Saper to gra logiczna, w której miny są ukryte wokół planszy nieokreślonych kafelków w celu ustalenia lokalizacji wszystkich min. Kliknięcie na minę przegrywa grę, ale kliknięcie na dowolny inny kafelek ujawni liczbę od 0 do 8, co oznacza, ile min bezpośrednio ją otacza.
Biorąc pod uwagę liczbę, musisz wyświetlić losową * możliwą kombinację pustych płytek i otaczających ją min. Powinno to być w postaci tablicy 3x3. Środkowa płytka powinna być liczbą min wziętych jako dane wejściowe.
* Musi mieć niezerową szansę na wystąpienie wszystkich kombinacji.
Przykłady
_ = blank square
X = mine
0
___
_0_
___
1
_X_
_1_
___
1
___
_1_
X__
___
_1_
__X
4
_X_
X4X
_X_
4
X_X
_4_
X_X
4
___
X4X
X_X
8
XXX
X8X
XXX
Wkład
- Liczba min otaczających środkową płytkę (0–8)
Wydajność
- Każda rozsądna forma wyniku wyświetlająca tablicę 3x3 płytek
Inne zasady
- Każda kombinacja nie musi mieć jednakowej szansy. Po prostu musi istnieć niezerowa szansa, że każda kombinacja wystąpi podczas wykonywania programu.
- Do kopalni i pustej płytki można wybrać dowolne 2 postacie.
- To jest kod golfowy, wygrywa program z najmniejszą liczbą bajtów.
code-golf
random
minesweeper
Aoemica
źródło
źródło
1
i0
?Odpowiedzi:
Galaretka , 9 bajtów
Wypróbuj online!
pusty =
1
mój =
0
Zauważ, że
1
i0
są liczbami całkowitymi.Kolejna uwaga: jest to nieco podobne do 10-bajtowej odpowiedzi Jonathana Allana, ale tak naprawdę nie ma na nią żadnego wpływu, a mechanizm, jeśli zwrócisz szczególną uwagę, w rzeczywistości jest bardziej inny niż na pierwszy rzut oka.
źródło
APL (Dyalog Unicode) ,
2815 bajtów-13 bajtów dzięki ngn!
Wyjaśnienie:
{...}
Bezpośrednia funkcja (D-Fn)⍵
jest jej właściwym argumentem.8?8
rozdaj 8 liczb losowych z listy 1..8:⍵≥
czy argument jest większy czy równy każdemu z nich ?:⍵,
wstaw argument na listę boolowską:5⌽
obróć listę o 5 pozycji w lewo, aby argument był na środku:3 3⍴
przekształć listę w macierz 3x3:Wypróbuj online!
J , 15 bajtów
Również wiele bajtów dzięki ngn!
Wypróbuj online!
źródło
(8↑1⍴⍨⍵)[8?8]
->⍵>8?8
(zakładając⎕io←0
)3 3⍴1↓,⍵,2 4⍴
->3 3⍴5⌽⍵,
JavaScript (ES6), 67 bajtów
Krótsza wersja sugerowana przez @tsh
Puste miejsca to
0
miny1
.Wypróbuj online!
Oryginalna wersja próbna i błędna, 78 bajtów
Puste miejsca są
_
miny7
.Wypróbuj online!
Skomentował
źródło
Galaretka ,
1310 bajtówZwrócona lista list ma wyświetlaną liczbę całkowitą pośrodku otoczoną zerami i jedynkami reprezentującymi odpowiednio miny i spacje.
Wypróbuj online! (stopka ładna drukuje tablicę)
W jaki sposób?
źródło
ŒH
działa również zamiasts4
.Pyth,
1614 bajtówZaoszczędzono 2 bajty dzięki isaacg.
Wykorzystuje spacje dla bezpiecznych miejsc i cytaty dla kopalń.
Wypróbuj tutaj
Wyjaśnienie
źródło
.[d8
zamiast>8+*8d
Oracle 18 SQL, 230 bajtów
Nie język golfa, ale ...
Wartość wejściowa znajduje się w tabeli
n
z kolumnąn
:Wypróbuj online - zaloguj się na https://livesql.oracle.com i wklej go do arkusza roboczego.
Wydajność:
Aby uzyskać wszystkie możliwe kombinacje (183 bajtów):
Wydajność:
źródło
Japt, 13 bajtów
Spróbuj
Wyjaśnienie
źródło
QBasic 1.1 ,
206186 bajtów-20 dzięki DLosc (nowo opublikowany trik golfowy).
Pusty =
0
Mój =
1
Zauważ, że
0
i1
są liczbami całkowitymi, ale i tak używam STDOUT, więc ...Dane wyjściowe wyglądają następująco:
Gdzie AH to 0/1, a x jest wartością wejściową.
źródło
Węgiel drzewny , 19 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Używa
0
kopalni,1
pustej przestrzeni. Wyjaśnienie:Peek
zwraca tablicę ciągów, któreSum
po prostu konkatenują, dlatego najpierw musimy rzutować na liczbę całkowitą. (Sum(Sum(PeekAll()))
również działa.)Sum
zwracaNone
pustą tablicę (pierwsza pętla), więc jedynym bezpiecznym porównaniem jestNot(Equals(...))
.Random
zawsze wraca0
, choć w jej dokumentacji jest inaczej.Alternatywne rozwiązanie, to 19 bajtów, teraz 17 bajtów po poprawce błędu węgla drzewnego:
Wypróbuj online! Link jest do pełnej wersji kodu. Używa
0
kopalni,1
pustej przestrzeni. Wyjaśnienie:Wydrukuj oryginalne wejście.
Wydrukuj a
9
lewą stronę. To przesuwa kursor z powrotem do oryginalnego wejścia, a także wymusza co najmniej jedną iterację pętli while (w przeciwnym razie wejście8
nie zrobiłoby nic).Powtórz, gdy różnica między sumą wszystkich cyfr na płótnie i 8 jest niezerowa:
Zamień losowo każdą z otaczających postaci na
0
lub1
.źródło
R ,
67 63 6259 bajtówWypróbuj online!
Używa
1
i0
. Zbudujn* 1 +(8-n)* 0
wektor, tasuje go, dołączan
, buduje większą macierz pokazaną poniżej (gdziea...i
oznaczają elementy oryginalnego wektora) i wyodrębnia odpowiednią podmacierz pokazaną wielkimi literami:źródło
matrix((c(sample(rep(1:0,c(n<-scan(),8-n))),n))[c(1:4,9:5)],3)
Python 2 , 93 bajty
Wypróbuj online!
0
dla pustych;1
dla kopalni; in
dla siebie.źródło
iter
jest inteligentne!Attache , 51 bajtów
Wypróbuj online!
Wyjaśnienie
Podobne do odpowiedzi J / APL Galena , podstawową techniką jest generowanie tablicy 1 i 0 z prawidłową liczbą min, wstawianie danych wejściowych przez dołączanie ich do końca, obracanie tablicy tak, aby dane wejściowe znajdowały się na środku, a następnie przekształcanie w matrycę 3x3.
Część 1: generowanie tablicy binarnej
Jest wiele sposobów na zrobienie tego, ale zdarzyło mi się głównie na dwa rodzaje: brutalna siła i selekcja.
Podstawowa metoda brutalnej siły wygląda następująco:
Generuje to losowe tablice 8 cyfr binarnych (
Random[8&2]
), podczas gdy ich sumy nie są równe wejściowi{Sum@_/=_2}&_
. Jest to trochę zbyt szczegółowe, ponieważ następujące fragmenty kodu, które podkreślono, są „tylko po to, aby działało”:I odrzuciłem ten pomysł.
Wybór jest bardziej interesujący. Główną koncepcją jest użycie
BaseBelow[b, n]
wbudowanego, który generuje listę wszystkich bazowychb
liczb całkowitych szerokościn
(jako tablic cyfrowych), od0
dob^n-1
. Na przykładBaseBelow[3, 2]
generuje wszystkie trójkowe liczby całkowite o szerokości 2:W szczególności korzystamy
BaseBelow[2, 8]
dla wszystkich liczb binarnych o szerokości 8. Reprezentują one wszystkie możliwe pola minowe wszystkich długości. To pierwszy krok.Drugim krokiem jest wybranie wszystkich takich tablic zawierających tylko
N
1s, gdzieN
jest wejście. Moim pierwszym pomysłem było przetłumaczenie tego angielskiego oświadczenia bezpośrednio na Attache:Jednak okazało się, że nie tylko był o 1 bajt dłuższy niż wspomniane wyżej podejście, ale jest również bardzo powtarzalny - i nawet nie jest jeszcze losowy! Jasne, prawdopodobnie mógłbym zaoszczędzić 1 bajt, reorganizując jak
BaseBelow
się nazywa, ale po prostu nie warto stosować tego podejścia.Postanowiłem więc zabić dwa ptaki jednym kamieniem i zastosować
Shuffle
podejście oparte. Poniżej podano wszystkie ważne pola minowe o długościN
w losowej kolejności:Następnie wszystko, co musisz zrobić, to wybrać pierwszy. Ale mogę zrobić lepiej - z pewnością lepiej byłoby po prostu
Sample
przefiltrować tablicę? Takie podejście wydaje się być takie:Musiałem cofnąć
BaseBelow&8!2
golfa, ponieważ\
priorytet jest zbyt wysoki. W przeciwnym razie usatysfakcjonowałem bajt:(Odkryłem tutaj inny sposób zwięzłego nazywania funkcji dyadycznej:
x&f@y
jest to wyrażenie o wysokim priorytecie, które oceniaf[x, y]
.)Jednak pomimo tego, przypomniałem sobie, że przez cały czas, alias
2&BaseBelow
istniał:BinBelow
. Więc użyłem tego:To generuje pożądane pole minowe. Jestem przekonany, że jest to prawie optymalne.
Część 2: Formowanie tablicy
Jak wspomniano wcześniej, zastosowana przeze mnie technika formowania jest podobna do odpowiedzi J / APL, więc nie będę wchodził w szczegóły. Załóżmy, że
MINEFIELD
jest to wynik z ostatniej sekcji. Funkcja staje się wtedy:MINEFIELD'_
łączy pole minowe z oryginalnymi danymi wejściowymi_
, dając nam coś takiego:Następnie
Rotate[MINEFIELD'_,4]
obraca tę listę4
razy w lewo, umieszczając środek:Ostatnim krokiem jest
[3,3]&
przekształcenie listy w macierz 3x3:źródło
Java 10,
165157141 bajtówPuste płytki są
_
(dowolna postać o wartości Unicode powyżej 58 jest w porządku), a miny są0
.Wypróbuj online.
Wyjaśnienie:
źródło
PowerShell , 77 bajtów
Wypróbuj online!
źródło
PHP ,
135134123117122121 bajtówPętla zamiast str do drukowania zamiast tego oszczędza 1 bajt
str_split i implode, aby wstawić numer środkowy, zapisuje 11 bajtów
Nie trzeba już przypisywać ciągu do $ s, co pozwala zaoszczędzić 6 bajtówTak. W przeciwnym razie ciąg jest tasowany po każdym echu ...
Usunięcie białych znaków po echu oszczędza 1 bajt
Zastąpienie „\ n” faktycznym podziałem linii pozwala zaoszczędzić 1 bajt
Wypróbuj online!
źródło
Alice , 24 bajty
Wypróbuj online!
Puste miejsca są
9
i miny0
.Zrobiłem również 27-bajtowy program z
1
kopalniami i0
pustymi miejscami:Wypróbuj online!
źródło
PowerShell ,
9186 bajtów-5 bajtów dzięki mazzy
Wypróbuj online!
Tasuje wygenerowany ciąg znaków od
________
doXXXXXXXX
(zastępując od lewej). Następnie przecina go wiele razy, wstawiając$n
na środku, aby zbudować ciąg wyjściowy. Ta ostatnia część może być prawdopodobnie znacznie zoptymalizowana, ponieważ każdy indeks kosztuje minimum 5 bajtów.źródło
Ruby , 59 bajtów
Zwraca listę ciągów (po jednym dla każdej linii).
Wypróbuj online!
źródło
C (gcc) , 81 bajtów
Wypróbuj online!
źródło
Perl 5
-pa
,105101 bajtówWypróbuj online!
źródło
05AB1E , 12 bajtów
Zastosowania
0
dla min, spacje dla pustych kwadratów. Wysyła listę linii, która jest dość drukowana w poniższych TIO, łącząc się z separatorem nowej linii (»
).Wypróbuj online lub sprawdź kilka innych przypadków testowych jednocześnie .
Wyjaśnienie:
Alternatywnie 12 bajtów :
Używa
1
dla kopalni,0
dla pustych kwadratów. Wyprowadza macierz cyfr, która jest dość drukowana w poniższych TIO, łącząc każdy wiersz, a następnie wiersze z separatorem nowej linii (J»
).Wypróbuj online lub sprawdź kilka innych przypadków testowych jednocześnie .
Wyjaśnienie:
źródło