Co otacza moją płytkę Saper?


31

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.

„Do kopalni i pustej płytki można wybrać 2 dowolne postacie”. Czy możemy nadal używać, powiedzmy, 1i 0?
Jonathan Allan

3
@JonathanAllan Powiem tak, przypadki wprowadzania 0/1 mogą być nieco mylące, ale nie sądzę, że to wielka sprawa.
aoemica,

czy płaska, 9-elementowa lista jest „rozsądną formą produkcji”?
Chas Brown

@ChasBrown nie, płaska lista nie jest tak naprawdę równoważna.
aoemica,

Odpowiedzi:


4

Galaretka , 9 bajtów

<Ɱ8Ẋs4js3

Wypróbuj online!

pusty = 1
mój =0

Zauważ, że 1i 0są 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.


Ugh spóźniłem się na lewę :)
Jonathan Allan

@JonathanAllan Czy uważasz, że jest to wystarczająco blisko twojego? Sufiks i tak jest taki sam ...
Erik the Outgolfer

1
Jest nieco inny. Jeśli przeczytam post i znajdę szybkiego golfa, komentuję; jeśli tylko próbuję rozwiązać wyzwanie, które zamieszczam. Wcześniej publikowałem identyczny kod.
Jonathan Allan

@JonathanAllan Moje podejście do tego jest nieco inne, jeśli dowiaduję się, że moje niezależne rozwiązanie jest w rzeczywistości prawie takie samo jak kogoś innego, ale z nieco innym elementem, który oszczędza bajt lub dwa (wynika subiektywna opinia), komentuję, w przeciwnym razie ja outgolf. Właśnie dlatego zapytałem, ale wydaje się, że wolisz, żebym to tutaj opublikował, więc ...
Erik the Outgolfer

9

APL (Dyalog Unicode) , 28 15 bajtów

-13 bajtów dzięki ngn!

{3 35⌽⍵,⍵≥8?8}

Wyjaśnienie:

{...}Bezpośrednia funkcja (D-Fn) jest jej właściwym argumentem.

8?8 rozdaj 8 liczb losowych z listy 1..8:

      8?8                         
7 2 1 8 4 6 5 3

⍵≥ czy argument jest większy czy równy każdemu z nich ?:

      5  7 2 1 8 4 6 5 3   
0 1 1 0 1 0 1 1

⍵, wstaw argument na listę boolowską:

      5 , 0 1 1 0 1 0 1 1
5 0 1 1 0 1 0 1 1

5⌽ obróć listę o 5 pozycji w lewo, aby argument był na środku:

      5  5 0 1 1 0 1 0 1 1
1 0 1 1 5 0 1 1 0

3 3⍴ przekształć listę w macierz 3x3:

      3 3  1 0 1 1 5 0 1 1 0
1 0 1
1 5 0
1 1 0

Wypróbuj online!

J , 15 bajtów

Również wiele bajtów dzięki ngn!

3 3$5|.],]>8?8:

Wypróbuj online!


1
(8↑1⍴⍨⍵)[8?8]-> ⍵>8?8(zakładając ⎕io←0)
ngn

1
3 3⍴1↓,⍵,2 4⍴->3 3⍴5⌽⍵,
ngn

@ngn Thanks! Wstydzę się mojej pełnej próby ...
Galen Iwanow

1
nie trzeba się wstydzić :) dziękuję - ta odpowiedź dała mi okazję do nauki J.
ngn

1
ta odpowiedź J jest naprawdę urocza.
Jonasz

8

JavaScript (ES6), 67 bajtów

Krótsza wersja sugerowana przez @tsh

Puste miejsca to 0miny 1.

n=>`___
_${t=9,n}_
___`.replace(/_/g,_=>n-(n-=Math.random()<n/--t))

Wypróbuj online!


Oryginalna wersja próbna i błędna, 78 bajtów

Puste miejsca są _miny 7.

f=(n,o=`___
_${k=n}_
___`.replace(/_/g,c=>Math.random()<.5?--k|7:c))=>k?f(n):o

Wypróbuj online!

Skomentował

f = (                         // f = recursive function
  n,                          // n = input
  o = `___\n_${k = n}_\n___`  // o = minesweeper field / k = backup of n
    .replace(/_/g, c =>       // for each underscore character c in o:
      Math.random() < .5 ?    //   random action:
        --k | 7               //     either decrement k and yield 7
      :                       //   or:
        c                     //     let the underscore unchanged
    )                         // end of replace()
) =>                          //
  k ?                         // if k is not equal to 0:
    f(n)                      //   try again
  :                           // else:
    o                         //   stop recursion and return o


6

Galaretka ,  13  10 bajtów

8Ẉ>RẊs4js3

Zwró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?

8Ẉ>RẊs4js3 - Link: integer, n                   e.g.  3
8          - eight                                    8
 Ẉ         - length of each (implicit range of eight) [1,1,1,1,1,1,1,1]
   R       - range of n                               [1,2,3]
  >        - greater than? (vectorises)               [0,0,0,1,1,1,1,1]
    Ẋ      - shuffle                                  [1,1,1,0,0,1,1,0]
     s4    - split into chunks of 4                   [[1,1,1,0],[0,1,1,0]]
       j   - join (with n)                            [1,1,1,0,3,0,1,1,0]
        s3 - split into chunks of 3                   [[1,1,1],[0,3,0],[1,1,0]]

1
Jako mała uwaga, ŒHdziała również zamiast s4.
Pan Xcoder,

; ṙ4s3 również działa
dylnan

@dylnan Właściwie napisałem z TIO o tym samym kodzie w pewnym momencie podczas gry w golfa (ale szybko go odłożyłem, aby nie musiałem przepisywać wyjaśnień).
Jonathan Allan

6

Pyth, 16 14 bajtów

c3jQc2.S.[d8*N

Zaoszczędzono 2 bajty dzięki isaacg.
Wykorzystuje spacje dla bezpiecznych miejsc i cytaty dla kopalń.
Wypróbuj tutaj

Wyjaśnienie

c3jQc2.S.[d8*N
            *NQ     Get (implicit) input number of quotes...
        .[d8        ... and pad to length 8 with spaces.
      .S            Shuffle.
  jQc2              Stick the input in the middle.
c3                  Split into three.

.[d8zamiast>8+*8d
isaacg

5

Oracle 18 SQL, 230 bajtów

Nie język golfa, ale ...

WITH v(v)AS(SELECT*FROM SYS.ODCINUMBERLIST(0,1))SELECT v.v||b.v||c.v||'
'||d.v||n||e.v||'
'||f.v||g.v||h.v
FROM n,v,v b,v c,v d,v e,v f,v g,v h
WHERE v.v+b.v+c.v+d.v+e.v+f.v+g.v+h.v=n
ORDER BY DBMS_RANDOM.VALUE
FETCH NEXT ROW ONLY

Wartość wejściowa znajduje się w tabeli nz kolumną n:

CREATE TABLE n(n) AS
SELECT 7 FROM DUAL;

Wypróbuj online - zaloguj się na https://livesql.oracle.com i wklej go do arkusza roboczego.

Wydajność:

V.V||B.V||C.V||''||D.V||N||E.V||''||F.V||G.V||H.V
-------------------------------------------------
101 
171 
111

Aby uzyskać wszystkie możliwe kombinacje (183 bajtów):

WITH v(v)AS(SELECT*FROM SYS.ODCINUMBERLIST(0,1))SELECT v.v||b.v||c.v||'
'||d.v||n||e.v||'
'||f.v||g.v||h.v
FROM n,v,v b,v c,v d,v e,v f,v g,v h
WHERE v.v+b.v+c.v+d.v+e.v+f.v+g.v+h.v=n

Wydajność:

V.V||B.V||C.V||''||D.V||N||E.V||''||F.V||G.V||H.V
-------------------------------------------------
111 
171 
110

111 
171 
101

111 
171 
011

111 
170 
111

111 
071 
111

110 
171 
111

101 
171 
111

011 
171 
111

3

Japt, 13 bajtów

çÊú8 öÊi4U ò3

Spróbuj


Wyjaśnienie

                   :Implicit input of integer U
 Ê                 :"l"
ç                  :Repeat U times
  ú8               :Pad right to length 8
    öÊ             :Random permutation
       i4U         :Insert U at index 4
            ò3     :Split at every 3rd character

3

QBasic 1.1 , 206 186 bajtów

RANDOMIZE TIMER
INPUT N
O=N
Z=8-N
FOR I=0TO 7
IF O*Z THEN
R=RND<.5
O=O+R
Z=Z-1-R
A(I)=-R
ELSEIF O THEN
O=O-1
A(I)=1
ELSE
Z=Z-1
A(I)=0
ENDIF
NEXT I
?A(0)A(1)A(2)
?A(3)N;A(4)
?A(5)A(6)A(7)

-20 dzięki DLosc (nowo opublikowany trik golfowy).

Pusty = 0
Mój =1

Zauważ, że 0i1 są liczbami całkowitymi, ale i tak używam STDOUT, więc ...

Dane wyjściowe wyglądają następująco:

 A  B  C
 D  x  E
 F  G  H

Gdzie AH to 0/1, a x jest wartością wejściową.


Fajna sztuczka, praca z chwiejnym wynikiem liczbowym QBasica za pomocą liczb dla kopalni i pustej płytki!
DLosc

3

Węgiel drzewny , 19 bajtów

W¬⁼ΣIKA⁸«E³⭆³‽²↑↗↖θ

Wypróbuj online! Link jest do pełnej wersji kodu. Używa 0kopalni, 1pustej przestrzeni. Wyjaśnienie:

     KA             Peek the entire canvas
    I               Cast to integer
   Σ                Take the sum
       ⁸            Literal 8
  ⁼                 Equals
 ¬                  Logical Not
W       «           While
          ³ ³       Literal 3
         E          Map over implicit range
           ⭆        Map over implicit range and join
              ²     Literal 2
             ‽      Random element of implicit range
                    Implicitly print on separate lines
               ↑↗↖θ Print the original input in the middle
  • Peek zwraca tablicę ciągów, które Sum po prostu konkatenują, dlatego najpierw musimy rzutować na liczbę całkowitą. ( Sum(Sum(PeekAll()))również działa.)
  • Sum zwraca None pustą tablicę (pierwsza pętla), więc jedynym bezpiecznym porównaniem jest Not(Equals(...)).
  • Nilary Randomzawsze 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:

θ←9W⁻ΣIKA⁸UMKMI‽²

Wypróbuj online! Link jest do pełnej wersji kodu. Używa 0kopalni, 1pustej przestrzeni. Wyjaśnienie:

θ

Wydrukuj oryginalne wejście.

←9

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ście 8nie zrobiłoby nic).

W⁻ΣIKA⁸

Powtórz, gdy różnica między sumą wszystkich cyfr na płótnie i 8 jest niezerowa:

UMKMI‽²

Zamień losowo każdą z otaczających postaci na 0lub 1.


3

R , 67 63 62 59 bajtów

matrix(c(sample(rep(1:0,c(n<-scan(),8-n))),n),6,5)[2:4,1:3]

Wypróbuj online!

Używa 1i 0. Zbuduj n* 1 +(8-n)* 0wektor, tasuje go, dołącza n, buduje większą macierz pokazaną poniżej (gdzie a...ioznaczają elementy oryginalnego wektora) i wyodrębnia odpowiednią podmacierz pokazaną wielkimi literami:

     [,1] [,2] [,3] [,4] [,5]
[1,] "a"  "g"  "d"  "a"  "g" 
[2,] "B"  "H"  "E"  "b"  "h" 
[3,] "C"  "I"  "F"  "c"  "i" 
[4,] "D"  "A"  "G"  "d"  "a" 
[5,] "e"  "b"  "h"  "e"  "b" 
[6,] "f"  "c"  "i"  "f"  "c"

Jeden bajt krótszy:matrix((c(sample(rep(1:0,c(n<-scan(),8-n))),n))[c(1:4,9:5)],3)
Gregor

1
@Gregor masz rację tablica jest prawdopodobnie rozsądną formą wyświetlania tablicy :)
JayCe


2

Attache , 51 bajtów

{[3,3]&Rotate[Sample[{Sum@_=_2}&_\BinBelow@8]'_,4]}

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:

NestWhile[{Random[8&2]},0,{Sum@_/=_2}&_]

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”:

NestWhile[{Random[8&2]},0,{Sum@_/=_2}&_]
          ^           ^^^^^        ^^^^

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 bazowych bliczb całkowitych szerokości n(jako tablic cyfrowych), od 0do b^n-1. Na przykład BaseBelow[3, 2]generuje wszystkie trójkowe liczby całkowite o szerokości 2:

A> BaseBelow[3, 2]
 0 0
 0 1
 0 2
 1 0
 1 1
 1 2
 2 0
 2 1
 2 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 N1s, gdzie Njest wejście. Moim pierwszym pomysłem było przetłumaczenie tego angielskiego oświadczenia bezpośrednio na Attache:

Chunk[SortBy[Sum,BaseBelow[2,8]],Sum]@N@1

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 BaseBelowsię nazywa, ale po prostu nie warto stosować tego podejścia.

Postanowiłem więc zabić dwa ptaki jednym kamieniem i zastosować Shufflepodejście oparte. Poniżej podano wszystkie ważne pola minowe o długości Nw losowej kolejności:

{Sum@_=_2}&N\Shuffle[BaseBelow&8!2]

Następnie wszystko, co musisz zrobić, to wybrać pierwszy. Ale mogę zrobić lepiej - z pewnością lepiej byłoby po prostu Sampleprzefiltrować tablicę? Takie podejście wydaje się być takie:

Sample[{Sum@_=_2}&_\BaseBelow[2,8]]

Musiałem cofnąć BaseBelow&8!2golfa, ponieważ \priorytet jest zbyt wysoki. W przeciwnym razie usatysfakcjonowałem bajt:

Sample[{Sum@_=_2}&_\2&BaseBelow@8]

(Odkryłem tutaj inny sposób zwięzłego nazywania funkcji dyadycznej: x&f@yjest to wyrażenie o wysokim priorytecie, które ocenia f[x, y].)

Jednak pomimo tego, przypomniałem sobie, że przez cały czas, alias 2&BaseBelowistniał: BinBelow. Więc użyłem tego:

Sample[{Sum@_=_2}&_\BinBelow@8]

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 MINEFIELDjest to wynik z ostatniej sekcji. Funkcja staje się wtedy:

{[3,3]&Rotate[MINEFIELD'_,4]}

MINEFIELD'_łączy pole minowe z oryginalnymi danymi wejściowymi _, dając nam coś takiego:

[1, 0, 0, 0, 1, 0, 0, 1, 3]

Następnie Rotate[MINEFIELD'_,4]obraca tę listę 4razy w lewo, umieszczając środek:

[1, 0, 0, 1, 3, 1, 0, 0, 0]

Ostatnim krokiem jest [3,3]&przekształcenie listy w macierz 3x3:

 1 0 0
 1 3 1
 0 0 0

2

Java 10, 165 157 141 bajtów

n->{var r="___\n_"+n+"_\n___";for(int i;n>0;r=r.charAt(i*=Math.random())>58?r.substring(0*n--,i)+(i>9?0:0+r.substring(i+1)):r)i=11;return r;}

Puste 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:

n->{                           // Method with integer parameter and String return-type
  var r="___\n_"+n+"_\n___";   //  Result-String, starting at:
                               //   "___
                               //    _n_
                               //    ___"
  for(int i;n>0                //  Loop as long as `n` isn't 0 yet:
      ;                        //    After every iteration:
       r=r.charAt(i*=Math.random())
                               //     Select a random integer in the range [0,11)
         >58?                  //     And if the character at this random index is a '_':
          r.substring(0*n--,i) //      Set `r` to the first part excluding character `i`,
                               //      (and decrease `n` by 1 in the process)
          +(i>9?0:0+           //      appended with a '0',
           r.substring(i+1))   //      appended with the second part
         :                     //     Else:
          r)                   //      Leave `r` unchanged
     i=11;                     //   Set `i` to 11 so a new random integer can be chosen
  return r;}                   //  Return the result


1

PHP , 135 134 123 117 122 121 bajtów

Pę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ów
Tak. 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

$n=$argv[1];$s=implode($n,str_split(str_shuffle(str_pad(str_repeat(m,$n),8,n)),4));for(;$i<9;)echo$s[$i].(++$i%3?"":"
");

Wypróbuj online!



1

PowerShell , 91 86 bajtów

-5 bajtów dzięki mazzy

param($n)$x=,'X'*$n+,'_'*(8-$n)|random -c 8
-join$x[0..2]
$x[3,4]-join$n
-join$x[5..7]

Wypróbuj online!

Tasuje wygenerowany ciąg znaków od ________do XXXXXXXX(zastępując od lewej). Następnie przecina go wiele razy, wstawiając $nna ś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.


1
miły. 86 bajtów
mazzy




0

05AB1E , 12 bajtów

$×8j.r2äIý3ô

Zastosowania 0dla 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:

$             # Push 0 and the input-digit
 ×            # Repeat the 0 the input-digit amount of times as string
              #  i.e. 4 → "0000"
  8j          # Prepend spaces to make the size 8
              #  → "    0000"
    .r        # Randomly shuffle the characters in this string
              #  i.e. "    0000" → " 00 0  0"
      2ä      # Split it into two equal halves (of 4 characters)
              #  → [" 00 ","0  0"]
        Iý    # Join it with the input-digit
              #  → " 00 40  0"
          3ô  # And then split it into (three) parts of 3 characters
              #  → [" 00"," 40","  0"]
              # (which is output implicitly as result)

Alternatywnie 12 bajtów :

8L@.rIš5._3ô

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 ( ).

Wypróbuj online lub sprawdź kilka innych przypadków testowych jednocześnie .

Wyjaśnienie:

8L            # Push the list [1,2,3,4,5,6,7,8]
  @           # Check for each if the (implicit) input-integer is >= it
              # (1 if truthy; 0 if falsey)
              #  i.e. 4 → [1,1,1,1,0,0,0,0]
   .r         # Randomly shuffle this list
              #  i.e. [1,1,1,1,0,0,0,0] → [0,1,1,0,1,0,0,1]
     Iš       # Prepend the input-digit to the list
              #  → [4,0,1,1,0,1,0,0,1]
       5._    # Rotate the list five times towards the left
              #  → [1,0,0,1,4,0,1,1,0]
          3ô  # And then split it into (three) parts of 3 digits each
              #  → [[1,0,0],[1,4,0],[1,1,0]]
              # (which is output implicitly as result)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.