Powyższy obraz nazywa się glifem heksa. Heksa-glify to kilka fajnych wzorów, które wymyśliłem podczas gry w DiffEq. Oto, jak to zrobić:
- Rozważ następujący zestaw punktów w kształcie zwykłego heksagramu. Wewnętrzny sześciokąt będzie zawierał ostatni glif, podczas gdy zewnętrzne 6 punktów tworzy gwiazdę i tam zaczynamy rysować nasze linie.
- Z zewnętrznych sześciu punktów losowo wybierz parę. Aby uzyskać wydajność, między dwoma wybranymi punktami powinien znajdować się co najmniej jeden inny punkt (w przeciwnym razie nie miałoby to wpływu na ostateczną liczbę). Następnie z każdego z dwóch punktów skieruj promień w kierunku drugiego. Promień ten jest blokowany przez poprzednie linie.
- Powtarzaj ten proces, aż utworzy się wszystkie 9 krawędzi, jak pokazano na kilku następnych obrazach.
- Oto przykład blokowania promieni. Końce segmentu promienia są nadal widoczne, ale środkowa część jest zasłonięta przez dwa pierwsze narysowane segmenty.
- Te dwa promienie są również „blokowane”, ale nie powoduje to widocznej różnicy, ponieważ są blokowane przez tę samą drugą linię.
- Szybkie przewijanie do momentu narysowania wszystkich 9 linii. Jeśli chcesz uzyskać bardziej szczegółowe wyjaśnienie pominiętych kroków, mogę wyjaśnić.
- Na koniec usuń punkty gwiazdy. Grube kropki są również usuwane, aby wyglądać ładniej.
Wyzwanie
Wyzwanie polega na wygenerowaniu wizualnej reprezentacji losowego glifu heksa. To jest golf golfowy, wygrywa najmniej bajtów.
Wszystkie możliwe glify heksowe powinny pojawić się z pewnym prawdopodobieństwem dodatnim. Różne hex-glify są generowane przez zmianę kolejności rysowania 9 krawędzi.
Ponadto wszystkie obrazy wyprowadzane przez Twój program muszą być poprawnymi glifami hexa. Pewne wzory (jak kompletny zarys wewnętrznego sześciokąta) nie mogą pojawić się jako glif heksowy, więc program nie może ich wyprowadzać.
Wyjście powinno być obrazem graficznym (wydrukowanym do ekranu lub pliku).
Sześciokąt musi być regularny, ale może pojawiać się w dowolnej orientacji.
Odbicia / obroty nie są uważane za wyjątkowe. (Może to ułatwić spełnienie wymagania 1).
źródło
I made up while doodling during my DiffEq class
. Sposób, w jaki dzieją się wszystkie wielkie odkrycia ...: P'01'
z przeplotem zamiast' *'
.Odpowiedzi:
Mathematica,
273268264242 bajtów
Czyni jako odnośnikiemT
w Mathematicą i operator przyrostek transpozycji.Uporządkowanie błędów w tym zajęło mi wieczność ... pod koniec zhakowałem kilka rzeczy razem, aby działało, więc jest to zdecydowanie nieoptymalne. Zastanawiam się także, czy ogólnie lepiej byłoby lepiej zaimplementować specyfikację dosłownie poprzez linie w zewnętrznym sześciokącie i pozwolić funkcjom geometrycznym Mathematica obsługiwać przecięcia.
Pamiętaj, że jest to pełny program i jeśli chcesz uruchomić kod wiele razy w ciągu jednej sesji REPL, musisz go poprzedzić
Clear[b]
.Oto wyniki 20 przebiegów:
Wyjaśnienie
To rozwiązanie w ogóle nie wykorzystuje zewnętrznych punktów gwiazdowych. Zamiast tego działa bezpośrednio z punktami, które są częścią heksaglypha i liniami pokrywającymi trzy z nich jednocześnie.
Oznaczmy punkty:
1
zaczyna się w nieco dziwnym zakręcie, ale wynika to z (również nieco dziwnego) domyślnego zachowaniaCirclePoints
. Stamtąd uruchomienie sześciokąta okazało się najtańsze.Teraz chcemy znaleźć odpowiednie linie przez trzy z tych punktów, które odpowiadają połączonym punktom gwiazdy zewnętrznej. Te wokół sześciokąta to oczywiście tylko 3 sąsiednie punkty (moduł 12), zaczynając od liczby nieparzystej. Te całym centrum składa się z numeru nawet
n
,13
in+6
.Reprezentacje tych linii (w formie list trzech punktów są generowane przez następujący kod):
Partition
Generuje linie wokół sześciokąta iArray
linii przez centrum. Aby przetworzyć obie wiązki, mapujemy tę funkcję na listę linii:Teraz tasujemy je,
RandomSample
aby przetwarzać je w losowej kolejności.Join @@
spłaszcza listę par, dzięki czemu mamy listę belek.Krótka przerwa: aby śledzić, które punkty są już zablokowane, używamy funkcji wyszukiwania
b
, która jest inicjowanaTrue
dla wszystkich wartości przezb@_=k=1>0;
. Podczas przetwarzania belki zachowujemy wszystkie punkty do pierwszego punktu, który mab[n] == False
(w tym ten):Wydaje mi się, że jest to obecnie najbardziej golfowa część ... użycie dwóch zmiennych tymczasowych do gry Mastermind wydaje się naprawdę drogie. W każdym razie wynik tego daje nam punkty w linii, którą możemy narysować. Teraz ta funkcja jest mapowana na każdy z tych punktów:
Pierwsza część generuje listę wszystkich 13 punktów na podstawie przeplatanych wyników dwóch wywołań do
CirclePoints
(z różnymi promieniami dla środków krawędzi i narożników sześciokąta). Zwróć uwagę na to,b@#=!k
co teraz ustawia wartość tabeli odnośników dla bieżącego punktu, abyFalse
żadna dalsza wiązka nie mogła przez niego przejść. Na koniec wartość jest używana jako indeks do listy współrzędnych w celu uzyskania prawidłowego punktu 2D.Spowoduje to odrzucenie wszystkich list jednoelementowych, ponieważ będą renderowane jako pojedyncze (i widoczne) punkty. Na koniec renderujemy wynik:
źródło
b@_=1>0
=b=1>0&
Buty (Ruby) Rev C 184 bajty
12 bajtów zaoszczędzonych poprzez przeniesienie odpowiedzialności za sprawdzenie, czy konkretna półwiersz powinna zostać narysowana z programu głównego do metody rysowania. Główny program nadal musi jednak sprawdzić, czy cała linia jest całkowicie zablokowana.
Buty (Ruby)
205... Rev B 196 bajtówButy to oparte na rubinie narzędzie do tworzenia GUI itp. Po raz pierwszy go używam. mothereff.in/byte-counter liczy moje przesłanie jako 196 bajtów, ale z jakiegoś powodu Shoes liczy je jako 202.
Ponadto Ruby pozwala robić rzeczy takie,
t[a=i.ord]
ale dziwnie, wydaje się, że nie działa zgodnie z oczekiwaniami z Shoes.Wyjaśnienie
Nie uważam części linii poza sześciokątem. Rysuję tylko tę część, którą trzeba narysować. Ważne jest, czy linie przecinają przecięcia (jeśli narysujemy tylko te części, które należy narysować, oznacza to, że zaczynają się / kończą na przecięciach).
Podstawowa zasada jest taka, że jeśli odwiedzono oba punkty końcowe linii, linia jest zablokowana i nie powinna być rysowana. Ponieważ linie są rysowane w dwóch połowach, musimy również sprawdzić, czy punkt środkowy został odwiedzony, aby zobaczyć, czy każda połowa powinna zostać narysowana, czy nie.
Śledzę, które punkty zostały odwiedzone w tablicy
t[]
. Ostatecznie zawiera wpis dla każdej fizycznej współrzędnej na siatce poniżej. Nie ma oddzielnej 13-elementowej tablicy logicznej. Do końcat[]
może zawierać 87 elementów, ale tylko 13 może zawierać przydatne dane.Wewnętrznie współrzędne punktów końcowych linii są podawane przez pojedynczą liczbę z, gdzie z% 6 to współrzędna y, a z / 6 to współrzędna x. W tym systemie sześciokąt jest spłaszczony. Kiedy linie są wykreślane, skala x jest mnożona przez 8, a skala y jest mnożona przez 14, co jest bardzo bliskim racjonalnym przybliżeniem do prawidłowego stosunku: 14/8 = 1,75 vs sqrt (3) = 1,732.
Wewnętrzny układ współrzędnych pokazano poniżej z kilkoma przykładowymi danymi wyjściowymi.
Bez golfa
Więcej próbek wyjściowych
Zostały one wykonane ze starszą wersją programu. Jedyna różnica polega na tym, że położenie sześciokąta w oknie jest teraz nieco inne.
źródło
mothereff.in/byte-counter counts my submission as 196 bytes, but for some reason Shoes counts it as 202.
Nie wiem w 100%, czy to prawda, ale myślę, że powodem, dla którego Shoes policzył twój kod jako 202 bajty zamiast 196, jest to, że twoje znaki nowej linii są w rzeczywistości sekwencją dwóch znaków „\ r \ n”. To sprawia, że każda nowa linia jest liczona dwukrotnie. Oto odpowiedź na pytanie o przepełnienie stosu dotyczące \ ri \ n.Python,
604591574561538531536534528493483452431420419415388385384 bajtówZaadaptowałem pomysł Level River St, aby sprawdzić, czy linia zostanie zablokowana, sprawdzając, czy oba punkty końcowe linii były już wcześniej odwiedzane. Oszczędza to 27 bajtów. Sugestie dotyczące gry w golfa mile widziane.
Edycja: Naprawianie błędów i gra
g(p,q)
w golfa przez 3 bajty. GrałL
w golfa na jeden bajt.Ungolfing:
Same heksa-glify są dość małe, ponieważ używamy 12-pikselowego sześciokąta jako podstawy (ze względów golfowych). Oto kilka przykładów heksa-glifów (przeprosiny za słabe kadrowanie):
źródło
R=range;G=goto