魚道は終わりましたか?


13

私は大好きです> <>、> <>は人生です!2Dの言語は素晴らしいです!このチャレンジでは、コードゴルフ中に「魚のような」道路に終わりがあるかどうかを言う必要があります。

定義

魚道は、次のものを含むタイルで構成されています。

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 / whateverを使用したスタンドアロンプ​​ログラムを送信できます。

あなたの提出は、それが完了したときに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
これは、より良い...> <>答えを得る
クラップ

@ConfusedMr_C私がこの言語を知っていれば、自分自身を着るでしょう:/。たぶん、時間を見つけたら^^ '
Katenkyo

入力を> <>に変換し、> <>インタープリターを呼び出す(カウントにそのコードを含めることなく)のは抜け穴になると思いますか?
パエロエベルマン

1
@PaŭloEbermann抜け穴にならないようにするには、インタープリターの文字をカウントするか、組み込みの> <>インタープリターで言語を使用する必要がありますが、存在しないと思います^^。
かてんきょう

回答:


4

JavaScriptを、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)、ある方向からの位置をD2回目に入力すると、このサイクルが永遠に繰り返されることがわかります。したがって、コードは、訪問されたすべての場所とその方向を追跡し、新しいスペースが訪問されるたびにそのレコードと照合します。

方向は上、下、左、右の数字が割り当てられ123、と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-|/\\'。表現は言う、

  • 現在の方向D1(上)の場合、\ミラーをヒットしたときの新しい方向は3(左)です。
  • 現在の方向D2(下)の場合、\ミラーを押すと新しい方向は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" <<
              ^

使用するには、オンラインインタープリターにコピーして、入力を処理するために十分な末尾の行を追加し、コードを送信して、入力を与えます ;-separated lines として、乗り心地を楽しんでください。

いくつかのテスト:

+--------------------+
|>\/  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     .
. /\/         ^<     .
 ....................

「true」を出力して停止します。


+--------+
|>>\ 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" <<
            ^
 ........ 
.>>\     .
.\\      .
.  \\    .
. \ /    .
 ........

永遠にループします。


準拠していない場合でも、あなたの情報源が大好きです!このエントリーをありがとう!それが真実であるはずなのに永遠にループするのは悲しいですが、とにかく良い仕事です^^。
かてんきょう

オンラインの魚通訳を更新しました。マルチライン入力をサポートするようになりました
Suppen

@Suppenやあ、いいね!最高速度も上げてくれてありがとう!
アーロン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.