沿轮廓移动箭头


28

沙盒

给定一组闭合的非重叠2d轮廓(即使在对角线上也至少间隔一个空格),并且箭头始终沿相同的顺时针或逆时针方向(每个轮廓都有自己的方向)和正数方向n移动箭头n在各个方向上沿着轮廓移动。箭头分别由> v < ^右,下,左和上方向表示。那里的其他字符是-(水平),|(垂直)和+(角)。当箭头位于角上时,它将保持其当前方向并仅在转弯后才更改。

在任何两个角之间始终会有一个直线段(或空间)(例如+-+水平方向和垂直方向类似),也就是说,U禁止急转弯。拐角之间的线段是垂直或水平的,拐角处的弯曲始终为90度。

输入:

  • 正整数-- n步骤数
  • 轮廓的ASCII表示-它可以是多行字符串,字符串列表,字符列表等。

输出:

带有所有箭头的相同轮廓n在每个轮廓的整体方向上移动了台阶。

测试用例:

1。

输入:

n = 1

 +----->->            
 |       |            
 |       v---+        
 |           |        
 +---<-------+      

输出:

 +------>+
 |       v
 |       +>--+
 |           |
 +--<--------+

2。

输入:

n = 2

 +-----+ +---+        
 |     | |   |        
 +-->--+ |   v  
         |   | 
 +--->---+   |        
 |           |         
 +------<<---+       

输出:

 +-----+ +---+
 |     | |   |
 +---->+ |   |
         |   | 
 +----->-+   v
 |           |     
 +----<<-----+        

3。

输入:

n = 3

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

输出:

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

4。

输入:

n = 1

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

输出:

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

5,

输入值

n = 4

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

输出:

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

6。

输入:

n = 1

^->
^ v
<<v

输出:

^>+
^ v
<<v

编写解决上述任务的函数或程序。每种语言中以字节为单位的最短代码获胜。不要因为打高尔夫球而灰心。高度赞赏算法和代码的说明。


两个轮廓可以碰到对角线上的角,还是轮廓本身可以碰触?
xnor

4
在我看来,“给出一组闭合的非重叠2d轮廓...箭头始终沿相同的顺时针或逆时针方向定向”,就像每个轮廓都沿相同的方向取向,而从测试案例来看,箭头仅在轮廓内保持一致。
xnor

3
@xnor感谢您的评论!-不可以,轮廓不允许在对角线上相互接触。-每个轮廓都有自己的方向。我将更新说明。
Galen Ivanov

2
墙壁之间没有空间可以输入吗?例如:在线尝试!。我知道您说过“至少间隔一个空格”,但是我不清楚这是仅适用于独立循环还是适用于单个循环。
约拿

1
@Jonah不行,不可能:There will always be a straight segment (or a space) between any two corners (like +-+ for the horizontal and similar for the vertical) - in other words the sharp U turns are forbidden.
Galen Ivanov

Answers:


14

JavaScript(ES6), 210 ...  182180 字节

(m)(n)

m=>g=n=>n?g(n-1,m=m.map((r,y)=>r.map((c,x)=>(i=0,h=$=>~$?(m[Y=y+($-2)%2]||0)[X=x+~-$%2]>h?"-|+"[n+=`;m[${Y}][${X}]=S[${$}]`,i?2:$&1]:h($^++i):c)((S="<^>v").indexOf(c)))),eval(n)):m

在线尝试!

怎么样?

您可以点击此链接查看源的格式化版本。

包装纸

Gñ-1个ñ=0

更新方式

我们不能一次安全地移动每个箭头,因为这样会冒用更新的箭头覆盖未更新的箭头的风险。相反,我们首先删除所有箭头并计算它们的新位置。我们第二次应用新职位。

ñ

ñ

"1;m[0][7]=S[2];m[1][8]=S[3];m[2][9]=S[2];m[4][3]=S[0]"

ñ

只需执行即可应用新职位eval(n)

方向

d$

1个0+23

dXdÿ

 d | dx = (d - 1) % 2 | dy = (d - 2) % 2
---+------------------+------------------
 0 |        -1        |         0
 1 |         0        |        -1
 2 |        +1        |         0
 3 |         0        |        +1

角落

Hdd异或1个d异或3

+-|d

H$H"$""$""$"

动画版


谢谢你的解释!
Galen Ivanov

8

K(ngn / k)183161157字节

{A:"^>v<";D,:-D:(-1 0;!2);s:(#x;#*x);c:~^x;r:" -+|"c*+/'3'0,c,0;$[#p:+s\&~^t:A?,/x;;:r];q:q@'*'&'~^x ./:/:q:+p+/:D@4!(t^0N)+/:0 1 3;s#@[,/r;s/+q;:;A@D?q-p]}/

在线尝试!

{ }/当用int左arg n进行调用时,此函数将{ }n次应用到右arg

A:"^>v<"

D,:-D:(-1 0;!2) 四个方向的yy,∆x

s:(#x;#*x) 输入的形状:高度,宽度

c:~^x countours-布尔矩阵,显示非空间在哪里

r:" -+|"c*+/'3'0,c,0通过计算每个单元格的self + upper + lower c并替换1-> -,2-> +,3->|

t:A?,/x箭头类型:0的1 2 3 3 ^>v<,所有其他单元格都表示为0N(null)

p:+s\&~^t 箭头的坐标

$[#p ;;:r] 如果没有箭头,请返回 r

q:+p+/:D@4!(t^0N)+/:0 1 3 每个箭头的所有3个可能的新位置-如果它继续前进,如果向左转以及如果向右转

q:q@'*'&'~^x ./:/:q 为每个箭头选择落在国家上的第一个选项

@[,/r;s/+q;:;A@D?q-p]展平r并在其新位置和新方向上放置箭头

s# 重塑为原始形状


2
你很快!我希望您在打完高尔夫球后再解释一下代码。
Galen Ivanov

谢谢你的解释!
Galen Ivanov

4

木炭,105字节

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ≔>^<vζPθFθ¿№ζι«⊞υ⟦⌕ζιⅉⅈ⟧§+|-↨EKV›κ ²»ιFυ«J⊟ι⊟ι≔⊟ιιFIη«≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ιM✳⊗黧ζι

在线尝试!链接是详细版本的代码。包括22个字节,用于避免要求繁琐的输入格式。说明:

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ

方便地输入轮廓和步数。

≔>^<vζ

方向字符被使用了几次,所以字符串被缓存在这里。该字符串中方向字符的索引称为其方向。

Pθ

在不移动光标的情况下打印原始轮廓。

Fθ

循环显示轮廓中的字符。

¿№ζι«

如果当前字符是方向字符...

⊞υ⟦⌕ζιⅉⅈ⟧

...然后将方向和位置保存在列表中...

§+|-↨EKV›κ ²

...,然后用适当的行字符替换该字符。

»ι

否则,输出字符并继续下一个字符。

Fυ«

循环浏览已保存的位置。

J⊟ι⊟ι

跳转到保存的位置。

≔⊟ιι

提取保存的方向。

FIη«

循环执行适当数量的步骤。

≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ι

找到下一步的方向,即既不反向也不为空的任何方向。

M✳⊗ι

朝这个方向迈出一步。(该Move命令的木炭方向索引是我的方向值的两倍。)

»§ζι

打印适当的方向字符。


谢谢你的解释!
Galen Ivanov

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.