Xác thực giải pháp Loopy


9

Đây là một thử thách bổ sung cho thử thách tạo câu đố Loopy . Bạn có thể muốn giải quyết thử thách này trước khi thử thách ở thử thách khó hơn trong liên kết trước.

Mục tiêu của thử thách này là xác nhận giải pháp cho một câu đố điên rồ. Vui lòng lấy tất cả tài liệu về câu đố loopy từ liên kết trước. Một câu đố về bản đồ đã được giải quyết được định dạng theo cách rất giống với kết quả của một bài nộp hợp lệ cho các câu đố về bản đồ tạo ra trò chơi thử thách và có thể giống như thế này:

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

Đường dẫn tạo nên giải pháp được đánh dấu |và các -ký tự giữa các +ký tự.

Đặc điểm kỹ thuật đầu vào

Chương trình của bạn sẽ nhận được một câu đố loopy với một giải pháp được định dạng như ví dụ ở trên làm đầu vào. Chương trình của bạn sẽ suy ra kích thước của câu đố từ đầu vào. Bạn có thể đưa ra các giả định sau về đầu vào:

  • Câu đố có không dưới 2 và không quá 99 ô theo cả hai hướng
  • Do đó, mỗi dòng có độ dài tối đa 199 ký tự, không bao gồm (các) ký tự dòng mới
  • Do đó, đầu vào chứa tối đa 99 dòng
  • mỗi dòng có thể kết thúc sau ký tự có thể in cuối cùng hoặc có thể được đệm bằng các ký tự khoảng trắng để nó có độ dài lên tới 2 · y + 1 ký tự trong đó y là số ô theo hướng ngang
  • mỗi vị trí có cả tọa độ xy thậm chí chứa một +ký tự
  • vị trí theo chiều ngang hoặc chiều dọc với vị trí chứa các +ký tự chứa ký tự khoảng trắng, nằm sau cuối dòng hoặc chứa -ký tự nếu liền kề theo chiều ngang hoặc |ký tự nếu liền kề theo chiều dọc
  • tất cả các vị trí khác hoặc là đằng sau cuối dòng hoặc có chứa một trong những nhân vật , 0, 1, 2, hoặc3
  • tất cả các dòng được kết thúc với (các) ký tự dòng mới mặc định của nền tảng của bạn
  • có chính xác một dòng mới

Đầu vào phải được nhận theo một trong các cách sau:

  • Từ đầu vào tiêu chuẩn
  • Là giá trị của tham số có tên ptrong yêu cầu POST HTTP
  • Là nội dung của biểu mẫu HTML
  • Là nội dung của một tệp có tên ptrong thư mục được xác định thực hiện
  • Trong một cách thực hiện được xác định theo cách trong thời gian chạy nếu bốn cái trước không có sẵn
  • Được mã hóa cứng nếu ngôn ngữ của bạn không có nghĩa là nhận đầu vào

Đặc điểm kỹ thuật đầu ra

Chương trình của bạn sẽ chấm dứt cho tất cả các đầu vào khớp với đặc điểm kỹ thuật đầu vào và sẽ tính toán xem giải pháp cho câu đố có đúng không. Chương trình của bạn sẽ đưa ra kết quả tính toán dưới dạng giá trị boolean theo một trong các cách sau:

  • Vì trạng thái thoát là 0 (giải pháp hợp lệ) hoặc khác không (giải pháp không hợp lệ)
  • Vì ký tự y(giải pháp hợp lệ) hoặc n(giải pháp không hợp lệ) theo sau là đầu ra bằng 0 hoặc nhiều ký tự tùy ý theo cách xác định thực hiện

Hành vi của chương trình của bạn là không xác định khi gặp đầu vào không được định dạng theo đặc điểm kỹ thuật đầu vào.

Chấm điểm

Điểm của chương trình của bạn là số lượng ký tự trong nguồn ngoại trừ các ký tự khoảng trắng có thể bỏ qua và các nhận xét có thể bỏ qua. Bạn được khuyến khích thụt lề gửi bài của mình để người khác dễ đọc hơn và nhận xét giải pháp của bạn để dễ theo dõi hơn.

Đệ trình không tuân theo đặc điểm kỹ thuật đầu vào hoặc đầu ra hoặc tạo kết quả không chính xác là không hợp lệ.


Làm thế nào là đầu vào được xử lý? Đọc từ một tập tin? STDIN? Tôi có thể viết một chức năng không?
Martin Ender

@ MartinBüttner "chương trình của bạn sẽ nhận được ...". Không chắc chắn tại sao bạn muốn đọc từ một tập tin.
John Dvorak

@ MartinBüttner Bạn phải viết một chương trình hoàn chỉnh. Tôi nghĩ rằng ngôn ngữ "chương trình của bạn", "sẽ chấm dứt", "trạng thái thoát" là khá rõ ràng.
FUZxxl

1
Cũng lưu ý rằng trong hầu hết các câu đố 0cũng là một số hợp lệ cho một ô.
Howard

@Howard Xin lỗi, đã bỏ lỡ điều đó.
FUZxxl

Câu trả lời:


2

GolfScript, 133 ký tự

'|':^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/=

Yêu cầu đầu vào từ STDIN và in ycho một giải pháp hợp lệ và ncho một giải pháp không hợp lệ. Thực hiện nhiệm vụ bằng cách sử dụng chủ yếu thay thế chuỗi trên lưới hoặc với các phiên bản xoay của lưới.

Mã chú thích:

# 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 579byte

Chương trình hoàn chỉnh, đọc từ STDIN, nên đối phó với bất kỳ sơ đồ dòng mới phổ biến nào miễn là nó có nguồn cấp dữ liệu. Cảm ơn HackerCow đã chỉ ra rằng tôi không phải nối thêm một dòng mới trong một câu hỏi khác, nhắc tôi xóa nó ở đây và lưu 4 byte

Mã đánh gôn:

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");}}

Mã thực hiện 3 kiểm tra, đầu tiên kiểm tra số lượng dòng xung quanh mỗi số và mỗi đường giao nhau có 0 hoặc 2 dòng dẫn từ nó, sau đó tất cả các dòng được nối với nhau.

Mã định dạng:

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
    }
}

Cảm ơn @ edc65, không biết làm thế nào tôi bỏ lỡ điều đó!
VisualMelon

1

Rắn hổ mang - 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')

Kiểm tra xem mỗi số có đúng số dòng bên cạnh không, và sau đó đi một đường xung quanh các dòng và kiểm tra xem nó có bỏ sót không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.