マインスイーパタイルの周囲は何ですか?


31

掃海艇は、すべての地雷の位置を特定することを目的として、地雷が非記述タイルのボードの周りに隠されているパズルゲームです。地雷をクリックするとゲームに負けますが、他のタイルをクリックすると0〜8の数字が表示され、それが直接地雷を囲んでいる数を示します。

番号を指定すると、空のタイルとその周囲の地雷のランダムな*可能な組み合わせを表示する必要があります。これは3x3配列の形式でなければなりません。中央のタイルは、入力として取得される鉱山の数である必要があります。

*すべての組み合わせが発生する可能性はゼロではありません。


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

入力

  • 中央のタイルを囲む鉱山の数(0〜8)

出力

  • タイルの3x3配列を表示する適切な形式の出力

その他の規則

  • 各組み合わせは、発生する可能性が同じである必要はありません。プログラムの実行時に各組み合わせが発生する可能性がゼロ以外である必要があります。
  • 鉱山と空のタイルには、任意の2文字を選択できます。
  • これはコードゴルフで、最少バイトのプログラムが勝ちます。

たとえば、我々はまだ使用することができ、「任意の2つの文字は、鉱山と空のタイルのために選択することができる」、10
ジョナサンアラン

3
@JonathanAllanはい、0/1の入力ケースは少し混乱するかもしれませんが、大したことではないと思います。
アオエミカ

フラットな9要素リストは「合理的な形式の出力」ですか?
チャスブラウン

@ChasBrownいいえ、フラットリストは実際には同等ではありません。
アオエミカ

回答:


4

ゼリー、9バイト

<Ɱ8Ẋs4js3

オンラインでお試しください!

空= 1
私の=0

ご了承ください 1and 0は整数で。

別の注意:これはジョナサン・アランの10バイトの回答に多少似ていますが、実際には何の影響も受けておらず、細心の注意を払った場合のメカニズムは実際には一見よりも異なります。


うーん、私はトリックを逃しました:)
ジョナサンアラン

@JonathanAllanこれはあなたのものに十分近いと思いますか?とにかく接尾辞は同じです...
エリックアウトゴルファー

1
少し違います。投稿を読んで簡単なゴルフを見つけたらコメントします。私が投稿した課題を解決しようとしているだけなら。独立して以前に同じコードを投稿しました。
ジョナサンアラン

@JonathanAllan私のアプローチは少し異なります。私の独立したソリューションが実際に他の誰かとほぼ同じであるが、バイトまたは2を節約するわずかに異なる要素(主観的な意見が続く)を見つけた場合、私はコメントしますアウトゴルフ。だからこそ、私が求めていたのですが、あなたはそう、それをここに掲示する私を好むように見える...
エリックOutgolfer

9

APL(Dyalog Unicode)28 15バイト

NGNのおかげで-13バイト!

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

説明:

{...}直接関数(D-Fn)は、その正しい引数です。

8?8 リスト1..8から8つの乱数を処理します。

      8?8                         
7 2 1 8 4 6 5 3

⍵≥ 引数はそれらのそれぞれ以上ですか?:

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

⍵, 引数をブールリストに追加します。

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

5⌽ リストが5ポジション左に回転し、引数が中央に来るようにします。

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

3 3⍴ リストを3x3行列に変形します。

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

オンラインでお試しください!

J、15バイト

ngnのおかげで多くのバイトも!

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

オンラインでお試しください!


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

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

@ngnありがとう!私は冗長な試みで恥ずかしい...
ガレン・イワノフ

1
無:)恥の必要性は、あなたに感謝-この答えは私にいくつかのJを学ぶ機会を与えた
NGN

1
Jの答えは本当に素敵です。
ジョナ

8

JavaScript(ES6)、67バイト

@tshによって提案された短いバージョン

空のスロットは0、鉱山は1です。

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

オンラインでお試しください!


オリジナルの試行錯誤バージョン、78バイト

空のスロットは_、鉱山は7です。

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

オンラインでお試しください!

コメント済み

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

ゼリー 13  10 バイト

8Ẉ>RẊs4js3

返されるリストのリストには、中央に表示される整数があり、0と1で囲まれ、それぞれ鉱山と空白を表します。

オンラインでお試しください!(フッターは配列をきれいに印刷します)

どうやって?

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
小さなメモとして、のŒH代わりにも機能しs4ます。
Mr Xcoder

;ṙ4s3も機能します
ディルナン

@dylnanゴルフ中のある時点で、同じコードを持つTIOを実際に投稿しました(ただし、説明を書き直す必要がないため、すぐに元に戻します)。
ジョナサンアラン

6

Pyth、16 14バイト

c3jQc2.S.[d8*N

isaacgのおかげで2バイト節約されました。
安全な場所にスペースを使用し、鉱山に引用符を使用します。
ここで試してみてください

説明

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.

.[d8代わりに>8+*8d
-isaacg

5

Oracle 18 SQL、230バイト

ゴルフ言語ではありませんが...

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

入力値はn列のあるテーブルにありますn

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

オンラインで試してください-https://livesql.oracle.comにログオンし、ワークシートに貼り付けます

出力:

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

可能なすべての組み合わせ(183バイト)を取得するには:

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

出力:

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

QBasicを1.1206の 186バイト

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 DLosc(新しく投稿されたゴルフトリック)に感謝します。

空= 0
鉱山=1

0and 1は整数ですが、とにかくSTDOUTを使用していることに注意してください。

出力は次のように表示されます。

 A  B  C
 D  x  E
 F  G  H

AHは0/1で、xは入力です。


マイニングタイルと空のタイルに数字を使用して、QBasicの奇妙な数字出力を操作する素晴らしいトリックです!
DLosc

3

、19バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。使用しています0、私のために1空きスペースのために。説明:

     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 文字列の配列を返します。 Sum単純に連結するため、最初に整数にキャストする必要があります。(Sum(Sum(PeekAll()))また機能します。)
  • Sum 返す None空の配列(最初のループ)をため、唯一の安全な比較はNot(Equals(...))です。
  • ニラリーはRandom常に戻る0、そのドキュメントはそうではないと述べています。

代替ソリューションは19バイトでしたが、現在は炭のバグ修正後17バイトです。

θ←9W⁻ΣIKA⁸UMKMI‽²

オンラインでお試しください!リンクは、コードの詳細バージョンです。使用しています0、私のために1空きスペースのために。説明:

θ

元の入力を印刷します。

←9

9左に印刷します。これにより、カーソルが元の入力上に戻され、whileループの少なくとも1回の繰り返しが強制されます(そうでない場合、の入力8は何もしません)。

W⁻ΣIKA⁸

キャンバス上のすべての数字の合計と8の差がゼロでない間、繰り返します。

UMKMI‽²

周囲の各文字をランダムに0またはに置き換えます1


3

R67 63 62 59バイト

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

オンラインでお試しください!

とを使用10ます。n* 1 +(8-n)* 0ベクトルを構築し、それをシャッフルし、追加しn、以下に示す大きなマトリックスを構築し(a...i元のベクトルの要素を表す)、大文字で示される適切なサブマトリックスを抽出します。

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

1バイト短縮:matrix((c(sample(rep(1:0,c(n<-scan(),8-n))),n))[c(1:4,9:5)],3)
グレゴール

1
@Gregorそうですね、配列はおそらく配列を表示するための適切な出力形式です:)
JayCe


2

アタッシュ、51バイト

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

オンラインでお試しください!

説明

GalenのJ / APL回答に似ています、基本的な手法は、正しい鉱山数で1と0の配列を生成し、入力を最後に追加して挿入し、入力が中央にくるように配列を回転させてから、 3x3マトリックスに再形成します。

パート1:バイナリ配列の生成

これを行うには多くの方法がありますが、主に2つのタイプ(ブルートフォースと選択)に遭遇しました。

主なブルートフォースメソッドは次のようになります。

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

これにより、8つの2進数(Random[8&2])のランダム配列が生成されますが、それらの合計は入力と等しくありません{Sum@_/=_2}&_。これは少し冗長です。コードの次の強調された部分が「機能させるために」あるからです。

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

そして、私はその考えを捨てました。

選択はより興味深いです。主な概念は、を使用して、からまでBaseBelow[b, n]のすべてbの幅の基本整数のリストをn(数字配列として)生成する0ことb^n-1です。たとえばBaseBelow[3, 2]、幅2のすべての3進整数を生成します。

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

具体的に使用します BaseBelow[2, 8]、幅8のすべてのバイナリ整数にします。これらは、すべての長さのすべての可能な地雷原を表します。これが最初のステップです。

2番目のステップは、入力がN1であるような配列をすべて選択することNです。私の最初のアイデアは、この英語の声明を直接Attacheに翻訳することでした。

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

ただし、これは前述のアプローチよりも1バイト長くなるだけでなく、反復性も高く、まだランダム化されていません。もちろん、BaseBelow呼び出される方法を再編成することでおそらく1バイト節約できますが、このアプローチを使用するだけの価値はありません。

そこで、私は1石で2羽の鳥を殺し、それにShuffle基づくアプローチを採用することにしました。以下は、長さの有効なすべての地雷原をNランダムな順序で示しています。

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

次に、最初に選択する必要があります。しかし、私はもっとうまくやることができます-単純Sampleにフィルターされた配列の方が良いでしょうか?このアプローチは次のようになります。

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

優先順位が高すぎるBaseBelow&8!2ため、ゴルフを元に戻す必要がありました\。それ以外の場合は満足し、私はそれからバイトを切り取りに進みました:

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

(ここで2項関数を簡潔に呼び出す別の方法を発見x&f@yしましたf[x, y]。これは、に評価される優先順位の高い式です。)

しかし、それにもかかわらず、私はずっと2&BaseBelow存在していたエイリアスを覚えていましたBinBelow。だから私はそれを使用しました:

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

これにより、目的の地雷原が生成されます。これは最適に近いと確信しています。

パート2:配列の形成

前に述べたように、私が使用したフォーミング手法はJ / APLの回答に似ているため、あまり詳しく説明しません。仮定MINEFIELD最後のセクションからの結果です。関数は次のようになります。

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

MINEFIELD'_地雷原を元の入力と連結し、_次のようなものを提供します。

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

次に、Rotate[MINEFIELD'_,4]このリスト4を左に回して、中央に配置します。

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

最後のステップでは[3,3]&、リストを3x3マトリックスに再形成します。

 1 0 0
 1 3 1
 0 0 0

2

Java 10、165 157 141バイト

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

空のタイルは_(58を超えるUnicode値を持つ文字であれば問題ありません)、地雷はそう0です。

オンラインでお試しください。

説明:

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

PHP135 134 123 117 122 121バイト

strをループして印刷する代わりに1バイトを節約します

str_splitおよびimplodeを使用して中心番号を挿入すると、11バイト節約されます

文字列を$ sに割り当てる必要がなくなり、6バイトを節約できます
できます。それ以外の場合、文字列はエコーごとにシャッフルされます...

エコー後に空白を削除すると1バイト節約されます

「\ n」を実際の改行に置き換えると、1バイト節約されます

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

オンラインでお試しください!



1

PowerShell91 86バイト

-5バイトのおかげでmazzy

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

オンラインでお試しください!

生成された文字列をから________にシャッフルしますXXXXXXXX(左から置換)。次に$n、中央に挿入して複数回スライスし、出力文字列を作成します。各インデックスの最小コストは5バイトなので、この最後の部分はおそらく大幅に最適化できます。


1
いいね 86バイト
奇抜な




0

05AB1E、12 バイト

$×8j.r2äIý3ô

用途 0地雷の、空白の正方形のスペース。行のリストを出力します。これは、改行区切り文字(»)で結合することにより、下のTIOにきれいに出力されます。

オンラインで試すたり、一度にいくつかのより多くのテストケースを検証します

説明:

$             # 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 バイト代替:

8L@.rIš5._3ô

1地雷の使用、0空白の正方形にます。数字のマトリックスを出力します。これは、各行を結合することで下のTIOにきれいに印刷され、次にこれらの行を改行区切り文字()で結合します。

オンラインで試すか、、一度にいくつかのより多くのテストケースを検証します

説明:

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.