Wszyscy znają starą grę Saper, która jest dostarczana z Windows XP. Jest to prosta siatka z matrycą 9 x 9 komórek zawierającą albo liczbę (wskazującą, ile min sąsiaduje z nią) lub kopalnię.
Wyzwanie polega na wygenerowaniu losowej siatki 9x9 z 10 bombami o dowolnym ziarnie całkowitym (do dowolnej liczby całkowitej maszyny / języka) z punktami brownie, jeśli sam zaimplementujesz PRNG
przykładowe dane wyjściowe: komórki zawierają cyfry 0–8 lub * dla kopalni
*101*1000
110111000
123210000
1***10000
123210011
00000002*
00000114*
000112*3*
0001*2121
Najkrótszy kod w bajtach wygrywa .. standardowe reguły itp. Itp.
code-golf
random
minesweeper
Aaron
źródło
źródło
Odpowiedzi:
Dyalog APL, 40 bajtów
⎕rl←1⋄(1,¨a)⍕¨{⍉3+/0,⍵,0}⍣2⊢a←9 9⍴9≥?⍨81
(zakłada
⎕io←0
)1
się⎕rl←1
to ziarnoz prawej do lewej:
?⍨81
jest taki sam jak81?81
- losowa permutacja9≥
powoduje, że maska bitowa zawiera dziesięć jedności w losowych pozycjach, reszta to 0a←9 9⍴
przekształć w kwadrat 9 na 9 i nazwij go „a”{ }⍣2
wykonaj następujące czynności dwa razy:⍉3+/0,⍵,0
przesuwane okno suma 3 kolumn (zakładaj 0 na zewnątrz), a następnie transponuj(1,¨a)⍕¨
każdy ma format (konwertuj na ciąg). Lewy argument⍕
określa całkowitą liczbę znaków i znaków ułamkowych w wyniku. Jeśli⍕
nie można sformatować zgodnie z tą specyfikacją, generuje*
- szczęśliwy zbieg okoliczności dla tego problemu.a
w miejscu, w którym znajdują się kopalnie, będzie 1 - próba dopasowania całości i części ułamkowej do jednego znaku jest niemożliwa, więc pojawią się one jako*
s.źródło
⎕io←0
założenie? Nie znam Dyalog APL ...⎕io
(„ Początek indeksu ”) na 0 powoduje, że są one oparte na 0 i odpowiednio zmienia niektóre prymitywy, np.⍳3
Będzie0 1 2
, nie1 2 3
. Można to zrobić programowo (⎕io←0
) lub z preferencji w GUI. Wybór ten jest 50-letnim błędem, który wciąż dzieli małą społeczność APL.MATLAB,
9493 bajtyPrzykład uruchomienia (pierwszy wiersz po kodzie to dane wpisane przez użytkownika):
Wyjaśnienie
przyjmuje liczbę całkowitą i używa jej jako materiału siewnego. (Działa to w nowoczesnych wersjach MATLAB. Stare wersje mogą wymagać innej składni.)
przypisuje wartość logiczną
0
lubfalse
(uzyskaną przez logiczne negowanie1
) do wpisu(9,9)
macierzyx
. Pozostałe wpisy są automatycznie inicjowane również na logiczne0
.cesjonariusze
1
(autoomatically rzutować na logiczne1
lubtrue
), aby10
z81
wpisówx
, wybranych losowo, bez zastąpienia. Te wpisy zawierają bomby.to skrót od
conv2(+x,ones(3),'same')
. Zwija matrycęx
(do której należy użyćdouble
, używając+
) z otoczeniem 3 × 3 zawierającym1
. To liczy, ile bomb sąsiaduje z każdym wejściem. Wpisy zawierające bombę obejmują tę bombę, ale wartość zostanie później zastąpiona.dodaje 48 do wartości, aby przekonwertować z numeru na kod ASCII. Łączenie z pustą macierzą powoduje rzutowanie tych kodów ASCII na znaki.
przypisuje 42 (kod ASCII dla
'*'
) do pozycji bomb. Te pozycje są podawane przezx
, który jest tutaj używany jako indeks logiczny.wyświetla wynik.
źródło
JavaScript (ES6), 204 lub 198 bajtów
Niestandardowy PRNG (204 bajty)
Ten kod używa liniowego generatora kongruencjalnego z mnożnikiem
22695477
i przyrostem1
(jest to implementacja Borland C / C ++).Ze względu na słabą wydajność PRNG podczas fazy rozgrzewania musiałem umieścić jedną bombę w rzędzie (zamiast 10 na początku lub 10 na końcu niewyasowanego układu). Zatem jest tylko 9 bomb. Mogę spróbować to naprawić później.
Ponadto musi istnieć prostszy / krótszy sposób przetworzenia czeku „poza planszą”,
(x=p%9-(n+=p)%9)*x-64
ale nie mogę tego teraz zrozumieć.Korzystanie z Math.random () (198 bajtów)
Ten obejmuje 10 kopalń zgodnie z życzeniem.
Próbny
źródło
'**********'+'0'
jest równy'**********'+0
; co oszczędza dwa bajty w wersji 198 bajtów.'0'
należy to powtórzyć i0.repeat()
nie zadziała....('**********'+0).repeat(71)
. Przepraszam.Python 2,
269266264 bajtówWypróbuj na ideone.com
Zaoszczędzono 2 bajty dzięki Aaronowi.
Najprawdopodobniej nadal gra w golfa.
Wyjaśnienie
random
jest importowany w celu użyciaseed
do wysiewu PRNG isample
losowego wyboru dziesięciu lokalizacji bomb.m
to matryca 9 x 9 zapisująca płytę. Dla każdej lokalizacji bomby odpowiedni wpis wm
zostanie ustawiony na,-9
a wszystkie sąsiednie wpisy zostaną zwiększone. W ten sposóbm
otrzymujemy liczbę sąsiednich bomb dla komórek niebombowych i liczbę ujemną dla komórek bombowych. Finałprint
drukuje całą planszę, iterując wszystkie liniel
dom
i wszystkie komórkic
wl
.źródło
sample()
for a in z:
bloku (tylko python 2.x)R, 187 bajtów
Wypróbuj na Ideone
Wyjaśnienie:
set.seed()
weź ziarno cst.x
jest indeksem macierzy 11 * 11y
jest indeksem macierzy 9 * 9 w macierzy 11 * 11z
jest indeksem bombyx=x*0
zainicjować wartość macierzyPętla dodaje 1 do x w przypadku sąsiedniej bomby.
źródło
JavaScript ES6, 244 bajty
źródło
`
znak.Ruby ,
181194183 + 1 = 184 bajtyZapomniałem ustawić nasiona, ups. Używa
-n
flagi.Wypróbuj online!
źródło
Python 2 , 172 bajty
Wypróbuj online!
źródło