Wprowadzenie
Zasady układanki:
Układanka Binarna (znana również jako Takuzu lub Subiku) jest bardzo łatwa do zrozumienia i ma tylko kilka zasad:
Ponieważ nazwa gry jest binarna, jest dość oczywista, ale można wprowadzać tylko zera i jedynki.
- Nie więcej niż dwie takie same cyfry mogą znajdować się obok siebie w pionie lub poziomie
- Każdy wiersz i każda kolumna musi zawierać równą liczbę zer i jedynek (to domyślnie oznacza, że każda gra binarna zawsze będzie miała równe wymiary).
- Może nie być zduplikowanych wierszy ani zduplikowanych kolumn (z dokładnie taką samą kolejnością zer i jedynek).
Możesz zagrać w grę na stronie www.binarypuzzle.com, jeśli chcesz.
Taktyka:
Zgodnie z regułą 1 zawsze możemy wpisać cyfrę, jeżeli:
- Istnieją już dwie takie same cyfry w pionie lub poziomie sąsiadujące ze sobą, w którym to przypadku możemy wpisać cyfrę przeciwną po obu stronach. Tj .11...
→ 0110..
.
- Istnieją dwie takie same cyfry w pionie lub poziomie, z tylko jedną przerwą między nimi. tj .1.1..
→.101..
Zgodnie z regułą 1, gdy pozostały trzy przerwy i nie możemy mieć trzech sąsiadujących z tą samą cyfrą, możemy wypełnić jedną z tych przerw. Tj. .0.1.0
→ 10.1.0
(Wciąż musimy wypełnić dwa i nie możemy mieć trzech sąsiadujących na środku, więc pierwsza przerwa musi być a 1
.)
Zgodnie z regułą 2 zawsze możemy wypełnić pozostałe luki w rzędzie lub kolumnie, jeśli połowa z nich jest już wypełniona przeciwną cyfrą. tj .1.011
→010011
Ze względu na zasadę 3, zawsze możemy wypełnić przeciwne cyfry, jeśli pozostaną tylko dwie do rozwiązania na równo uporządkowanej linii. tj 101100 & 1..100
→101100 & 110100
Ze względu na zasadę 3 możemy czasami wypełnić lukę, gdy trzy luki pozostaną na równo uporządkowanej linii. Tj. 010011 & .1.01.
→ 010011 & .1.010
(Tutaj nie możemy wypełnić1
na końcu, ponieważ oznaczałoby to, że musimy wypełnić zera na dwóch pozostałych przerwach, dzięki czemu obie linie będą jednakowe w kolejności.)
Przykład:
Zaczynamy od następującej siatki 6x6 z wypełnionymi zerami i zerami (a kropki to luki, które musimy jeszcze wypełnić):
.1....
.10.0.
1.11..
.1....
...1.0
......
Ze względu na zasady 1 i 2 możemy wpisać następujące cyfry:
.1.01.
.1010.
101100
010011
.0.1.0
.010..
Zgodnie z regułą 1 możemy wypełnić 1 w wierszu 5, kolumnie 1:
.1.01.
.1010.
101100
010011
10.1.0
.010..
Zgodnie z zasadą 3 możemy wypełnić 0 w wierszu 1, kolumnie 6 (patrząc na wiersz 4):
.1.010
.1010.
101100
010011
10.1.0
.010..
Teraz możemy nadal wypełniać luki cyframi zgodnie z regułami 1 i 2:
.1.010
010101
101100
010011
10.1.0
.010.1
Teraz możemy zakończyć wiersz 5 ze względu na zasadę 3 (patrząc na wiersz 3):
.1.010
010101
101100
010011
100110
.010.1
Następnie możemy ukończyć układankę zgodnie z zasadami 1 i 2:
011010
010101
101100
010011
100110
101001
Wyzwanie:
Wyzwanie jest proste: biorąc pod uwagę początkową siatkę, wyjmij rozwiązaną zagadkę.
UWAGA: Nie musisz wdrażać powyższych zasad. Oczywiście możesz i powinien on dać ci wskazówki, jak wdrożyć to wyzwanie, ale brutalne wymuszanie rozwiązania z myślą o regułach jest całkowicie w porządku.
Sposób rozwiązania zależy od Ciebie, ale wyzwaniem jest wyjście z rozwiązanej układanki.
Zasady konkursu:
- Format wejścia i wyjścia dla siatki jest elastyczny, ale proszę podać, czego używasz. (Tj. Tablica bajtów 2D; ciąg znaków z nowymi liniami; itp.)
- Powyższe dotyczy również użytych znaków. W przykładzie, którego użyłem
01.
, ale jeśli chcesz, możesz użyćABx
zamiast tego. Proszę podać, jakiego formatu wejścia / wyjścia i znaków użyłeś. - Można tylko przypuszczać, wykorzystane zostaną następujące rozmiary siatki:
6x6
;8x8
;10x10
;12x12
;14x14
;16x16
.
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi odnoszą się standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem swojego kodu.
- W razie potrzeby dodaj również wyjaśnienie.
Przypadki testowe:
Kropki są dodawane tylko dla czytelności, możesz zamiast tego użyć spacji lub cokolwiek innego, co wolisz dla przerw. Format zarówno wyjściowy, jak i wyjściowy jest elastyczny.
Input:
1..0..
..00.1
.00..1
......
00.1..
.1..00
Output:
101010
010011
100101
011010
001101
110100
Input:
.1....
.10.0.
1.11..
.1....
...1.0
......
Output:
011010
010101
101100
010011
100110
101001
Input:
.......1..
.00..0..1.
.0..1..0.0
..1...1...
1.1......1
.......1..
.0..1...0.
....11...0
.0.0..1..0
0...0...1.
Output:
0110010101
1001100110
1001101010
0110011001
1010100101
0101010110
1001101001
0110110100
1010011010
0101001011