Yarr! छिपे खजाने का नक्शा!


49

परिचय

"यार !! हमारे पास एक लड्डू था, जो खुद को" प्रोग्रामर "कहता था, एक नक्शा t 'हमारे छिपे हुए खज़ाने को बनाता है! लेकिन' tis लिखा wit 'अजीब नंबर' n अक्षर!" E5, N2, E3 "... यह क्या करता है! मतलब? पागलपन! एक उचित खजाने का नक्शा भी नहीं लिख सकते, 'बेकार क्रेटिन। इसे ठीक करो हम! हम तुम्हें एक हिस्सा ओ' टी 'खजाना उपहार देंगे! "

चुनौती का वर्णन

समुद्री लुटेरों के एक समूह को खजाने का नक्शा पढ़ने में परेशानी हो रही है। क्या आप इसे और अधिक ... समुद्री डाकू के रूप में बदलने के लिए एक कार्यक्रम लिख सकते हैं?

इनपुट के रूप में, आपको मूल खजाना नक्शा प्राप्त होगा। यह अल्पविराम से अलग तारों की एक सूची है, प्रत्येक स्ट्रिंग जिसमें एक अक्षर भाग होता है (जो समुद्री डाकू को बताता है कि उन्हें किस दिशा में चलने की आवश्यकता है), और एक संख्या वाला भाग (जो समुद्री डाकू को बताता है कि उस दिशा में कितने कदम चलना है )। उदाहरण के लिए, निम्नलिखित खजाना नक्शा:

E2,N4,E5,S2,W1,S3

का अर्थ होगा, "पूर्व की ओर दो कदम चलना, उत्तर की ओर चार कदम चलना, पूर्व की ओर पांच कदम चलना, दक्षिण की ओर दो कदम चलना, पश्चिम की ओर एक कदम चलना, फिर दक्षिण की ओर तीन कदम चलना।"

उत्पादन के रूप में, आप एक ग्राफिकल रूप में उत्पादन का नक्शा, अक्षरों का उपयोग करेंगे >, ^, v, और <संकेत के रूप में। यहाँ उपरोक्त इनपुट के लिए आउटपुट है:

  >>>>>v
  ^    v
  ^   v<
  ^   v
>>^   X

ध्यान दें कि हमने अंतिम चरण को Xइसके बजाय दक्षिण में बदल दिया है । इसका कारण यह है कि अंतिम चरण वह स्थान है जहाँ खजाना है, और जैसा कि हम सभी जानते हैं, समुद्री डाकू के पास अपने खजाने के नक्शे पर एक एक्स होना चाहिए, अन्यथा वे इसे पढ़ना नहीं जानते।

वैसे, मानचित्र कभी भी खुद को पार नहीं करेगा, इसलिए आपको ओवरलैप से निपटने के बारे में चिंता करने की आवश्यकता नहीं है। साथ ही, आपको आउटपुट के अंत में एक अनुगामी नई रेखा रखने की अनुमति है।

नमूना इनपुट और आउटपुट

S5,W2

 v
 v
 v
 v
 v
X<

N1,E1,S1,E1,N1,E1,S2

>v>v
^>^X

N1

X

N6,E6,S6,W5,N5,E4,S4,W3,N3,E2,S2,W1,N2

>>>>>>v
^>>>>vv
^^>>vvv
^^^Xvvv
^^^^<vv
^^^<<<v
^^<<<<<

E21,S2

>>>>>>>>>>>>>>>>>>>>>v
                     X

N12,E11,S12,W2,N4

>>>>>>>>>>>v
^          v
^          v
^          v
^          v
^          v
^          v
^          v
^          v
^        X v
^        ^ v
^        ^ v
^        ^<<

1
क्या हमें प्रत्येक पंक्ति में अनुगामी स्थान रखने की अनुमति है? क्या हमेशा संख्या दस से कम होने वाली है?
डाउनगेट 3

9
मुझे वास्तव में लगता है कि अंतिम Xकदम के बाद कदम को चिह्नित करना चाहिए , जैसे अन्य सभी कदमों को गिना जाता है। अंतिम चरण की कल्पना करें N3: आप उत्तर की ओर तीन कदम चलते हैं और खुदाई करते हैं, लेकिन यहां कुछ भी नहीं है, आपको इसके बजाय 2 कदम चलना होगा। यदि आप मौजूदा नियम रखते हैं तो मुझे कोई आपत्ति नहीं है, क्योंकि यह एक छोटे से कोने के मामले को संभालता है। लेकिन याद है उस लड्डू का क्या हुआ।
coredump

6
@ कॉर्डम्प या शायद हम समुद्री लुटेरों को गुमराह करना चाहते हैं, ताकि हम खुद के लिए खजाना ले सकें;) नहीं, आप सही हैं, समुद्री डाकू बहुत जल्द एक कदम खोद रहे हैं। यह देखते हुए कि पहले से ही तीन उत्तर हैं, मैं नियम रखूंगा क्योंकि मौजूदा समाधानों को अमान्य करने से बचना है।
absinthe

4
@ jpmc26 ठीक है, इन समुद्री लुटेरों को वर्णमाला के बारे में ज्यादा जानकारी नहीं है ... उन्होंने पिछले कुछ साल C :) में बिताए
absinthe

4
चौथा उदाहरण सिर्फ समुद्री लुटेरों को
ट्रोल करना है

जवाबों:


8

माणिक, 213 209 198 186 178

M={};x=0,m=q=0
gets.scan(/.(\d+)/){?1.upto($1){m,y=x
x[d=$&.ord%10%7-2]+=1|($u=M[y]||={})[m]=d
m<q&&q=m}}
$u[m]=2
puts M.sort.map{|_,b|(q..b.max[0]).map{|k|">vX <^"[b[k]||3]}*""}

स्टड के माध्यम से इनपुट पास करें।

यह एक का उपयोग करता y -> x -> charनक्शा, जहां दोनों के निर्माण के लिए शब्दकोश xऔर yनकारात्मक हो सकता है। एक बार इनपुट पार्स होने के बाद, x निर्देशांक का वैश्विक न्यूनतम निकाला जाता है। प्रत्येक पंक्ति के लिए, यह तब वैश्विक रेखा से वर्तमान रेखा के लिए अधिकतम सूचकांक तक जाने वाली सीमा से अधिक होता है, और उस सूचकांक के लिए सही वर्ण प्रिंट करता है।

विषय के साथ रहने के लिए, NESWउचित सूचकांकों में बदलने के लिए अभिव्यक्तियों को बेशर्मी से Sp3000 के उत्तर से निकाल दिया गया था

मूल संस्करण जो एक [x,y] -> charशब्दकोश का उपयोग करता है :

M={};x=0,0
gets.scan(/.(\d+)/){(?1..$1).map{x[d=$&.ord%10%7-2]+=1|M[$y=x+[]]=d}}
M[$y]=2
a,*q=M.minmax.flatten
M.map{|(x,y),v|($*[y-M.map{|a,|a[1]}.min]||=?\s.*q[2]-a)[x-a]=">vX<^"[v]}
puts$*.map &:rstrip

20

पायथन 2, 249 248 244 239 237 बाइट्स

D={}
m=X=Y=0
for s in input().split(","):d=ord(s[0])%10%7;exec"a,b=X,Y;E=D[Y]=D.get(Y,{});E[X]='<^>v'[d];m=min(m,X);%c+=d-2|1;"%(88+d%2)*int(s[1:])
D[b][a]="X"
for Y in sorted(D):print"".join(D[Y].get(n," ")for n in range(m,max(D[Y])+1))

इनपुट की तरह "E2,N4,E5,S2,W1,S3"

NSEWद्वारा मैप किया गया [1, 3, 2, 0]है d=ord(c)%10%7। क्या बदलना है yया xफिर इसके द्वारा तय किया जाता है d%2, और वेतन वृद्धि या वेतन वृद्धि का निर्णय किया जाता है d-2|1। पहला और तीसरा भाव पाशविक बल द्वारा पाया गया।

इसके अलावा, यह फॉर्म के एक नेस्टेड शब्दकोश का एक सरल उपयोग है {y: {x: char}}

(मैपिंग में मदद के लिए @joriki से साभार)


1
(d + 1 & 2) - 1
जॉर्की

1
@joriki आह यह एक अच्छी अभिव्यक्ति है - धन्यवाद!
23:

2
पूर्णांक कार्यों के लिए सरल अभिव्यक्ति खोजने के लिए मैंने कुछ कोड (एक अलग संदर्भ में) लिखे हैं। मैंने इसके लिए इसका उपयोग नहीं किया, लेकिन सिर्फ यह सोचा कि यह आपके लिए दिलचस्प हो सकता है। (संबंधित कोड शुरू होता है जहां यह कहता है "यह वह कोड है जिसे मैंने एन्कोडिंग को अनुकूलित करने के लिए उपयोग किया था"।)
joriki

3
@joriki जानवर जबरदस्ती एक महान विचार है - बस बदल गया 1|d%-3(जो कि नकारात्मकता है, लेकिन मुझे अभी एहसास हुआ कि यह ठीक है)!
Sp3000

14

जावास्क्रिप्ट (ईएस 6), 260

यह एक दिलचस्प था ...

धन्यवाद @ETHproductions, @ edc65, और @vihan मदद के लिए!

s=>{z=o=""
m=[]
q=x=y=2e3
s.split`,`.map(v=>z+=v[0].repeat(+v.slice(1)))
for(i=0;d=z[i];q=x<q?x:q)(m[y]=m[y]||[])[x]=z[++i]?d=="N"&&--y?"^":d=="S"&&++y?"v":d=="W"&&--x?"<":++x?">":o:"X"
m.map(a=>a.map((b,j)=>o+=" ".repeat(-p-1+(p=j))+b,p=q-1,o+=`
`))
return o}

यह एक अनाम फ़ंक्शन को परिभाषित करता है, इसलिए इसे कॉल f=करने के लिए शुरुआत में इसे नाम दें।

परीक्षा करना: console.log(f("E2,N4,E5,S2,W1,S3"))

स्पष्टीकरण:

s=>{ //define function w/ parameter s
z=o=""      //z=modified input, o=final output
m=[]        //map of characters
q=x=y=2e3   //q=minimum value of x; x+y=coordinates. These start high to leave room to go backwards
s.split`,`.map(v=>z+=v[0].repeat(+v.slice(1)))    //change "N3,E4" -> "NNNEEEE", and put in z
for(i=0;d=z[i];q=x<q?x:q)   //for each direction d in z, while updating q:
    (m[y]=m[y]||[])[x]=     //in the right place on the map, put:
        z[++i]?                 //if last character of z, "X"
            d=="N"&&--y?"^":    
            d=="S"&&++y?"v":    //otherwise get the right character and change x+y accordingly
            d=="W"&&--x?"<":
            ++x?">":o
        :"X"
m.map(a=>a.map((b,j)=>o+=" ".repeat(-p-1+(p=j))+b,p=q-1,o+=`
`)) //dump map to o, with correct padding
return o}   //return

3
बयानों को अलग करने का यह एक अच्छा तरीका है! यह निश्चित रूप से एक पंक्ति में सब कुछ डालने और अर्धविराम के साथ उन्हें अलग करने की तुलना में बहुत अधिक पठनीय है। यदि मैं अपना सुझाव दे सकता हूं: आप अपने बाइट i++को forलूप से उस स्थान पर अंतिम स्थान पर ले जा सकते हैं जिसका उपयोग किया गया है, इस मामले में c=i++>r-2?"X":c
ETHproductions

1
इसके अतिरिक्त, क्योंकि आप ES6 उपयोग कर रहे हैं, मैं का उपयोग कर सुझाव v[0].repeat(+v.slice(1))के स्थान पर Array(v.slice(1)- -1).join(v[0]), और " ".repeat(j-p-1)के स्थान पर Array(j-p).join(" "), कुल मिलाकर 11 बाइट्स की बचत। मुझे लगता है कि आप F='forEach'फ़ंक्शन की शुरुआत में भी जगह ले सकते हैं , फिर .forEachवहां से प्रत्येक को बदलकर [F], एक और बचत कर सकते हैं 4.
ETHproductions

1
.ForEach के बजाय .map का उपयोग करने का प्रयास करें। यह इतना छोटा है कि आपको इसे F
edc65

1
@ निर्धारित समय के लिए आप शॉर्टहैंड्स का उपयोग करना चाहते हैं if, यह मदद कर सकता है यदि आप एक ही समय में चर भी
घटा

1
यदि मेरी समझ सही है, तो q=x=y=2e3इसका मतलब है कि अगर मैंने किया, तो आउटपुट गलत होगा W9999?
Sp3000

7

PHP, 431 417 बाइट्स

$g=explode(',',$argv[1]);$x=$y=$a=$b=$c=$d=$e=$f=0;
foreach($g as$i=>$h){list($k,$l,$m)=
    ['N'=>[-1,0,'^'],'E'=>[0,1,'>'],'S'=>[1,0,'v'],'W'=>[0,-1,'<']][$h[0]];
    for($s=substr($h,1);$s--;){$z[$f=$y][$e=$x]=$m;$y+=$k;$x+=$l;}
    if($i==count($g)-1){$x=$e;$y=$f;}
    $a=min($a,$x);$b=max($b,$x);$c=min($c,$y);$d=max($d,$y);
}$z[$y][$x]='X';for($y=$c;$y<=$d;$y++)
{$o='';for($x=$a;$x<=$b;$x++)$o.=$z[$y][$x]?:' ';echo rtrim($o)."\n";}

इसे एक फ़ाइल में डालें ( treasure.php), इंडेंटेशन को हटाएं, लाइनों को मिलाएं (यह पठनीयता के लिए यहां लपेटा गया है), <?phpफ़ाइल की शुरुआत में मार्कर को डालें (यहां प्रदर्शित नहीं किया जाता है क्योंकि यह तकनीकी रूप से कार्यक्रम का हिस्सा नहीं है)।

निष्पादन का उदाहरण:

$ php -d error_reporting=0 treasure.php E2,N4,E5,S2,W1,S3
  >>>>>v
  ^    v
  ^   v<
  ^   v
>>^   X
$

-d error_reporting=0निर्दिष्ट सूचकांक में नहीं मिले मूल्यों के बारे में नोटिस को दबाने के लिए विकल्प की आवश्यकता है $z

अपडेट करें:

जब मैं पोस्टिंग के लिए कोड का अनऑर्गलाइज्ड संस्करण तैयार कर रहा था तो मुझे पता चला कि इसमें दो अनावश्यक असाइनमेंट (12 बाइट्स) और एक व्हाट्सएप है जिसे हटाया जा सकता है ( as$i); इसके अलावा, whileएक forलूप के साथ बदलकर और इसमें एक असाइनमेंट निचोड़ कर (संभव नहीं है कि whileलूप का उपयोग करके ) मैंने एक और बाइट को बचाया।


मुझे एक अनगुल्ड संस्करण देखना अच्छा लगेगा।
लार्स एबर्ट

1
@LarsEbert I ने असंगठित कोड के लिंक के साथ उत्तर को अपडेट किया। मैंने अब आपके समाधान की जाँच की (यह पहले नहीं किया था); हमने मूल रूप से समान एल्गोरिथ्म का उपयोग किया है। तुम्हारा है मेरा से बेहतर अंतिम चरण संभालता है। अगर मैं लागू करता हूं तो मैं 25 और बाइट्स छीन सकता हूं $count --;
अक्षीय

$argn3 बाइट्स chopबचाओ 1 बाइट बचाओ "X"-> X
कांस्टेंट

@ JörgHülsermann मुझे $argnसंकेत नहीं मिला । मुझे इस "X"->Xट्रिक के बारे में पता है लेकिन मैं शायद इस बारे में भूल गया जब मैंने इसका हल लिखा। मैं 2002 से PHP कोड लिखता हूं लेकिन आज तक मैंने यह नहीं देखा कि PHP chop()फ़ंक्शन प्रदान करता है । इस संकेत के लिए धन्यवाद।
अक्षीय

7

पर्ल, 702 613 546 474 439 338 260 बाइट्स

डोम हेस्टिंग्स को उनकी मदद और उनके सुपरगॉल्फेड संस्करण के लिए धन्यवाद।
कोड एक 2D सरणी का उपयोग करता है।

डोम हेस्टिंग्स द्वारा संस्करण:

$x=$y=$a=$b=99;map{/^./;$a=($c=$x)<$a?$x:$a,$A=$x>$A?$x:$A,$b=($C=$y)<$b?$y:$b,$B=$y>$B?$y:$B,$q[$c][$C]={split'','W<E>N^Sv'}->{$&},$x+={W,-1,E,1}->{$&},$y+={N,-1,S,1}->{$&}for 1..$'}split',',pop;$q[$c][$C]=X;for$y($b..$B){print$q[$_][$y]||$"for$a..$A;print$/}

338 बाइट्स (संदर्भ के लिए) का मेरा कम गोल्फ वाला संस्करण:

@m=split(',',pop);$x=$y=$a=$b=99;map{($d,$s)=/^(.)(.+)$/;for(1..$s){$c=$x;$C=$y;if($x<$a){$a=$x}if($x>$A){$A=$x}if($y<$b){$b=$y}if($y>$B){$B=$y}if($d eq"W"){$r="<";$x--}if($d eq"E"){$r=">";$x++}if($d eq"N"){$r="^";$y--}if($d eq"S"){$r=v;$y++}$q[$c][$C]=$r}}@m;$q[$c][$C]=X;for$y($b..$B){for$x($a..$A){$t=$q[$x][$y];print$t?$t:$"}print$/}

परीक्षा

$ perl piratemap_golf.pl E4,N3,W6,S10,W1,S1,E5,N1,W2,N6,E6,N5,W10,S1,E2
v<<<<<<<<<<
>Xv<<<<<< ^
  v     ^ ^
  v     ^ ^
  v >>>>^ ^
  v >>>>>>^
  v ^
  v ^
  v ^
  v ^
  v ^
 v< ^<<
 >>>>>^

3
यदि आप उपयोग नहीं कर रहे हैं use strict;, तो आपको सभी myएस की आवश्यकता नहीं है , जो आपको कम से कम कुछ बाइट्स बचाएगा। बाद के रिक्त स्थान की आवश्यकता ==होने eqसे भी कम है ।
एलेक्स ए।

1
यदि मैं गलत नहीं हूं, तो आप केवल $mएक बार कॉल कर रहे हैं , इसलिए कमांड लाइन तर्क को एक चर के रूप में संग्रहीत करने के बजाय, आप इसे सीधे split, यानी में कॉल कर सकते हैं @m=split(',',$ARGV[0])
एलेक्स ए।

1
हे @LukStorms, अधिक पर्ल गोल्फरों को देखकर खुशी हुई! कुछ चीजें बाइट्स को बचाने में मदद करने के लिए! कुछ बाइट्स को बचाने के लिए regex का उपयोग करके आपके $dऔर $sचर को पकड़ा जा सकता है ($d,$s)=/^(.)(.+)$/, और सभी foreachs हो सकते हैं for(जैसा कि वे एक ही हैं। आप इनमें से कुछ के स्थान पर कुछ चार्ट को सहेजने में भी सक्षम हो सकते हैं map{... }@xक्योंकि आप दृष्टांतों को अनदेखा कर सकते हैं। iterated आइटम के आसपास (यह अच्छी तरह से काम करता है यदि आपको अन्य लूप सम्‍मिलित करने हैं)। यदि आप उपयोग कर रहे हैं तो आप इसे $ARGV[0]पॉप के साथ बदल सकते हैं, लेकिन यदि आप स्क्रिप्ट का उपयोग करते हैं तो आप इसके बजाय perl script.pl <<< "text"उपयोग कर सकते हैं <>!
डोम हेस्टिंग्स

1
यदि आप स्क्रिप्ट का उपयोग करना चाहते हैं, तो आप popएक जोड़े को बचाने के लिए उपयोग कर सकते हैं । / use Swtichऔर कथनों के बजाय , आप व्यक्तिगत जांच कर सकते हैं जो आपको बाइट्स बचा सकती है। कुछ ऐसा ही काम करेगा (चूंकि सच्चा और गलत है )। अक्सर, आपके पास नंगे शब्द के रूप में शब्द हो सकते हैं, इसलिए काम करेंगे! कुछ मैजिक वैरिएबल हैं जिनका उपयोग आप बाइट्स बचाने के लिए कर सकते हैं, है और है , लेकिन कभी-कभी एक शाब्दिक न्यूलाइन एक चार्ट को भी बचाने में मदद कर सकती है। एक और (गंदा!) चाल कुछ और अधिक सहेजने के लिए एकाधिक असाइन है, जैसा कि हो सकता है । switchcase$y-="N"eq$d1''$y-=N eq$d$/'\n'$"' '$a=0;$b=0;$a=$b=0
डोम हेस्टिंग्स

1
बस कुछ और, मैं वादा करता हूं। मुझे आशा है कि यह थोड़े जानकारी है जिसके बाद आप हैं! फंक्शन कॉल पर पैरेंस को मिस करना काफी मानक बदलाव है, इसलिए ऐसा substr($_,0,1)हो सकता है substr$_,0,1। लूप्स के लिए पोस्टफ़िक्स और यदि चेक for(@c){...}बनाम के रूप में भी उपयोगी हो ...for@cसकते हैं, लेकिन आप ;कोड में उपयोग नहीं कर सकते हैं , तो आपको इसके बजाय अलग से कॉमा करना होगा (जो हमेशा तब काम नहीं करता जब आप कॉल कर रहे हों)। कोडगुल्फ.स्टैकएक्सचेंज . com / questions / 5105 / पर भी कई बेहतरीन टिप्स हैं । सौभाग्य!
डोम हेस्टिंग्स

5

पायथन 2, 394 बाइट्स

प्रोग्राम को चलाएं फिर जैसे मानक इनपुट में पेस्ट करें "E2,N4,E5,S2,W1,S3"

m=input().split(',')
def f(x,y,h,o,s=[]):
 for c in m:
  for _ in range(int(c[1:])):
   a,b,l={'E':(1,0,'>'),'W':(-1,0,'<'),'N':(0,1,'^'),'S':(0,-1,'v')}[c[0]]
   if o:o[h-y][x]=l
   s+=[(x,y)];x+=a;y+=b
 if o:o[h-y+b][x-a]='X'
 return s
p,q=zip(*f(*[0]*4))
w,h=max(p)-min(p),max(q)-min(q)
o=[[' ']*-~w for _ in range(h+1)]
f(-min(p),-min(q),h,o)
print'\n'.join(["".join(l).rstrip()for l in o])

यह बहुत अनुकूलित नहीं है। पहले यह पथ रिकॉर्ड करने के लिए इनपुट के माध्यम से चलता है। फिर यह सही शुरुआत की स्थिति और आकार को निर्धारित करने के लिए कुछ गणित करता है o। फिर यह फिर से चलता है और oइनमें से उपयुक्त प्रविष्टियों को सेट करता है >v<^X। मुख्य चालाकी इन दोनों ट्रैवर्सल्स के लिए एक ही फ़ंक्शन का पुन: उपयोग करने में है।


4

XQuery 3.0, 498

declare variable $v external;let $m:=<v>{tokenize($v,',')!(for $j in(1 to xs:int(substring(.,2)))return<c>{translate(substring(.,1,1),'NESW','^>v<')}</c>)}</v>/c!(let $p:=./preceding-sibling::c return<p x="{count($p[.='>'])-count($p[.='<'])}" y="{count($p[.='v'])-count($p[.='^'])}">{if(./following::*)then .else'X'}</p>)for $y in(min(xs:int($m/@y))to max(xs:int($m/@y)))return string-join(for $x in(min(xs:int($m/@x))to max(xs:int($m/@x)))let $d:=$m[@x=$x and @y=$y]return if($d)then$d else' ','')

XQuery अक्सर थोड़ा प्रतिस्पर्धात्मक नहीं होता है, इसलिए यह मजेदार था।

Ungolfed

declare variable $v external;
let $map := <vector>{ tokenize($v,',') ! 
        (for $j in (1 to xs:int(substring(.,2)))
            return <step>{ translate(substring(.,1,1),'NESW','^>v<') }</step> ) 
         }</vector>/step !
            (let $path_so_far := ./preceding-sibling::step
            return <point 
                x="{ count($path_so_far[.='>']) - count($path_so_far[.='<']) }" 
                y="{ count($path_so_far[.='v']) - count($path_so_far[.='^']) }">
                {if(./following::*) then string(.) else 'X'}
            </point>)
for $y in (min(xs:int($map/@y)) to max(xs:int($map/@y)))
return string-join(
    for $x in (min(xs:int($map/@x)) to max(xs:int($map/@x)))
    let $d := $map[@x=$x and @y=$y]
    return if($d) then string($d) else ' '
    ,'')

4

PHP, 496 514 528

मैंने PHP में अपनी किस्मत की कोशिश की, परिणाम लंबे समय तक है, मैं अभी भी इसे पोस्ट करना चाहता हूं, बस मनोरंजन के लिए।

function a($c){global$a,$b;$a[$b[1]][$b[0]]=$c;}$c=explode(',',$argv[1]);$a=[];$b=[0,0];foreach($c as$d=>$e){$f=substr($e,1);if($d==count($c)-1)$f--;for($i=0;$i++<$f;){if($e[0]==N){a('^');$b[1]--;}elseif($e[0]==E){a('>');$b[0]++;}elseif($e[0]==S){a(v);$b[1]++;}else{a('<');$b[0]--;}}}a(X);$d=$e=$f=$g=0;foreach($a as$y=>$h){$f=min($f,$y);$g=max($g,$y);foreach($h as$x=>$i){$d=min($d,$x);$e=max($e,$x);}}for($y=$f;$y<=$g;$y++){for($x=$d;$x<=$e;$x++)echo isset($a[$y][$x])?$a[$y][$x]:' ';echo "
";}

Ungolfed

<?php

    function setInMap($char) {
        global $map, $position;
        $map[$position[1]][$position[0]] = $char;
    }

    $instructions = explode(',', $argv[1]);

    $map = [];

    $position = [0, 0];

    foreach($instructions as $index => $instruction) {
        $count = substr($instruction, 1);
        if($index === count($instructions) - 1) {
            $count--;
        }
        for($i = 0; $i < $count; $i++) {
            if($instruction[0] === 'N') {
                setInMap('^');
                $position[1]--;
            } elseif($instruction[0] === 'E') {
                setInMap('>');
                $position[0]++;
            } elseif($instruction[0] === 'S') {
                setInMap('v');
                $position[1]++;
            } else($instruction[0] === 'W') {
                setInMap('<');
                $position[0]--;
            }
        }
    }
    setInMap('X');

    $minX = $maxX = $minY = $maxY = 0;
    foreach($map as $y => $row) {
        $minY = min($minY, $y);
        $maxY = max($maxY, $y);
        foreach($row as $x => $cell) {
            $minX = min($minX, $x);
            $maxX = max($maxX, $x);
        }
    }
    for($y = $minY; $y <= $maxY; $y++) {
        for($x = $minX; $x <= $maxX; $x++) {
            if(isset($map[$y][$x])) {
                echo $map[$y][$x];
            } else {
                echo ' ';
            }
        }
        echo "\n";
    }

?>

1
बहुत कम किया जा सकता है। उदाहरण के लिए, आप बस लिख सकते हैं for(;$i++<$f;), अनावश्यक ब्रैकेट्स को हटाने का प्रयास करें, Nस्ट्रिंग्स ( 'N') के बजाय अपरिभाषित स्थिरांक ( ) का उपयोग करें ...
ब्लैकहोल

1
ifS के बजाय , trenary ऑपरेटर्स या तार्किक ands का उपयोग करके देखें। इसके अलावा, यदि आप PHP4.1 का उपयोग करते हैं और अंकों के साथ एक जीईटी सरणी का उपयोग करते हैं तो यह मदद करेगा।
इस्माइल मिगुएल

3

जावास्क्रिप्ट (ईएस 6), 244 249 274

लीडिंग स्पेस और न्यूलाइन्स को स्पष्टता के लिए जोड़ा गया है और गणना में शामिल नहीं किया गया है, सिवाय इसके कि न्यूलाइन को ज्वाइन कॉल में अंत के अलावा , जो महत्वपूर्ण है और गिना जाता है।

स्निपेट का परीक्षण करना (केवल ECMAScript 6, फ़ायरफ़ॉक्स और सफारी 9 होना)

F=m=>(
  x=y=0,p=[],
  m.replace(/\w(\d+)/g,(d,z)=>{
    for(d='NWSE'.search(d[0]);
        z--&&(p=~x?~y?p:[y=0,...p]:p.map(r=>' '+r,x=0));
        p[u=y]=(w=r.slice(0,x))+'^<v>'[d]+(v=r.slice(x+1)),
        d&1?x+=d-2:y+=d-1)
      for(r=p[y]||'';!r[x];)r+=' ';
  }),
  p[u]=w+'X'+v,
  p.join`
`
)

// TEST

out=x=>O.innerHTML+=x.replace(/</g,'&lt;')+'\n'

;['S5,W2','N1,E1,S1,E1,N1,E1,S2','N1','N6,E6,S6,W5,N5,E4,S4,W3,N3,E2,S2,W1,N2','E21,S2','N12,E11,S12,W2,N4']
.forEach(a=>out(a+'\n'+F(a)+'\n'))
<pre id=O></pre>


2

सी, 557

main(_,a,minX,maxX,minY,maxY,x,y,v,dir,dist)char**a;char*v;{char o[998][999];for(y=0;y-998;++y){for(x=0;x-998;++x)o[y][x]=32;o[y][998]=0;}y=x=minY=minX=maxY=maxX=499;v=a[1];while(*v){dir=*v++;dist=atoi(v);while(*v&&*v!=44)v++;v+=!!*v;if(dir==78){while(dist--)o[y--][x]=94;if(y<minY)minY=y;y+=!*v;}if(dir==69){while(dist--)o[y][x++]=62;if(x>maxX)maxX=x;x-=!*v;}if(dir==83){while(dist--)o[y++][x]=86;if(y>maxY)maxY=y;y-=!*v;}if(dir==87){while(dist--)o[y][x--]=60;if(x<minX)minX=x;x+=!*v;}}o[y][x]=88;for(y=minY;y<=maxY;++y){o[y][maxX+1]=0;puts(o[y]+minX);}}

Ungolfed संस्करण:

#include <stdio.h>

#define MAX_WIDTH 998
#define MAX_HEIGHT 998

int main(int argc, char *argv[]) {
    int minX,maxX,minY,maxY;
    int x,y;
    char output[MAX_HEIGHT][MAX_WIDTH+1];
    char *v;

    for (y=0; y<MAX_HEIGHT; ++y) {
        for (x=0; x<MAX_WIDTH; ++x) 
            output[y][x] = ' ';
        output[y][MAX_WIDTH] = 0;
    }

    x = minX = maxX = MAX_WIDTH/2;
    y = minY = maxY = MAX_HEIGHT/2;

    v = argv[1];
    while (*v) {
        char dir; int dist;
        dir = *(v++);
        dist = atoi(v);
        while (*v && *v != ',') v++;
        if (*v) v++;

        switch (dir) {
            case 'N':case 'n':
                while (dist--) output[y--][x] = '^';
                if (y < minY) minY = y;
                if (!*v) y++;
                break;
            case 'E':case 'e':
                while (dist--) output[y][x++] = '>';
                if (x > maxX) maxX = x;
                if (!*v) x--;
                break;
            case 'S':case 's':
                while (dist--) output[y++][x] = 'v';
                if (y > maxY) maxY = y;
                if (!*v) y--;
                break;
            case 'W':case 'w':
                while (dist--) output[y][x--] = '<';
                if (x < minX) minX = x;
                if (!*v) x++;
                break;
        }
    }

    output[y][x] = 'x';
    for (y = minY; y <= maxY; ++y) {
        output[y][maxX+1] = 0;
        puts(output[y]+minX);
    }

    return 0;
}

डायनामिक मेमोरी एलोकेशन बहुत कठिन नहीं है, लेकिन कोड गोल्फ में इस्तेमाल किए जाने वाले मॉलोक की पहचान बहुत लंबी है। मुझे ऐसा लगता है कि सी में गोल्फिंग के लिए किसी तरह का पीसीजी.एच हेडर कानूनी रूप से स्वत: शामिल होना चाहिए, बस कुछ पहचानकर्ताओं को संक्षिप्त करना चाहिए।


1

ग्रूवी, 359

c=args[0].split(',').collect{[it[0],it[1..-1]as int]}
m=[[]]
x=y=0
d=["N":["^",0,1],"S":["v",0,-1],"E":[">",1,0],"W":["<",-1,0]]
c.each{z->(1..z[1]).each{if(x<0){m*.add(0," ");x=0};if(y<0){m.add(0,[]);y=0};m[y]=m[y]?:[];m[y][x]=d[z[0]][0];if(c.last()==z&&it==z[1])m[y][x]='X';y+=d[z[0]][2];x+=d[z[0]][1]}}
m.reverse().each{println it.collect{it?:" "}.join()}

1

आम लिस्प - 603

(lambda(s)(do((x 0)i(y 0)j(p 0)r(q 0)(g(mapcar(lambda(x)`(,(aref x 0),(parse-integer x :start 1)))(split-sequence:split-sequence #\, s))(cdr g))c)((not g)(setf x 0 y 0)(dolist(e(stable-sort(sort r #'<= :key #'car)#'< :key #'cadr))(dotimes(_(-(cadr e)p y))(terpri)(incf y)(setf x 0))(dotimes(_(-(car e)q x))(princ" ")(incf x))(princ(caddr e))(incf x)))(case(caar g)(#\N(setf i 0 j -1 c #\^))(#\E(setf i 1 j 0 c #\>))(#\W(setf i -1 j 0 c #\<))(#\S(setf i 0 j 1 c #\v)))(dotimes(_(-(cadar g)(if(cdr g)0 1)))(push`(,x,y,c)r)(incf x i)(incf y j))(setf q(min q x)p(min p y))(unless(cdr g)(push`(,x,y #\X)r))))

एरे-फ्री कार्यान्वयन: ऊपर से नीचे तक, बाएं से दाएं तक प्रिंट।

  • पार्स और (x y char)तत्वों के एक ट्रेस में दिशाओं का विस्तार :

    सरल "एन 3" इनपुट पैदा करता है ((0 0 #\^) (0 -1 #\^) (0 -2 #\X))

  • इसके अलावा, न्यूनतम गणना करें xऔरy
  • yपहले और बाद में परिणामी ट्रेस को क्रमबद्ध करेंx
  • कर्सर ले जाने के दौरान क्रमबद्ध सूची में फेरबदल करें

    1. सही स्थिति में वर्तमान कर्सर को स्थानांतरित करने के लिए नई लिंक और रिक्त स्थान जोड़ें
    2. स्थिति में होने पर x - minx, y - minyवांछित वर्ण प्रिंट करें

उदाहरण

(loop for input in  '("N6,E6,S6,W5,N5,E4,S4,W3,N3,E2,S2,W1,N2" 
                      "N1,E1,S1,E1,N1,E1,S2" 
                      "N12,E11,S12,W2,N4")
      do (fresh-line)
         (terpri)
      (funcall *fun* input))

नतीजा:

>>>>>>v
^>>>>vv
^^>>vvv
^^^Xvvv
^^^^<vv
^^^<<<v
^^<<<<<

>v>v
^>^X

>>>>>>>>>>>v
^          v
^          v
^          v
^          v
^          v
^          v
^          v
^          v
^        X v
^        ^ v
^        ^ v
^        ^<<

1

कॉफीस्क्रिप्ट, 303   285 बाइट्स

Y=(s)->o=[];t=l=x=y=0;q='';q+=s[0]for[1..s[1..]]for s in s.split ',';q=q[..-2];(i='NWSE'.search c;(o[y]?=[])[x]='^<v>'[i];j=(i&2)-1;x+=j*(i&1);y+=j*(!(i&1));y<t&&t=y;x<l&&l=x)for c in q;(o[y]?=[])[x]='X';((o[y][x]||' 'for x in[l...o[y].length]).join ''for y in[t...o.length]).join '\n'

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.