Apa yang mengelilingi ubin Minesweeper saya?


31

Minesweeper adalah permainan puzzle di mana ranjau tersembunyi di sekitar papan ubin yang tidak mencolok dengan tujuan mengidentifikasi lokasi semua ranjau. Mengklik ranjau kehilangan permainan, tetapi mengeklik ubin lain akan mengungkapkan angka dari 0-8 yang menandakan berapa banyak ranjau yang secara langsung mengelilinginya.

Diberi nomor, Anda harus menampilkan kemungkinan kombinasi * ubin dan tambang kosong di sekitarnya. Ini harus dalam bentuk array 3x3. Ubin tengah harus menjadi jumlah tambang yang diambil sebagai input.

* Harus memiliki peluang nol untuk semua kombinasi terjadi.


Contohnya

_ = 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

Memasukkan

  • Jumlah tambang di sekitar ubin tengah (0-8)

Keluaran

  • Segala bentuk output yang masuk akal yang menampilkan array ubin 3x3

Aturan lainnya

  • Setiap kombinasi tidak harus memiliki peluang yang sama untuk terjadi. Harus ada peluang tidak nol dari setiap kombinasi untuk terjadi saat menjalankan program Anda.
  • 2 karakter dapat dipilih untuk tambang dan ubin kosong.
  • Ini adalah kode golf, program dengan kemenangan byte paling sedikit.

"2 karakter apa saja dapat dipilih untuk tambang dan ubin kosong" bisakah kita masih menggunakan, katakanlah, 1dan 0?
Jonathan Allan

3
@ Jonathan Allan Saya akan mengatakan ya, 0/1 input case mungkin sedikit membingungkan tapi saya rasa ini bukan masalah besar.
aoemica

Apakah flat, daftar 9 elemen merupakan 'bentuk output yang masuk akal'?
Chas Brown

@ ChasBrown tidak, daftar datar tidak benar-benar setara.
aoemica

Jawaban:


4

Jelly , 9 byte

<Ɱ8Ẋs4js3

Cobalah online!

kosong = 1
milikku =0

Perhatikan itu 1dan 0bilangan bulat.

Catatan lain: ini agak mirip dengan jawaban 10-byte Jonathan Allan, tetapi itu tidak benar-benar dipengaruhi olehnya dengan cara apa pun, dan mekanismenya, jika Anda perhatikan dengan cermat, sebenarnya lebih berbeda dari pada pandangan pertama.


Ugh saya melewatkan trik :)
Jonathan Allan

@JonathanAllan Apakah Anda yakin ini cukup dekat dengan milik Anda? Sufiksnya tetap sama ...
Erik yang Outgolfer

1
Itu sedikit berbeda. Jika saya membaca posting dan menemukan golf cepat saya berkomentar; jika saya hanya mencoba untuk menyelesaikan tantangan yang saya posting. Saya telah memposting kode identik sebelumnya secara independen.
Jonathan Allan

@ JonathanAllan Pendekatan saya untuk itu sedikit berbeda, jika saya menemukan bahwa solusi independen saya sebenarnya hampir sama dengan orang lain tetapi dengan elemen yang sedikit berbeda yang menghemat satu atau dua byte (terjadi opini subjektif), saya berkomentar, kalau tidak saya mengalahkan Itu sebabnya saya bertanya, tetapi Anda tampaknya lebih suka saya mempostingnya di sini, jadi ...
Erik the Outgolfer

9

APL (Dyalog Unicode) , 28 15 byte

-13 byte terima kasih kepada ngn!

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

Penjelasan:

{...}Fungsi langsung (D-Fn), adalah argumen yang tepat.

8?8 berikan 8 angka acak dari daftar 1..8:

      8?8                         
7 2 1 8 4 6 5 3

⍵≥ Apakah argumennya lebih besar atau sama dengan masing-masing ?:

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

⍵, tambahkan argumen ke daftar boolean:

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

5⌽ putar daftar 5 posisi ke kiri, sehingga argumennya ada di tengah:

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

3 3⍴ membentuk kembali daftar menjadi matriks 3x3:

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

Cobalah online!

J , 15 byte

Juga banyak byte, terima kasih kepada ngn!

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

Cobalah online!


1
(8↑1⍴⍨⍵)[8?8]-> ⍵>8?8(dengan asumsi ⎕io←0)
ngn

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

@ ngn Terima kasih! Saya merasa malu dengan upaya verbal saya ...
Galen Ivanov

1
tidak perlu malu :) terima kasih - jawaban ini memberi saya kesempatan untuk belajar beberapa J
ngn

1
jawaban J itu sangat menyenangkan.
Jonah

8

JavaScript (ES6), 67 byte

Versi lebih pendek disarankan oleh @tsh

Slot kosong adalah 0, ranjau 1.

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

Cobalah online!


Versi coba-dan-kesalahan asli, 78 byte

Slot kosong adalah _, ranjau 7.

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

Cobalah online!

Berkomentar

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

Jelly ,  13  10 byte

8Ẉ>RẊs4js3

Daftar daftar yang dikembalikan memiliki bilangan bulat yang ditampilkan di tengah dikelilingi oleh 0s dan 1s masing-masing mewakili ranjau dan kosong.

Cobalah online!(footer cukup mencetak array)

Bagaimana?

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
Sebagai catatan kecil, ŒHjuga berfungsi sebagai pengganti s4.
Tn. Xcoder

; ṙ4s3 juga berfungsi
dylnan

@ Dylnan Saya sebenarnya memposting dengan TIO yang memiliki kode yang sama pada satu titik selama bermain golf saya (tetapi dengan cepat memasangnya kembali jadi saya tidak perlu menulis ulang penjelasannya).
Jonathan Allan

6

Pyth, 16 14 byte

c3jQc2.S.[d8*N

Disimpan 2 byte berkat isaacg.
Menggunakan ruang untuk tempat yang aman dan kutipan untuk tambang.
Coba di sini

Penjelasan

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.

.[d8bukannya>8+*8d
isaacg

5

Oracle 18 SQL, 230 byte

Bukan bahasa golf tapi ...

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

Nilai input dalam tabel ndengan kolom n:

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

Cobalah online - masuk https://livesql.oracle.com dan rekatkan ke lembar kerja.

Keluaran:

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

Untuk mendapatkan semua kemungkinan kombinasi (183 Bytes):

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

Keluaran:

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 byte

çÊú8 öÊi4U ò3

Cobalah


Penjelasan

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

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 Berkat DLosc (trik golf yang baru diposting).

Kosong = 0
Milikku =1

Perhatikan itu 0dan 1bilangan bulat, tapi saya tetap menggunakan STDOUT, jadi ...

Output muncul seperti ini:

 A  B  C
 D  x  E
 F  G  H

Di mana AH adalah 0/1 dan x adalah input.


Trik yang bagus, bekerja dengan output angka QBasic yang tidak menyenangkan dengan menggunakan angka untuk tambang & ubin kosong!
DLosc

3

Arang , 19 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penggunaan 0untuk tambang, 1untuk ruang kosong. Penjelasan:

     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
  • Peekmengembalikan array string, yang Sumhanya menyatukan, itulah sebabnya kita harus dilemparkan ke integer terlebih dahulu. ( Sum(Sum(PeekAll()))juga berfungsi.)
  • Summengembalikan Noneuntuk array kosong (loop pertama), jadi satu-satunya perbandingan yang aman adalahNot(Equals(...)) .
  • Nilary Randomselalu kembali 0, meskipun dokumentasinya mengatakan sebaliknya.

Solusi alternatif, adalah 19 byte, sekarang 17 byte setelah perbaikan bug Charcoal:

θ←9W⁻ΣIKA⁸UMKMI‽²

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penggunaan 0untuk tambang, 1untuk ruang kosong. Penjelasan:

θ

Cetak input asli.

←9

Cetak 9ke kiri. Ini memindahkan kursor kembali ke input asli, dan juga memaksa setidaknya satu iterasi dari loop sementara (jika tidak, input dari8 tidak akan melakukan apa-apa).

W⁻ΣIKA⁸

Ulangi sementara perbedaan antara jumlah semua digit pada kanvas dan 8 adalah nol:

UMKMI‽²

Ganti setiap karakter di sekitarnya secara acak dengan 0atau 1.


3

R , 67 63 62 59 byte

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

Cobalah online!

Penggunaan 1dan 0. Bangun n* 1 +(8-n)* 0vektor, kocok, tambahkan n, a...ibuat matriks yang lebih besar seperti di bawah ini (di mana berarti elemen-elemen dari vektor asli) dan ekstrak sub-matriks yang tepat seperti pada huruf besar:

     [,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"

Satu byte lebih pendek:matrix((c(sample(rep(1:0,c(n<-scan(),8-n))),n))[c(1:4,9:5)],3)
Gregor

1
@Gregor Anda benar array mungkin merupakan bentuk yang wajar dari output untuk menampilkan array :)
JayCe

2

Python 2 , 93 byte

from random import*
def f(n):a=[1]*n+[0]*(8-n);shuffle(a);a[4:4]=[n];return zip(*[iter(a)]*3)

Cobalah online!

0untuk kosong; 1untuk tambang; dan nuntuk diri sendiri.


Penggunaan itercerdas!
Jonathan Allan

@ Jonathan Allan: xnor menunjukkan kepada saya bahwa beberapa hari yang lalu.
Chas Brown

2

Attache , 51 byte

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

Cobalah online!

Penjelasan

Mirip dengan jawaban J / APL Galen , teknik dasarnya adalah menghasilkan array 1s dan 0s dengan jumlah tambang yang benar, memasukkan input dengan menambahkannya ke akhir, memutar array sedemikian rupa sehingga input terletak di tengah, lalu membentuk kembali menjadi matriks 3x3.

Bagian 1: menghasilkan array biner

Ada banyak cara untuk melakukan ini, tetapi saya terutama terjadi pada dua jenis: brute force dan seleksi.

Metode brute force primer terlihat seperti ini:

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

Ini menghasilkan array acak 8 digit biner ( Random[8&2]) sementara jumlah mereka tidak sama dengan input {Sum@_/=_2}&_. Ini agak bertele-tele, karena bagian-bagian kode yang ditekankan berikut ini ada "hanya untuk membuatnya bekerja":

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

Dan saya membuang ide itu.

Seleksi lebih menarik. Konsep utamanya adalah menggunakan BaseBelow[b, n]builtin, yang menghasilkan daftar semua basis- binteger lebar n(sebagai digit array), dari 0hingga b^n-1. Misalnya, BaseBelow[3, 2]menghasilkan semua bilangan bulat ternary dengan lebar 2:

A> BaseBelow[3, 2]
 0 0
 0 1
 0 2
 1 0
 1 1
 1 2
 2 0
 2 1
 2 2

Kami secara khusus menggunakan BaseBelow[2, 8] untuk semua bilangan bulat biner dengan lebar 8. Ini mewakili semua bidang ranjau yang mungkin dari semua panjang. Ini adalah langkah pertama.

Langkah kedua adalah memilih semua array dengan hanya N1s, di manaN inputnya. Ide pertama saya adalah menerjemahkan pernyataan bahasa Inggris ini langsung ke dalam Atase:

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

Namun, ini tidak hanya menjadi 1 byte lebih lama dari pendekatan yang disebutkan sebelumnya, tetapi juga sangat berulang — dan bahkan belum diacak !. Tentu, saya mungkin bisa menghemat 1 byte dengan mengatur ulang caranyaBaseBelow dipanggil, tetapi tidak layak menggunakan pendekatan tersebut.

Jadi saya memutuskan untuk membunuh dua burung dengan satu batu dan menggunakan Shufflependekatan berbasis. Berikut ini memberikan semua panjang ranjau yang valid Ndalam urutan acak:

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

Kemudian, semua yang perlu dilakukan adalah memilih yang pertama. Tapi saya bisa melakukan yang lebih baik — tentunya akan lebih baik hanya Sampledengan array yang difilter? Pendekatan ini menjadi seperti ini:

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

Saya harus mengembalikan BaseBelow&8!2golf karena \prioritasnya terlalu tinggi. Kalau tidak puas, saya melanjutkan untuk memotong byte dari itu:

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

(Saya menemukan cara lain untuk secara ringkas memanggil fungsi diad di sini: x&f@yadalah ekspresi prioritas tinggi yang dievaluasi f[x, y].)

Namun, meskipun ini, saya ingat bahwa, selama ini, alias untuk 2&BaseBelowada: BinBelow. Jadi saya menggunakan itu:

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

Ini menghasilkan ladang ranjau yang diinginkan. Saya yakin ini mendekati optimal.

Bagian 2: Membentuk array

Seperti yang dikatakan sebelumnya, teknik pembentukan yang saya gunakan mirip dengan jawaban J / APL, jadi saya tidak akan membahas terlalu banyak detail. Misalkan MINEFIELDadalah hasil dari bagian terakhir. Fungsi itu kemudian menjadi:

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

MINEFIELD'_menyatukan ladang ranjau dengan input asli _, memberi kita sesuatu seperti ini:

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

Kemudian, Rotate[MINEFIELD'_,4]putar daftar ini 4kali ke kiri, dengan menempatkan tengah:

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

Langkah terakhir adalah menggunakan [3,3]&untuk membentuk kembali daftar menjadi matriks 3x3:

 1 0 0
 1 3 1
 0 0 0

2

Java 10, 165 157 141 byte

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;}

Ubin kosong adalah _(karakter apa pun dengan nilai unicode di atas 58 baik-baik saja) dan tambang adalah0 .

Cobalah online.

Penjelasan:

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 byte

Melonggarkan str untuk mencetak bukannya menghemat 1 byte

str_split dan implode untuk memasukkan nomor pusat menghemat 11 byte

Tidak perlu menetapkan string ke $ s lagi menghemat 6 byte
Ya Anda lakukan. Kalau tidak, string dikocok setelah setiap gema ...

Menghapus spasi setelah gema menghemat 1 byte

Mengganti "\ n" dengan jeda baris ctual menghemat 1 byte

$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?"":"
");

Cobalah online!



1

PowerShell , 91 86 byte

-5 byte berkat mazzy

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

Cobalah online!

Mengocok string yang dihasilkan mulai dari ________ke XXXXXXXX(menggantikan dari kiri). Ini kemudian mengirisnya beberapa kali, memasukkan $ndi tengah, untuk membangun string output. Bagian terakhir ini mungkin dapat sangat dioptimalkan karena setiap indeks biaya minimal 5 byte.


1
bagus. 86 byte
mazzy




0

05AB1E , 12 byte

$×8j.r2äIý3ô

Penggunaan 0untuk tambang, ruang untuk kotak kosong. Menghasilkan daftar garis, yang cukup dicetak dalam TIO di bawah ini dengan bergabung dengan pembatas baris baru ( »).

Cobalah secara online atau verifikasi beberapa kasus uji sekaligus .

Penjelasan:

$             # 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)

12 byte alternatif:

8L@.rIš5._3ô

Penggunaan 1 untuk tambang, 0untuk kotak kosong. Menghasilkan matriks digit, yang cukup dicetak dalam TIO di bawah ini dengan menggabungkan setiap baris, dan kemudian baris ini dengan pembatas baris baru ( ).

Cobalah secara online atauverifikasi beberapa kasus uji sekaligus .

Penjelasan:

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.