Saper to popularna gra komputerowa, w którą prawdopodobnie zmarnowałeś czas, grając, w której próbujesz odsłonić komórki, które są kopalniami w prostokątnej siatce na podstawie wskazówek o tym, ile sąsiednich min ma każda komórka niemina. A jeśli jeszcze tego nie grałeś, zrób to tutaj .
Sprytny matematyczny fakt o siatce Saperów (aka board) jest taki, że:
Plansza i jej uzupełnienie mają taką samą całkowitą liczbę kopalni . ( Dowód )
To znaczy, że jeśli masz całkowicie ujawnioną siatkę Saper, suma wszystkich liczb na tej siatce, tj. Suma kopalni , będzie równa sumie kopalni uzupełnienia siatki, która jest siatką, w której każda kopalnia została zastąpiona z nie-kopalnią, a każda nie-kopalnia zastąpiona kopalnią.
Na przykład dla siatki Saper
**1..
34321
*2**1
suma kopalni wynosi 1 + 3 + 4 + 3 + 2 + 1 + 2 + 1 = 17.
Uzupełnieniem siatki jest
24***
*****
3*44*
która ma moje kopie łącznie 2 + 4 + 3 + 4 + 4 = 17 ponownie.
Napisz program, który pobierze dowolną siatkę Saper w postaci tekstowej, gdzie *
reprezentuje minę i 1
poprzez 8
reprezentuje liczbę min sąsiadujących z komórką inną niż kopalnia. Możesz użyć .
lub 0
lub
(spacji) do reprezentowania komórek bez sąsiadów kopalni, twój wybór. Możesz założyć, że siatka wejściowa zostanie poprawnie oznaczona, tj. Każda komórka nie będąca kopalnią będzie dokładnie oznaczać całkowitą liczbę min bezpośrednio przylegających do niej prostopadle lub ukośnie.
Twój program musi wydrukować uzupełnienie sieci w tym samym formacie (przy użyciu tego samego .
, 0
lub
, jak oczekiwano na wejściu).
Najkrótszy kod w bajtach wygrywa.
- Zamiast programu możesz napisać funkcję, która pobiera siatkę wejściową jako ciąg i wypisuje lub zwraca siatkę dopełniacza.
- Końcowy znak nowej linii na wejściu lub wyjściu jest w porządku, ale nie powinno być żadnych innych znaków poza tymi, które tworzą siatkę.
- Możesz założyć, że siatka 1 × 1 będzie najmniejszym wejściem.
Przypadki testowe
Wszystkie dane wejściowe i wyjściowe można zamienić, ponieważ uzupełnieniem uzupełnienia jest pierwotna siatka. Siatki mogą być również obracane w dalszych przypadkach testowych.
Wkład:
111
1*1
111
Wydajność:
***
*8*
***
Wkład:
.
Wydajność:
*
Wkład:
*11*1.1**1...1***1.....1*****1..........
Wydajność:
1**2***11*****1.1*******1...1***********
Dane wejściowe: ( Wytnij przykład węzła )
**212*32
333*33**
1*22*333
222222*1
*33*2232
2**22*2*
Wydajność:
24***4**
***7**64
*8**7***
******8*
4**7****
*33**5*3
źródło
?
) w wierszu po ostatnim wierszu płyty jest dopuszczalne, czy też mogę przenieść liczbę wierszy wejściowych przez wiersz poleceń?Odpowiedzi:
Pyth,
3938 bajtówWypróbuj online: demonstracja
Główny algorytm jest naprawdę prosty. Po prostu iteruję każdą komórkę, biorę otaczające pudełko 3x3 (lub mniejsze, gdy komórka znajduje się na granicy) i drukuję gwiazdę lub liczbę gwiazd niebędących gwiazdami w tym pudełku.
Wyjaśnienie:
źródło
CJam,
5857 bajtówDane wejściowe nie powinny kończyć się wierszem. Dane wyjściowe zawierają
0
komórki bez pobliskich min.Wypróbuj online w interpretatorze CJam .
Pomysł
Zaczynamy od wypełnienia macierzy wejściowej jednym wierszem i jedną kolumną gwiazdek.
Do wprowadzenia
to skutkuje
Teraz generujemy wszystkie możliwe modyfikacje, które wynikają z obracania wierszy i kolumn o 0, -1 lub 1 jednostkę w górę / w lewo:
Odrzucamy „miejsca wypełnienia” z każdego obrotu, tj.
i utwórz pojedynczą macierz, łącząc odpowiednie znaki każdego obrotu:
Pierwszym znakiem każdej pozycji jest jej oryginalny charakter.
Jeśli jest to gwiazdka, należy ją zastąpić gwiazdką.
Jeśli jest to gwiazdka, liczba nie-gwiazdek w tym ciągu to liczba sąsiednich min.
Jak to działa
źródło
Ruby, 119
Ungolfed w programie testowym:
źródło
Oktawa, 76
Wyjaśnienie
Konwertuj ciąg wejściowy na macierz ciągów, używając
strsplit
icell2mat
.Uzyskaj macierz logiczną zawierającą miejsce, w
1
którym nie ma*
oryginalnej macierzy.Przekonaj się dzięki matrycy 3x3 z jedynkami.
Zamaskuj go odwrotną macierzą logiczną i umieść
*
w miejscu maski.Uwaga: Komórki bez sąsiadów kopalni są reprezentowane jako
0
.Wykonanie
źródło