Twoim zadaniem jest więc wzięcie bloku 3x3, w którym -
oznaczają puste miejsca i *
średnie wypełnione miejsca, na przykład:
-**
-*-
*-*
i przestawiaj blok tak, *
aby tworzył X, jak poniżej:
*-*
-*-
*-*
Wejście: kwadraty 3x3 jak wyżej, mogą to być 3 linie, tablica lub dowolnie.
Wyjście: Najkrótsza liczba ruchów, które można przestawić na X. Każdy ruch polega na odwróceniu 2 dotykających się znaków, które są względem siebie poziomo, pionowo od siebie lub ukośnie. Jeśli nie jest to możliwe, zwróć niemożliwe wyjście, na przykład 999
lub -4242
. 5
jest najmniejszą taką liczbą.
Przypadki testowe:
1) Wyjście: 1
-**
-*-
*-*
2) Wyjście: -1
-*-
-*-
*-*
3) Wyjście: 3
---
-**
***
4) Wyjście: 0
*-*
-*-
*-*
Możesz zastąpić puste i niepuste znaki, ale pamiętaj, aby podać, który z nich jest w poście
Code Golf
Pamiętaj, to jest kod golfowy, który wygrywa najkrótszy kod!
źródło
*
i odwrotnie, czy wymieniłeś je?*
? Czy możesz dodać więcej przypadków testowych?*
lub mniejszej niż 5 uniemożliwia.-1
? Na przykład5
(inaczej niemożliwe) lub zgłaszasz błąd?Odpowiedzi:
Python 3 ,
10478 bajtówWypróbuj online!
Edycja: Zastosowano zarówno sugestie @Jonathan Allan, jak i @ xnor, aby drastycznie zmniejszyć liczbę bajtów.
Dane wejściowe to lista
ciągówo długości 9 z zerami i jedynek, z których jednymi jest*
s.Oto kilka spostrzeżeń:
Dlatego najpierw sprawdzamy, czy ciąg ma pięć, a następnie liczymy następujące rzeczy:
0124
,0346
,2458
,4678
są jedynkami)n[4]
jako jeden, a następnie przetestuj ekstrakcję dla każdego zakresu jako'111'
.max
zamiast niejsum
.źródło
count
szsum
s i'111'
z[1]*3
) TIO (starałem się być mądry zn[i::j]>=[1]*3
pętli, ale nie znalazłem krótszy).max(n,n[6:],n[::3],n[2::3])>='1'*3
.Galareta , 26 bajtów
Wypróbuj online!
Weź płaską listę jako dane wejściowe.
Szkoda, że Jelly nie ma „wielowymiarowych prawdomównych wskaźników” ...
T€ṭ€"JẎ
również działa, ale zajmuje jeszcze 1 bajt.Algorytm: Istnieje 5 bieżących pozycji bloku i 5 celów (miejsc docelowych), algorytm próbuje każdej z 5! dopasowanie i wyprowadzenie minimalnej sumy [źródła, celu] odległości Czebyszewa.
źródło
Haskell ,
176132126104 bajtówWypróbuj online!
Pobiera listę liczb całkowitych z 1 jako niepustym znakiem. Sumuje liczbę niezerowych kwadratów o indeksie parzystym, a następnie dodaje 1, jeśli zostanie znaleziony jeden z wzorów podwójnego ruchu (kwadrat środkowy i kolumna / rząd krawędzi całkowicie wypełnione). Ostatnia część jest trochę marnowana, myślę, że prawdopodobnie mogłaby zostać znacznie ulepszona w porównaniu z tą metodą brutalnej siły. Zwraca 5 (niemożliwe wyjście) przy niemożliwym wejściu.
źródło
length
test można skrócićsum[1|1<-a]
. Funkcjas
do:(1-e,n+sum[1|b>e])
którą możesz wstawić, aby zapisać kolejny bajt. Można użyćotherwise
osłony wm
celu oszczędzania parą()
. Wreszcie&&
na najwyższym poziomie w straży można wymienić,
. ...sum
na liście, aby rzutować wartość logiczną na int. Wypróbuj online!m
. Wypróbuj online!a
musi być,0
nie możesz użyćsum a
zamiastsum[1|1<-a]
? Wypróbuj online!1
s, chyba że centrum jest0
, możesz zrobić3<-
zamiastelem 3$
. Możesz także użyćsum.map(a!!)
zamiastsum<$>map(a!!)
.Python 2 ,
194192 bajtówWypróbuj online!
źródło
[0,1,0,1,0,1,1,1,0]
(oczekiwany: 4, rzeczywisty: 13).JavaScript (ES6), 123 bajty
Pobiera dane wejściowe jako 9-bitową liczbę całkowitą. Rozwiązuje zagadkę, naiwnie stosując zasady, co do których udowodniono, że nie jest najkrótszym podejściem.
Wypróbuj online!
Skomentował
Uwaga : ten kod wykonuje niektóre nielegalne ruchy poza górną część planszy, gdy m jest pomnożone przez 64. Ale są one po prostu ignorowane, ponieważ nie mogą prowadzić do rozwiązania krótszego niż najlepsze rozwiązanie legalne.
Poniżej znajduje się 9 podstawowych masek bitowych wymiany i wzorzec docelowy. Najważniejszy jest lewy górny róg.
źródło
Galaretka , 26 bajtów
Wypróbuj online!
Link monadyczny.
W jaki sposób?
Zainspirowany odpowiedzią Python Bubblera ; gra w golfa na miarę Jelly ...
źródło
JavaScript, 85 bajtów
To jest wyrażenie regularne odpowiedzi Bubblera .
Wprowadź jako ciąg 0/1.
Pokaż fragment kodu
źródło
Stax ,
2322 bajtówUruchom i debuguj
Ten program pobiera tablicę
[0, 1]
jako dane wejściowe i zwraca całkowitą liczbę ruchów lub pusty ciąg, jeśli żadne rozwiązanie nie jest możliwe.Rozważ te wskaźniki dla siatki
1
na wejściu nie ma dokładnie 5 s, to nie ma rozwiązania, więc nie produkujemy.1
z tych pozycji da wynik końcowy.1
w niewłaściwej pozycji jego odległość wynosi 1 lub 2. Będzie 2, jeśli jest otoczona przez inne1
s. Na przykład, jeśli istnieją1
indeksy [0, 1, 2, 4], to odległość dla niepoprawnego1
wynosi 2.Mając to na uwadze, rozważ ten pseudo-kod, aby uzyskać odległość przyczyniającą się do wyniku przez indeks 1.
b
od 0 do 15.0 <= b <= 7
odległość wynosi 0. Gdy8 <= b <= 14
odległość wynosi 1. Gdyb == 15
odległość wynosi 2. Można to obliczyć za pomocą dzielenia liczb całkowitych przezb * 2 / 15
.Tak więc całkowitą odległość można obliczyć, powtarzając ten proces 4 razy i obracając siatkę pomiędzy nimi.
Uruchom ten
źródło
Excel,
8681 bajtówStare: Kiedy wystąpił „niemożliwy” wynik
-1
Używa
1
wypełnionego i0
pustego wejścia w zakresieA1:C3
.Można dalej grać w golfa, jeśli możemy zwrócić wartości inne niżZwraca a-1
„niemożliwe”.#DIV/0!
błąd w niemożliwych siatkachDziała na tej samej logice co odpowiedź Python Bubblera .
źródło