tło
Nonogram , znany również jako Picross lub Griddlers, to łamigłówka, której celem jest ustalenie, czy każda komórka na siatce 2D powinna być pokolorowana, czy pozostawiona pusta, przy użyciu liczb kolejnych kolorowych komórek w każdej linii.
Poniżej znajduje się przykład puzzle Nonogram z rozwiązaniem.
Problem polega na tym, że niektóre komercyjne gry / aplikacje mobilne Nonogram mają łamigłówki, których nie można rozwiązać ręcznie (np. Mają wiele rozwiązań lub wymagają głębokiego cofania). Jednak oferują one także życie graczowi, w którym jedno życie zostaje utracone, gdy próbujesz pokolorować komórkę, której poprawna odpowiedź jest pusta . Czas więc brutalnie zmusić te paskudne „łamigłówki”!
Aby uprościć zadanie, wyobraź sobie tylko jedną linię ze wskazówką i niczym więcej:
3 7 | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Są [3,7]
to wskazówki, a długość linii wynosi 15 komórek. Ponieważ ma wiele możliwych rozwiązań, musimy zaryzykować życie, aby w pełni rozwiązać tę linię (tj. Określić wszystkie kolorowe komórki).
Wyzwanie
Biorąc pod uwagę linię ze wskazówkami (listę dodatnich liczb całkowitych) i długość linii, znajdź maksymalną liczbę żyć, które stracisz, zakładając, że brutalnie zmusisz linię z optymalną strategią.
Pamiętaj, że zawsze zgadujesz kolorowe komórki . W rzeczywistych grach odgadywanie pustych komórek (dobre lub złe) nie ma wpływu na twoje życie, więc nie możesz w ten sposób „rozwiązać” układanki.
Możesz również założyć, że dane wejściowe zawsze reprezentują prawidłową linię Nonogram, więc nie musisz się martwić o coś takiego [6], 5
.
Wyjaśnienie
Najpierw spójrzmy na kilka prostszych przykładów.
[1,2], 5
Istnieją dokładnie trzy możliwości dla tej linii ( O
jest kolorową komórką, .
jest pustą):
O . O O .
O . . O O
. O . O O
Jeśli spróbujemy kolorować komórkę 0 (indeks 0 od lewej), nastąpi jedna z następujących czynności:
- Komórka jest poprawnie pokolorowana. Teraz mamy dwie możliwości i możemy wybrać między komórką 2 a komórką 4, aby w pełni rozwiązać linię. W obu przypadkach stracimy jedno życie w najgorszym przypadku.
- Komórka jest pusta i tracimy życie. W tym przypadku zidentyfikowaliśmy już unikalne rozwiązanie tej linii, więc skończyliśmy z 1 straconym życiem.
Dlatego odpowiedź [1,2], 5
brzmi 1.
[5], 10
Wyszukiwanie binarne? Nie.
Najbardziej oczywistym pierwszym wyborem jest 4 lub 5, które ujawnią jedną możliwość, jeśli jest pusta (kosztem 1 życia). Powiedzmy, że wybraliśmy 4 jako pierwsze. Jeśli komórka 4 rzeczywiście jest zabarwiona, rozciągamy ją w lewo, tj. Próbuj 3, 2, 1 i 0, aż do utraty życia (lub komórka 0 jest zabarwiona, w końcu nie wydajemy wcale życia). Za każdym razem, gdy ginie życie, możemy jednoznacznie ustalić rozwiązanie, np. Jeśli zobaczymy coś takiego:
_ _ X O O _ _ _ _ _
wiemy już, że odpowiedź brzmi:
. . . O O O O O . .
Dlatego odpowiedź na [5], 10
to również 1.
[3,7], 15
Zacznij od komórki 11, która, jeśli jest pusta, od razu ujawni następujące rozwiązanie.
O O O . O O O O O O O X . . .
Następnie spróbuj 12, która, jeśli jest pusta, daje dwie możliwości, które można rozwiązać kosztem 1 dodatkowego życia.
O O O . . O O O O O O O X . .
. O O O . O O O O O O O X . .
Teraz spróbuj 2. Jeśli pusty, prowadzi do trzech możliwości, które można rozwiązać podobnie jak w [1,2], 5
przykładzie.
. . X O O O . O O O O O O O .
. . X O O O . . O O O O O O O
. . X . O O O . O O O O O O O
Jeśli nadal minimalizujesz ryzyko w ten sposób, możesz osiągnąć dowolne rozwiązanie z maks. 2 życia spędzone.
Przypadki testowe
[1,2] 5 => 1
[2] 5 => 2
[1] 5 => 4
[] 5 => 0
[5] 10 => 1
[2,1,5] 10 => 0
[2,4] 10 => 2
[6] 15 => 2
[5] 15 => 2
[4] 15 => 3
[3,7] 15 => 2
[3,4] 15 => 3
[2,2,4] 15 => 4
[1,1,1,1,1,1,1] 15 => 2
[2,1,1,3,1] 15 => 3
[1,1,1,2,1] 15 => 5
W dwóch ostatnich przypadkach optymalną strategią nie jest przechodzenie przez minimalne odstępy, ale po prostu przechodzenie od lewej do prawej (lub od prawej do lewej). Dzięki @crashoz za wskazanie tego.
Zasady
Obowiązują standardowe zasady gry w golfa . Najkrótsze prawidłowe przesłanie w bajtach wygrywa.
Hojność
Jeśli ktoś wymyśli algorytm wielomianowy (z dowodem poprawności), przyznam +100 nagród za takie rozwiązanie.
źródło
[6], 5
?Odpowiedzi:
Rubinowy , 85 bajtów
Wypróbuj online!
Wyjaśnienie
Oto przykład
_
jest nieznany,X
jest znaną przestrzenią,O
jest znaną kolorową komórką iL
ginie życieźródło
Python,
303289 bajtówPierwszy golf od dłuższego czasu, więc może być dużo nadmiaru tłuszczu. (Dzięki Jo King za znalezienie 14 bajtów.)
Funkcja f generuje wszystkie możliwe aranżacje (choć zawsze z pustym znakiem jako pierwszym znakiem, ale to w porządku, o ile zwiększamy długość o 1, zanim ją wywołamy). Funkcja g wybiera pozycję z najmniejszą liczbą odstępów i powtarza się. Funkcja h łączy je razem.
Wszystkie przykłady działają poprawnie:
źródło
False
do0
? Jeśli tak, możesz zmienić(len(q)>1)*1and
nalen(q)>1and
. Jeśli nie są dozwolone, aby powrócićFalse
do0
, a następnie zrobić to, ale zmianag(f(l,n+1),n+1)
na1*g(f(l,n+1),n+1)
i będzie jeszcze uratować jeden bajtFalse
nie jest dozwolone0
, zamiast zmienićg(f(l,n+1),n+1)
na1*g(f(l,n+1),n+1)
, zmień na+g(f(l,n+1),n+1)
h=
bajtów