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
źródło
Odpowiedzi:
Brachylog , 34 bajty
Wypróbuj online!
To jest cholernie wolne, więc przypadek testowy na TIO to 4x4. Obecnie uruchomię testową skrzynkę 6x6 na moim komputerze, aby zobaczyć, ile czasu to zajmuje.
To pobiera listę list jako dane wejściowe. Nieznane wartości należy wskazać zmiennymi, czyli ciągami wielkimi literami (i wszystkie powinny być różne, ponieważ w przeciwnym razie wskazujesz, że niektóre komórki muszą mieć tę samą wartość)
Wyjaśnienie
Ograniczamy wartości, które mają się znaleźć
{0,1}
, a następnie próbujemy tworzyć wystąpienia zmiennych, dopóki nie przestrzega się wszystkich 3 reguł. Dlatego jest to tak powolne (ponieważ spróbuje wszystkich z nich, aż do znalezienia jednego; i ponieważ w takim przypadku Brachylog nie jest wystarczająco dobrze wdrożony, aby można było nałożyć ograniczenia przed wypróbowaniem możliwej matrycy).źródło
A
pośrednictwemY
(zZ
jako wyjście-parametru). Czy kontynuowaćAA
,AB
itp?AA
jest zmienną iKEVINCRUIJSSEN
jest również zmienną.JavaScript (ES6),
274270 bajtówPobiera dane wejściowe jako tablicę 2D, w której puste komórki są oznaczone
2
. Drukuje wszystkie możliwe rozwiązania do konsoli.Jak to działa
Pierwsza część kodu używa
M()
funkcji do sprawdzania poprawności bieżącej płytki, zarówno poziomo, jak i pionowo.Odwzorowuje pełny wiersz lub kolumnę na ciąg s . W rzeczywistości jest to tablica wymuszona na łańcuch, więc wygląda na to, że
"1,2,2,0,2,2"
.To używa:
/(0|1),\1,\1/
do wykrywania 3 lub więcej kolejnych identycznych cyfr.Jeśli tablica jest nieważna, natychmiast się zatrzymujemy. Jeśli płyta jest ważna i kompletna, drukujemy ją na konsoli. W przeciwnym razie druga część kodu próbuje zastąpić każdą 2 wartością zero lub jedną z wywołaniami rekurencyjnymi:
Próbny
Pokaż fragment kodu
źródło
Galaretka ,
5351 bajtówPobiera listę list reprezentujących siatkę, zawierające
0
,1
oraz2
(spacje). Zwraca listę list, każda lista list ma ten sam format (chociaż bez2
s) i reprezentuje możliwe rozwiązanie danych wejściowych.Wypróbuj online! (nie uruchomi to żadnego z przypadków testowych pytania z powodu ograniczeń pamięci - wszystkiesiatki2 nSpaces są tworzone jako lista list liczb całkowitych - ale umieściłem tam stosunkowo spory przypadek z jednym rozwiązaniem). Stopka oddziela i formatuje siatki.
Metoda czystej siły brutalnej - wdraża reguły i sprawdza je dla każdej siatki, którą można utworzyć, zastępując dowolne
2
s1
s lub0
s.źródło