网格上的转子路由器


10

输入值

您的输入是一个字符串,由换行符分隔成一些整数2n+1的长度行。整数不属于输入;您必须从字符串中进行计算。这些行由“方向字符”组成。如果换行符引起问题,则可以用竖管替换它们。2n+1n ≥ 0n>^<v|

输入形成一个大小为方格的正方形网格(2n+1)x(2n+1),并且网格的每个像元都解释为转子路由器,它指向四个基本方向之一。我们继续将令牌放在网格中心的路由器上,然后路由器将以以下方式移动令牌。当令牌落在路由器上时,路由器将沿逆时针方向旋转90度,并将令牌在其指向的新方向上移动一步。如果它落在另一个路由器上,则重复该过程,但是最终,令牌将脱离网格。

输出量

您的输出是路由器的最终配置,格式与输入相同。

作为示例输入,请考虑3x3网格

<^<
^><
>^v

中央路由器已高亮显示以指示令牌(很难看到)。中央路由器旋转以面向北方,并将令牌移动到第一行的中央单元格:

<^<
^^<
>^v

此路由器向西旋转,并将令牌发送到左上角:

<<<
^^<
>^v

角落中的路由器将令牌发送到南方,因此它现在位于中间行的最左侧单元格:

v<<
^^<
>^v

该路由器旋转以面向西,并将令牌发送出网格。

v<<
<^<
>^v

这是最终的网格配置,因此您的程序应将其输出。请注意,在更复杂的示例中,令牌在脱离网格之前可以多次通过同一路由器。

规则

您可以编写函数或完整程序。这是代码高尔夫球,因此最低的字节数为准。不允许出现标准漏洞。您可以确定输入和/或输出中是否有尾随换行符。

测试用例

Input:
v
Output:
>

Input:
<^<
^><
>^v
Output:
v<<
<^<
>^v

Input:
>>^>>
v<vv<
>^>^<
^<>>^
vvv>>
Output:
>>^>>
>v>>v
^>>vv
^^>>>
v^<<^

Input:
<^^^^^^^^
<<^^^^^^>
<<<^^^^>>
<<<<^^>>>
<<<<^>>>>
<<<vv>>>>
<<vvvv>>>
<vvvvvv>>
vvvvvvvv>
Output:
>>>>>>>>v
^>>>>>>vv
^^>>>>vvv
^^^>>vvvv
<<<<<vvvv
^^^^<<vvv
^^^<<<<vv
^^<<<<<<v
^<<<<<<<<

是否应该将“向东旋转”这两个实例说成“向西旋转”?
彼得·泰勒

@PeterTaylor好收获。我总是把两者混为一谈。
Zgarb 2015年

输入字符串是否以换行符终止?
edc65

@ edc65您也可以自己决定,也用于输出。但是,没有前面的换行符。
Zgarb

Answers:


3

CJam,62 61 63字节

在线尝试

Nq_N#):D;+_,2/{:P"^<v>^

"_P4$=#:X)=t_,0PX[1DW*WDSP]=-e>e<}h;1>

展开并评论:

Nq              "Read the input grid";
_N#):D;         "Calculate the vertical delta (line length + 1)";
+               "Prepend a newline to the grid";
_,2/            "Calculate the initial position as the length of the grid
                 string divided by 2";
{               "Do...";
  :P"^<v>^

"
  _P4$=           "Get the character indexed by the position in the grid";
  #:X             "Map the character to an operation number:
                   '^'=>0, '<'=>1, 'v'=>2, '>'=>3, '^'=>4, '\n'=>5, '\n'=>6
                   (the unreachable duplicate mappings are important below)";
  )=t             "Set the character indexed by the position in the grid to
                   the result of mapping the operation number + 1 backwards";
  _,0PX[1DW*WDSP]="Map the operation number to a negated delta (this occurs
                   after rotating routers, which means that operation n should
                   act like the character corresponding to operation n + 1):
                   0=>1, 1=>-delta, 2=>-1, 3=>delta, 5=>position";
  -e>e<           "Subtract the negated delta from the position and clamp it to
                   [0, length of the grid string] (array indices are circular,
                   so the length of the grid string will act like the index 0
                   and point to the initial newline next iteration, which will
                   *really* set the position to 0)";
}h              "... while the position is not 0 (i.e. not at the initial
                 newline)";
;1>             "Clean up and remove the initial newline";

我的解决方案以扁平字符串的形式在输入上进行操作,因此只有一个位置值可用于跟踪,几乎没有预处理/后处理。只有2个字节的预处理可将换行符添加到网格的开头,而2个字节的后处理可将其从输出中删除。但是这4个字节非常值得,因为它们让我保留换行符并像路由器一样“执行”它们,但是它们“旋转”到另一个换行符并将位置设置为零。当位置变为零时,主循环结束。


我裁定不幸的是,前面的换行符必须走。只允许尾随的。
Zgarb 2015年

@Zgarb固定,+ 2个字节。
Runer112

您链接的输出似乎不正确
aitsu退出,因为SE为EVIL

@aditsu你确实是正确的。我不确定自己碰过什么,我发誓它过去工作正常。我会调查一下。
Runer112

@aditsu证明减法不是可交换的。感谢您指出它已损坏,很容易修复。但是现在注释之一触及了代码。:(
Runer112

2

CJam,90 69字节

q_,mqi):L_*Lm2/(:X;{_X_@="^<v>"_@#_[WL1LW*]=X+:X;)=tX)L%XW>XLL(*<**}g

到目前为止,还可以减少很多。

在这里在线尝试


1
诅咒,再次挫败!我本来打算发布70字节的CJam解决方案,但现在似乎需要重新考虑。
Runer112

1

的JavaScript(ES6)121 120 127 129

一个将字符串作为输入参数并返回输出的命名函数。
假设输入字符串以换行符终止。

编辑错误修复程序,.search()不能很好地与undefined

F=s=>(o=~s.search('\n'),s=[...s],
R=p=>~(u='^<v>'.indexOf(s[p]))?R(p+[-1,-o,1,o][u],s[p]='<v>^'[u]):s)(-~o*o/2-1)
.join('')

脱节和解释

F=s=>{
  o = s.search('\n')+1; // offset to next row
  s = [...s]; // string to array
  R=p=>{ // recursive search functiom, parameter p is current position in grid
    u = '^<v>'.indexOf(s[p]); // find direction
    if (u<0) return s; // if no direction found, out of grid -> stop recursion
    s[p] = '<v>^'[u] // set new direction into the array cell 
    return R(p+[-1,o,1,-o][u]) // call recursive function with new position
  }
  return R((o-1)*o/2-1) // start recursive search with initial position at grid center
  .join('') // array to string
}

在Firefox / FireBug控制台中测试

s='<^^^^^^^^\n\
<<^^^^^^>\n\
<<<^^^^>>\n\
<<<<^^>>>\n\
<<<<^>>>>\n\
<<<vv>>>>\n\
<<vvvv>>>\n\
<vvvvvv>>\n\
vvvvvvvv>\n'
console.log(F(s))

输出量

>>>>>>>>v
^>>>>>>vv
^^>>>>vvv
^^^>>vvvv
<<<<<vvvv
^^^^<<vvv
^^^<<<<vv
^^<<<<<<v
^<<<<<<<<
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.