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 좌표를 가진 각 위치 는 +문자를 포함합니다.
  • +문자를 포함 하는 위치에 가로 또는 세로로 인접한 위치 공백 문자를 포함하거나 줄 끝 뒤에 있거나 -가로로 인접한 |경우 문자 또는 세로로 인접한 경우 문자
  • 다른 모든 위치가 라인의 끝에 뒤에 하나 또는 포함 된 문자 중 하나 , 0, 1, 2, 또는3
  • 모든 줄은 플랫폼 기본 줄 바꿈 문자로 종료됩니다
  • 정확히 하나의 후행 줄 바꿈이 있습니다

입력은 다음 방법 중 하나로 수신되어야합니다.

  • 표준 입력에서
  • pHTTP POST 요청에서 이름 지정된 매개 변수의 값으로
  • HTML 양식의 내용으로
  • p구현 정의 디렉토리에 이름이 지정된 파일의 내용으로
  • 이전 4 개를 사용할 수없는 경우 런타임시 정의 된 구현 방식
  • 언어가 입력을받을 수단을 제공하지 않으면 하드 코딩 됨

출력 사양

프로그램은 입력 사양과 일치하는 모든 입력에 대해 종료하고 퍼즐 솔루션이 올바른지 계산해야합니다. 프로그램은 계산 결과를 다음 방법 중 하나로 부울 값으로 출력해야합니다.

  • 종료 상태가 0 (솔루션이 유효 함) 또는 0이 아닌 경우 (솔루션이 유효하지 않음)
  • 문자 y(솔루션이 유효 함) 또는 n(솔루션이 유효하지 않음) 다음에 구현 정의 방식으로 0 개 이상의 임의의 문자가 출력 됨

입력 스펙에 따라 형식화되지 않은 입력이 발생할 때 프로그램의 동작은 지정되지 않습니다.

채점

프로그램 점수는 생략 가능한 공백 문자와 생략 가능한 주석을 제외한 소스의 문자 수입니다. 제출 한 내용을 들여 쓰면 다른 사람이 쉽게 읽을 수 있고 답을 찾기 쉽게 답할 수 있습니다.

입력 또는 출력 사양을 따르지 않거나 잘못된 결과를 생성하는 제출은 유효하지 않습니다.


입력은 어떻게 처리됩니까? 파일에서 읽습니까? STDIN? 함수를 작성할 수 있습니까?
Martin Ender

@ MartinBüttner "귀하의 프로그램은 ..."을 받게됩니다. 왜 파일을 읽고 싶었는지 잘 모르겠습니다.
John Dvorak

@ MartinBüttner 완전한 프로그램을 작성해야합니다. 나는 "귀하의 프로그램", "종료해야한다", "종료 상태"라는 언어가 매우 분명하다고 생각합니다.
FUZxxl

1
또한 대부분의 퍼즐 0에서 셀의 유효한 숫자이기도합니다.
Howard

@Howard 죄송합니다.
FUZxxl

답변:


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

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')

모든 숫자 옆에 올바른 수의 줄이 있는지 확인한 다음 줄 주위에 경로를 걸어 누락 된 부분이 있는지 확인합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.