আইস 523 এর জন্য একটি ব্যাকলিপ করুন!


16

এই চ্যালেঞ্জের জন্য একটি পুরস্কার হল ais523 জন্য বিজয়ী " বছরের সেরা সৈন্য " বিষয়শ্রেণীতে অন্তর্ভুক্ত " PPCG 2016 এর শ্রেষ্ঠ "। অভিনন্দন!


ব্যাকফ্লিপ ব্যবহারকারী আইস 523 দ্বারা তৈরি একটি রহস্যময় প্রোগ্রামিং ল্যাঙ্গুয়েজ , যিনি 30 টিরও বেশি আকর্ষণীয় esolangs ভাল তৈরি করেছেন

ব্যাকফ্লিপটি বেফুঞ্জ বা > <> এর মতো একটি 2D ভাষা যেখানে নির্দেশিকা পয়েন্টারটি যে অক্ষরটি চলছে তার উপর নির্ভর করে দিক, পরিবর্তন, উপরে, নীচে, বাম এবং ডানদিকে সরানো, পাঠ্যের একটি গ্রিড (প্রোগ্রাম) সরিয়ে দেয়। সমালোচকদের, একটি BackFlip প্রোগ্রামে গ্রিড পরিবর্তন যেমন ভেদকরেখার হচ্ছে, মত একটি বিট Langton এর অ্যান্ট

এই চ্যালেঞ্জের জন্য আপনি ধরে নিতে পারেন যে ব্যাকফ্লিপ প্রোগ্রামটি সর্বদা পাঠ্যের একটি আয়তক্ষেত্রাকার গ্রিড (সমস্ত লাইন একই দৈর্ঘ্য), সর্বনিম্ন আকারে 1 size 1 থাকে, কেবলমাত্র অক্ষর থাকে ./\<>^V। ( .স্থানের পরিবর্তে দৃশ্যমানতার জন্য ব্যবহৃত হয়)) শব্দার্থগতভাবে আমরা এখানে ব্যাকফ্লিপটি ব্যবহার করব এটি মূল বৈশিষ্টের মতো ident

ব্যাকফ্ল্যাপে নির্দেশিকা পয়েন্টার (আইপি) সর্বদা প্রোগ্রামের উপরের-বাম কোণে ডানদিকের শিরোনামে শুরু হয়। এটির তিন ধরণের আদেশ রয়েছে যার মুখোমুখি হতে পারে:

  1. .একটি অপ- অপ হয়। আইপিটি যেদিকে যাচ্ছিল সে দিকে চালিয়ে যায়। নো-অপশন কোনও অপ-আপ থাকে।

  2. /এবং \আয়না হয়। তারা তাদের কোণ দ্বারা নির্দেশিত আইপি প্রতিফলিত করে, তারপর তারা অন্য ধরণের আয়নাতে পরিবর্তিত হয়

    • উদাহরণস্বরূপ, আইপি যদি একটিতে রেখে যায় তবে \এটি বামের পরিবর্তে উপরের দিকে অগ্রসর হতে শুরু করে এবং এটি \একটি হয়ে যায় /
  3. <, >, ^, এবং Vতীর হয়। তারা আইপিটিকে যে দিকে নির্দেশ করেছে সে দিকে পুনর্নির্দেশ করে, তারপরে তারা একটি তীরতে পরিবর্তিত হয় যা আইপিটি যে দিক থেকে এসেছিল নির্দেশ করে (আইপিটি যে দিকে চলছিল তার বিপরীতে)

    • উদাহরণস্বরূপ, আইপি যদি নীচের দিকে চলে যায় তবে এটি নীচের >দিকে ডানদিকে চলতে শুরু করে এবং আইপিটি যে দিক থেকে এসেছিল সে কারণ >হয়ে যায় ^

একটি ব্যাকফ্ল্যাপ প্রোগ্রাম সমাপ্ত হয় যখন আইপি সীমার বাইরে চলে যায়, অর্থাত্ গ্রিড বন্ধ হয়ে যায়। এটি সব দেখা যাচ্ছে ব্যাকফ্ল্যাপ প্রোগ্রামগুলি অবশেষে শেষ হয় কারণ অসীম লুপগুলি অসম্ভব। (আপনি ধরে নিতে পারেন এটি সত্য।)

এই চ্যালেঞ্জের আপনার লক্ষ্যটি এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা ব্যাকফ্লিপ প্রোগ্রামে লাগে এবং প্রোগ্রামটি শেষ হওয়ার আগে নির্দেশ পয়েন্টারটির যে সংখ্যাটি চালিয়ে যায় তার আউটপুট দেয়। এটাই, কোনও প্রোগ্রাম চালানোর সময় আইপি কত পদক্ষেপ গ্রহণ করে? এর মধ্যে গ্রিডের প্রাথমিক পদক্ষেপ এবং এর চূড়ান্ত পদক্ষেপ অন্তর্ভুক্ত রয়েছে।

উদাহরণস্বরূপ, নির্দেশ পয়েন্টারটি তুচ্ছ গ্রিডে 5 টি পদক্ষেপ নেয় ....:

 ....  <- empty 4×1 grid
012345 <- step number of the IP

সুতরাং আউটপুট ....হয় 5

আরও জটিল 4 × 2 গ্রিডে

\...
\.><

আইপি তার নবম ধাপে গ্রিড থেকে প্রস্থান করে, তাই আউটপুটটি হ'ল 9:

step  grid  IP position (@)
0     \...  @....
      \.><   ....

1     \...   @...
      \.><   ....

2     /...   ....
      \.><   @...

3     /...   ....
      /.><   .@..

4     /...   ....
      /.><   ..@.

5     /...   ....
      /.<<   ...@

6     /...   ....
      /.<<   ..@.

7     /...   ....
      /.><   .@..

8     /...   ....
      /.><   @...

9     /...   ....
      \.><   ....
             @

বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।

আপনি চাইলে মাল্টলাইন স্ট্রিংয়ের পরিবর্তে লাইনগুলির অক্ষরের ম্যাট্রিক্স বা ম্যাট্রিক্স হিসাবে ইনপুট নিতে পারেন, তবে আপনাকে অবশ্যই অক্ষরগুলি ব্যবহার করতে হবে ./\<>^V(পূর্ণসংখ্যার অপকড নয়)। আপনি .পছন্দ হলে পরিবর্তে স্থান ব্যবহার করতে পারেন । চরিত্রগুলি পছন্দ করলে এটি ঠিক আছে\ যদি ইনপুট থেকে পালাতে হয় তবে তা ঠিক। আউটপুট সর্বদা একের বেশি একটি পূর্ণসংখ্যা হয়।

পরীক্ষার কেস

....
5

\...
\.><
9

.
2

..
3

.
.
2

\
2

^
2

.^.
3

<.
2

\\
\/
7

>V
^<
6

>\
>/
6

\><
2

\><
\><
7

\><
\><
\><
12

\.V.
\.\<
5

\.V.
\./<
9

V./\
V./\
>./<
..\/
14

\V..
.^..
\/><
.V..
.^..
20

\.V.V.
\./.\<
.>\<..
..^.^.
31

\.V.V.V.
\./>/.\<
.>\>\<..
..^.^.^.
69

\.V.V.V.V.
\./>/>/.\<
.>\>\>\<..
..^.^.^.^.
145

\.V.V.V.V.V.V.V.V.V.V.
\./>/>/>/>/>/>/>/>/.\<
.>\>\>\>\>\>\>\>\>\<..
..^.^.^.^.^.^.^.^.^.^.
9721

1
এটি এমন লজ্জাজনক যে আপনি এটির জন্য ব্যাকফ্লিপ সমাধান করতে পারবেন না ...
HyperNeutrino

আয়নাগুলি সম্পর্কে বিভ্রান্ত ... বামে => উপরে এবং উপরে => বাম হিসাবে দিকগুলি উল্টে দেয়?
অফিসিয়ালাইম

1
@Fficialaimm বাম দিক থেকে /শিরোনামে আইপি উপরে উঠবে এবং উপরের দিকে যেতে শিরোনাম /আইপিটি ডানদিকে যাবে, যেন এটি কোনও প্রাচীরের উপরের দিকে ঝাঁকানো বল। (তবে /আইপিটি স্পর্শ করার পরে ব্যাকস্ল্যাশের পরিবর্তনগুলি মনে রাখবেন ))
ক্যালভিনের

'\\' <LF> '\ /' 6 এর পরিবর্তে 7 কেন?
tsh

উত্তর:


3

জাভাস্ক্রিপ্ট (ES6), 158 বাইট

f=(a,x=0,y=0,d=3)=>a[x]&&(c=a[x][y])?(a[x][y]=c=='.'?c:c=='/'?(d^=3,'\\'):c=='\\'?(d^=1,'/'):'v>^<'[d][d='^<v>'.search(c),0],f(a,d<3?x+d-1:x,d?y+d-2:y,d)+1):1

মারাত্মকভাবে মিল থাকলেও @ tsh এর উত্তর থেকে স্বাধীনভাবে বিকাশ হয়েছে।

^<v>পূর্ণসংখ্যার 0-3- এর দিকে দিকনির্দেশের মানচিত্রটি নিয়ন্ত্রিত হয় যে .search('^')0 থেকে যেহেতু প্রত্যাবর্তন ^হয় তা একটি রেজিএক্সপ্যাক মেটাচার্যাক্টর।


আমি খুব মারধর বোধ করছি। আমি যেটা প্রত্যাশা করেছিলাম তার তুলনায় এক্স এবং ওয়াই উল্টে না যাওয়া পর্যন্ত আমি সেখানে শেষে বেশ বিভ্রান্ত হয়ে পড়েছিলাম।
janrjan জোহানসেন

@ JanrjanJohansen এটি একটি ভাল পয়েন্ট; এটি বুঝতে সহজতর করার জন্য আমার সর্বত্র y এর সাথে এক্স অদলবদল করা উচিত।
নীল

2

হাস্কেল , 333 325 বাইট

সম্পাদনা করুন:

  • -8 বাইট: fপয়েন্টফ্রি তৈরি এবং এতে একত্রিত হয়েছে b

bএর একটি তালিকা নেয় Stringএবং একটি প্রদান করে Integer

data C a=C{c::a->(a,C a)}
b g=[0,0]#([0,1],map(maybe(C$m 1)C.(`lookup`zip"./^>V<"[n,m(-1),a[-1,0],a[0,1],a[1,0],a[0,-1]]))<$>g)
[y,x]#(d,g)|g&y||g!!0&x=1|n@([f,e],_)<-(($d).c)?x?y$g=1+[y+f,x+e]#n
l&i=i<0||i>=length l
(f?i)l|(p,a:r)<-splitAt i l=(p++).(:r)<$>f a
n d=(d,C n)
a v d=(v,C$a$(0-)<$>d)
m s[d,e]=([s*e,s*d],C$m(-s))

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

  • C aএকটি ডেটা টাইপ ব্যবহৃত হয় কারণ হাস্কেল কোনও প্রকারটিকে স্পষ্টভাবে ঘোষণা না করে পুনরাবৃত্ত হতে দেয় না। Cএছাড়াও একটি মোড়ক নির্মাণকারী এবং cএটি সম্পর্কিত আনারপ্যাটিং ফাংশন। এটি শুধুমাত্র সঙ্গে ব্যবহৃত হয় a=[Int]
    • প্রকারটি C [Int]একটি সেল কমান্ডকে এমন একটি ফাংশন হিসাবে উপস্থাপন করে যা একটি দিক ( [Int]) টি আর্গুমেন্ট গ্রহণ করে এবং একটি নতুন দিক এবং একটি নতুন C [Int]মান একটি জোড়া দেয় ।
  • bপ্রধান কাজ। এটি প্রতিটি চরিত্রকে একটি Cমান রূপান্তর করে , তারপরে এটি কল করে#
    • g স্ট্রিংগুলির তালিকা হিসাবে গ্রিড।
    • যেহেতু \পালানো দরকার এবং তেমনি দীর্ঘতম চরিত্রটিও উল্লেখ করা উচিত, ফলস্বরূপ তালিকাটি অনুসন্ধানের জন্য এটি ডিফল্ট মান হিসাবে ব্যবহৃত হয়।
  • #মূল সিমুলেশন চালায়, এর সাথে সীমা পরীক্ষা করে &এবং এর সাথে নতুন গ্রিড উত্পন্ন করে ?[y,x]বর্তমান অবস্থান, dবর্তমান দিক এবং gবর্তমান গ্রিড। [f,e]পরবর্তী দিক, এবং nএটি এবং পরবর্তী গ্রিডের একটি জুটি।
  • l&iসূচকের iতালিকার সীমা ছাড়িয়ে গেছে কিনা তা পরীক্ষা করে দেখুন l। (এটি Trueসীমানার বাইরে ফিরে আসে , যেহেতু এটি একটি ডামি গার্ড শর্তটিকে এড়িয়ে চলে #))
  • কখন f(l!!i)==(d,x), থিম উপাদানটির সাথে তালিকাটি (f?i)l==(d,m)কোথায় প্রতিস্থাপন করা হবেmlix
    • প্রযুক্তিগতভাবে (?i)আরও সাধারণ লেন্স, তালিকার (,) [Int]উদাহরণের সাথে মনোযোগ নিবদ্ধ করে, এই ক্ষেত্রে ফান্টারের উদাহরণ সহ ব্যবহৃত হয় ।
  • n বিন্দু প্রতিনিধিত্ব করে ফাংশন।
  • a v দিকনির্দেশে একটি তীর উপস্থাপন করা একটি ফাংশন v
  • m sএকটি আয়না প্রতিনিধিত্ব করে একটি ফাংশন; s==1জন্য \\এবং s==-1জন্য /

1

জাভাস্ক্রিপ্ট, 172 বাইট

f=(a,d=3,x=0,y=0,n=1)=>(p=a[y]||[],q=p[x])?(p[x]=~(t='^<V>'.indexOf(q))?'^<V>'[d^2]:q=='/'?(t=3-d,'\\'):q=='\\'?(t=d^1,'/'):(t=d,q),f(a,t,x+(t&1&&t-2),y+(~t&1&&t-1),n+1)):n

আমার মেশিনে স্ট্যাক ওভারফ্লো হয়ে যাওয়ার পরে আমি শেষ টেস্টকেসটি পরীক্ষা করতে পারছি না। (বৃহত্তর র্যাম সহ কোনও মেশিন থাকলে কাজ করা উচিত)

আমরা দিকনির্দেশের জন্য একটি সংখ্যা ব্যবহার করি:

  • 0: ^
  • 1: <
  • 2: ভি
  • 3:>

dদিক নম্বর হউক ...

  • যদি আমরা একটি '/' পূরণ করি, আমাদের d = 3 - d প্রয়োজন;
  • যদি আমরা একটি '\' পূরণ করি তবে আমাদের d = d ^ 1 প্রয়োজন;
  • যদি আমরা একটি '^ <V>' এর সাথে সাক্ষাত করি তবে আমাদের d = '^ <V>' দরকার ind

দিন (x, y)বর্তমান অবস্থান হতে, পরবর্তী অবস্থা বোঝা যায়, x+(t&1&&t-2),y+(~t&1&&t-1)

বিঃদ্রঃ:

ফাংশনটি নিম্নলিখিত বিন্যাসের সাথে একটি পরামিতি নেয়:

[ [ '\\', '.', 'V', '.', 'V', '.', 'V', '.', 'V', '.' ],
  [ '\\', '.', '/', '>', '/', '>', '/', '.', '\\', '<' ],
  [ '.', '>', '\\', '>', '\\', '>', '\\', '<', '.', '.' ],
  [ '.', '.', '^', '.', '^', '.', '^', '.', '^', '.' ] ]

এটি এখানে পরীক্ষা করুন

f=(a,d=3,x=0,y=0,n=1)=>(p=a[y]||[],q=p[x])?(p[x]=~(t='^<V>'.indexOf(q))?'^<V>'[d^2]:q=='/'?(t=3-d,'\\'):q=='\\'?(t=d^1,'/'):(t=d,q),f(a,t,x+(t&1&&t-2),y+(~t&1&&t-1),n+1)):n

    ;k=x=>x.split('\n').map(t=>t.split(''));
<textarea id=v>\.V.V.V.V.
\./>/>/.\<
.>\>\>\<..
..^.^.^.^.</textarea><br/><button onclick="r.textContent=f(k(v.value))">Solve</button>
<p>Result: <output id=r></output></p>


শুধু ডকুমেন্ট করতে, আমি Uncaught RangeError: Maximum call stack size exceeded16 জিবি র‌্যাম নিয়ে আসছি ।
জেব ম্যাককর্কল

1
@ জেবিএমসি কর্কল আহা, কেবল এটি খুঁজে নিন যে "কঠোর ব্যবহার করুন" এবং কিছু varঘোষণা এটি শেষ টেস্টকেসটি পাস করে (জেএস ইন্টারপ্রেটার টাল কলটি কড়া মোডে অনুকূলিত করে)
tsh

1

সি, 232 221 বাইট

d,n,t,m[4]={1,-1};char*w="><^V/\\.",*P;main(o,v)char**v;{for(P=v[1],m[2]=-(m[3]=strchr(P,10)-P+1);P>=v[1]&&P<strchr(v[1],0)&&*P^10;++n)*P=w[((o=d,t=strchr(w,*P)-w)<4)?d=t,o^1:(t<6)?d^=t-2,9-t:6],P+=m[d];printf("%d",n+1);}

প্রথম যুক্তিতে ইনপুট নেয়, ফলাফল মুদ্রণ করে। ইনপুটটিতে কমপক্ষে 1 টি নতুন লাইন থাকা দরকার (সুতরাং যদি কেবল 1 টি সারি থাকে তবে এটি অবশ্যই একটি নতুন লাইন দিয়ে শেষ হবে)

ব্যবহারের উদাহরণ:

./backflip '....
';

ভাঙ্গন:

d,                                          // Direction
n,                                          // Step counter
t,
m[4]={1,-1};                                // Movement offsets
char*w="><^V/\\.",                          // Command lookup
*P;                                         // Cursor location
main(o,v)char**v;{
    for(P=v[1],                             // Begin at 0,0
        m[2]=-(m[3]=strchr(P,10)-P+1);      // Find width of grid
        P>=v[1]&&P<strchr(v[1],0)&&*P^10;   // While inside grid:
        ++n)                                //  Increment step
        *P=w[                               //  Update the current cell
            ((o=d,t=strchr(w,*P)-w)         //  (store current direction & command)
              <4)?d=t,o^1:                  //   If <>^V, write backflip & set dir
            (t<6)?d^=t-2,9-t:               //   If / or \, write flip & bounce
            6],                             //   If ., write unchanged & continue
        P+=m[d];                            //  Move
    printf("%d",n+1);                       // Print result
}

1

পাইথন 3 , 286 বাইট

[এফ () রূপে ইনপুট নেয় {(0,0):'/',(0,1):'.'}তাই আমি লাইনগুলির একটি অ্যারে রূপে রূপান্তর করার জন্য একটি ফাংশন জি ()ও লিখেছি]

def f(r):
 x=y=0;d='>';s=1
 while 1:
  try:c=r[y,x];m='>^<V'.find(d)
  except:break
  if(c=="\\"):d='V<^>'[m];r[y,x]="/"
  elif(c=="/"):d='^>V<'[m];r[y,x]="\\"
  elif(c!="."):r[y,x]='<V>^'[m];d=c
  x+=1if(d=='>')else-1if(d=='<')else 0;y+=1if(d=='V')else-1if(d=='^')else 0;s+=1
 return s

এটি অনলাইন চেষ্টা করুন!

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