Układanka liczb Arystotelesa polega na wypełnieniu każdej z 19 komórek heksagonalną siatką unikalną liczbą całkowitą od 1 do 19, tak że suma wzdłuż każdej osi wynosi 38.
Możesz wyobrazić sobie planszę wyglądającą tak:
Układanka jest w istocie rozwiązaniem następującego zestawu piętnastu równań:
((a + b + c) == 38 && (d + e + f + g) == 38 && (h + i + j + k + l) ==
38 && (m + n + o + p) == 38 && (q + r + s) == 38 && (a + d + h) ==
38 && (b + e + i + m) == 38 && (c + f + j + n + q) ==
38 && (g + k + o + r) == 38 && (l + p + s) == 38 && (c + g + l) ==
38 && (b + f + k + p) == 38 && (a + e + j + o + s) ==
38 && (d + i + n + r) == 38 && (h + m + q) == 38)
Gdzie każda zmienna jest unikalnym numerem w zestawie {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}
.
Istnieje wiele możliwych rozwiązań i 19!
możliwych kombinacji liczb całkowitych, więc naiwna brutalna siła będzie niepraktyczna.
Zasady:
- Żadnego wpisywania odpowiedzi na stałe ani szukania odpowiedzi w innym miejscu; Twój kod musi go znaleźć samodzielnie
- Szybkość nie ma znaczenia, ale musisz pokazać swoje wyniki, więc kod, którego uruchomienie zajmuje 1000 lat, nie pomoże
- Znajdź wszystkie odpowiedzi
- Traktuj identyczne odpowiedzi w rotacji jako identyczne
- Odejmij 5% całkowitej liczby bajtów, jeśli wyprowadzisz wyniki w atrakcyjny plaster miodu
- Wygrywa najmniej bajtów
code-golf
game
hexagonal-grid
Michael Stern
źródło
źródło
Odpowiedzi:
Haskell
295289Inna podobna odpowiedź, wykorzystująca arytmetykę do uzyskania pośrednich heksów. W przeciwieństwie do innych rozwiązań, nie sprawdzam, czy sumy te wynoszą> 0, wystarczy sprawdzić, czy posortowane heksy są równe zakresowi [1..19]. a, c i h są ograniczone, tak że dozwolone są tylko unikatowo obrócone / dublowane rozwiązania. Rozwiązanie pojawia się po kilku sekundach, a następnie trwa około minuty i decyduje, że nie będzie już więcej.
Zastosowanie w ghci:
Edytowane, aby ogolić kilka znaków. „y 0 t” daje [1..19].
źródło
x>0
czek, ponieważ sortuję listę zawierającą negatywy zamiast zwiększania tablicy? Z drugiej strony muszę ograniczyć zakresy (mojey a b
), aby Haskell mógł wykonać, co kosztuje mnie kilka znaków. Ale musi istnieć inny język z wbudowanym rodzajem, który pobije mnie, pracując w ten sam sposób (patrząc na ciebie, Mathematica).Java
(1517 - 75,85) = 1441,15(1429 - 71,45) = 1357,55(1325 - 66,25) = 1258,75To było fajne.
Drukuje wszystkie unikalne rozwiązania z lustrzanym odbiciem i rotacją, w przyjemnej strukturze plastra miodu (stąd redukcja o 5%)
Runtime: ~ 0,122 s (122 milisekundy) na moim 4-letnim laptopie.
Kod w golfa ( edycja zdała sobie sprawę, że głupio powtarzam moje printfs, zredukowałem je do jednego printf dla maksymalnego golfa) ( nowa edycja Zredukowane wywołania funkcji Set w sprytne mniejsze funkcje, niektóre inne mikrooptymalizacje):
Cieszyć się!
źródło
return;
instrukcję.return;
zdania zwiększa długość mojego kodu o 7, dodanie go byłoby szaleństwem, gdyby prawdziwa odpowiedź obejmowała wszystkie 12 rozwiązań, które są po prostu obróconymi / dublowanymi wersjami siebie. Chociaż nie można wykluczyć szaleństwa, w tym przypadku dodaniereturn;
było zamierzone i, jak to opisałem, w oparciu o pełne okno dialogowe pytań i komentarzy , które powinieneś przejrzeć przed podrzuceniem oskarżeń. Dzięki!C, 366 bajtów (
C ++ 541 450)Kompiluj z
gcc -std=c99 -O3
.Drukuje wszystkie unikalne rozwiązania modulo rotacji i dublowania, w formacie
a b c d ...
, jeden na linię.Runtime: 0,8 sekundy na moim komputerze.
źródło
Matlab:
333320 znakówJest to dość głupie podejście o niemal brutalnej sile, które nie wykorzystuje rekurencji. Tworzy częściowe rozwiązania w
z
, które są wydrukowane na końcu. Każda kolumna jest rozwiązaniem; elementy są wymienione az od góry do dołu. Czas działania wynosi 1-2 godziny.Uruchamianie z poziomu Matlaba:
źródło