验证Loopy解决方案


9

这是生成Loopy拼图挑战的附加挑战。在尝试上一个链接中的较难挑战之前,您可能需要解决此挑战。

这项挑战的目的是验证一个循环难题的解决方案。请从上一链接中获取有关什么是难题的所有文档。解决的循环拼图的格式与对“生成循环拼图”挑战的有效提交的输出非常相似,其格式如下:

+-+-+ +-+ +-+ +
|   | | |2|3|  
+-+ + + + + +-+
 2| | | |2|  3|
+ + +-+ + + +-+
 2|  2 1|3| |  
+-+ +-+ +-+ +-+
|2  | |    1 2|
+ +-+ +-+ +-+ +
| |2 1 2|3|3| |
+ + +-+ +-+ +-+
| | |3|2   1   
+ +-+ +-+-+-+-+
|        2 2  |
+-+-+-+-+-+-+-+

组成解决方案的路径在字符之间用|和标记。-+

输入规格

您的程序将收到一个带有如上示例所示格式的解决方案的循环拼图作为输入。您的程序应从输入中推断出拼图的大小。您可以对输入做出以下假设:

  • 拼图在两个方向上的不少于2个且不超过99个单元
  • 因此,每行的最大长度为199个字符(不包括换行符)
  • 因此,输入最多包含99行
  • 每行可以在最后一个可打印字符之后结束,也可以用空格字符填充,因此其长度最多为2·y + 1个字符,其中y是水平方向上的单元数
  • 具有xy坐标的每个位置甚至都包含一个+字符
  • 与包含+字符的位置在水平或垂直方向上相邻的位置包含空格字符,行尾或-在水平方向上包含字符或|在垂直方向上包含字符
  • 所有其它位置或线的端部后面或包含字符之一012,或3
  • 所有行都以您的平台默认的换行符终止
  • 恰好有一条尾随换行符

应通过以下方式之一接收输入:

  • 从标准输入
  • 作为pHTTP POST请求中命名的参数的值
  • 作为HTML表单的内容
  • 作为p在实现定义的目录中命名的文件的内容
  • 如果前四个不可用,则在运行时以实现定义的方式
  • 如果您的语言无法接收输入,则进行硬编码

输出规格

您的程序应针对与输入规范匹配的所有输入终止,并应计算难题的解决方案是否正确。您的程序应通过以下方式之一将计算结果输出为布尔值:

  • 退出状态为零(解决方案有效)或非零(解决方案无效)
  • 因为字符y(解决方案有效)或n(解决方案无效),然后以实现定义的方式输出零个或多个任意字符

当遇到未根据输入规范格式化的输入时,程序的行为是不确定的。

计分

程序的分数是其源中的字符数,可忽略的空白字符和可忽略的注释除外。鼓励您缩进来的内容,以便其他人更容易阅读,并评论您的解决方案,以使其易于遵循。

未能遵循输入或输出规范或生成不正确结果的提交无效。


输入如何处理?从文件读取?STDIN?我可以写一个函数吗?
Martin Ender 2014年

@MartinBüttner“您的程序将收到...”。不知道为什么要读取文件。
约翰·德沃夏克

@MartinBüttner您必须编写一个完整的程序。我认为语言“您的程序”,“将终止”,“退出状态”非常清楚。
2014年

1
另请注意,在大多数拼图0中,单元格的有效数字也是有效的。
霍华德

@Howard抱歉,错过了。
2014年

Answers:


2

GolfScript,133个字符

'|':^4,{48+.(}%+^*1>.^/'-'*+2/:F;4{{~@@/*}2F//n%zip-1%n*}:X*.'+-'?.3+@/(-2<' 9'+\+'9-+  99|+  9'3/:F;.,4*{X}*.9`?@=\' +09
'-!&'ny'1/=

期望来自STDIN的输入并打印y出有效的解决方案和n无效的解决方案。通过在网格上或旋转版本的网格上大部分使用字符串替换来执行任务。

带注释的代码:

# construct the string "|0|/|1|0|2|1|3|2-0-/-1-0-2-1-3-2"
# split into pieces of two and save to variable F
'|':^4,{48+.(}%+^*1>.^/'-'*+
2/:F;

# run the code block X 4 times
# with X: string-replace 1st item in F with 2nd, 3rd with 4th, ...
# i.e. '|0' with '|/', '|1' with '|0'
# and then rotate grid by 90 degrees
4{{~@@/*}2F//n%zip-1%n*}:X*

# for a valid grid all digits are now reduced to exactly '0'
# (i.e. no '1' or '2' or '3' or '/')

# now follow the loop along and remove it
# start: find the first occurence of '+-+' and replace with '+ 9'
# note: '9' is the marker for the current position
.'+-'?
.3+@/(-2<' 9'+\+

# string-replace '9-+' or '9|+' by '  9' (i.e. go one step along the loop)
# using block X enough times
'9-+  99|+  9'3/:F;
.,4*{X}*

# look for the marker '9' in the result and check if it is at the original
# position again
.9`?
@=

# the remaining grid must not contain any digits besides 0 and 9
# esp. no '|' or '-' may remain
\' +09
'-!

# check if both conditions are fulfilled and output corresponding character
&'ny'1/=

2

C#803 579字节

从STDIN读取的完整程序,只要有换行符,就应该可以应付任何常见的换行方案。感谢HackerCow指出我不必在其他问题中添加新行,提示我在此处删除它并保存4个字节

高尔夫代码:

using C=System.Console;class P{static void Main(){var D=C.In.ReadToEnd().Replace("\r","").Split('\n');int w=D[0].Length+2,h=D.Length+1,i=0,j,c,T=0,O=1,o,z,R=0;var B=new int[w,h];var S=new int[w*h*9];for(;i++<w-2;)for(j=0;j<h-2;B[i,j]=c)if((c=(D[j++][i-1]-8)%10)>5){c=5;T++;S[0]=i+j*w;}for(i=0;++i<w-1;)for(j=0;++j<h-1;)R=(i%2+j%2>1&(o=B[i,j-1]%2+B[i-1,j]%2+B[i+1,j]%2+B[i,j+1]%2)>0&o!=2)|((c=B[i,j])<4&c!=o)?7:R;for(o=h=0;o<O;B[i,j]=0)if(B[i=(c=S[o++])%w,j=c/w]>4){h++;S[O++]=(S[O++]=c-w-1)+2;S[O++]=(S[O++]=c+w-1)+2;z=j%2<1?w*2:2;S[O++]=c-z;S[O++]=c+z;}C.Write(h-R<T?"n":"y");}}

该代码执行3次检查,首先检查每个数字周围的行数,并检查每个结点是否有0或2行从其引出,然后将所有行连接在一起。

格式化代码:

using C=System.Console;

class P
{
    static void Main()
    {
        var D=C.In.ReadToEnd().Replace("\r","").Split('\n');
        int w=D[0].Length+2,h=D.Length+1,i=0,j,c,T=0,O=1,o,z,R=0;
        var B=new int[w,h]; // this is the grid
        var S=new int[w*h*9]; // this is a list of joined up lines (stored as x+y*w)

        for(;i++<w-2;)
            for(j=0;j<h-2;B[i,j]=c)
                if((c=(D[j++][i-1]-8)%10)>5)
                { // we are a line
                    c=5;
                    T++; // increment line counter
                    S[0]=i+j*w; // set start of loop
                }

        for(i=0;++i<w-1;) // this loop checks the numbers and that every + has 0 or 2 lines leading from it
            for(j=0;++j<h-1;)
                R=(i%2+j%2>1&(o=B[i,j-1]%2+B[i-1,j]%2+B[i+1,j]%2+B[i,j+1]%2)>0&o!=2)|((c=B[i,j])<4&c!=o)?7:R; // set R to 7 (no significance) if check fails

        for(o=h=0;o<O;B[i,j]=0) // this loops through the list of joined lines adding more until the whole loop has been seen
            if(B[i=(c=S[o++])%w,j=c/w]>4)
            {
                h++; // increment "seen" counter
                S[O++]=(S[O++]=c-w-1)+2;
                S[O++]=(S[O++]=c+w-1)+2;
                z=j%2<1?w*2:2; // special for | and -
                S[O++]=c-z;
                S[O++]=c+z;
            }

        C.Write(h-R<T?"n":"y"); // check if R is greater than 0 or h is less than T and output appropriately
    }
}

谢谢@ edc65,不知道我怎么想念它!
VisualMelon 2014年

1

眼镜蛇-514

class P
    def main
        t,m,g=[[1]][:0],nil,File.readAllLines('p')
        u,i=g[0].length,1
        for l in g.length,for c in u,if g[l][c]in'0123'
            n=0
            for j in-1:2:2,for r in[g[l+j][c],g[l][c+j]],if r in'-|',n+=1
            if'[n]'<>g[l][c],m?='n'
        else if g[l][c]in'-|',x,y,t,d=c,l,t+[[c,l]],g[l][c]
        while i
            i=z=6
            for f,b in[[-1,1],[1,1],[0,2],[-1,-1],[+1,-1],[0,-2]]
                if'-'==d,f,b=b,f
                for w in t.count,if z and t[w]==[x+f,y+b],t,x,y,d,z=t[:w]+t[w+1:],x+=f,y+=b,g[y][x],0
                i-=z//6
        print if(t.count,'n',m?'y')

检查每个数字旁边是否有正确的行数,然后绕过这些行,并检查是否错过了行号。

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.