在你的灾难性的独木舟旅行之后,你最终在急流的尽头从瀑布上掉下来。你的独木舟爆炸了,但你在爆炸中幸免于难。然而,你的河流之旅完全偏离了地图--你现在发现自己迷失在森林中。幸运的是,你仍然有你的编程技能,所以你决定把一个程序刻在树的一边,帮助你找到穿过森林的路。然而,树上没有太多的表面积,所以你必须使你的程序尽可能短。
这个林可以用n
( n
(n > 5
)平方字符来描述),它将只由小写字母a-z
组成。一个例子森林:
anehcienwlndm
baneiryeivown
bnabncmxlriru
anhahirrnrauc
riwuafuvocvnc
riwnbaueibnxz
hyirorairener
ruwiiwuauawoe
qnnvcizdaiehr
iefyioeorauvi
quoeuroenraib
cuivoaisdfuae
efoiebnxmcsua
您可能已经注意到,在这个森林中,有一条从左上角到右下角的a
字符对角线。这是一条穿过森林的“小径”,如果你沿着这条路走,它会带你到某个地方。您的任务是编写一个程序,它将找到奇异路径。我现在将更具体地描述这一挑战的“道路”的含义。
在这一挑战中,“路径”被定义为类似于使用布列森姆算法生成的行,但附加的要求如下:
为了更清楚地解释第二项要求,请考虑以下一行:
aaa
aaa
aaa
aaa
aaa
这一行由字符的共线“段”组成,每段都有三个字符长。它有资格成为一条道路。现在考虑一下这一行:
a
aa
a
aa
a
aa
这一行由不完全相同的字符长度的共线“段”组成(其中一些字符长一个字符,而另一些字符长两个)。因此,这一条不符合路径的条件。
给出森林的地图,您的程序将识别路径中使用的字符。输入是对任意约束的输入(例如命令行参数、STDIN、prompt()
等)。它不能预先初始化为一个变量。输入的第一部分是表示森林大小的单个整数n
(林始终是正方形)。之后是一个空格,然后整个森林作为一个字符串。例如,示例林将显示为输入,如下所示:
13 anehcienwlndmbaneiryeivownbnabncmxlriruanhahirrnraucriwuafuvocvncriwnbaueibnxzhyirorairenerruwiiwuauawoeqnnvcizdaiehriefyioeorauviquoeuroenraibcuivoaisdfuaeefoiebnxmcsua
这方面的产出如下:
a
因为路径是使用字母a
形成的。森林里只有一条路。这是代码高尔夫,所以最少的字符获胜。如果你有问题,请在评论中提问。
发布于 2014-08-22 23:14:14
⎕ML←3⋄Z/⍨1=≢¨Z←∪¨(↓⍉F),(↓F),{(⍳≢⍵)⌷¨↓⍵}¨(⊂F),⊂⌽F←⊃{⍵⍴⍨2/⍎⍺}/I⊂⍨' '≠I←⍞
解释:
⎕ML←3
:将ML
设置为3
,意思是⊂
有其APL2含义。I←⍞
:从键盘读取一行并将其存储在I
中I⊂⍨' '≠I
:在空格上拆分I
{
.}/
:将此函数应用于两个结果字符串:2/⍎⍺
:计算左参数并复制两次,给出矩阵大小⍵⍴⍨
:使用该大小格式化正确的参数F←⊃
:打开它并将它存储在F
中。{(⍳≢⍵)⌷¨↓⍵}¨(⊂F),⊂⌽F
:获取对角线:从F
和⌽F
中的每一行(垂直镜像的F
)获取X列的值,其中X是其行号(↓⍉F),(↓F),
:获取F
的行和列Z←∪¨
:查找每行、每列和每对角的唯一值,并将它们存储在Z
中。因为森林是矩形的,如果有一个有效的路径,它意味着其中一个将只包含一个字符,即路径字符,因此:
Z/⍨1=≢¨Z
:从Z
中取出那些只有一个元素的子数组。这将显示所有有效路径的字符,但是应该只有一个不重要。
发布于 2014-08-20 04:21:56
下面定义了一个函数x
,该函数接受一个林字符串作为参数,并返回通过受给定规则约束的林中的有效“路径”的字符。
function F=x(s),A=sscanf(s,'%d%s');n=A(1);A=reshape(A(2:end),n,n);for c=A(:)',B=A==c;for i=1:n,if~mod(n,i),C=[kron(eye(i),ones(n/i,1)),zeros(n,n-i)];for j=0:n-i,f=@(B)sum(sum(B&circshift(C,[0,j]))==n;D=fliplr(B);if f(B)|f(B')|f(D)|f(D'),F=char(c);end;end;end;end;end;end
非缩小版本是
function F = x(s)
A = sscanf( s, '%d %s' );
n = A(1);
A = reshape( A(2:end), n,n );
for c = A(:)'
B = A==c;
for i = 1:n
if ~mod( n, i )
C = [kron( eye(i), ones( n/i,1 ) ), zeros( n,n-i )];
for j = 0:n-i
f = @(B) sum(sum( B & circshift( C, [0 j] ))) == n;
D = fliplr(B);
if f(B) | f(B') | f(D) | f(D')
F = char(c);
end
end
end
end
end
end
基本前提是为每个可能的有效路径构造一个布尔掩码,并返回矩阵中索引函数覆盖任何掩码的任何字符。要做到这一点,只创建垂直或自上而下的反斜杠形状的面具,但森林矩阵是在所有四个方向上进行比较的:同一性,翻转,旋转90°,翻转旋转90°。
该函数运行于任何n
。在命令行上调用它的一个例子是
x('13 anehcienwlndmbaneiryeivownbnabncmxlriruanhahirrnraucriwuafuvocvncriwnbaueibnxzhyirorairenerruwiiwuauawoeqnnvcizdaiehriefyioeorauviquoeuroenraibcuivoaisdfuaeefoiebnxmcsua')
ans =
a
https://codegolf.stackexchange.com/questions/36404
复制相似问题