Mieliśmy kilka z wyzwań o spirali Ulama. Ale to nie wystarczy.
W tym wyzwaniu narysujemy trójkątną spiralę Ulama (w przeciwieństwie do zwykłej kwadratowej spirali Ulama). Oto szkic tego, jak wygląda spirala.
Jak wiemy, spirala Ulama układa wszystkie liczby naturalne w spiralę zewnętrzną i zaznacza tylko te, które są pierwsze. Na powyższym szkicu pokazane byłyby tylko liczby, które pojawiają się na czarno (liczby pierwsze).
Wyzwanie
Zaakceptuj liczbę N jako dane wejściowe i wyświetl trójkątną spiralę Ulama do tej liczby.
- Dane wejściowe mogą być argumentem standardowym lub funkcyjnym.
- Spirala powinna obrócić się w kierunku dodatnim (to znaczy przeciwnie do ruchu wskazówek zegara), jak na powyższym rysunku.
- Dowolny zwojów o 120 stopni powyższej liczby byłby prawidłowy, a zwrot może być inny dla różnych danych wejściowych. Ale najniższa strona implikowanych trójkątów powinna być pozioma, ponieważ jedynymi dozwolonymi zwojami są (wielokrotności) 120 stopni.
- Kod powinien działać teoretycznie (biorąc pod uwagę wystarczającą ilość czasu i pamięci) dla dowolnego N, aż do poziomu dozwolonego przez jakiekolwiek pośrednie obliczenia wykonane z domyślnym typem danych.
double
wystarczy; nie potrzeba dużych typów całkowitych. - Wszystkie wbudowane funkcje są dozwolone.
- Nie zaakceptuję własnej odpowiedzi (nie sądzę, że i tak byłaby najkrótsza ...).
Formaty wyjściowe
Wybierz jedną z poniższych opcji.
Wyświetl wykres ze znacznikiem (kropka, okrąg, krzyż, cokolwiek wolisz) przy liczbach pierwszych i nic przy liczbach innych niż pierwsze. Skala nie musi być taka sama dla dwóch osi. Oznacza to, że implikowane trójkąty nie muszą być równoboczne. Osie, linie siatki i etykiety osi są opcjonalne. Wymagane są tylko znaczniki liczb pierwszych.
Przykładowy wynik dla N = 12 byłby następujący (porównaj z powyższym szkicem). Drugi wykres jest bardziej interesującym przykładem, odpowiadającym N = 10000.
- Utwórz plik obrazu z powyższym, w dowolnym dobrze znanym formacie obrazu (takim jak png, tiff, bmp).
Wyświetl spiralę jako grafikę ASCII , używając jednego wybranego znaku dla liczb pierwszych i pustego miejsca dla liczb niepierwszych, z pustym miejscem do oddzielenia pozycji liczbowych w tym samym rzędzie. Dopuszczalne są wiodące lub końcowe spacje lub znaki nowej linii. Na przykład przypadek N = 12 użyty
o
jako znak byłbyo · · · o · o · · · o · o
gdzie oczywiście
o
byłby wyświetlany tylko znak na liczbach pierwszych. W·
non-primes pokazano tutaj tylko w celach informacyjnych.
Kryterium wygranej
Prawdziwą nagrodą jest przekonanie się o tych niesamowitych wzorach Kod golfa, najkrótszy kod wygrywa.
źródło
Odpowiedzi:
CJam,
4942 bajtówWprowadź jako jedną liczbę całkowitą w STDIN. Wyjście jako siatka ASCII
0
dla liczb pierwszych. Obrót spirali nie jest spójny: największa liczba spirali będzie zawsze w dolnym rzędzie.Sprawdź to tutaj.
Wyjaśnienie
Podstawową ideą jest przedstawienie trójkąta jako poszarpanej tablicy 2D podczas wykonywania obliczeń. Tę tablicę uzyskuje się poprzez odwrócenie linii i wyrównanie wszystkich wierszy w lewo:
Byłby reprezentowany jako
Ponieważ odbiliśmy lustrzaną linię, chcemy zwinąć spiralę zgodnie z ruchem wskazówek zegara . Jest to wygodne, ponieważ wszystko, co musimy zrobić, to obrócić trójkąt przeciwnie do ruchu wskazówek zegara i przygotować kolejną listę podrzędną w kolejności. Możemy obrócić nierówną tablicę, odwracając wszystkie linie i transponując ją:
Oto kod. Jednym szczegółem, na który chciałbym zwrócić uwagę, jest ostatni bit, który tworzy układ trójkątny. Myślę, że to raczej fajne. :)
źródło
MATL ,
4836 bajtówWykorzystuje bieżącą wersję (9.3.0) .
Wypróbuj online!
Nie mam pojęcia, w jaki sposób kompilatorowi online udaje się przetłumaczyć dane wyjściowe na ASCII, ale robito. Powoduje to przybliżony wykres ASCII dzięki funkcji Octave obsługiwanej przez kompilator online!Edycja (4 kwietnia 2016 r.):
Y[
Zmieniono nazwę tej funkcjik
od wydania 13.0.0. Link do kompilatora online zawiera tę zmianę, dzięki czemu można przetestować kod.Przykład
tworzy wyjście graficzne (pokazana wersja MATLAB):
Wyjaśnienie
Kod wykorzystuje liczby zespolone do śledzenia ścieżki, po której następuje spirala. Jak można zobaczyć na pierwszej figurze w wyzwaniu, każda prosta noga spirali jest segmentem o wzrastającej długości 1, 2, 3, 4 ... i cyklicznie rosnącym ukierunkowaniu 120 stopni, 240 stopni, 0 stopni, 120 stopni. ..
Kod najpierw generuje indywidualne złożone przesunięcia z każdej liczby całkowitej na następny. Te złożone przemieszczenia mają wielkość 1 i kąt
2*pi/3
,4*pi/3
lub0
(w radianach). W ten sposób można je łatwo wygenerować jako wyimaginowane wykładnicze. W tym celu najpierw używana jest liczba całkowita 0,1,2,2,3,3,3,3,4,4,4,4 ...Ta sekwencja liczb całkowitych jest prawie podobna do sekwencji „n pojawia się n razy” ( OEIS A002024 ) i można ją uzyskać jako
floor(sqrt(2*n)+.5)
gdzien
jest 0,1,2,3, ... Mnożenie przez2j*pi/3
, gdziej
jest jednostką urojoną, daje pożądane złożone przemieszczenia.Przemieszczenia są kumulowane w celu obliczenia pozycji odpowiadających liczbom całkowitym w spirali. Pierwsza liczba całkowita w spirali, która
1
jest dowolnie umiejscowiona w miejscu1
w płaszczyźnie zespolonej.Na koniec pozycje odpowiadające liczbom innym niż pierwotne są odrzucane, a pozostałe wykreślane są w płaszczyźnie zespolonej.
źródło
.png
pliku, który będzie wyświetlany na stronie internetowej @AlexAplot(1:5)
) i generuje on tekst-grafikę !! matl.tryitonline.net/#code=NTpYRw&input= @AlexA. Jak to jest ??Rysowanie należy wykonać za pomocą
LaTeX / PGF, 527
594bajtów527 bajtów to pełny dokument jak wyżej, tj. Zawierający preambułę i parametr (tutaj 4000, więc ~ 523 bez parametru). Tworzy plik PDF.
Podstawowy pomysł: po prostu narysuj. Wykorzystuje transformację macierzową dla siatki trójkątnej. Jedynym problemem jest to, że transformacja wpływa również na kropki (i je rozciąga). Wybieram więc znaczniki elipsy :) to, co mam na myśli, jest jasne na drugim obrazku (n = 250, 5pkt).
Kolejne zastrzeżenie: może obsłużyć tylko nieco mniej niż 5000 ze względu na maksymalny rozmiar stosu TeXa. Pierwszy obraz jest dla n = 4000. Najwyraźniej można zwiększyć rozmiar stosu , nie próbowałem tego.
Wykorzystuje PGF
isprime()
.Nie golfowany:
źródło
lualatex
lub inny dynamicznie alokujący kompilator powinien pozwolić ci ominąć rozmiar stosu, jeśli dobrze rozumiem odpowiedni komentarz. Więc to nie jest ograniczenie twojej odpowiedzi, tylko większość implementacji, w których ją uruchomisz.Mathematica, 94 bajty
Wynik
źródło
Python, 263 bajty
Będąc nowym w Pythonie, z pewnością jest miejsce na ulepszenia :)
Przykład:
źródło
s=[];X=[];Y=[];i=1;x=0;y=0
dos=X=Y=[];i=1;x=y=0;
x=y=0
.R, 137 bajtów
Używa tylko wbudowanych funkcji, nawet dla liczb pierwszych. Biorąc pod uwagę wektoryzowane podejście zamiast iteracyjne, jest szybki, ale nie może obsłużyć dużych liczb.
Gra w golfa:
Nie golfowany:
Przykład:
źródło