Loopy Çözümlerini Doğrulayın


9

Bu Loopy bulmacaları meydan okumak için ek bir meydan okuma. Önceki bağlantıda daha zor bir meydan okumaya başlamadan önce bu zorluğu çözmek isteyebilirsiniz.

Bu zorluğun amacı, çözümü döngüsel bir bulmacanın doğrulamaktır. Lütfen önceki bağlantıdan döngüsel bir bulmacanın ne olduğuna dair tüm belgeleri alın. Çözülmüş bir döngüsel bulmaca, "döngüsel bulmacalar oluştur" mücadelesine geçerli bir gönderimin çıktısına çok benzer bir şekilde biçimlendirilir ve şöyle görünebilir:

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

Çözümü oluşturan yol |ve -karakterleri arasında karakterler ile işaretlenir +.

Giriş özellikleri

Programınız, yukarıdaki örnek gibi biçimlendirilmiş bir çözümü girdi olarak döngüsel bir bulmaca alacaktır. Programınız bulmacanın boyutunu girişten çıkarır. Girdi hakkında aşağıdaki varsayımları yapabilirsiniz:

  • Bulmacanın her iki yönde de 2'den az ve 99'dan fazla hücre yok
  • Bu nedenle, her satırın yeni satır karakterlerini içermeyen maksimum 199 karakter uzunluğunda olması gerekir
  • Böylece, girdi maksimum 99 satır içerir
  • her satır son yazdırılabilir karakterden sonra sona erebilir veya boşluk karakterleri ile doldurulabilir, böylece uzunluğu 2 · y + 1 karaktere kadar çıkabilir, burada y yatay yönde hücre sayısıdır
  • x ve y koordinatlarına sahip her konum bir +karakter bile içerir
  • +karakter içeren konumlara yatay veya dikey olarak bitişik konumlar boşluk karakteri, satır sonunun arkasında veya -yatay olarak bitişikse bir |karakter veya dikey olarak bitişikse bir karakter içerir
  • diğer tüm pozisyonları hattının sonunda geride veya burada içeren karakter bir , 0, 1, 2, ya da3
  • tüm satırlar platformlarınızın varsayılan yeni satır karakterleriyle sonlandırılır
  • tam bir sondaki yeni satır var

Girdi aşağıdaki yollardan biriyle alınacaktır:

  • Standart girişten
  • pHTTP POST isteğinde adlandırılan bir parametrenin değeri olarak
  • HTML formunun içeriği olarak
  • pUygulama tanımlı bir dizinde adlandırılan bir dosyanın içeriği olarak
  • Önceki dört uygulama yoksa çalışma zamanında tanımlanmış bir şekilde
  • Diliniz herhangi bir girdi alma aracı sağlamazsa sabit kodlanmış

Çıktı özellikleri

Programınız, giriş belirtimiyle eşleşen tüm girişler için sonlandırılmalı ve bulmacanın çözümünün doğru olup olmadığını hesaplamalıdır. Programınız, hesaplamanın sonucunu aşağıdaki yollardan biriyle bir boole değeri olarak verir:

  • Sıfır (çözüm geçerli) veya sıfır olmayan (çözüm geçersiz) çıkış durumu olarak
  • Karakter y(çözüm geçerli) veya n(çözüm geçersiz) ardından sıfır veya daha fazla rastgele karakter, uygulama tanımlı bir şekilde çıkarılır

Girdi belirtimine göre biçimlendirilmemiş girdiyle karşılaştığınızda programınızın davranışı belirtilmez.

puanlama

Programınızın puanı, atlanabilir boşluk karakterleri ve atlanabilir yorumlar hariç, kaynağındaki karakter sayısıdır. Gönderinizi girintilemeniz tavsiye edilir, böylece diğerleri için daha kolay okunur ve çözümünüzü yorumlayabilir, böylece takip edilmesi daha kolay olur.

Girdi veya çıktı belirtimine uymayan veya yanlış sonuçlar veren gönderimler geçersiz.


Girdi nasıl ele alınacak? Bir dosyadan okumak ister misiniz? STDIN? Bir işlev yazabilir miyim?
Martin Ender

@ MartinBüttner "programınız ... alacaktır." Neden bir dosyadan okumak istediğinizden emin değilim.
John Dvorak

@ MartinBüttner Tam bir program yazmalısınız. Bence “programınız”, “sona erecek”, “çıkış durumu” oldukça açıktır.
FUZxxl

1
Ayrıca, çoğu bulmacada 0bir hücre için geçerli bir sayı olduğunu unutmayın .
Howard

@ Üzgünüm, özledim.
FUZxxl

Yanıtlar:


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/=

STDIN'den girdi bekler ve ygeçerli bir çözüm niçin ve geçersiz bir çözüm için yazdırır . Görevi çoğunlukla ızgarada dize değiştirme veya ızgaraya döndürülmüş sürümleri kullanarak gerçekleştirir.

Açıklamalı kod:

# 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 bayt

STDIN'den okunan tam program, satır beslemeleri olduğu sürece herhangi bir yeni satır düzeniyle başa çıkmalıdır. HackerCow'a farklı bir soruya yeni bir satır eklemem gerekmediğini, buradan kaldırmamı ve 4 bayt kaydetmem gerektiğini belirttiği için HackerCow'a teşekkürler.

Golf kodu:

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

Kod, her sayının etrafındaki satır sayısını ve her bir kavşaktan 0 veya 2 satır olduğunu ve ardından tüm satırların birleştirildiğini kontrol ederek 3 kontrol gerçekleştirir.

Biçimlendirilmiş kod:

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

Teşekkürler @ edc65, bunu nasıl özlediğim hakkında hiçbir fikrim yok!
VisualMelon

1

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

Her sayının yanında doğru sayıda satır olup olmadığını kontrol eder ve ardından satırların etrafında bir yol yürür ve kaçırıp kaçırmadığını kontrol eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.