Validasi Solusi Loopy

9

Ini adalah tantangan tambahan untuk menghasilkan teka-teki Loopy . Anda mungkin ingin menyelesaikan tantangan ini sebelum mencoba tantangan yang lebih sulit di tautan sebelumnya.

Tujuan dari tantangan ini adalah untuk memvalidasi solusi untuk teka-teki gila. Silakan ambil semua dokumentasi tentang apakah puzzle gila itu dari tautan sebelumnya. Teka-teki gila yang terpecahkan diformat dengan cara yang sangat mirip dengan keluaran dari pengajuan yang valid ke tantangan "buat lingkaran gila" dan mungkin terlihat seperti ini:

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

Jalur yang membentuk solusi ditandai dengan |dan -karakter di antara +karakter.

Spesifikasi input

Program Anda akan menerima puzzle gila dengan solusi yang diformat seperti contoh di atas sebagai input. Program Anda akan menyimpulkan ukuran puzzle dari input. Anda dapat membuat asumsi berikut tentang input:

  • Teka-teki memiliki tidak kurang dari 2 dan tidak lebih dari 99 sel di kedua arah
  • Dengan demikian, setiap baris memiliki panjang maksimum 199 karakter tidak termasuk karakter baris baru
  • Dengan demikian, input berisi maksimal 99 baris
  • setiap baris dapat berakhir setelah karakter yang dapat dicetak terakhir atau mungkin diisi dengan karakter spasi sehingga memiliki panjang hingga 2 · y + 1 karakter di mana y adalah jumlah sel dalam arah horizontal
  • setiap posisi dengan koordinat x dan y bahkan berisi +karakter
  • posisi yang berdekatan secara horizontal atau vertikal dengan posisi yang mengandung +karakter mengandung karakter spasi, berada di belakang garis atau berisi -karakter jika berdekatan secara horizontal atau |karakter jika berdekatan secara vertikal
  • semua posisi lainnya baik di belakang akhir baris atau mengandung salah satu karakter , 0, 1, 2, atau3
  • semua baris diakhiri dengan platform Anda, karakter baris baru default
  • ada persis satu trailing newline

Masukan harus diterima dengan salah satu cara berikut:

  • Dari input standar
  • Sebagai nilai parameter yang disebutkan pdalam permintaan HTTP POST
  • Sebagai konten formulir HTML
  • Sebagai konten file yang disebutkan pdalam direktori yang ditentukan implementasi
  • Dalam implementasi cara yang ditentukan saat runtime jika empat mantan tidak tersedia
  • Hard kode jika bahasa Anda tidak berarti menerima input

Spesifikasi keluaran

Program Anda harus diakhiri untuk semua input yang cocok dengan spesifikasi input dan harus menghitung apakah solusi untuk puzzle itu benar. Program Anda akan menampilkan hasil perhitungan sebagai nilai boolean dalam salah satu cara berikut:

  • Sebagai status keluar dari nol (solusi valid) atau non-nol (solusi tidak valid)
  • Karena karakter y(solusi valid) atau n(solusi tidak valid) diikuti oleh nol atau lebih karakter arbitrer yang dihasilkan dalam implementasi yang ditentukan cara

Perilaku program Anda tidak ditentukan ketika menemukan input tidak diformat sesuai dengan spesifikasi input.

Mencetak gol

Skor dari program Anda adalah jumlah karakter dalam sumbernya kecuali untuk karakter spasi putih yang dapat diabaikan dan komentar yang dapat diabaikan. Anda didorong untuk membuat indentasi kiriman Anda sehingga lebih mudah dibaca untuk orang lain dan untuk mengomentari solusi Anda sehingga lebih mudah diikuti.

Kiriman yang gagal mengikuti spesifikasi input atau output atau menghasilkan hasil yang salah tidak valid.

FUZxxl
sumber
Bagaimana cara input ditangani? Baca dari file? STDIN? Bisakah saya menulis fungsi?
Martin Ender
@ MartinBüttner "program Anda akan menerima ...". Tidak yakin mengapa Anda ingin membaca dari file.
John Dvorak
@ MartinBüttner Anda harus menulis program yang lengkap. Saya pikir bahasa "program Anda", "akan berakhir", "status keluar" cukup jelas.
FUZxxl
1
Perhatikan juga bahwa di sebagian besar teka 0- teki juga merupakan angka yang valid untuk sel.
Howard
@ Howard Maaf, ketinggalan itu.
FUZxxl

Jawaban:

2

GolfScript, 133 karakter

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

Mengharapkan input dari STDIN dan mencetak yuntuk solusi yang valid dan nuntuk yang tidak valid. Melakukan tugas dengan menggunakan sebagian besar string-replace pada grid atau dengan versi rotated grid.

Kode beranotasi:

# 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/=
Howard
sumber
2

C # 803 579 bit

Program yang lengkap, dibaca dari STDIN, harus mengatasi skema jalur baru yang umum selama ia memiliki umpan garis. Terima kasih kepada HackerCow untuk menunjukkan bahwa saya tidak perlu menambahkan baris baru dalam pertanyaan yang berbeda, mendorong saya untuk menghapusnya di sini dan menyimpan 4 byte

Kode golf:

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

Kode melakukan 3 pemeriksaan, pertama-tama memeriksa jumlah garis di sekitar setiap angka dan bahwa setiap persimpangan memiliki 0 atau 2 garis yang mengarah darinya, kemudian semua garis disatukan.

Kode yang diformat:

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
    }
}
VisualMelon
sumber
Terima kasih @ edc65, tidak tahu bagaimana saya melewatkan itu!
VisualMelon
1

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

Memeriksa apakah setiap angka memiliki jumlah garis yang tepat di sebelahnya, dan kemudian berjalan di jalur di sekitar garis dan memeriksa apakah ada yang terlewat.

Suram
sumber