Celem tego wyzwania jest graficzne przedstawienie chodzenia po płaszczyźnie, gdzie kierunek każdego kroku jest określony przez pierwotność i parzystość jego binarnej ekspansji. Konkretnie,
- Początkowy kierunek jest ustalony, powiedzmy na północ.
- Wszystkie kroki mają tę samą długość .
- Kierunek z etapu może być Północna, Zachodnia, Południowa i Wschodnia, a określa się następująco:
- Jeśli nie jest liczbą pierwszą, kierunek się nie zmienia.
- Jeśli jest liczbą pierwszą, a binarne rozszerzenie ma parzystą liczbę, skręć w prawo.
- Jeśli jest liczbą pierwszą, a binarne rozszerzenie ma nieparzystą liczbę, skręć w lewo.
Jako działający przykład , załóżmy, że początkowy kierunek to Północ. Pierwsze kroki to:
- nie jest liczbą pierwszą. Przesuwamy się więc o jeden krok w obecnym kierunku, czyli na północ.
- jest liczbą pierwszą, a jej rozwinięcie binarne
10
ma liczbę nieparzystą. Skręcamy więc w lewo i jesteśmy teraz zwróceni na Zachód. Przesuwamy się o jeden krok w tym kierunku. - jest liczbą pierwszą, a jej binarne rozszerzenie
11
ma, a nawet liczbę. Skręcamy więc w prawo i jesteśmy teraz skierowani na północ. Przesuwamy się o jeden krok w tym kierunku. - nie jest liczbą pierwszą. Przesuwamy się więc o jeden krok w obecnym kierunku, czyli na północ.
Wyzwanie
Wejście : dodatnia .
Wyjście : wykres przejścia krokowego, jak zdefiniowano powyżej.
Dodatkowe zasady
- Początkowy kierunek może być dowolnie wybrana (niekoniecznie Północna), lecz powinna być taka sama dla wszystkich .
- Reguła toczenia może być odwrotny do opisanego powyżej, to znaczy, skręcić w prawo na nieparzystości i pozostawiona na jeszcze; ale to musi być taka sama dla wszystkich .
- Wyjściem musi być graficzne przedstawienie marszu. Na przykład:
- Spacer można narysować za pomocą segmentów linii.
- Odwiedzone punkty mogą być oznaczone markerem, takim jak kropka; z segmentami linii łączącej lub bez.
- Można dostarczyć dwukolorowy obraz rastrowy, z jednym kolorem odpowiadającym odwiedzanym punktom, a drugim dla osób nieodwiedzanych.
- Skale osi poziomej i pionowej nie muszą być takie same. Również etykiety osi i podobne elementy są opcjonalne. Tak długo, jak spacer można wyraźnie zobaczyć, fabuła jest ważna.
- Pamiętaj, że niektóre punkty są odwiedzane więcej niż raz. Fabuła nie jest na to wrażliwa. Na przykład, jeśli na wykresie są pokazane segmenty linii, każdy segment jednostki jest wyświetlany tak samo bez względu na to, ile razy został przemierzony.
- Kod powinien działać dla dowolnych
N
nieograniczonych zasobów. Dopuszczalne jest, jeśli w praktyce zawodzi przez długiN
czas z powodu ograniczeń czasowych, pamięciowych lub typu danych. - Wejścia i wyjścia są elastyczne jak zwykle. W szczególności można zastosować dowolny ze standardowych sposobów przesyłania obrazów.
- Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
Poniższe wykresy wykorzystują północ jako kierunek początkowy; nawet parzystość skręca w prawo; i spacer jest przedstawiony za pomocą segmentów linii.
N = 7
:
N = 3000
:
N = 20000
:
N = 159000
:
N = 1200000
:
N = 11000000
:
code-golf
graphical-output
integer
primes
Luis Mendo
źródło
źródło
[graphical-output]
dozwolony jest tylko powód ? Czy jest jakikolwiek powód, aby odrzucić niedozwolone dane wyjściowe ASCII, takie jak moja teraz usunięta odpowiedź na węgiel drzewny?Odpowiedzi:
Młot 0.4 ,
2220 bajtówDekompresuje się do tej funkcji języka Wolfram:
Nie golfił
Najpierw definiujemy funkcję, która zwraca kąt obrotu na każdym kroku:
ThueMorse
jest parzystością sumy cyfr binarnych. Używamy-1^(...)
raczej niż2*...-1
z nieco skomplikowanego powodu: Język Wolfram automatycznie konwertuje wyrażenia arytmetyczne ze źródła na postać kanoniczną, więc wyrażenia podobne2/x
są przechowywane jakoTimes[2, Power[x, -1]]
. To sprawia, że częstotliwość jestPower
bardzo wysoka, a zatem kompresja jest bardzo tania.(Mnożenie przez
Boole@PrimeQ@
jest nieco dłuższe, a niejawneBoole
rzucanie booleanów nie było zaimplementowane w momencie wyzwania).Odtąd matematyka
AnglePath
iListPlot
rób dokładnie to, czego potrzebujemy:W aplikacji interaktywnej dane wyjściowe to skalowalny obiekt wektorowy.
źródło
MATL ,
252421 bajtówWypróbuj w MATL online
Dzięki @LuisMendo za fajną sesję golfa na czacie, która ostatecznie doprowadziła do tej 21-bajtowej wersji, sugerując
Eq*^
Wyjaśnienie
źródło
C (gcc) , 179 bajtów
Wypróbuj online!
0
1
C (gcc) , 219 bajtów
Wypróbuj online!
Przycięta moc wyjściowa dla 20000:
Obie wersje zaczynają się od zachodu i skręcają w prawo na kursie nieparzystym, w lewo na parzystym.
Wypróbowałem większe przypadki testowe z żadnym z nich, ponieważ dane wyjściowe z 20000 wyniosły ~ 1,5 GB, a 150000 to ~ 90 GB. Wszystko to jest przechowywane w pamięci podczas wykonywania programu.
Wyjaśnienie górnej:
źródło
0
wskaźnik zerowy w przypadku C).Wolfram Language (Mathematica) ,
989691777663 bajtów-14 bajtów: Dzięki @lirtosiast za pokazanie mi, jak używać
AnglePath
...-13 bajtów: ... i
ThueMorse
!przykład użycia:
Wyjaśnienie krok po kroku:
If[PrimeQ@#, 2 ThueMorse@# - 1, 0] &
jest funkcją, która pobiera indeks kroku i zwraca 0 dla liczb niepierwszych, -1 dla liczb parzystych binarnych i +1 dla liczb nieparzystych.ThueMorse@#
zastępuje poprzednie rozwiązanieTotal[#~IntegerDigits~2]
(które jest takie samo, modulo 2).Array[Pi/2*%,#]
tworzy listę tej funkcji z indeksem od 1 do argumentu funkcji (20000 w przykładzie) i mnoży każdy element przez π / 2, aby uzyskać kąt zmiany kierunku (w radianach). Mamy teraz 0 dla liczb pierwszych nieparzystych, -π / 2 dla liczb parzystych binarnych i + π / 2 dla liczb nieparzystych binarnych.AnglePath[%]
konwertuje tę listę kątów zmiany kierunku na ścieżkę. Ta instrukcja zastępuje podwójne użycie poprzedniego rozwiązaniaAccumulate
.ListPlot[%]
konwertuje listę pozycji na wykres kropkowy XY. Jeśli preferowana jest linia, użyjListLinePlot
zamiast niej. Te funkcje drukowania mają wiele opcji, dzięki którym wykresy wyglądają lepiej.źródło
MATL,
31302826 bajtów3 bajty zapisane dzięki @LuisMendo
2 bajty zapisane dzięki @Sanchises
Wypróbuj w MATL Online
Wyjaśnienie
W tym rozwiązaniu liczby zespolone reprezentują składowe X i Y płaszczyzny 2D
W tym momencie mamy cztery punkty (
(0, 1), (-1, 0), (0, -1), (1, 0)
) w tablicy reprezentowanej przez liczby zespolone. Są to cztery główne kierunki. Teraz chcemy ich użyć do „chodzenia”.Zasadniczo działa to w ten sposób, że zaczynamy zmierzać w kierunku zerowym (0-ty element tablicy, który jest
(-1, 0)
). Na każdym etapie musimy określić zmianę w tym nagłówku. Użyjemy liczb całkowitych do śledzenia tej zmiany. Jeśli chcemy skręcić w prawo, zwiększamy tę liczbę całkowitą o 1 (odwołując się do następnego elementu w tablicy 4-punktowej), a jeśli chcemy przejść w lewo, zmniejszamy tę liczbę całkowitą o 1 (odwołując się do poprzedniego elementu w Tablica 4-punktowa). Jeśli chcemy kontynuować naszą ścieżkę, utrzymujemy stałą wartość całkowitą (odwołując się do tego samego elementu w tablicy 4-punktowej).Ta część kodu tworzy tablicę wszystkich tych
0
,-1
i1
wartości.Teraz mamy tablicę różnic między kolejnymi liczbami całkowitymi, dzięki czemu możemy obliczyć skumulowaną sumę tych wartości, aby uzyskać wskaźniki, których możemy użyć do sprawdzenia kierunku na każdym kroku w oryginalnej 4-elementowej tablicy.
Dogodnie, MATL ma indeksowanie z zawijaniem, tak że indeks
5
zawija się do początku 4-elementowej tablicy. Możemy to wykorzystać na naszą korzyść, dzięki czemu możemy zwiększać i zmniejszać tę liczbę całkowitą, nie martwiąc się o to, że tablica kierunków odniesienia zawiera tylko 4 elementy.Teraz mamy tablicę kierunków kroków, dzięki czemu możemy obliczyć skumulowaną sumę tych kierunków, aby wyznaczyć ścieżkę, którą obierzono.
źródło
Perl 6 ,
213182 bajtów{my @p = [\ +] [\ *] ({{. is-prime ??. base (2) .comb (~ 1)% 2 ?? i !! - i !! 1 + 0i} (+ + $)} ... *) [^ $ _]; {"<svg viewBox = '{. min xx 2, .elems xx 2}' >>. & {" L {.re} {.im} " }} 'fill =' none 'stroke =' black '/> "} (minmax | @p» .reals)}Wypróbuj online!
(Naprawdę udało mi się to obniżyć!)
Ta funkcja wyświetla dane w formacie SVG.
{ -{ .is-prime * .base(2).comb(~1) R** -1 || i }(++$)i } ... *
jest nieskończoną sekwencją zmian kierunku dla każdego kroku, w postaci liczb zespolonych, gdzie1
oznacza „kontynuuj w tym samym kierunku”i
oznacza „skręć w lewo” i-i
„skręć w prawo”.[^$_]
ogranicza tę sekwencję do liczby kroków podanych jako argument funkcji.[\*]
skanuje tę sekwencję z (złożonym) mnożeniem, zamieniając listę względnych zmian kierunku w listę bezwzględnych kierunków.[\+]
skanuje tę sekwencję z (złożonym) dodatkiem, tworząc listę odwiedzanych współrzędnych.».reals
konwertuje tę listę liczb zespolonych na dwuelementowe listy jej rzeczywistych i urojonych części.Obraz SVG to tylko jeden
path
element.Wyjście (przeliczone na PNG) dla N = 20000:
źródło
C, 321 bajtów
Wypróbuj online!
Zacząłem nad tym pracować, zanim opublikowano drugą odpowiedź C, ale pomyślałem, że równie dobrze mogę napisać moją. Ten jest znacznie dłuższy, ale automatycznie przycina obraz wyjściowy do wymiarów wyniku.
Funkcja jest wywoływana jako
f(n)
, a wyjściem jest wyjście standardowe w formacie netpbm.Przykładowe dane wyjściowe dla n = 1000:
Test podstawowy jest zasadniczo testem zastosowanym w odpowiedzi Lynn na inne wyzwanie , które opiera się na twierdzeniu Wilsona .
Test parzystości wykorzystuje adaptację metody zliczania bitów Kernighana .
Ponieważ główny test jest bardzo wolny, a algorytm ponownie uruchamia całą funkcję generowania ścieżki dla każdego narysowanego piksela, każde wejście znacznie wyższe niż 1000 razy w TIO.
źródło
LOGO,
177171 bajtówDo użytku, coś takiego zrobić to :
Przepraszam, ale nie byłem w stanie uchwycić próbki wyjściowej. Wyjaśnienie:
Jest to procedura rekurencyjna, która obraca się o 180 ° dla każdego ustawionego bitu w swoim parametrze, co skutecznie oblicza parzystość jego binarnej ekspansji.
To jest bardzo podstawowy test pierwotności. Po specjalnej obudowie 1 procedura wcześnie powraca, jeśli zostanie znaleziony czynnik. Jeśli jednak bieżąca wartość okaże się liczbą pierwszą, skręca w prawo, a następnie stosuje powyższą procedurę, aby zmienić ją odpowiednio na skręt w lewo.
Jest to po prostu prosta pętla do przetestowania wszystkich liczb aż do
n
pierwotności i do przesunięcia o dwa piksele po każdym.źródło
Galaretka , 41 bajtów
Wypróbuj online!
źródło
JavaScript -
675668660632556534 bajtówPo raz pierwszy na CodeGolf, początkowo zaczął od ~ 1500 Bajtów. Grał w golfa do
mniej niż połowyprawiewięcej niż jednej trzeciej. Kontynuuj grę w golfa. Bajty liczone za pomocą: tego narzędziaZasada:
Rysuje na płótno o stałym rozmiarze z N i zmienną długością skoku jako wejściem.
Edycje:
-07 Bytes - usunięcie pominiętego if
-08 Bytes - zmiana przełącznika na if / else
-28 Bytes - zmiana na tenary if / else
-76 Bytes - krótszy test główny (runtime / 3)
-22 Bytes - użyj tej funkcji prime (runtime * 4)
Kod do gry w golfa:
Nieskluczony kod z białymi spacjami:
Przykłady:
źródło
Czerwony ,
515480471 bajtów-1 bajt dzięki Kevin Cruijssen!
Znaczna część kodu (~ 160 bajtów) dotyczy normalizacji współrzędnych, tak aby grafika mieściła się całkowicie w obszarze roboczym, niezależnie od wielkości danych wejściowych.
Początkowy kierunek: południe.
Oto wynik dla
n = 3000
n = 20000
źródło
if j%(k + 1)
aif j% 2 = 1
, ale istnieją przestrzenie wymagane dla większości pozostałych operatorów (+
,/
, itd.). Czy przestrzeń można również usunąć w modulepick[-90 90]s% 2
? Właściwie, dlaczego również nie są wymagane jakieś obowiązuje was-pair k/1 - t * c k/2 - v * c
dla/
?s% 2
, dzięki! Nie wiem dlaczego, ale modulo%
jest jedynym operatorem, dla którego spacja przed nim może zostać usunięta, jeśli poprzedza ją słowo (zmienna). Was-pair k/1 - t * c k/2 - v * c
ukośnikach/
służą zupełnie inne cele - sąpath
.k
jest apair
ik/1
jest pierwszym elementem (można go również wybraćk/x
, lubpick k 1
). Przestrzenie są potrzebne prawie wszędzie, wyjątki są wokół()[]{}
, ponieważ nie ma dwuznaczności.word
nazwach (Red
nie mavariables
, wszystko jest albo a,word
albo wartością (lub jakimś blokiem składni, takim jak[...]
lub(...)
). Więc:a*4: 45
-> słowua*4
przypisuje się wartość 45.%
jest używane jako znacznik dlafile!
typu danych i może dlatego nie można go używać wword
nazwach, ale może łamać reguły dla innych operatorów arytmetycznych/
mają one inny cel, a symbole mogą być używane bez spacji w zmiennych (lubwords
jak się je nazywa na czerwono). Dziękuję za wyjaśnienie. :) I cieszę się, że mogłem (głównie przypadkowo) zapisać bajt dlas% 2
. :)Przetwarzanie, ponad 140 bajtów
Może nie spełnić wyraźnie widoczne
źródło