Sprawdź poprawność rozwiązań Loopy

9

Jest to dodatkowe wyzwanie dla wyzwania generowania łamigłówek Loopy . Możesz spróbować rozwiązać to wyzwanie, zanim spróbujesz trudniejszego wyzwania w poprzednim łączu.

Celem tego wyzwania jest sprawdzenie rozwiązania łamigłówki. Proszę wziąć całą dokumentację dotyczącą tego, czym jest zwariowana łamigłówka z poprzedniego linku. Rozwiązana łamigłówka jest sformatowana w bardzo podobny sposób, jak wynik prawidłowego poddania się wyzwaniu „generuj łamigłówki” i może wyglądać następująco:

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

Ścieżka tworząca rozwiązanie jest oznaczona znakami |i -pomiędzy +znakami.

Specyfikacja wejściowa

Twój program otrzyma pętlową łamigłówkę z rozwiązaniem sformatowanym jak na powyższym przykładzie jako dane wejściowe. Twój program wyliczy rozmiar układanki na podstawie danych wejściowych. Możesz przyjąć następujące założenia dotyczące danych wejściowych:

  • Układanka ma nie mniej niż 2 i nie więcej niż 99 komórek w obu kierunkach
  • Tak więc, każda linia ma maksymalną długość 199 znaków bez uwzględnienia znaku (ów) nowej linii
  • Tak więc wejście zawiera maksymalnie 99 wierszy
  • każda linia może kończyć się po ostatnim znaku do wydrukowania lub może być wypełniona białymi znakami, więc ma długość do 2 · y + 1 znaków, gdzie y jest liczbą komórek w kierunku poziomym
  • każda pozycja z obu x i y współrzędnych nawet zawiera +znak
  • pozycje w poziomie lub w pionie przylegające do pozycji zawierających +znaki zawierają znak spacji, znajdują się za końcem linii lub zawierają -znak, jeśli sąsiadują poziomo lub |znak, jeśli sąsiadują pionowo
  • wszystkie pozostałe pozycje są albo za koniec linii lub zawierają jeden z bohaterów , 0, 1, 2, lub3
  • wszystkie linie są zakończone domyślnymi znakami nowej linii na platformie
  • jest dokładnie jedna nowa linia

Dane wejściowe należy odbierać w jeden z następujących sposobów:

  • Ze standardowego wejścia
  • Jako wartość parametru nazwanego pw żądaniu POST HTTP
  • Jako treść formularza HTML
  • Jako zawartość pliku o nazwie pw katalogu zdefiniowanym w implementacji
  • W implementacji zdefiniowany sposób w czasie wykonywania, jeśli poprzednie cztery nie są dostępne
  • Zakodowane na stałe, jeśli twój język nie zapewnia możliwości otrzymywania danych wejściowych

Specyfikacja wyjściowa

Twój program zostanie zakończony dla wszystkich danych wejściowych zgodnych ze specyfikacją danych wejściowych i obliczy, czy rozwiązanie układanki jest prawidłowe. Twój program wyświetli wynik obliczeń jako wartość logiczną na jeden z następujących sposobów:

  • Jako status wyjścia zero (rozwiązanie jest prawidłowe) lub niezerowe (rozwiązanie jest nieprawidłowe)
  • Ponieważ znak y(rozwiązanie jest prawidłowe) lub n(rozwiązanie jest nieprawidłowe), po którym następuje zero lub więcej dowolnych znaków wyprowadzanych w sposób zdefiniowany w implementacji

Zachowanie Twojego programu jest nieokreślone, gdy napotkasz dane wejściowe niesformatowane zgodnie ze specyfikacją danych wejściowych.

Punktacja

Wynik twojego programu to liczba znaków w jego źródle, z wyjątkiem możliwych do pominięcia białych znaków i możliwych do pominięcia komentarzy. Zachęcamy do wcięcia swojego zgłoszenia, aby ułatwić innym czytanie i komentowanie rozwiązania, aby było łatwiejsze do naśladowania.

Zgłoszenia niezgodne ze specyfikacją wejściową lub wyjściową lub generujące nieprawidłowe wyniki są nieprawidłowe.

FUZxxl
źródło
Jak przetwarzać dane wejściowe? Czytasz z pliku? STDIN? Czy mogę napisać funkcję?
Martin Ender
@ MartinBüttner „Twój program otrzyma ...”. Nie jestem pewien, dlaczego chcesz czytać z pliku.
John Dvorak,
@ MartinBüttner Musisz napisać kompletny program. Myślę, że język „twój program”, „kończy się”, „status wyjścia” jest dość jasny.
FUZxxl,
1
Zauważ też, że w większości puzzli 0jest także poprawny numer komórki.
Howard,
@ Howard Przepraszamy, przegapiłem to.
FUZxxl,

Odpowiedzi:

2

GolfScript, 133 znaki

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

Oczekuje danych wejściowych od STDIN i drukuje ydla prawidłowego i nnieprawidłowego rozwiązania. Wykonuje zadanie, używając głównie zamiany łańcucha na siatce lub z obróconymi wersjami siatki.

Kod z adnotacjami:

# 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
źródło
2

C # 803 579 bajtów

Kompletny program, odczytywany ze STDIN, powinien poradzić sobie z każdym popularnym schematem nowej linii, o ile ma on linie. Dzięki HackerCow za zwrócenie uwagi, że nie muszę dodawać nowego wiersza w innym pytaniu, prosząc mnie o usunięcie go tutaj i zapisanie 4 bajtów

Kod do gry w golfa:

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 wykonuje 3 kontrole, najpierw sprawdzając liczbę linii wokół każdej liczby i czy każde skrzyżowanie ma 0 lub 2 linie prowadzące od niego, a następnie czy wszystkie linie są ze sobą połączone.

Sformatowany 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
    }
}
VisualMelon
źródło
Dzięki @ edc65, nie mam pojęcia, jak mi tego brakowało!
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')

Sprawdza, czy obok każdej liczby znajduje się odpowiednia liczba wierszy, a następnie przechodzi ścieżkę wokół linii i sprawdza, czy nie została pominięta.

Obrzydliwe
źródło