Jedną z ulubionych zabawek mojego dziecka jest taki zestaw . Właściwie to jedna z moich ulubionych zabawek - bawiłem się nią i dawałem mi pomysły na wyzwania PPCG. Tutaj jest jeden:
Napisz program lub funkcję, która pobiera rysunek linii ASCII jako dane wejściowe i decyduje, czy złoży się w kostkę.
Wkład
Dane wejściowe będą składały się z dokładnie jednego heksomina zbudowanego z kwadratów takich jak to:
+-+
| |
+-+
Na przykład poprawnym wejściem heximino jest:
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
| |
+-+
Wydajność
- Prawda, jeśli heksomino można złożyć w sześcian lub
- W przeciwnym razie wartość falsey.
Aby zaoszczędzić nam trochę pracy, wikipedia ma ładną grafikę:
- Wszystkie 35 heksominoes:
- Wszystkie 11 heksomino, które składają się w kostkę:
Notatki
- Heksomino wejściowe mogą mieć dowolny obrót lub odbicie, a nie tylko te pokazane na powyższych obrazach
- Heksomino wejściowe mogą mieć spacje wiodące, ale zostaną odpowiednio wyrównane względem siebie
- Heksomino wejściowe mogą mieć końcowe spacje na końcu linii i końcowe nowe linie na końcu wprowadzania
code-golf
ascii-art
kolmogorov-complexity
geometry
Cyfrowa trauma
źródło
źródło
Odpowiedzi:
PMA / Ślimaki , 130
lub bardziej „czytelnie”,
Niezwykle pojawił się problem, którym można zaradzić dzięki ograniczonej liczbie zaimplementowanych do tej pory funkcji.
!(z\ )
Wzór określa, że obecna sytuacja jest w przestrzeni w środku kwadratu przy użyciu twierdzenia negatywny, że istnieje przestrzeń w jakimś kierunku „octilinear”. Ogólnym pomysłem jest sprawdzenie wzoru, który umieszcza kwadrat w każdej z 5 niezbędnych lokalizacji w stosunku do kwadratu, od którego rozpoczyna się mecz. Musi także sprawdzić, czy nie ma go w bloku kwadratów 2x2. Zanim program zadziałał, musiałem naprawić błąd podczas analizowania nawiasów.Jeśli hexomino nie mapuje sześcianu,
0
jest drukowane. Jeśli tak, wypisywana jest dodatnia liczba całkowita (liczba dopasowań).Zaadaptowałem ten generator poliomino, aby stworzyć wszystkie możliwe przypadki testowe:
źródło
Rubinowy,
173 148 145143 bajtówOstatnia zmiana:
/2
po prawej stronie<
zastąpiona przez*2
po lewej stronie. Umożliwia eliminację jednego zestawu()
Wyjaśnienie
Kod składa się z dwóch części: głównej nienazwanej funkcji wykonującej parsowanie oraz pomocniczej nienazwanej funkcji przypisanej do zmiennej
h
, która sprawdza.Główna funkcja skanuje kolejno ciąg znaków, dodając współrzędne xiy
i,j
wszystkich+
znalezionych symboli dox[]
iy[]
. Następnie dzwonih
dwukrotnie. Za pierwszym razem zakłada, że heksomino jest w poziomie (x[]
zawiera długości iy[]
szerokości), a po raz drugi zakłada, że jest w pionie.Funkcja
h
przyjmuje współrzędne wzdłużne w tablicy,b
a następnie współrzędne wzdłużne w tablicyc
. Oblicza długość (w kwadratach) według wyrażenia(b.max.b.min)/2
. Jeśli jest mniejsza lub równa 3, heksomino powinno być ocenione w innym kierunku, więch
powracafalse
.Inspekcja heksominów pokaże, że jeśli długość wynosi 4, te heksominosy, które złożą się w sześcian, mają nie więcej niż 2 kwadraty (3
+
symbole) w pierwszym i ostatnim rzędzie . Większość kwadratów koncentruje się w środkowym rzędzie, który stanie się równikiem sześcianu. Ten warunek okazuje się konieczny i wystarczający dla heksomino o długości 4, które złoży się w sześcian.Jest tylko jedno heksomino o długości 5, które złoży się w sześcian. Ma 3 kwadraty (4
+
symbole) w pierwszym i ostatnim rzędzie. Wszystkie pozostałe heksominosy o długości 5 mają 5 lub więcej+
symboli w pierwszym lub ostatnim rzędzie.Jest tylko jeden heksomino o długości 6. Ma 7
+
symboli w każdym rzędzie.Podsumowując, wystarczy sprawdzić, czy długość heksomina jest większa niż 3, a liczba
+
symboli w pierwszym i ostatnim rzędzie (w zależności od tego, która wartość jest większa) jest mniejsza niż długość.Niegolfowany w programie testowym
źródło
JavaScript (ES6), 443
431Edytuj poprawkę błędu, problem podczas analizy wejściowej, usuwanie pustych kolumn
To bardzo długo, a nawet dłużej, ponieważ analizowanie danych wejściowych stanowi dużą część zadania.
To, co robię, to sprawdzanie, czy dane wejście jest jednym z 11 składanych heksomino.
Każde składane hexomino może być mapowane na jakąś bitmapę 5x5 (do 8 różnych, z symetrią i obrotami). Biorąc mapy bitowe jako liczbę 25-bitową, znalazłem wartości minimalne dla 11 odnotowanych heksominoes, używając następującego kodu (z bardzo prostym formatem wejściowym)
To daje
[1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056]
Biorąc pod uwagę ciąg wejściowy, muszę zrobić to samo, aby znaleźć minimalną mapę bitową, a następnie zwrócić wartość true, jeśli ta liczba jest obecna na mojej liście precalc.
Uruchom fragment kodu, aby przetestować w przeglądarce Firefox
Pokaż fragment kodu
źródło
,\nt=t
od końca drugiej linii / początku trzeciej linii?