Mayın Tarlası döşememi çevreleyen ne?


31

Mayın Tarlası , tüm mayınların yerlerini belirlemek amacıyla mayınların sıradan bir karoların etrafına gizlendiği bir bulmaca oyunudur. Bir mayına tıklamak oyunu kaybeder, ancak herhangi bir karo üzerine tıklamak, 0-8 arasında bir sayı ortaya çıkarır ve bu da kaç tane mayın doğrudan çevrelendiğini belirtir.

Bir sayı verildiğinde, etrafındaki boş fayans ve mayınların rastgele * olası bir kombinasyonunu göstermelisiniz. Bu 3x3 dizi şeklinde olmalıdır. Orta kiremit, girdi olarak alınan mayın sayısı olmalıdır.

* Tüm kombinasyonların gerçekleşmesi için sıfır olmayan bir şansa sahip olmalısınız.


Örnekler

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

Giriş

  • Merkez döşemesini çevreleyen mayın sayısı (0-8)

Çıktı

  • 3x3 karo dizisini görüntüleyen makul herhangi bir çıktı biçimi

Diğer kurallar

  • Her bir kombinasyonun eşit olma şansı olması gerekmez. Programınızı çalıştırırken her kombinasyonun sıfır olmayan bir şansı olması gerekir.
  • Maden ve boş kiremit için 2 karakter seçilebilir.
  • Bu kod golf, en az bayt olan program kazanıyor.

Diyelim ki, biz hala kullanabiliriz "Herhangi 2 karakter madeni ve boş karo için seçilebilir", 1ve 0?
Jonathan Allan,

3
@JonathanAllan Evet diyeceğim, 0/1 giriş davaları biraz kafa karıştırıcı olabilir ama bunun çok da önemli olduğunu sanmıyorum.
aoemica

9 elementli bir liste 'makul bir çıktı şekli' listesidir?
Chas Brown,

@ChasBrown hayır, düz bir liste gerçekten eşdeğer değildir.
aoemica

Yanıtlar:


4

Jöle , 9 bayt

<Ɱ8Ẋs4js3

Çevrimiçi deneyin!

boş = 1
benim =0

Bunu 1ve 0tamsayıları unutmayın.

Başka bir not: Bu, Jonathan Allan'ın 10 baytlık cevabına biraz benziyor, ancak ondan herhangi bir şekilde etkilenmiyor ve yakından ilgileniyorsanız mekanizma ilk bakışta olduğundan daha farklı.


Bir numara kaçırdım :)
Jonathan Allan

@JonathanAllan Bunun sizin için yeterince yakın olduğuna inanıyor musunuz? Son ek yine de aynı ...
Outgolfer Erik,

1
Bu biraz farklı. Eğer bir yazı okudum ve hızlı bir golf bulursam yorum yaparım; Sadece gönderiyi çözmeye çalışıyorum. Daha önce bağımsız olarak aynı kodu gönderdim.
Jonathan Allan,

@JonathanAllan Bu benim yaklaşımım biraz farklı, eğer bağımsız çözümümün aslında başkasıyla aynı olduğunu, ancak bir veya iki kuruş kazandıran biraz farklı bir öğeyle (öznel görüş ortaya çıkar) olduğunu fark edersem, aksi halde ben outgolf. Bu yüzden sormuştum, ama buraya göndermemi tercih ediyor
gibisin

9

APL (Dyalog Unicode) , 28 15 bayt

Ngn sayesinde -13 bayt!

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

Açıklama:

{...}Doğrudan bir işlev (D-Fn), doğru argümanıdır.

8?8 listeden 8 rastgele sayı dağıtın 1..8:

      8?8                         
7 2 1 8 4 6 5 3

⍵≥ argüman her birine eşit veya daha büyük mü ?:

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

⍵, argümanı boolean listesine hazırla:

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

5⌽ listeyi 5 konum sola döndürün, böylece argüman ortada olur:

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

3 3⍴ Listeyi 3x3'lük bir matriste yeniden şekillendirin:

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

Çevrimiçi deneyin!

J , 15 bayt

Ayrıca birçok bayt ngn sayesinde!

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

Çevrimiçi deneyin!


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

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

@ ngn Teşekkürler! Ayrıntılı girişimlerimden utanıyorum ...
Galen Ivanov


1
J cevabı gerçekten çok güzel.
Jonah

8

JavaScript (ES6), 67 bayt

@Tsh tarafından önerilen daha kısa sürüm

Boş yuvalar 0, mayınlar 1.

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

Çevrimiçi deneyin!


Orijinal deneme yanılma sürümü, 78 bayt

Boş yuvalar _, mayınlar 7.

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

Çevrimiçi deneyin!

Yorumlananlar

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

Jöle ,  13  10 bayt

8Ẉ>RẊs4js3

Döndürülen listeler listesi, sırasıyla mayın ve boşlukları temsil eden 0s ve 1s ile çevrili merkezde görüntülenen tamsayıya sahiptir.

Çevrimiçi deneyin! (altbilgi oldukça diziyi yazdırır)

Nasıl?

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
Küçük bir not olarak, ŒHaynı zamanda yerine çalışır s4.
Bay Xcoder

; s4s3 ayrıca çalışır
dylnan

@dylnan Golf sırasında bir noktada aynı kodu içeren bir TIO ile yayınladım (ancak çabucak geri koydum, böylece açıklamayı tekrar yazmak zorunda kalmadım).
Jonathan Allan,

6

Pyth, 16 14 bayt

c3jQc2.S.[d8*N

Isaac sayesinde 2 bayt kaydedildi.
Güvenli noktalar için boşluklar kullanır ve mayınlar için tırnak kullanır.
Burada dene

açıklama

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.

.[d8yerine>8+*8d
isaacg

5

Oracle 18 SQL, 230 bayt

Golf dili değil ama ...

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

Giriş değeri nsütunlu bir tablodadır n:

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

Çevrimiçi deneyin - https://livesql.oracle.com adresinde oturum açın ve bir çalışma sayfasına yapıştırın.

Çıktı:

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

Mümkün olan tüm kombinasyonları elde etmek için (183 Bayt):

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

Çıktı:

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 bayt

çÊú8 öÊi4U ò3

Dene


açıklama

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

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 (yeni yayınlanan golf oyunu) sayesinde.

Boş = 0
Maden =1

Bunu 0ve 1tamsayıları unutmayın , ancak yine de STDOUT kullanıyorum, bu yüzden ...

Çıktı şöyle görünür:

 A  B  C
 D  x  E
 F  G  H

Burada AH 0 / 1'dir ve x girişidir.


Boş numara, QBasic'in kazık sayı çıktısıyla, maden ve boş kiremit için sayıları kullanarak çalışmak!
DLosc

3

Kömür , 19 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Boş bir alan 0için bir maden için kullanır 1. Açıklama:

     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
  • PeekSumbasitçe birleştirilen bir dizi dizisi döndürür , bu yüzden önce tamsayıya çevirmemiz gerekir. ( Sum(Sum(PeekAll()))ayrıca çalışır.)
  • SumNoneboş bir dizi için döner (ilk döngü), bu nedenle tek güvenli karşılaştırma Not(Equals(...)).
  • Nilary Randomher zaman geri döner 0, ancak belgelerinde aksini belirtildiği halde.

Alternatif çözüm, bir Kömür hata düzeltmesinden sonra şu anda 17 byte olan 19 baytı:

θ←9W⁻ΣIKA⁸UMKMI‽²

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Boş bir alan 0için bir maden için kullanır 1. Açıklama:

θ

Orijinal girişi yazdırın.

←9

9Sola doğru yazdırın . Bu, imleci orijinal girişin üzerine geri getirir ve aynı zamanda while döngüsünün en az bir yinelemesini zorlar (aksi halde bir giriş 8hiçbir şey yapmaz).

W⁻ΣIKA⁸

Tuval üzerindeki tüm rakamların toplamı ile 8 arasındaki fark sıfır olmasa da tekrarlayın:

UMKMI‽²

Çevreleyen karakterlerin her birini rastgele 0veya ile değiştirin 1.


3

R , 67 63 62 59 bayt

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

Çevrimiçi deneyin!

Kullanır 1ve 0. Bir n* 1 +(8-n)* 0vektör oluşturun, karıştırır, ekler n, aşağıda gösterilen daha büyük matrisi ( a...iorijinal vektörün öğelerini temsil eder) oluşturur ve büyük harfle gösterilen uygun alt matrisi çıkarır:

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

Bir bayt kısa:matrix((c(sample(rep(1:0,c(n<-scan(),8-n))),n))[c(1:4,9:5)],3)
Gregor

1
@Gregor haklısın bir dizi muhtemelen bir diziyi görüntülemek için makul bir çıktı biçimidir :)
JayCe


2

Ataşesi , 51 bayt

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

Çevrimiçi deneyin!

açıklama

Galen'in J / APL cevabına benzer şekilde , temel teknik doğru sayıda mayın içeren 1s ve 0s dizisi oluşturmak, girişi sonuna ekleyerek girişi yerleştirmek, diziyi girişin ortasına gelecek şekilde döndürmek, sonra 3x3'lük bir matriste yeniden şekillendirme.

Bölüm 1: İkili dizinin oluşturulması

Bunu yapmanın pek çok yolu var, ama ben genelde iki tip arasında oldum: kaba kuvvet ve seçim.

Birincil kaba kuvvet metodu şuna benzer:

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

Bu Random[8&2]toplamları girişi eşit değil ise 8 ikili rasgele dizileri ( ) üretir {Sum@_/=_2}&_. Bu biraz ayrıntılı, aşağıda kodun vurgulanan kısımları “çalışmasını sağlamak için” olduğu için:

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

Ve fikri atmıştım.

Seçim daha ilginç. Temel kavram, genişlikten BaseBelow[b, n]tüm temel btam sayıların n(basamaklı diziler gibi) bir listesini oluşturan yerleşimi 0kullanmaktır b^n-1. Örneğin, BaseBelow[3, 2]genişlik 2'nin üçlü tam sayılarını üretir:

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

Özellikle BaseBelow[2, 8]genişlik 8'in tüm ikili tamsayıları için kullanıyoruz . Bunlar, tüm uzunluklardaki olası tüm mayın tarlalarını temsil ediyor. Bu ilk adım.

İkinci adım, tüm bu dizileri yalnızca N1s ile seçmektir N, giriş nerede . Benim ilk fikrim bu İngilizce ifadeyi doğrudan Attache'ye çevirmek:

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

Ancak, bu sadece yukarıda bahsedilen yaklaşımdan 1 byte daha uzun sürmekle kalmadı, aynı zamanda oldukça tekrarlandı - ve henüz rastgele bile değil! Elbette, nasıl BaseBelowçağrıldığını yeniden düzenleyerek muhtemelen 1 byte tasarruf edebilirim ama bu yaklaşımı kullanmaya değmez.

Böylece iki taşı bir taşla öldürmeye ve Shuffletemelli bir yaklaşım kullanmaya karar verdim . Aşağıdakiler geçerli uzunluktaki tüm mayın tarlalarını Nrasgele sırayla verir:

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

Sonra yapılması gereken tek şey ilkini seçmektir. Ama daha iyisini yapabilirim - kesinlikle sadece Samplefiltrelenmiş diziyi kullanmak daha iyi olur mu? Bu yaklaşım bunun gibi bir şey olarak ortaya çıkıyor:

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

Golfü geri almak zorunda kaldım, BaseBelow&8!2çünkü \önceliği çok yüksek. Aksi halde memnun kaldım, bundan bir bayt kesmeye başladım:

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

(Burada, kısaca, ikili bir işlevi çağırmanın başka bir yolunu keşfettim: x&f@ydeğerlendiren yüksek öncelikli bir ifadedir f[x, y].)

Ancak, buna rağmen, ben, baştan beri, bir takma ad hatırladı 2&BaseBelowvar: BinBelow. Bu yüzden bunu kullandım:

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

Bu istenen mayın tarlasını üretir. Bunun optimal olduğuna ikna oldum.

Bölüm 2: Diziyi oluşturma

Daha önce de söylediğim gibi, kullandığım şekillendirme tekniği J / APL cevabına benzer, bu yüzden fazla ayrıntıya girmeyeceğim. Diyelim ki MINEFIELDson bölümün sonucu. İşlev daha sonra olur:

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

MINEFIELD'_mayın tarlasını orijinal girdiyle birleştirir, _bize şöyle bir şey verir:

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

Sonra Rotate[MINEFIELD'_,4]bu listeyi 4sola döndürerek merkeze yerleştirerek:

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

Son adım [3,3]&listeyi 3x3'lük bir matriste yeniden şekillendirmek için kullanıyor :

 1 0 0
 1 3 1
 0 0 0

2

Java 10, 165 157 141 bayt

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

Boş fayanslar _(58'in üzerinde unicode değeri olan herhangi bir karakter iyi) ve mayınlar 0.

Çevrimiçi deneyin.

Açıklama:

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 bayt

Yazdırmak için str üzerinde döngü yapmak, 1 bayttan tasarruf sağlar

str_split ve merkez numarasına yerleştirmek için kullanılan 11 bayt kaydeder

Artık dize $ s'ye atamanıza gerek yok artık 6 byte tasarruf
Evet. Aksi takdirde, dize her yankıdan sonra karıştırılır ...

Ekodan sonra boşlukların kaldırılması 1 bayt kazandırır

"\ N" yerine bir sıralı satır sonu ile değiştirmek 1 bayt kazandırır

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

Çevrimiçi deneyin!



1

PowerShell , 91 86 bayt

Mazzy sayesinde -5 bayt

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

Çevrimiçi deneyin!

Karıştırır arasında değişen bir üretilen dizisi ________için XXXXXXXX(soldan değiştirme). Daha sonra $nçıktı dizesini oluşturmak için orta noktaya ekleyerek defalarca dilimleyin . Bu son bölüm muhtemelen büyük ölçüde optimize edilebilir çünkü her endeks en az 5 bayt tutar.


1
Güzel. 86 bayt
mazzy




0

05AB1E , 12 bayt

$×8j.r2äIý3ô

Kullanımları 0madenleri için, boş kareler için alanlar. Newline sınırlayıcısına ( ») katılarak aşağıdaki TIO'larda oldukça iyi yazdırılan bir satır listesi çıkarır .

Çevrimiçi deneyin veya bir kerede birkaç test vakasını doğrulayın .

Açıklama:

$             # 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 bayt alternatif:

8L@.rIš5._3ô

Boş kareler 1için mayınlar 0için kullanır . Her satıra katılarak aşağıdaki TIO'larda oldukça yazdırılmış bir rakam matrisi ve ardından bu satırları newline sınırlayıcı ( ) ile yazdırır .

Çevrimiçi deneyin veya bir kerede birkaç test vakasını doğrulayın .

Açıklama:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.