Yarr! লুকানো গুপ্তধনের মানচিত্র!


49

ভূমিকা

"ইয়ার! আমাদের একটি লাড্ডি ছিল যিনি নিজেকে" প্রোগ্রামার "বলেছিলেন এটি একটি মানচিত্রকে 'আমাদের লুকানো ধন' তৈরি করে! মানে? পাগলামি! এমনকি সঠিক ট্রেজার মানচিত্রও লিখতে পারছি না, 'অকেজো ক্রিটিন us এটি আমাদের কাছে ঠিক করুন! আমরা আপনাকে একটি ভাগ উপহার দেব!'

চ্যালেঞ্জের বর্ণনা

একদল জলদস্যুদের একটি ধন মানচিত্র পড়তে সমস্যা হচ্ছে। আপনি কি আরও প্রোগ্রামে ... পাইরেটি ফর্মে রূপান্তর করতে কোনও প্রোগ্রাম লিখতে পারেন?

ইনপুট হিসাবে, আপনি আসল ট্রেজার মানচিত্র পাবেন। এটি কমা দ্বারা পৃথক করা স্ট্রিংগুলির একটি তালিকা, প্রতিটি স্ট্রিং যা একটি অক্ষরের অংশ নিয়ে গঠিত (যা জলদস্যুদের তাদের কোন দিকে যেতে হবে) এবং একটি সংখ্যা অংশ (যা জলদস্যুদের নির্দেশ দেয় যে সেদিকে কত পদক্ষেপ নেবে)। উদাহরণস্বরূপ, নিম্নলিখিত ধন মানচিত্র:

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
আমাদের কি প্রতিটি লাইনে পিছনে স্থান দেওয়ার অনুমতি দেওয়া হচ্ছে? সংখ্যাটি কি সর্বদা দশের চেয়ে কম হতে চলেছে?
ডাউনগোট

9
আমি সত্যিই ভাবি যে অন্যান্য পদক্ষেপগুলি গণনা করার মতো শেষ Xপদক্ষেপের পরে পদক্ষেপটি চিহ্নিত করা উচিত । শেষ ধাপটি এন 3 এর কল্পনা করুন: আপনি উত্তরে তিনটি ধাপে যান এবং খনন করেন তবে এখানে কিছুই নেই, পরিবর্তে আপনাকে 2 টি পদক্ষেপে হাঁটতে হয়েছিল। আপনি বিদ্যমান নিয়মটি বজায় রাখলে আমার আপত্তি নেই, কারণ এটি হ্যান্ডেল করার জন্য একটি সামান্য কোণার কেস যুক্ত করে। তবে মনে আছে সেই লাড্ডির কী হয়েছিল।
coredump

6
@ কর্ডাম্প বা হতে পারে আমরা জলদস্যুদের বিভ্রান্ত করতে চাই, যাতে আমরা নিজেরাই ধনটা নিতে পারি;) না, আপনি ঠিক বলেছেন, জলদস্যুরা খুব শীঘ্রই একধাপ খনন করছে। ইতিমধ্যে তিনটি উত্তর দেওয়া আছে, আমি বিদ্যমান বিধি অকার্যকর এড়ানোর জন্য নিয়মটি রাখব।
6:58 এ int

4
@ jpmc26 ঠিক আছে, এই জলদস্যুরা বর্ণমালার বেশি কিছু জানেন না ... তারা গত কয়েক বছর সি-তে ব্যয় করেছেন
অ্যাবিন্থে

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সঠিক সূচকগুলিতে রূপান্তরিত করার অভিব্যক্তিগুলি স্প3000 এর উত্তর থেকে নির্লজ্জভাবে পাইরেটেড হয়েছিল ।

মূল সংস্করণ যা একটি [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}}

(ম্যাপিংয়ের ক্ষেত্রে সহায়তার জন্য @জোরিকিকে ধন্যবাদ)


1
(d + 1 & 2) - 1
জোরিকি

1
@ জোরিকি আহ! এটি একটি সুন্দর অভিব্যক্তি - ধন্যবাদ!
Sp3000

2
পূর্ণসংখ্যার ক্রিয়াগুলির জন্য সহজ অভিব্যক্তি সন্ধানের জন্য আমি এখানে কিছু কোড লিখেছি (ভিন্ন প্রসঙ্গে)। আমি এটির জন্য এটি ব্যবহার করি নি, তবে কেবল ভেবেছিলাম এটি আপনার জন্য আকর্ষণীয় হতে পারে। (প্রাসঙ্গিক কোডটি শুরু হয় যেখানে এটি বলে যে "এটি কোড যা আমি এনকোডিংটি অনুকূলিত করতে ব্যবহার করেছি"))
জোরিকি

3
@ জোজিরিকি ব্রুটে একটি দুর্দান্ত ধারণা - সবেমাত্র পরিণত হয়েছে 1|d%-3(যা প্রত্যাখ্যান , তবে আমি ঠিক বুঝতে পেরেছি যে এটিও ঠিক আছে)!
Sp3000

14

জাভাস্ক্রিপ্ট (ES6), 260

এটি একটি আকর্ষণীয় ছিল ...

সহায়তার জন্য @ ইথ প্রডাকশনস, @ এডসি 65, এবং @ভিহানকে ধন্যবাদ!

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
ইটিএইচ প্রোডাকশনস

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 টি সংরক্ষণ করে পরিবর্তন করতে পারেন
ETH প্রোডাকশনগুলি

1
.ForEach এর পরিবর্তে .map ব্যবহার করার চেষ্টা করুন। এটি এত সংক্ষিপ্ত আপনি এটিকে এফ
edc65 65 ই

1
@ সংজ্ঞায়িত ফাংশনটি আপনি এসটির জন্য শর্টহ্যান্ডগুলি ব্যবহার ifকরতে চাইতে পারেন, আপনি যদি একই সময়ে ভেরিয়েবলগুলি হ্রাস করতে পারেন তবে এটি সাহায্য করবে
ডাউনগোট

1
যদি আমার বোধগম্যতা সঠিক হয়, তার q=x=y=2e3মানে কি আমি যদি বলি, আউটপুটটি ভুল হবে W9999?
Sp3000

7

পিএইচপি, 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
@ লার্সবার্ট আমি উত্তরটি অদৃশ্য কোডের একটি লিঙ্ক সহ আপডেট করেছি। আমি এখনই আপনার সমাধানটি পরীক্ষা করেছি (আগে এটি করিনি); আমরা মূলত একই অ্যালগরিদম ব্যবহার করেছি। আপনার আমার চেয়ে শেষ পদক্ষেপটি পরিচালনা করে। আমি যদি প্রয়োগ করি তবে আমি আরও 25 টি বাইট ছড়িয়ে দিতে পারি $count --;
axiac

$argn3 বাইট chopসংরক্ষণ করুন 1 বাইট সংরক্ষণ করুন "X"-> Xধ্রুবক ব্যবহার করুন আরও বাইট সংরক্ষণ করুন
জার্গ হালসারম্যান

@ JörgHülsermann আমি $argnইঙ্গিতটি পাই না । আমি "X"->Xকৌশল সম্পর্কে সচেতন কিন্তু আমি যখন এই সমাধানটি লিখেছিলাম তখন আমি সম্ভবত এটি সম্পর্কে ভুলে গিয়েছিলাম। আমি ২০০২ সাল থেকে পিএইচপি কোডটি লিখি তবে আজ অবধি আমি লক্ষ্য করিনি যে পিএইচপি chop()ফাংশন সরবরাহ করে । এই ইঙ্গিতটির জন্য আপনাকে ধন্যবাদ।
axiac

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
আরে @ লুক্সটর্মস, আরও পার্ল গল্ফার্স দেখে খুশি! কিছু জিনিস কিছু বাইট সংরক্ষণ করতে! আপনাকে কিছু বাইট সংরক্ষণ করতে রেজেক্স ব্যবহার করে আপনার $dএবং $sভেরিয়েবলগুলি ধরা যেতে পারে ($d,$s)=/^(.)(.+)$/এবং সমস্ত foreachকিছু হতে পারে for(সেগুলি একই হয় You আপনি কিছু অক্ষরের পরিবর্তে কিছু অক্ষর সংরক্ষণ করতেও সক্ষম হতে পারেন map{... }@xযেহেতু আপনি পেরেনগুলি উপেক্ষা করতে পারেন পুনরাবৃত্ত আইটেমটির চারপাশে (যদি আপনাকে অন্যান্য লুপগুলি ধারণ করতে হয় তবে এটি ভাল কাজ করে) আপনি যদি এটি ব্যবহার করেন তবে আপনি এটি $ARGV[0]পপ দিয়ে প্রতিস্থাপন করতে পারেন, তবে আপনি যদি স্ক্রিপ্টটি perl script.pl <<< "text"ব্যবহার করেন তবে <>পরিবর্তে ব্যবহার করতে পারেন !
ডম হেস্টিংস

1
আপনি যদি স্ক্রিপ্টটি আরগস ব্যবহার করে রাখতে চান তবে আপনি কয়েকজনকে popবাঁচাতে ব্যবহার করতে পারেন । use Swtichএবং switch/ caseবিবৃতিগুলির পরিবর্তে , আপনি পৃথক চেক করতে পারেন যা আপনার বাইটগুলি বাঁচাতে পারে। এর মতো কিছু $y-="N"eq$dকাজ করবে (যেহেতু সত্য 1এবং মিথ্যা '')। প্রায়শই, আপনি খালি শব্দ হিসাবে শব্দ থাকতে পারে, তাই $y-=N eq$dকাজ করবে! বাইট সংরক্ষণ করতে আপনি ব্যবহার করতে পারেন এমন কয়েকটি ম্যাজিক ভেরিয়েবল $/রয়েছে '\n'এবং $"রয়েছে ' ', তবে কখনও কখনও আক্ষরিক নতুন লাইনটি একটি চরও সংরক্ষণ করতে পারে। আরেকটি (মলিন!) কৌতুক হিসাবে একাধিক নির্ধারণ, আরো কয়েকটি রক্ষা করা $a=0;$b=0;হতে পারে $a=$b=0
ডম হেস্টিংস

1
আরও কিছু, আমি প্রতিশ্রুতি। আমি আশা করি এটি আপনার মত পরে তথ্য হবে! ফাংশন কলগুলিতে প্যারেনগুলি মিস করা একটি বেশ মানক পরিবর্তন, তাই substr($_,0,1)হতে পারে substr$_,0,1। লুপগুলির জন্য পোস্টফিক্স এবং যদি চেকগুলি for(@c){...}বনাম হিসাবেও কার্যকর হতে পারে ...for@cতবে আপনি কোডটিতে ব্যবহার করতে পারবেন না ;, তার পরিবর্তে আপনাকে আলাদা কমাতে হবে (যা আপনি যখন ফাংশন বলছেন তখন সবসময় কাজ করে না)। কোডগল্ফ.স্ট্যাকেক্সেঞ্জ / বিকিউশনস / 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

এক্সকিউরি 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' ','')

এক্সকিউরি প্রায়শই সামান্য প্রতিযোগিতামূলকও হয় না, তাই এটি মজাদার ছিল।

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

পিএইচপি, 496 514 528

আমি পিএইচপিতে আমার ভাগ্য চেষ্টা করেছিলাম, ফলাফলটি দীর্ঘ দীর্ঘ, আমি এখনও এটি কেবল মজাদার জন্য পোস্ট করতে চাই।

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 ব্যবহার করেন এবং পয়েন্টগুলি সহ একটি জিইটি অ্যারে ব্যবহার করেন তবে এটি সহায়তা করবে help
ইসমাইল মিগুয়েল

3

জাভাস্ক্রিপ্ট (ES6), 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);}}

অবরুদ্ধ সংস্করণ:

#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'

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.