Saper to popularna gra logiczna, w której musisz odkryć, które kafelki są „kopalniami”, bez klikania na te kafelki. Każdy kafelek jest kopalnią (reprezentowaną przez *
) lub wskazówką, tj. Liczbą od 0 do 8, która reprezentuje liczbę 8 sąsiadujących kafelków to miny. Twoim zadaniem dzisiaj jest zabranie planszy zawierającej miny i wypełnienie wszystkich wskazówek. Na przykład spójrz na następującą planszę 5x4 z 5 minami:
*
* *
*
*
Po wypełnieniu wskazówek tablica będzie wyglądać następująco:
2*211
*33*1
12*32
0112*
Detale
Musisz napisać pełny program lub funkcję, która przyjmuje siatkę znaków zawierającą tylko spacje i gwiazdki i wypisuje inną siatkę, w której każda spacja jest zastępowana liczbą sąsiednich min (gwiazdkami). Każdy z tych formatów jest akceptowalny dla twoich siatek:
Ciąg z znakami nowej linii
2D lista znaków / ciągi pojedynczych znaków
Lista ciągów
Możesz założyć, że siatka będzie wynosić co najmniej 1x1, chociaż możliwe jest, że będą to wszystkie miny lub wszystkie pola.
Siatka wejściowa zawsze będzie wypełniona odpowiednią liczbą spacji. Jak zwykle jest to gra w golfa , więc obowiązują standardowe luki i wygrywa najkrótsza odpowiedź w bajtach!
Próbka IO
Aby zobaczyć białą przestrzeń, pokażę wszystkie próbki IO z nawiasami wokół tego.
Input:
[ * ]
[* ]
[ ]
[ ]
[ ** ]
[ * * ]
Output:
[1101*1]
[*10111]
[110000]
[012210]
[12**21]
[1*33*1]
Input:
[****]
[****]
Output:
[****]
[****]
Input:
[ ]
[ ]
[ ]
[ ]
Output:
[000]
[000]
[000]
[000]
Input:
[* ]
[** ]
[ ]
[ *]
Ouput:
[*310]
[**10]
[2221]
[001*]
Input:
[** ]
[* *]
[ * ]
[ ]
[* ]
[**** ]
Output:
[**1011]
[*4211*]
[12*111]
[121100]
[*43210]
[****10]
Input:
[ * ]
[ * ]
[ * ]
[** *** ]
[ *** ]
[ ]
[ ** ]
[ * * ]
[* ** ]
[ ** ]
Output:
[00001*1111]
[00002221*1]
[22102*4321]
[**102***31]
[221013***1]
[0000013542]
[0112111**1]
[12*2*12442]
[*212112**2]
[1100002**2]
źródło
Odpowiedzi:
MATL ,
1817 bajtówDzięki @ mbomb007 za poprawkę na wejściu przypadku testowego 6
Dane wejściowe to tablica znaków 2D w formacie
Wypróbuj online!
Przypadki testowe: 1 , 2 , 3 , 4 , 5 , 6 .
Wyjaśnienie
źródło
JavaScript (ES6),
11496 bajtówEdycja: Zapisano 18 bajtów dzięki pomysłowi @ETHproductions.
źródło
a=>a.map((s,i)=>s.replace(/ /g,(_,j)=>a.slice(i-!!i,i+2).reduce((t,s)=>t+(q=i=>s[i+j]>' ')(-1)+q(0)+q(1),0)))
R,
127112 bajtówdzięki @gtwebb i @ sebastian-c za ulepszenia.
Ważne punkty:
Macierze są wektorami w R. Nie potrzebujesz indeksowania 2-D, aby wydobyć elementy.
seq(M)
zwróci ciąg o tej samej „długości” (wiersze x kolumny) coM
.Nie można mieszać dodatnich i ujemnych wskaźników ekstrakcji w R.
M[-3]
jest to prawidłowy kod R, ale nie to, co jest pożądane.Dane wejściowe mają postać macierzy R. Kilka przykładów:
źródło
T
zamiastTRUE
. Udało mi się również zsunąć kilka nawiasów klamrowych z jednej z funkcji if:f=function(M){a=nrow(M);b=ncol(M);for(i in seq(M))if(M[i]!="*")M[i]=sum(M[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)]=="*",na.rm=T);M}
b=ncol(M)
a następnie nie używaj go, aby się go pozbyć.M->{a=nrow(M);p=M=='*';M[]=ifelse(p,'*',sapply(seq(M),i->sum(p[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)],na.rm=T)))}
- to jednak trochę oszukuje, ponieważ wymaga przedefiniowanej<-
lambdy, patrz klmr / funkcjonalna / lambdaJava, 190 bajtów
Edytować:
Snipet
Nie golfowany:
Ideone to.
źródło
x,y,i,j
c[i][j]==32
i tak dalej, po prostu zmieniłem je w części Ungolfed0000*1\n*10011\n110000\n000000\n00**10\n0*22*1
. Czy mógłbyś dodać link testowy ideone.com? EDYCJA: Poza tym, chyba że sami coś robię źle, wyjście z kodu golfowego:ssss0s\n0sssss\nssssss\nssssss\nss00ss\ns0ss0s
dla pierwszego przypadku testowego (zastąpił*
je zerami ..): SJavaScript (ES6), 107
Wejścia / wyjścia jako tablica ciągów
Uwaga: gdy funkcja s zostanie wywołana z elementem listy l poza granicami, parametr
a
jestundefined
ic+a
spowoduje" undefined"
dzięki dziwacznym regułom konwersji javascriptBardziej czytelny
źródło
Python 2, 138 bajtów
Definiuje funkcję,
f
która akceptuje ciąg wejściowy, taki jaki wypisuje ciąg do STDOUT:
źródło
enumerate(s,2)
) i zastąpić wszystkie wystąpieniai + 2
zi
ii - 1
zi - 3
. To ogoli kilka bajtów.JavaScript (ES6)
186182177161152 bajtówAktualizacja
Powyższy kod
" *"
zwrotów"2*"
. Zostało to naprawione w następującym skrypcie.168167 bajtówWypróbuj tutaj.
źródło
t+=(a[x+i%3-1]||[])[y+i/3-1|0]==k
powinien działać w podobny sposób i oszczędzić Ci częśćtry
/catch
.(a[x+i%3-1]||1)[y+i/3-1|0]
.Haskell, 115 bajtów
Definiuje funkcję
f
na listach ciągówźródło
Python 2, 192 bajty
-3 bajty dzięki Copper, -10 bajtów, jeśli dozwolona jest modyfikacja siatki wejściowej, kolejne -11 bajtów poprzez pozbycie się
continue
i kolejne -12 bajtów w celu wyeliminowania zmiennej licznikaWykorzystuje listę znaków
L
i tworzy wyściełaną wersjęK
, więc nie ma problemu na granicach. Wcięcie jestStosowanie:
źródło
if'*'==L[y][x]:
aby zapisać bajt.r=range;
na tej samej linii, con,S,s
można zapisać pięć znaków poprzez zastąpienie połączeń dorange(...)
zr(...)
.ange
więc 8 bajtów, ale muszę dodać,r
i,range
który jest również 8 bajtami, więc nic nie zarobiłem.range
.Ruby, 112
Bierze i zwraca ciąg znaków. Ciąg musi być oddzielony znakiem nowej linii i zakończony znakiem nowej linii.
w programie testowym
źródło
TSQL
292291 bajtówGra w golfa:
Nie golfowany:
Skrzypce
źródło
;
liczy się przód kodu? Wygląda na to, że to policzyłeś.Rakieta 415 bajtów
Nie golfowany:
Testowanie (wyszczególnia jako pojedynczy ciąg znaków z określonym numerem kolumny; działa również ze spacjami):
Wynik:
źródło
PHP,
145133132127 bajtówpobiera dane wejściowe jako pojedynczy ciąg rozdzielony znakiem nowej linii. Uruchom z
-r
.awaria
źródło
"!">$n=$s[$p]
zamiast" "==$n=$s[$p]
oszczędza jeden bajtTurtlèd , 99 bajtów
(ups, ciągle zapominam o linku: |)
Pobiera dane w nawiasach wokół każdej linii
Turtlèd nie może przyjmować wejścia wieloliniowego, więc po ostatnim wierszu napisz
|
na koniec sygnału wejściaZwróć uwagę, że niedopasowane nawiasy są, ponieważ otwarte nawiasy parsują następny znak jako część polecenia nawiasu
Wypróbuj online!
Jak to działa (opis ogólny):
Dopóki nie
|
zostanie wprowadzony, zapisuje dane wejściowe w każdym wierszu, w nawiasach, aby pomóc mu rozpoznać koniec każdego wiersza. Kiedy to się stanie, nastąpi powrót na szczyt danych wejściowych. Przechodzi przez każdy wprowadzany znak. Jeśli jest to spacja, rozgląda się po niej, dodając jeden do licznika za każdą znalezioną bombę. po każdej linii usuwa nawiasy. Kiedy dojdzie do ostatniej linii, za pomocą | w nim zatrzymuje się i usuwa |. siatka jest domyślnie drukowana.źródło
C,
152150147145 bajtówDane wejściowe mają postać dwuwymiarowej tablicy znaków, po której następują liczby wierszy i kolumn. Wynik zostanie zwrócony na miejscu.
(Przeważnie) Nie golfowany:
Podejście jest proste - pętla nad każdą pozycją, pętla nad sąsiadami i sumowanie wszystkich gwiazdek. Istnieją dwa triki na poziomie bitowym:
Kiedy decydujemy, czy komórka jest gwiazdką, czy nie, możemy po prostu sprawdzić, czy ustawiony jest bit ósemki, ponieważ liczba w komórce musi być mniejsza niż 8 (maksymalna wartość komórki).
Możemy zamienić znak spacji na znak zerowy przez OR-16.
Edycja: Oderwano dwa bajty, używając
/
zamiast>=
.Edycja: Kolejne pięć bajtów poprzez odwrócenie kierunku pętli.
źródło
C #, 341 bajtów
Naiwne wdrożenie, które można zdecydowanie skrócić.
źródło
Python 2, 183 bajtów
źródło