ফিশী রাস্তার কি শেষ আছে?


13

আমি> <>,> <> জীবন জীবন! 2 ডি ল্যাঙ্গেজ আশ্চর্যজনক! এই চ্যালেঞ্জের মধ্যে, আপনাকে বলতে হবে কোড-গল্ফ করার সময় কোনও "ফিশি" রাস্তার কোনও শেষ আছে কিনা।

সংজ্ঞা

নীচের রাস্তাগুলি সহ টাইলস সহ একটি ফিশিয় রোড নির্মিত হয়েছে:

v (go down)
> (go right)
^ (go up)
< (go left)
/ (mirror)
\ (mirror)

অন্য যে কোনও চরিত্রকে (বাদে -|+) রাস্তার সীমানায় কিছু ফুল (বা মাছের মাথা) এর মতো একটি ব্যাঘাত হিসাবে বিবেচনা করা যেতে পারে।

একটি রাস্তা সর্বদা একটি আয়তক্ষেত্রাকার গ্রিডের উপরের-বাম কোণে শুরু হয়, -|+প্রতীক দ্বারা সীমাবদ্ধ । রাস্তাটির একটি সমাপ্তি রয়েছে যদি এটি অনুসরণ করে আপনি একটি সীমান্তে পৌঁছে যান, অন্যথায়, আপনি অসীম পথে আটকা পড়বেন।

রাস্তায় আপনার পথ সন্ধান করা v>^<এবং মিরর দ্বারা প্রদত্ত নির্দেশাবলী অনুসরণ করে সম্পন্ন হয় । আপনি কোথায় এসেছেন তার উপর নির্ভর করে একটি আয়না 90% দ্বারা প্রতিফলিত হবে। এটি কীভাবে কাজ করে তা এখানে ( v>^<দিকনির্দেশ দেখানোর জন্য ব্যবহার করে):

 ^    ^
>/<  >\<
 v    v
</>  <\>
 ^    ^

কোনও রাস্তা যদি শেষ হয় তবে এটির মতো দেখাচ্ছে:

+--------------------+
|>\/  this way >\/>  | this one ends here
| v^            \/   |
| v^   ^.^           |
| \/\         >v     |
| /\/         ^<     |
+--------------------+

অসীম লুপ:

+--------+
|>>\ This|
|\\   is |
|  \\ a  |
| \ /trap| 
+--------+

সুনির্দিষ্ট

কোনও রাস্তা অগত্যা কেবলমাত্র নির্দেশাবলীর সমন্বয়ে থাকে। এটি সম্পূর্ণ করতে স্পেস বা অক্ষর ব্যবহার করা যেতে পারে। এর অর্থ আপনি কোনও অক্ষর অতিক্রম না করেই আপনাকে একই দিকে অগ্রসর হতে হবে <v^>-|

v>^<উপরের-বাম কোণে সর্বদা যে কোনও একটি থাকবে <বা ^এই রাস্তাটির প্রান্তটি বোঝায়।

আপনি প্যারামিটার হিসাবে একটি স্ট্রিং গ্রহণ করে একটি ফাংশন জমা দিতে পারেন, বা আপনার ভাষার সবচেয়ে নিকটতম বিকল্প যা যা STDIN / ব্যবহার করে একটি স্ট্যান্ডেলোন প্রোগ্রাম।

আপনার জমাটি শেষ হয়ে গেলে অবশ্যই STDOUT সত্যতা / মিথ্যা মানগুলিতে মুদ্রণ করতে হবে বা প্রিন্ট করতে হবে। সত্যবাদী মানগুলির অর্থ রাস্তার একটি শেষ আছে, যখন মিথ্যা মানে এটি একটি অসীম লুপ।

পরীক্ষার মামলা

+--------------------+
|>\/  this way >\/>  | this one ends here
| v^            \/   |
| v^   ^.^           |
| \/\         >v     |
| /\/ ><>     ^<     |
+--------------------+
    True

+--------+
|>>\ This|
|\\   is |
|  \\ a  |
| \ /trap| 
+--------+
    False

+--+
|<v|
|^<|
+--+
    True

+--+
|>v|
|^<|
+--+
    False

+----------+
|v Hello \ |
|\\/\/   / |
| \/\\   \ |
|/  // >\  |
|  ^/\>\\/ |
|\  /\/\/  |
+----------+
    False

+-----+
|>\/\\|
|//\\/|
|\/\\\|
|//\//|
|\/\/ |
+-----+
    True

2 test cases added as suggested by @MartinBüttner
+----+
|v   |
|\\  |
|//\ |
|\\v |
| \/ |
+----+
    False

+----+
|v   |
|\\  |
|//\ |
|\\^ |
| \/ |
+----+
    False

Test case inspired by @ETHproductions
+-------------------------+
|><>                      |
|something smells fishy...|
+-------------------------+
    False

স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ (সর্বদা হিসাবে)।

বিজয়ী হবেন বাইটের মধ্যে সংক্ষিপ্ততম কোড সহ। (এটি একটি> <> উত্তর দেখতে আশ্চর্যজনক হবে :))



1
এটি আরও ভাল একটি> <> উত্তর পান ...
তালি দিন

@ কনফিউজড এমআর_সি যদি আমার এই ল্যাঙ্গেজটি জানত তবে আমার নিজের উপর চাপিয়ে দেবে: /। আমি যদি সময় পাই
find

আমি অনুমান করি যে ইনপুটটি> <> তে রূপান্তরিত করা হবে এবং তারপরে> <> দোভাষীকে কল করুন (গণনার মধ্যে কোডটি অন্তর্ভুক্ত না করে) একটি ফাঁকফোকর হবে?
পাওলো ইবারম্যান

1
@ PaŭloEbermann এটির একটি ফাঁকফুল না হওয়ার জন্য আপনাকে দোভাষীর মধ্যে এই চরিত্রটি গণনা করতে হবে, বা বিল্ট-ইন> <> দোভাষীর সাথে একটি ল্যাঙ্গেজ ব্যবহার করতে হবে এবং আমি মনে করি না এটি বিদ্যমান ^^ ^^
কাটেনকিও

উত্তর:


4

জাভাস্ক্রিপ্ট, ES6, 177 161 145 বাইট

f=(s,i=1,M=[],D)=>D==5||!~M[O="indexOf"](D+i)&&f(s,i-[M.push(D+i),L=s[O]('|'),-L,1,-1][D=`431255${5-D+'X3412'[D]}`['><^v-|/\\'[O](s[i+L])]||D],M,D)

আমরা পথটি অনুসরণ করে এবং একটি টিউপের পুনরাবৃত্তি সনাক্ত করে একটি চক্র সনাক্ত করতে পারি

  • অবস্থান
  • দিকনির্দেশ

এটি হ'ল আমরা যদি দ্বিতীয় বারের জন্য (x,y)কিছু দিক থেকে কিছু অবস্থান নিয়ে প্রবেশ করি তবে আমরা Dজানি যে এই চক্রটি চিরতরে পুনরাবৃত্তি হবে। অতএব, কোডটি যে সমস্ত স্থান পরিদর্শন করা হয়েছিল এবং কোন দিক থেকে, এবং প্রতিবার নতুন স্থান পরিদর্শন করা হলে সেই রেকর্ডের বিপরীতে পরীক্ষা করে were

দিকনির্দেশ ঊর্ধ্বমুখী, নিম্নমুখী, বাম এবং ডান নম্বর হস্তান্তর করা হয়েছে 1, 2, 3, এবং 4। কোডটি বর্তমান প্রতীকটি পরিদর্শন করা ( s[i+L]) এবং বর্তমান দিশা ( D) পরিবর্তন করে , তারপরে নতুন দিকটি পুনরাবৃত্তভাবে ফাংশনটি কল করতে এবং পরবর্তী স্থানটি মূল্যায়ন করতে ব্যবহৃত হয়।5দিকনির্দেশটি কোনও প্রাচীর এবং trueপ্রোগ্রামটির সমাপ্তি নির্দেশ করে ।

এখানে কম-গল্ফযুক্ত কোডের ব্যাখ্যা:

f=
(s,     // input string
 i=1,   // current location as offset string index
 M=[],  // record of previously visited spaces
 D      // current direction
  )=>(
    L=s[O="indexOf"]('|'), // find arena width `L` by index of first `|`

    // if D is 5, return true, or...
    D==5 ||

    // if direction + position is not new, return false
    !~M[O](D+i) &&

    // otherwise, save this direction + position
    M.push(D+i) &&

    // recursively call `f` with new direction and position
    f(s,
      i-[,L,-L,1,-1][D=            // modify position based on active direction
        `431255${5-D+'X3412'[D]}`  // from these possible directions...
          [                        // chose the one at the index...
            '><^v-|/\\'[O](        // based on the index of the symbol 
                           s[i+L]  // of the current character
                                 )
          ]
        ||D     // or preserve old D if symbol is not directional
      ],
      M,D)

টেম্পলেট স্ট্রিংয়ের `431255${5-D+'X3412'[D]}`একটি নেস্টেড এক্সপ্রেশন রয়েছে যা আয়নাগুলি পরিচালনা করে: কারণ দিকগুলি সংখ্যা হওয়ায় সেগুলি সূচক হিসাবেও ব্যবহার করা যেতে পারে। এই অভিব্যক্তিটি 'X3412'[D], সম্ভাব্য দিকের স্ট্রিংয়ের 8 তম বর্ণকে মূল্যায়ন করে \এবং প্রতীক স্ট্রিংয়ের 8 ম অক্ষরের সাথে মিলে যায়'><^v-|/\\' )। অভিব্যক্তিটি বলে,

  • যদি বর্তমান দিকটি (আপ) হয় তবে Dএটিকে 1আঘাত করার ক্ষেত্রে নতুন দিক\ আয়না করা হবে 3(বামে)
  • যদি বর্তমান দিকটি (নিচে) হয় তবে Dএটিকে 2আঘাত করার ক্ষেত্রে নতুন দিক\ আয়না হতে হবে 4(ডান)
  • প্রভৃতি

অন্য আয়নাটি /এক্সপ্রেশনটি ব্যবহার করবে 'X4321'[D]তবে এটি যেহেতু কেবলমাত্র আদেশযুক্ত গণনা-থেকে 4, তাই আমরা এটিকে আরও সহজভাবে প্রকাশ করতে পারি 5-D


5

অ-অনুগত> <> উত্তর

আপনি চেয়েছিলেন> <>, আমি আপনাকে> <> দিন!

আমি বিশ্বাস করি> <> এ করার একমাত্র বুদ্ধিমান উপায় হ'ল কোডস্পেসের ইনপুটটি অনুলিপি করা এবং যদি ইনপুটটি কোথাও কোথাও চলে যায় তবে দোভাষীকে নিজেই সিদ্ধান্ত নিতে দেওয়া। যেহেতু> <> আর থ্রেডিং বাস্তবায়ন করে না, এটি আমাদেরকে একটি বড় সমস্যায় ফেলে দেয়: যদি ইনপুটটির কোনও লুপ থাকে তবে আমরা এতে আটকে যাব।

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

ওহ এবং যেহেতু আমি এখনই স্পষ্টভাবে অযোগ্য ঘোষণা করেছি, তাই কোডটি গল্ফ করে আমি বিরক্ত করিনি।

আর কোনও বিজ্ঞাপন ছাড়াই কোডটি সমস্ত গৌরবযুক্ত:

50i:0(?v   :"^"=?v:"v"=?v:">"=?v:"<"=?v:"/"=?v:"\"=?v:"|"=?v:"-"=?va=?v1+10.
>.!603f<         v"."~                                     <      <   >~1+010.
>.!01+1p}:$}:}v! <      <      <      <      <      <
  ;oooo"true" <<
              ^

এটি ব্যবহার করার জন্য, এটি অনলাইন দোভাষীগুলিতে অনুলিপি করুন, আপনার ইনপুট পরিচালনা করতে পর্যাপ্ত ট্রেইলিং লাইন যুক্ত করুন, কোডটি জমা দিন, ইনপুটটি- বিভক্ত লাইন হিসাবে ;দিন এবং যাত্রায় উপভোগ করুন।

কয়েকটি পরীক্ষা:

সঙ্গে

+--------------------+
|>\/  this way >\/>  | this one ends here
| v^            \/   |
| v^   ^.^           |
| \/\         >v     |
| /\/         ^<     |
+--------------------+` 

চূড়ান্ত কোডস্পেস:

50i:0(?v   :"^"=?v:"v"=?v:">"=?v:"<"=?v:"/"=?v:"\"=?v:"|"=?v:"-"=?va=?v1+10.
>.!603f<         v"."~                                     <      <   >~1+010.
>.!01+1p}:$}:}v! <      <      <      <      <      <
  ;oooo"true" <<
            ^
 ....................
.>\/           >\/>  .                   
. v^            \/   .
. v^   ^ ^           .
. \/\         >v     .
. /\/         ^<     .
 ....................

আউটপুটগুলি "সত্য" এবং থামে।


সঙ্গে

+--------+
|>>\ This|
|\\   is |
|  \\ a  |
| \ /trap| 
+--------+

চূড়ান্ত কোডস্পেস:

50i:0(?v   :"^"=?v:"v"=?v:">"=?v:"<"=?v:"/"=?v:"\"=?v:"|"=?v:"-"=?va=?v1+10.
>.!603f<         v"."~                                     <      <   >~1+010.
>.!01+1p}:$}:}v! <      <      <      <      <      <
  ;oooo"true" <<
            ^
 ........ 
.>>\     .
.\\      .
.  \\    .
. \ /    .
 ........

চিরকালের জন্য লুপস।


এটি অনুগত না হলেও, আমি আপনার উত্সটি ভালবাসি! এই প্রবেশের জন্য ধন্যবাদ! এটি দুঃখজনক যে এটি যখন চিরকালীন হয় তবে এটি চিরতরে চলে যায়, তবে ভাল কাজ ^^
কাটেনকিও

আমি অনলাইন ফিশ ইন্টারপ্রেটার আপডেট করেছি। এটি এখন
মাল্টলাইন

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