Zadanie
Zadanie polega na kafelkowaniu wielokątów z uwzględnieniem konfiguracji wierzchołków.
Punktacja
Twój wynik jest równy „poziomowi złożoności”, który osiągniesz. Poziomy złożoności są kumulatywne, co oznacza, że aby osiągnąć # 3, musisz także wesprzeć # 1 i # 2.
Zgłoszenia na tym samym poziomie złożoności są rozróżniane według liczby bajtów; najniższe wygrane.
Wejście
Dane wejściowe to ciąg zawierający konfigurację wierzchołków, reprezentujący figurę wierzchołków. Oznacza to oddzieloną kropką listę liczb całkowitych, gdzie każda liczba całkowita (n) reprezentuje zwykły n-gon, połączony wspólnym wierzchołkiem.
Muszą być obsługiwane następujące konfiguracje wierzchołków:
3.3.3.3.3.3
3.3.3.3.6
3.3.3.4.4
(zwróć uwagę, że kolejność jest odzwierciedlona na rysunku wierzchołka, dlatego poniższe różnice się różnią)3.3.4.3.4
3.12.12
3.4.6.4
3.6.3.6
4.4.4.4
4.6.12
4.8.8
6.6.6
Wyjście - Poziom złożoności nr 1: Rysunek wierzchołka
Na tym poziomie złożoności dane wyjściowe to obraz przedstawiający liczbę wierzchołków odpowiadającą podanemu wejściowi.
Wejście jest poprzedzone znakiem, F
który oznacza, że liczba wierzchołków powinna być wyprowadzana, a nie pełne kafelki.
Na przykład F3.6.3.6
podaje tę liczbę wierzchołków:
Wyjście - Poziom złożoności # 2: Układanie płytek
Na tym poziomie złożoności wyjściowym jest obraz pokazujący jednolite kafelkowanie z wykorzystaniem liczby wierzchołków odpowiadającej podanemu wejściowi.
Na przykład 3.6.3.6
daje to kafelkowanie:
Nie ma ograniczeń dotyczących koloru ani formatu (z wyjątkiem luk prawnych).
Wyjście - Poziom złożoności nr 3: Podwójne układanie płytek
Na tym poziomie złożoności można tworzyć „podwójne kafelki” z każdego kafelka. Osiąga się to poprzez rysowanie linii od środka każdego wielokąta do środka każdego graniczącego wielokąta.
Podwójne kafelkowanie jest określane przez wcześniejsze wprowadzenie za pomocą V
.
Na przykład V3.6.3.6
daje to podwójne kafelki (na czerwono):
3.3.3.4.4
3.3.4.4.3
3.4.4.3.3
4.4.3.3.3
4.3.3.3.4
. Czy musimy poprzeć wszystkie synonimy, czy tylko najniższy leksykalnie (jak podano w pytaniu)? Ponadto,3.3.3.3.6
istnieje w dwóch postaciach lustrzanym odbiciem. Rozumiem, że oba są dopuszczalne.3.3.3.4.4
na przykład brakuje. pl.wikipedia.org/wiki/… dokładnie pasuje do Twojej listy. Rozumiem, że dopuszczalne są zarysy lub wypełnione wielokąty (lub ich kombinacja?) Niektóre dualne są już na liście. Na przykład4.4.4.4
ma swoją podwójność3.3.3.3.3.3
i6.6.6
są wzajemnie dualne. Ponieważ dualne są wyświetlane niezależnie od ich rodziców, rozumiem, że nie ma potrzeby prawidłowego dopasowania z rodzicem.3.3.3.3.6
ale skąd miałbyś wiedzieć, który to jest? :)Odpowiedzi:
BBC BASIC
Rev 1 Kod do gry w golfa, 655 znaków ASCII, tokenizowany rozmiar pliku 614
Kilka istotnych ulepszeń w tabeli danych, mieszając ciąg znaków
A.B..N
z liczbą(1*A+2*B+..n*N)+n
przed spojrzeniem w górę, i przechowując tylko jeden wektor tłumaczenia (drugi jest generowany przez kod.) Więcej wyjaśnień, kiedy skończę grać w golfa.Rev 0 Kod w golfa, 770 znaków ASCII, tokenizowany rozmiar pliku 728
Wszystko, co tutaj zrobiłem, to usunięcie komentarzy, niepotrzebnych białych znaków i cudzysłowów oraz umieszczenie wszystkich
DATA
w jednym wierszu. Z pewnością jest miejsce na więcej golfa.Wyjaśnienie
Jest to kontynuacja mojej poprzedniej odpowiedzi na poziomie 1, ale postanowiłem opublikować ją osobno, ponieważ jest dość długa.
Poziom 2
Osiąga się to poprzez tłumaczenie moich szablonów „poziomu 1.5” z mojej poprzedniej odpowiedzi. Dwa wektory translacji dla każdego kafelka są zakodowane na stałe. Korzystam z faktu, że trójkąt równoramienny podstawy 80 i wysokości 70 jest bardzo dobrym przybliżeniem trójkąta równobocznego, a trójkąt prawy z wektorem przeciwprostokątnym
(56,56)
ma długość przeciwprostokątną bardzo zbliżoną do 80.Poziom 3
Aby narysować wykresy dualne, zamiast kreślenia krawędzi wielokąta, wykreślamy szprychę od środka tej krawędzi do środka wielokąta. Jest to prostopadłe do krawędzi i ma długość
1/TAN/(PI/n)
razy wektor (u, v), który z kolei jest o połowę dłuższy niż krawędź.Niestety, ponieważ niektóre wielokąty w tilings
3.3.3.3.6
i3.4.6.4
nie są drukowane wyraźnie, nie zostałyby one wykreślone, gdybyśmy tylko to zrobili. Dlatego szprycha rozciąga się również na zewnątrz od wielokąta. Zewnętrzne rozszerzenie jest kontrolowane przez zmiennąo
.Domyślnie rozszerzenie jest wystarczające, aby dotrzeć do środka trójkąta, ale
3.4.6.4
w celu narysowania podwójnych kwadratów, które nie zostały wyraźnie narysowane, należy je rozszerzyć bardziej. Występuje więc wystarczające rozszerzenie, aby wypełnić brakujące kwadraty, gdy sześciokąty i trójkąty są drukowane jawnie, ale normalne rozszerzenie jest stosowane, gdy kwadraty są drukowane jawnie, aby uniknąć fałszywych linii w sąsiednich trójkątach.Oto jak wyglądają bez rozszerzeń szprych. Otwory w podwójnym wzorze są wyraźnie widoczne. Prawidłowe wyjście można zobaczyć na głównym obrazie u dołu odpowiedzi
Skomentowany kod
Różnice w stosunku do mojej poprzedniej odpowiedzi są oznaczone liniowo
Wynik
Program wykonuje tylko jedno kafelkowanie lub podwójny dla każdego uruchomienia. Jednak rysuje podwójne na czerwono. Aby zaoszczędzić miejsce, uruchomiłem program dwukrotnie bez czyszczenia ekranu w celu nałożenia podwójnego na zwykłe kafelki.
źródło
Matematyka
Poziom 1 zawiera podstawowe szablony kafelków, które są wielokrotnie stemplowane, aby kafelkować płaszczyznę.
Poziom 2 wykonuje kafelki.
Wciąż są 2 tile, których nie byłem w stanie osiągnąć. Wydaje się, że wymagają rotacji, a także tłumaczenia.
Poziom 1: Liczba wierzchołków (559 bajtów)
Testowanie
Poziom 2: Kafelkowanie (690 dodatkowych bajtów)
Reguły zwracają przesunięcia i wcięcia w kafelkach dla każdej konfiguracji.
r
to podstawowa funkcja generująca przechyłki.p
pokazuje szablon i odpowiednie kafelki. Białe spacje odpowiadają tym, które nie są objęte szablonem.Testowanie
Trójkątne płytki
sześciokątny
kwadrat
nieznany
ścięty kwadrat
triheksagonalny
ścięty sześciokątny
anonimowy
wydłużony trójkątny
Tilings do rozgryzienia
źródło
3.3.3.3.3.3
połowę, aby jednostki zachodziły na siebie, możesz pozbyć się tych diamentów i naprawić płytki. Masz jeszcze wiele do zrobienia w sprawie3.3.3.3.6
,3.4.6.4
a4.6.12
jednak.4.6.12 anyone know what it should look like?
- Wszystkie wymagane nachylenia są na stronie en.wikipedia.org/wiki/… . Zobacz mój komentarz do pytania. To jest inna strona niż ta wymieniona w pytaniu. Ale i tak4.6.12
jest również pokazywany na tej stronie.R
Krok 1
Oto mój wysiłek w budowaniu płytek. Płytka, aby przejść dalej. To nie sprawdza poprawności danych wejściowych, więc inwalidzi będą rysować dziwne płytki. Dane wejściowe wpisuje się po pierwszym wierszu
Krok # 1, # 2 i # 3: 1898
Wreszcie wróciłem do tego. Większość tego zajmuje zajęcie się ustawianiem przesunięć i obsługą specjalnych przypadków :). Edycja: Flaga V dla dualów jest teraz obsługiwana
Ogólny proces to:
Prawdopodobnie mogę jeszcze trochę golfa.
źródło
BBC BASIC
Pobierz emulator na http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Poziom 1
Poziom 1,5
Poziom 1,5 to moje własne oznaczenie, ale jest to ważny kamień milowy w mojej metodzie.
Przesunięcie liczb wierzchołków nie zawsze prowadzi do prawidłowego sąsiadowania. W niektórych przypadkach brakuje linii.
Moim rozwiązaniem jest obejście największego wielokąta, rysowanie liczby wierzchołków dla każdego drugiego wierzchołka tego wielokąta. Jest to ogólne rozwiązanie dla wszystkich przypadków. Zauważ, że największy wielokąt ma zawsze parzystą liczbę boków, a liczba wierzchołków często zmienia się w kierunku zgodnym z ruchem wskazówek zegara / przeciwnie do kierunku ruchu wskazówek zegara podczasokoła wielokąta. Widać to najwyraźniej za pomocą
4.6.12
, ale jest to również prawdą4.8.8
i3.12.12
: gdy oglądane z dowolnego konkretnego 8-gona lub 12-gona, naprzemienne wierzchołki są wzajemnie odbiciami lustrzanymi. Tak też dzieje się, nieco mniej oczywiste, z3.3.3.4.4
i3.3.4.3.4
: patrząc z dowolnego kwadratu, przemienne wierzchołki są wzajemnie odbiciami lustrzanymi.Algorytm, którego używam do przesuwania 2 boków wokół wielokąta, polega na tym, aby zawsze wykonywać 14 iteracji pętli rysującej krawędzie, niezależnie od tego, ile krawędzi ma wielokąt. 8 jest współczynnikiem 16, dlatego podczas rysowania ośmiokątów kursor graficzny kończy się 16-14 = 2 wierzchołkami za miejscem, w którym się zaczął. 3- 4- 6- i 12-gony mają boki o współczynniku 12, więc kursor graficzny kończy się o 14-12 = 2 wierzchołki przed początkiem.
Liczby można zobaczyć poniżej. Jutro mam nadzieję opracować prawidłowe tłumaczenia, aby ukończyć kafelkowanie. We wszystkich przypadkach narysowane są wystarczające linie, aby ukończyć poziom 2 tylko z tłumaczeniami. W niektórych przypadkach rysuje się znacznie więcej niż wymagane minimum, ale nie ma problemu z nakładaniem się: reguły nie mówią nic o rysowaniu linii tylko raz :-)
Ogólnie rzecz biorąc, największy wielokąt jest ostatni na liście. Niestety jest jeden przypadek, w którym tak nie jest:
3.4.6.4
dlatego rysunek narysowany w tym przypadku jest wyśrodkowany na kwadracie, a nie na sześciokącie. Jest wystarczająca liczba wierszy, aby ukończyć poziom 2 przy użyciu samych tłumaczeń, chociaż będą pewne kwadraty, które nie zostaną wyraźnie narysowane. Spowoduje to pewne problemy na poziomie 3 (na szczęście myślę, że wiem, jak to rozwiązać). Podobnie z3.3.3.3.6
wystarczającą liczbą linii do ukończenia poziomu 2 przy użyciu samych tłumaczeń, ale będą pewne trójkąty, które nie zostaną wyraźnie narysowane.Kod
Kod poziomu 1.5 został skomentowany, aktywowany jest tylko kod poziomu 1. Istnieją cztery linie rozpoczynające się od
REM
. Usuń je,REM
aby aktywować poziom 1.5.Poziomy 2 i 3
Zobacz moją drugą odpowiedź.
źródło