首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >森林之路

森林之路
EN

Code Golf用户
提问于 2014-08-19 05:51:30
回答 2查看 723关注 0票数 9

在你的灾难性的独木舟旅行之后,你最终在急流的尽头从瀑布上掉下来。你的独木舟爆炸了,但你在爆炸中幸免于难。然而,你的河流之旅完全偏离了地图--你现在发现自己迷失在森林中。幸运的是,你仍然有你的编程技能,所以你决定把一个程序刻在树的一边,帮助你找到穿过森林的路。然而,树上没有太多的表面积,所以你必须使你的程序尽可能短。

这个林可以用n ( n (n > 5)平方字符来描述),它将只由小写字母a-z组成。一个例子森林:

代码语言:javascript
运行
复制
anehcienwlndm
baneiryeivown
bnabncmxlriru
anhahirrnrauc
riwuafuvocvnc
riwnbaueibnxz
hyirorairener
ruwiiwuauawoe
qnnvcizdaiehr
iefyioeorauvi
quoeuroenraib
cuivoaisdfuae
efoiebnxmcsua

您可能已经注意到,在这个森林中,有一条从左上角到右下角的a字符对角线。这是一条穿过森林的“小径”,如果你沿着这条路走,它会带你到某个地方。您的任务是编写一个程序,它将找到奇异路径。我现在将更具体地描述这一挑战的“道路”的含义。

在这一挑战中,“路径”被定义为类似于使用布列森姆算法生成的行,但附加的要求如下:

  • 行必须至少有6个字符长。
  • 行中的每个共线(完全相邻)字符组必须具有相同的长度。
  • 它将从森林的一个边缘开始,在相反的边缘结束(详解请参见我在这里的评论 )

为了更清楚地解释第二项要求,请考虑以下一行:

代码语言:javascript
运行
复制
aaa
   aaa
      aaa
         aaa
            aaa

这一行由字符的共线“段”组成,每段都有三个字符长。它有资格成为一条道路。现在考虑一下这一行:

代码语言:javascript
运行
复制
a
 aa
   a
    aa
      a
       aa

这一行由不完全相同的字符长度的共线“段”组成(其中一些字符长一个字符,而另一些字符长两个)。因此,这一条不符合路径的条件。

给出森林的地图,您的程序将识别路径中使用的字符。输入是对任意约束的输入(例如命令行参数、STDIN、prompt()等)。它不能预先初始化为一个变量。输入的第一部分是表示森林大小的单个整数n (林始终是正方形)。之后是一个空格,然后整个森林作为一个字符串。例如,示例林将显示为输入,如下所示:

代码语言:javascript
运行
复制
13  anehcienwlndmbaneiryeivownbnabncmxlriruanhahirrnraucriwuafuvocvncriwnbaueibnxzhyirorairenerruwiiwuauawoeqnnvcizdaiehriefyioeorauviquoeuroenraibcuivoaisdfuaeefoiebnxmcsua

这方面的产出如下:

代码语言:javascript
运行
复制
a

因为路径是使用字母a形成的。森林里只有一条路。这是代码高尔夫,所以最少的字符获胜。如果你有问题,请在评论中提问。

EN

回答 2

Code Golf用户

回答已采纳

发布于 2014-08-22 23:14:14

APL (Dyalog 14) (70)

代码语言:javascript
运行
复制
⎕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中取出那些只有一个元素的子数组。

这将显示所有有效路径的字符,但是应该只有一个不重要。

票数 3
EN

Code Golf用户

发布于 2014-08-20 04:21:56

MATLAB - 270字符

下面定义了一个函数x,该函数接受一个林字符串作为参数,并返回通过受给定规则约束的林中的有效“路径”的字符。

代码语言:javascript
运行
复制
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

非缩小版本是

代码语言:javascript
运行
复制
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。在命令行上调用它的一个例子是

代码语言:javascript
运行
复制
x('13 anehcienwlndmbaneiryeivownbnabncmxlriruanhahirrnraucriwuafuvocvncriwnbaueibnxzhyirorairenerruwiiwuauawoeqnnvcizdaiehriefyioeorauviquoeuroenraibcuivoaisdfuaeefoiebnxmcsua')

ans =

    a
票数 3
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/36404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档