这条鱼路结束了吗?


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提交独立的程序,无论哪种语言,您都可以使用。

完成后,您的提交必须返回或打印在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
这样更好地得到一个> <>答案...
2015年

如果我知道这种语言,@ ConfusedMr_C会戴上自己的:/。也许如果我能找到时间^^'
Katenkyo

我想将输入转换成> <>然后调用> <>解释器(不包括计数的代码)会是一个漏洞吗?
圣保罗Ebermann

1
@PaŭloEbermann为了避免出现漏洞,您需要在解释器中计算字符,或者使用内置的> <>解释器使用语言,但我认为它不存在^^。
Katenkyo 2015年

Answers:


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)从某个方向进入某个位置D,则我们知道该循环将永远重复。因此,该代码会跟踪所有访问过的位置以及从哪个方向跟踪,并在每次访问新空间时都对照该记录进行检查。

方向上,下,左,右的分配数量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" <<
              ^

要使用它,请在在线解释器中将其复制,添加足够的尾随行以处理您的输入,提交代码,以- ;分隔行的形式将其输入并享受旅程。

一些测试:

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

永远循环。


即使不符合规定,我也喜欢您的资料!感谢您的输入!可悲的是,当它虚假时,它会永远循环,但无论如何还是不错的。^^。
Katenkyo,2015年

我更新了在线鱼解释器。它现在支持多行输入
Suppen

@Suppen嘿,太好了!也感谢增加的最大速度!
亚伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.