Bir Mayın Tarlası Tahtasını Ters Çevir


32

Mayın Tarlası , her bir mayın olmayan hücrenin sahip olduğu komşu mayının ipuçlarına dayanarak, dikdörtgen bir ızgarada mayın olan hücreleri ortaya çıkarmaya çalıştığınız zaman harcadığınız popüler bir bilgisayar oyunudur. Ve eğer oynamamışsanız, burada yapın .

Bir Mayın Tarlası ızgarası (aka yönetim kurulu) hakkındaki ilginç bir matematiksel gerçek şu ki:

Bir kurul ve tamamlayıcısı aynı mayın toplam sayısına sahiptir . ( Kanıt )

Diğer bir deyişle, tamamen açıklanmış bir Mayın Tarlası ızgarasına sahipseniz, o ızgaradaki tüm sayıları, yani toplam mayın toplamını , her bir mayının değiştirildiği ızgara olan ızgara tamamlayıcısının toplamına eşit olacaktır. madeni olmayan ve madeni olmayan her madenin yerine.

Örneğin, Mayın Tarlası ızgarası için

**1..
34321
*2**1

maden toplamı 1 + 3 + 4 + 3 + 2 + 1 + 2 + 1 = 17'dir.

Izgara'nın tamamlayıcısı

24***
*****
3*44*

ki yine toplam 2 + 4 + 3 + 4 + 4 = 17'dir.

Metin halinde isteğe bağlı bir tarlası ızgarada alan bir program bilgileri *bir maden temsil eder ve 1içinden 8olmayan bir maden hücresine bitişik mayın sayısını temsil eder. Sen kullanabilirsiniz .ya 0ya (boşluk) hiçbir maden komşuları, seçtiğiniz hücreleri temsil etmek. Giriş ızgarasının doğru bir şekilde işaretlendiğini, yani her bir mayın olmayan hücrenin, ortogonal veya çapraz olarak hemen bitişiğindeki toplam mayın sayısını doğru olarak göstereceğini varsayabilirsiniz.

Programınız aynı formatta ızgaranın tamamlayıcı yazdırmak gerekiyor (aynı kullanılarak ., 0ya girmek beklendiği gibi).

Bayt cinsinden en kısa kod kazanır.

  • Bir program yerine, giriş ızgarasını bir dizge olarak alan ve tamamlayıcı ızgarayı basan ya da döndüren bir işlev yazabilirsiniz.
  • Girdi veya çıktıdaki izleyen yeni satır iyi, ancak ızgarayı oluşturanlar dışında başka karakter olmamalıdır.
  • 1 × 1 ızgarasının en küçük giriş olacağını düşünebilirsiniz.

Test Kılıfları

Tüm girdi ve çıktılar, tamamlayıcının tamamlayıcısı orijinal ızgara olduğu için değiştirilebilir. Izgaralar, diğer test durumları için de döndürülebilir.

Giriş:

111
1*1
111

Çıktı:

***
*8*
***

Giriş:

.

Çıktı:

*

Giriş:

*11*1.1**1...1***1.....1*****1..........

Çıktı:

1**2***11*****1.1*******1...1***********

Giriş: ( Düğüm Kes örneğini )

**212*32
333*33**
1*22*333
222222*1
*33*2232
2**22*2*

Çıktı:

24***4**
***7**64
*8**7***
******8*
4**7****
*33**5*3

TI-BASIC boş bir girdi satırını kabul edemez. ?Kurulun son satırından sonraki satırda bir uç sınırlayıcı (örneğin ) kullanmak kabul edilebilir mi yoksa giriş satırı sayısını komut satırından alabilir miyim?
lirtosiast

@ThomasKwa Bir son sınırlayıcı, TI-BASIC ve tuhaf newline sınırlamaları olan diğer diller için iyi gelir.
Calvin'in Hobileri

Yanıtlar:


12

Pyth, 39 38 bayt

j.es.eh-+K\*l-s:RtWYY+Y2:+K.zk+k3KZb.z

Çevrimiçi deneyin: Gösteri

Ana algoritma gerçekten basittir. Basitçe her hücrenin üzerinde yineliyorum, çevresindeki 3x3 kutuyu (veya hücre sınırdayken daha küçük) alıyorum ve o kutudaki bir yıldızı veya yıldız olmayanları basıyorum.

Açıklama:

j.es.eh-+K\*l-s:RtWYY+Y2:+K.zk+k3KZb.z  implicit: .z = list of input strings
 .e                                 .z  map each index k, line b of .z to:
    .e                             b      map each index Y, char Z of b to:
         K\*                                assign "*" to K
                         +K.z               insert K at the front of .z
                        :    k+k3           slice from k to k+3
               :RtWYY+Y2                    take the slice from Y-1 or 0 
                                            to Y+2 for each line
              s                             join, this gives the 3x3 rectangle
                                             (or smaller on the border)
             -                   K          remove all "*"s
            l                               take the length
        +K                                   "*" + ^
       -                          Z         remove Z from this string
      h                                     and take the first char
                                            (if cell=mine take the number, 
                                             otherwise take the number)
  s                                       join the chars of one line
j                                       join by newlines

Çok temiz, +1
MKII

22

CJam, 58 57 bayt

0WX]2m*qN/{'*f+z}2*f{\~@m<fm<W<}:..+{W<{_'*#'*@'*-,?}/N}/

Giriş, satır beslemeyle bitmemelidir. Çıktı 0yakındaki mayınsız hücreleri içerir .

CJam tercümanında çevrimiçi olarak deneyin .

Fikir

Giriş matrisini bir satır ve bir yıldız işareti ile doldurmaya başlıyoruz.

Giriş için

*4*
**2

bu sonuçlanır

*4**
**2*
****

Şimdi, satırları ve sütunları 0, -1 veya 1 birim yukarı / sola döndürme sonucu olabilecek tüm olası değişiklikleri üretiyoruz:

*4** **** **2* **4* **** ***2 4*** **** *2**
**2* *4** **** ***2 **4* **** *2** 4*** ****
**** **2* *4** **** ***2 **4* **** *2** 4***

"Dolgu yerlerini" her dönüşten atarız, yani

*4* *** **2 **4 *** *** 4** *** *2*
**2 *4* *** *** **4 *** *2* 4** ***

ve her rotasyonun karşılık gelen karakterlerini birleştirerek tek bir matris oluşturur:

******4** 4*******2 **24*****
*******4* *4****2** 2***4****

Her pozisyonun ilk karakteri orijinal karakterdir.

  • Yıldız işareti değilse, yıldız işareti ile değiştirilmelidir.

  • Bu bir yıldız ise, o dizgede yıldız olmayanların sayısı, komşu mayınların sayısıdır.

Nasıl çalışır

0WX]2m*   e# Push the array of all vectors of {0,-1,1}^2.
qN/       e# Read all input from STDIN and split at linefeeds.
{'*f+z}2* e# Append a '*' to each row and transpose rows with columns. Repeat.
f{        e# For each vector [A B], push the modified input Q; then:
  \~      e#   Swap Q with [A B] and dump A and B on the stack.
  @m<     e#   Rotate the rows of Q B units up.
  fm<     e#   Rotate each row of the result A units left.
  W<      e#   Discard the last row.
}         e# This pushes all nine rotations with Manhattan distance 1.
:..+      e# Concatenate the corresponding characters for each position.
{         e# For each row:
  W<      e#   Discard the character corresponding to the last column.
  {       e#   For each remaining string:
    _'*#  e#     Find the first index of '*' in a copy.
    '*    e#     Push '*'.
    @'*-, e#     Count the non-asterisks in the string.
    ?     e#     Select '*' if the index is non-zero, the count otherwise.
  }/      e#
  N       e#   Push a linefeed.
}/        e#

7
Korkuyorum - bu harika.
Deusovi

Siz bayım, sistemi yeni kırdınız. 1! Bu teoriyi nerede bulduğunuzu sorabilir miyim?
GamrCorps

9
@IonLee Bu benim. Gerçekten de oldukça basit bir fikir: Belirli bir hücrenin etrafındaki hücreleri kontrol etmek yerine, tüm ızgarayı hareket ettirip hücreye düşenleri gözlemliyoruz.
Dennis,

Bravo! Bunu asla düşünmemeliydim.
GamrCorps 29:15

7

Ruby, 119

->s{w=1+s.index('
')
s.size.times{|c|t=0;9.times{|i|(s+?**w*2)[c+i/3*w-w+i%3-1]<?0||t+=1}
print [t,?*,'
'][s[c]<=>?*]}}

Test programında Ungolfed:

f=->s{
  w=1+s.index("\n")                          #width of board
  s.size.times{|c|                           #iterate through input
    t=0;                                     #number of digits surrounding current cell
    9.times{|i|                              #iterate through 3x3 box (centre must be * if this ever gets printed.)
      (s+"*"*w*2)[c+i/3*w-w+i%3-1]<"0"||t+=1 #copy of s has plenty of * appended to avoid index errors
    }                                        #add 1 every time a number is found.
  print [t,"*","\n"][s[c]<=>"*"]             #if * print t. if after * in ACSII it's a number, print *. if before, it's \n, print \n
  }
}


f['**212*32
333*33**
1*22*333
222222*1
*33*2232
2**22*2*']

2

Octave, 76

m=@(s)char(conv2(b=(cell2mat(strsplit(s)'))~='*',ones(3),'same').*~b-6*b+48)

açıklama

  • Dönüştürme girdi dizesi kullanarak dizeleri matris strsplitve cell2mat.

  • Orijinal matristeki 1hiçbir yerde bulunmayan mantıksal matrisi alın *.

  • Konvolüsyonunu 1x'lik 3x3'lük bir matris ile alın.

  • Ters mantıksal matris ile *maskeleyin ve maskenin yerine koyun .

  • Not: Mayın komşusu olmayan hücreler olarak temsil edilir 0.

infaz

>> m(['**100' 10 '34321' 10 '*2**1'])   %// `10` is newline
ans =

24***
*****
3*44*

>> m(['24***' 10 '*****' 10 '3*44*'])
ans =

**100
34321
*2**1
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.