两条道路分叉成黄色的木头(第3部分)


10

注意:这是基于两条道路在黄色的木头分叉(第2部分),这是我的先前挑战。由于该问题的受欢迎程度,并且两条道路在黄色的树林中分叉(第1部分),所以我想提出第三条。但是前两个太简单了(第一个回答为2字节,第二个回答为15字节。)所以我做了一些更复杂的事情……

灵感来源

这一挑战的灵感来自罗伯特·弗罗斯特(Robert Frost)的著名诗作《未走的路》

两条道路在黄色的树林中分叉,
对不起,我无法同时行进
,成为一个行人,我站了很久
,俯视着一条路,尽我所能
,一直到弯曲的灌木丛中。

... 2段落已修剪...

我将叹息地告诉这个问题,因为它
在某个年代和年代都在变老:
两条路在树林中分叉,而我-
我走过的路少了,
这一切都改变了。

请注意倒数第二行I took the one less traveled by,

背景故事

您被分配帮助一位盲人冒险者,他们在道路上行走,并受到“未走的路”的启发。冒险家正在接近叉路,并希望走少走的路。您必须找到冒险家实际所在的位置,并告诉冒险家转弯的地方。

挑战

您的目标是在地图上找到岔路口最少经过的道路。您的地图是一个包含换行符(或\n,如果愿意的话)的字符串,并且具有未知的宽度和高度。在地图中,道路由数字0到9组成,交叉点由#s组成。您必须找到您当前所处的道路,以及其他道路中行驶最多的道路,以及盲人冒险者行驶较少的道路。地图中的树林由空格表示。这是一个简单的地图:

2   2
 1 0 
  #  
  2  
  2  

该地图宽5高5。注意路叉如何呈Y形。Y可以以任何方式定向,因此您必须能够理解“旋转”贴图。

什么#意思

地图分叉的地方将有一个#。这不会影响任何路径的分数。

数字实际上是什么意思

每条路径(一行数字,可能会有一个弯头)都有一个分数。路径的分数是通过将其数字相加来确定的,因此,对于第一个示例,第一条路径(从左上角,顺时针方向)的分数为2 + 1 = 3,第二条路径的分数为2 + 0 = 2,第三条路径有2 + 2 = 4。道路可能包含对角连接的数字。

找到你在哪里

您正在分数最高的道路上。其他2条路径是经过的道路较多,经过的道路较少。您需要找到分数最低的道路。

告诉你的旅行者去哪里

您必须告诉旅客“左”或“右”。请记住,方向是从旅行者的角度出发的(他正对着叉子。)

范例地图

  14
9#  
  04

输出:“ right”(旅行者在9路上,0 + 4 <1 + 4

  9  
  9  
  9  
  9  
  9  
  #  
 8 8 
 8 8 
88 88
8   7

输出:“向左”(旅行者在99999路上,8 + 8 + 8 + 8 + 8> 8 + 8 + 8 + 8 + 7

02468      
     #98765
13579      

输出:“右”(旅行者在98765路上,0 + 2 + 4 + 6 + 8 <1 + 3 + 5 + 7 + 9)

4 2
4 2
 # 
 4 
 4 
 2 
 2 

输出:“ right”(旅行者在4422路上,4 + 4> 2 + 2)

 9   
 9   
 9   
 #   
8 7  
8  7 
8   7

输出“左”(旅行者在999路上,8 + 8 + 8> 7 + 7 + 7

要知道的东西:

  • 地图将用空格填充,以使每行长度相同。
  • 您必须将字符串left或输出到STDOUT / console /文件right,并可以选择在其后跟一个换行符。
  • 您必须将输入作为包含换行符\ns 的字符串或行的数组/列表(每行都是一个字符串)。输入的位置必须是函数,命令行参数,文件或STDIN,一次或类似一行。变量不是可接受的输入设备(除非它是函数参数。)同样,必须将JS和其他语言的函数表达式分配给变量。
  • 这是,因此最短答案以字节为单位!
  • 禁止标准漏洞

你可以假设的事情

  • 您的输入将是有效的。不会对以下任何东西进行测试:
0 0 0
 0 0
  #
 0 0
  • 路径的分数永远不会被束缚。
  • 输入的宽度或高度可以是任何长度,小于您的语言的字符串限制。
  • 2条路径之间将始终至少有1个间隔。
  • 路径可能有弯曲,转弯等。这些是道路,而不是高速公路。

有什么问题吗?请在下面的评论中问我,打高尔夫球愉快!


#始终处于水平方向的中心?
David Archibald

12
我认为您该使用Sandbox了。也许会找到一些新的灵感。以这种速度,感觉就像是在倡导一首诗,而不是创造一个有趣的挑战系列。特别是因为您除了每首诗外都发表了这首诗。我们已经从第一个开始就已经看到了,这就足够了。
mbomb007'3

4
看。我喜欢您的挑战,但是简单地增加一些难度,然后在不接受pt 2的情况下发布3就太快了。对2的修改足以满足旋转的微小变化,绝对输出等问题。
David Archibald

2
与以前的挑战相比,挑战是非常不同的,我喜欢它...我们可以将Y形视为理所当然的(一条路径总是在一条边上结束而另一条路径总是在另一边上结束),对吗?
dnep

1
@dnep是的,您是对的。
程序员

Answers:


4

d348个 321 312 302字节

import std.stdio,std.algorithm,std.regex,std.range;void h(R,U)(R s,U r){U[2]c;foreach(L;s.map!(a=>a.array.split)){U l=L.length-1;r>1?r=l^r-2:0;l?c[]+=l*L.map!sum.array[]:c;}write(c[r]>c[!r]?"right":"left");}void main(){auto s=stdin.byLineCopy.array;!s.join.match(`\d \d`)?h(s.transposed,2UL):h(s,3UL);}

不打高尔夫球

import std.stdio,std.algorithm,std.regex,std.range;

void h(R,U)(R s, U reverse) {
    U[2] counts;
    /* Now that all paths are up/down, every line we need to count up has
       precisely two space-delimited parts to sum up. */
    foreach (line; s.map!(a=>a.array.split)) {
        U len = line.length - 1;
        reverse > 1 ? reverse = len ^ reverse - 2 : 0;
        len ? counts[] += len * line.map!sum.array[] : counts;
    }

    /* Switch left/right as needed based on our orientation */
    write(counts[reverse] > counts[!reverse] ? "right" : "left");
}

void main() {
    /* Treat the input as a matrix of integers */
    auto s = stdin.byLineCopy.array;

    /* If moving left/right intead of up/down, transpose */
    !s.join.match(`\d \d`)?h(s.transposed,2UL):h(s,3UL);
}

在线尝试!


祝贺您成为第一个回答者!您可能会赢得这一奖项。您可以链接到D吗?
程序员

2

Python 2,304个字节

在线尝试

A=input()
S=str(A)[2:-2].replace("', '",'')
i=S.index('#')
r=len(A[0])
w=1
a=i/r
if' '<S[i-r]:w=-w;A=A[::w];a=len(A)+~a
if' '<S[i+1]:A=zip(*A[::-1]);a=i%r
if' '<S[i-1]:A=zip(*A)[::-1];a=len(A)-i%r-1
s=0
for c in' '.join(map(''.join,A[0:a])).split():s+=sum(map(int,c));s=-s
print['left','right'][::w][s>0]

该程序将推导道路的方向并将其面向上旋转,以使用本挑战第二部分中的解决方案。


被2个字节击败了!谈论沮丧!
caird coinheringaahing

@ user00001这就是为什么我大哭
死负鼠
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.