Minesweeper adalah gim komputer populer yang mungkin Anda buang-buang waktu untuk mencoba mengungkap sel-sel yang ditambang dalam kotak persegi panjang berdasarkan petunjuk tentang berapa banyak tambang tetangga yang dimiliki masing-masing sel non-tambang. Dan jika Anda belum memainkannya, lakukan di sini .
Fakta matematika yang bagus tentang kisi Minesweeper (alias papan) adalah:
Dewan dan pelengkapnya memiliki jumlah total tambang yang sama . ( Bukti )
Artinya, jika Anda memiliki kisi Minesweeper yang benar-benar terungkap, jumlah semua angka pada kisi itu, yaitu total tambang , akan sama dengan total tambang dari komplemen kisi, yang merupakan kisi tempat setiap tambang telah diganti dengan non-tambang dan setiap non-tambang diganti dengan tambang.
Misalnya, untuk kisi Minesweeper
**1..
34321
*2**1
total tambang adalah 1 + 3 + 4 + 3 + 2 + 1 + 2 + 1 = 17.
Komplemen grid adalah
24***
*****
3*44*
yang memiliki total tambang 2 + 4 + 3 + 4 + 4 = 17 lagi.
Tulis program yang menggunakan kisi Minesweeper yang sewenang-wenang dalam bentuk teks yang *
mewakili tambang dan 1
melalui 8
jumlah tambang yang berdekatan dengan sel non-tambang. Anda dapat menggunakan .
atau 0
atau
(ruang) untuk mewakili sel dengan tetangga tidak tambang, pilihan Anda. Anda dapat mengasumsikan bahwa kisi-kisi input akan ditandai dengan benar, yaitu setiap sel non-ranjau akan secara akurat menunjukkan jumlah total tambang yang berbatasan langsung dengannya secara ortogonal atau diagonal.
Program Anda perlu untuk mencetak komplemen dari grid dalam format yang sama (menggunakan yang sama .
, 0
atau
seperti yang Anda harapkan di input).
Kode terpendek dalam byte menang.
- Alih-alih sebuah program Anda dapat menulis fungsi yang mengambil kisi input sebagai string dan mencetak atau mengembalikan kisi komplemen.
- Baris tambahan di input atau output baik-baik saja, tetapi tidak boleh ada karakter lain selain yang membentuk kisi.
- Anda dapat menganggap kisi 1 × 1 akan menjadi input terkecil.
Uji Kasus
Semua input dan output dapat ditukar karena komplemen dari komplemen adalah grid asli. Kisi-kisi dapat diputar juga untuk kasus uji lebih lanjut.
Memasukkan:
111
1*1
111
Keluaran:
***
*8*
***
Memasukkan:
.
Keluaran:
*
Memasukkan:
*11*1.1**1...1***1.....1*****1..........
Keluaran:
1**2***11*****1.1*******1...1***********
Input: ( Potong contoh Simpul )
**212*32
333*33**
1*22*333
222222*1
*33*2232
2**22*2*
Keluaran:
24***4**
***7**64
*8**7***
******8*
4**7****
*33**5*3
sumber
?
) pada baris setelah baris akhir papan dapat diterima, atau bisakah saya mengambil jumlah baris input melalui baris perintah?Jawaban:
Pyth,
3938 byteCobalah online: Demonstrasi
Algoritma utama sangat mudah. Saya cukup mengulangi setiap sel, mengambil kotak 3x3 di sekitarnya (atau lebih kecil ketika sel di perbatasan) dan mencetak bintang atau jumlah non-bintang di kotak itu.
Penjelasan:
sumber
CJam,
5857 byteInput tidak boleh diakhiri dengan linefeed. Keluaran berisi
0
sel tanpa tambang terdekat.Cobalah online di juru bahasa CJam .
Ide
Kita mulai dengan mengisi matriks input dengan satu baris dan satu kolom tanda bintang.
Untuk input
ini menghasilkan
Sekarang kami menghasilkan semua modifikasi yang mungkin terjadi akibat memutar baris dan kolom 0, -1 atau 1 unit ke atas / kiri:
Kami membuang "lokasi bantalan" dari setiap rotasi, yaitu,
dan membentuk matriks tunggal dengan menggabungkan karakter yang sesuai dari setiap rotasi:
Karakter pertama dari setiap posisi adalah karakter aslinya.
Jika itu bukan tanda bintang, itu harus diganti dengan tanda bintang.
Jika itu adalah tanda bintang, jumlah non-tanda bintang dalam string itu adalah jumlah tambang tetangga.
Bagaimana itu bekerja
sumber
Ruby, 119
Tidak tergabung dalam program uji:
sumber
Oktaf, 76
Penjelasan
Mengonversi string input ke matriks string menggunakan
strsplit
dancell2mat
.Dapatkan matriks logis yang berisi di
1
mana tidak ada*
dalam matriks asli.Ambil belokannya dengan matriks 3x3 dari 1.
Topeng dengan matriks logis terbalik dan tempatkan
*
topeng.Catatan: Sel tanpa tetangga ranjau direpresentasikan sebagai
0
.Eksekusi
sumber