Twoim celem jest sprawdzenie, czy wypełniona tablica Saper jest ważna. Oznacza to, że każda liczba jest prawidłową liczbą min w sąsiadujących z nią komórkach, w tym przekątnych. Plansza się nie zawija.
Jak zwykle powinieneś podać funkcję lub program, a najkrótszy kod w bajtach wygrywa.
Zobacz także poprzednie wyzwania dotyczące generowania , rozwiązywania i pełnego wdrażania Saperów.
Wkład:
Pojedyncza struna tak: 02X2 13X2 X211
.
Rzędy planszy trałowskiej są oddzielone spacjami. Tak więc powyższe przedstawia planszę 3x4:
02X2
13X2
X211
Każda komórka ma postać:
X
dla kopalni lub numer0
przez8
.Wszystkie rzędy mają tę samą długość.
Istnieją co najmniej 3 rzędy i 3 kolumny.
Dane wejściowe nie zaczynają się ani nie kończą spacją, ale możesz dodać nowy wiersz na końcu, jeśli chcesz.
Wydajność:
Spójna Prawda na prawidłowych planszach i spójna wartość Falsey na niewłaściwych planszach. Konsekwencja oznacza, że wszystkie dane wyjściowe Prawdy są takie same, a wszystkie dane wyjściowe Falsey są takie same.
Przypadki testowe
Każda linia to osobny przypadek testowy.
True
:
02X2 13X2 X211
XXXX XXXX XXXX XXXX
XX4X2 5X6X4 XX6XX 4XX54 2X4XX
False
:
02X2 13X2 X212
XXXX XXXX X7XX XXXX
XX5X2 5X6X4 XX6XX 4XX54 2X5XX
źródło
Odpowiedzi:
Python 2,
132 129128Użyłem
enumerate
w golfa ... a nawet użyłemrange
gdzie indziej w tym samym programie. Oczywiście coś jest nie tak.Edycja: Powtarzaj
dict(enumerate(s))
zamiastenumerate(s)
, więcenumerate
nie trzeba wywoływać dwa razy.źródło
~
! I słowniki, aby indeksowanie poza zakresem działało poprawnie.~
operatora ironicznie zwrócił uwagę, że użyłem go dwa razy bez żadnego powodu, a użycie go tylko raz oczywiście doprowadziłoby do tego samego. Pomyślałem, że część słownika jest zabawna, dzięki.Pyth, 43
Wypróbuj tutaj .
Wyjaśnienie:
Jhxzd
: Jest to lokalizacja pierwszego miejsca na wejściu + 1. (z
na wejściud
jest spacja.) Jest to separacja na wejściu między sąsiadującymi pionowo komórkami na planszy.!f
: Jest to logiczne not (!
) filtru (f
), który będzieTrue
wtedy i tylko wtedy, gdy wyrażenie będzie fałszem dla każdego elementu sekwencji.-@zT
: Weź znak z lokalizacjiT
(zmienna lambda) z wejścia i usuń wszelkie wyglądy: (To będzie prawda, jeśli znak nie zostanie usunięty, i fałsz, jeśli tak jest.+" X"
: Usuń spację, X i`
: Repr zsm
: suma mapy do/ \X
: liczba „X” w:+*JNz
: Wycinek wejścia poprzedzonyJ
fikcyjnymi znakamitd+d2
: Od d-1 do d + 2.m+T*kJU3
: Dla d w [T, T + J, T + 2 * J].Uz
Dla T wrange(len(input))
.źródło
APL (NARS2000) (74)
Działa również w APL Dyalog, jeśli
⎕ML
jest ustawiony na3
.Wyjaśnienie:
⊃⍵⊂⍨⍵≠' '
: podziel⍵
na spacje i użyj list do utworzenia matrycy.G←¯1+⎕D⍳
: znajdź indeks⎕D
dla każdej wartości, odejmij 1 i zapisz go wG
. (⎕D
zawiera cyfry, dowolna cyfra zmieni się w10
).Z←G↑⍨2+⍴G
: dodaj dwie linie i kolumny zer na krawędzi macierzy, aby poradzić sobie z zawijaniem{
...}¨⍳⍴Z
: dla każdej pozycjiZ
znajdź liczbę bomb w sąsiedztwie Moore tej pozycji:G∘.⊖(G←2-⍳3)∘.⌽⊂Z
: obracaj wZ
lewo, w prawo, w górę, w dół, w lewo w górę, w prawo w górę, w lewo w dół i w prawo w dół.⍵∘⌷¨
: dla każdego z nich znajdź element⍵
w każdej z tych obróconych matryc+/∊9<
: policz, ile elementów ma więcej niż 9 (to jest ilość bomb).(⍴G)↑
: ponownie usuń dodane linie zer,G=
: sprawdź, czy każdy elementG
jest równy ilości bomb otaczających tę pozycję (powinno to być prawdziwe dla wszystkich kwadratów niebombowych),(G>9)∨
: i sprawdź, czy pierwiastkiG
są wyższe niż9
(to są bomby).~0∊
: zwróć,1
jeśli wynikowa macierz nie zawiera zer (= wszystkie kwadraty to albo bomby, albo poprawna liczba), a0
jeśli tak.źródło
C #,
321 320305Pierwsza próba gry w golfa i wiem, że C # nie jest idealnym językiem.
Mam nadzieję, że pisanie metody instancji jest dozwolone, w przeciwnym razie dodaj kolejne 7 znaków dla
static
.Rozmieszczone:
Korzystanie z Linq oszczędza trochę miejsca w porównaniu do pętli, ale trudniej jest debugować.
Nauczyłem się kilku rzeczy, takich jak konwersja
char => int
przez odejmowanie'0'
.Wydawało się, że łatwiej jest wyłożyć planszę spacjami, aby iteracja nad nią była łatwiejsza.
źródło
-'0'
się-48
. Działa dla mnie i zapisuje kilka bajtów dla różnych „X” i „”Python 2, 121
Jest to w dużej mierze inspirowane odpowiedzią feersum . Kolejność dnia to przesada: zamiast sprawdzać miny w 9 sąsiadach komórki, sprawdź każdą komórkę, aby zobaczyć, czy jest to sąsiednia kopalnia.
Sprawdzamy, czy dwie komórki są sąsiadami
2>r>-2<c<2
, gdzier
i gdziec
są różnice między rzędami i kolumnami komórek, równoważne{r,c}<{-1,0,1}
. Te współrzędne są obliczane na podstawie indeksów komórekI
orazi
jakoc=I%n-i%n
ir=I/n-i/n
. Bardziej efektywne jest indeksowanie bezpośrednio do ciągu i wyodrębnianie wierszy i kolumn niż przekształcanie go w obiekt 2D, taki jak lista list. Kontrola kopalni jestB[i]>'W'
tutaj równoważnaB[i]=='X'
.Użycie
enumerate
zapisałoby dwa znaki na brzydkim,range(len(B))
z wyjątkiem tego, że zwraca obiekt iteratora, który nie obsługuje dwóch zagnieżdżonych pętli.źródło
~B.find
./
ponieważ zaokrągla również negatywy w dół.Python 2, 140
źródło
JavaScript (ES6),
135133125122Wprowadź dane wejściowe do funkcji jako ciąg znaków:
Wyjaśnienie znajduje się w starej wersji poniżej. Nowa wersja zastępuje
for
pętleevery
wywołaniami i używa zmienneje="every"
do wykonaniasomeArray[e](...)
zamiastsomeArray.every(...)
.Ponadto licznik
k
jest teraz indeksowany,1
dzięki czemuk+=...
wyrażenie jest zawsze zgodne z prawdą, abyevery
pętla działała. Eliminujemy to dodatkowe1
, odejmująctrue
wynik (który zmusza liczbowo1
) zwrócony przezevery
operację[-1,0,k=1][e](...)
.Stara wersja:
Kod ze spacjami i komentarzami:
Metoda
every
tablicowa JavaScript przyjmuje wywołanie zwrotne i stosuje je do każdego elementu tablicy. Jeśli jakakolwiek funkcja zwrotna zwróci wartość falsey,every
połączenie zostanie zwróconefalse
.Wartości logiczne w JS są wymuszane na 1 lub 0, gdy są częścią dodatku. Dla każdej otaczającej przestrzeni „dodajemy” wynik boolowski porównując jego wartość,
X
a następnie dodajemy tę wartość do licznikak
w wyrażeniuk += (... == "X")
. Dlategok
zawiera liczbę otaczającychX
s, ponieważtrue
liczy się jako1
ifalse
liczy się jako0
.źródło
c=="X"
próbować!c/1
, co oszczędza ogromną ilość krzyczącej pary bajtów! Jeśli to się nie powiedzie, spróbuj!!c/1
. Rozumowanie jest takie'X'/1 => NaN
iNaN
jest falsie. Sprawdzasz, czyc=='X'
nie spróbowaćfalse
?(!c)/1
, co niestety nie pomaga; Musiałbym mieć nawiasy!(c/1)
, które kosztują 2. Również0/1
jest falsey, więc nieprawidłowe wpisanie „0X
” miałoby niepoprawny wyniktrue
. Najlepsze, co mogę zrobić, wciąż przestrzegając zer, to połączenie dwóch warunków w negację, na przykład!(+c+1&&k-c)
, ale ta sama długość, co już mam.!(k-1-c)
testuje oba warunki, ponieważ jeślik
pasujec
(minus 1 przesunięcie), to negacja staje się0
prawdą, a jeślic
nie jest liczbą, otrzymujemyNaN
i negację jest równieżtrue
.CJam,
70 6563 bajtówMożna w to dużo grać w golfa.
Daje
1
za prawidłową i0
nieprawidłową tablicę.Przypadki testowe
Wkład
Wydajność
Wypróbuj online tutaj
źródło
JavaScript (ES6) 98
Używanie niektórych do zastosowania funkcji do każdego znaku ciągu.
Funkcja powraca
Wewnętrzna kontrola jest wykonywana przy użyciu mapy tylko dlatego, że jest krótsza niż dla każdego
niektóre zwracają wartość true przy pierwszej wartości zgodnej z prawdą (w tym przypadku niezerowej), co oznacza nieudane sprawdzenie. Wynik jest zanegowany, aby dać bardziej rozpoznawalną wartość prawda / fałsz.
Testuj w konsoli FireFox / FireBug
Wydajność
źródło
R, 156 znaków
Z wcięciami, spacjami i podziałami linii, dla czytelności:
Przykłady:
źródło