Najwyraźniej tak! W trzech łatwych krokach.
Krok 1
Niech f ( n ) oznacza funkcję zliczania liczb pierwszych (liczba liczb pierwszych mniejsza lub równa n ).
Zdefiniuj sekwencję całkowitą s ( n ) w następujący sposób. Dla każdej dodatniej liczby całkowitej N ,
- Zainicjuj t do n .
- Dopóki t nie jest ani liczbą pierwszą ani 1, zamień t na f ( t ) i iteruj.
- Liczba iteracji to s ( n ).
Proces iteracyjny gwarantuje zakończenie, ponieważ f ( n ) < n dla wszystkich n .
Rozważmy na przykład n = 25. Inicjalizujemy t = 25. Ponieważ nie jest to liczba pierwsza ani 1, obliczamy f (25), które wynosi 9. To staje się nową wartością dla t . To nie jest liczba pierwsza ani 1, więc kontynuujemy: f (9) wynosi 4. Kontynuujemy ponownie: f (4) wynosi 2. Ponieważ jest to liczba pierwsza, zatrzymujemy się tutaj. Zrobiliśmy 3 iteracje (od 25 do 9, następnie do 4, a następnie do 2). Zatem s (25) wynosi 3.
Pierwsze 40 elementów sekwencji są następujące. Sekwencja nie znajduje się w OEIS.
0 0 0 1 0 1 0 2 2 2 0 1 0 2 2 2 0 1 0 3 3 3 0 3 3 3 3 3 0 3 0 1 1 1 1 1 0 2 2 2
Krok 2
Biorąc pod uwagę nieparzystą dodatnią liczbę całkowitą N , zbuduj tablicę N × N (macierz), nawijając skończoną sekwencję s (1), s (2), ..., s ( N 2 ), aby utworzyć kwadratową spiralę na zewnątrz . Na przykład, biorąc pod uwagę N = 5, spirala jest
s(21) s(22) s(23) s(24) s(25)
s(20) s(7) s(8) s(9) s(10)
s(19) s(6) s(1) s(2) s(11)
s(18) s(5) s(4) s(3) s(12)
s(17) s(16) s(15) s(14) s(13)
lub zastępując wartości,
3 3 0 3 3
3 0 2 2 2
0 1 0 0 0
1 0 1 0 1
0 2 2 2 0
Krok 3
Przedstaw tablicę N × N jako obraz za pomocą szarej mapy kolorów lub innej mapy kolorów według własnego gustu. Mapa powinna być stopniowa, aby kolejność liczb odpowiadała wizualnie oczywistej kolejności kolorów. Poniższe przypadki testowe pokazują przykładowe mapy kolorów.
Wyzwanie
Biorąc pod uwagę nieparzystą dodatnią liczbę całkowitą N , wykonaj zdjęcie opisane powyżej.
Zasady
Spirala musi być skierowana na zewnątrz, ale może być zgodna z ruchem wskazówek zegara lub przeciwna do ruchu wskazówek zegara i może zacząć przesuwać się w prawo (jak w powyższym przykładzie), w lewo, w dół lub w górę.
Skale osi poziomej i pionowej nie muszą być takie same. Również etykiety osi, pasek kolorów i podobne elementy są opcjonalne. Dopóki spirala jest wyraźnie widoczna, obraz jest prawidłowy.
Obrazy można wyprowadzać dowolnym standardowym sposobem . W szczególności obraz może być wyświetlany na ekranie lub może zostać utworzony plik graficzny lub może zostać wyprowadzony szereg wartości RGB. Jeśli wyprowadzasz plik lub tablicę, zamieść przykład tego, jak to wygląda po wyświetleniu.
Środki wprowadzania i format są jak zwykle elastyczne . Program lub funkcja może być zapewnione . Standardowe luki są zabronione .
Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
Poniższe zdjęcia (kliknij w pełnej rozdzielczości) odpowiadają kilku wartości N . Zastosowano spiralę, zgodnie z ruchem wskazówek zegara, pierwszą w prawo, jak w powyższym przykładzie. Obrazy ilustrują również kilka prawidłowych map kolorów.
źródło
s(n)
może być wprowadzona do jakiejś funkcji / pakietu kreślącego bez modyfikacji (myślę, żeimshow
w matplotlib mógłby to na przykład poradzić), czy jest to akceptowalna forma wyjściowa?imshow
robi Matlab (i prawdopodobnie Matplotlib)imshow
robi.Odpowiedzi:
Dyalog APL, 94 bajty
zakłada
⎕IO=0
wyjście dla n = 701 (przekonwertowane z .pgm na .png):
źródło
MATLAB -
197185178175184163162148142140 bajtówOgoliłem 12 bajtów, dzięki Anderowi i Andrasowi, i wiele podziękowań dla Luisa za połączenie tych dwóch. Ogolono 16 dzięki Remco, 6 dzięki flawr
Wynik dla
N=301
(F(301)
):Wyjaśnienie:
źródło
Wolfram Language (Mathematica) , 124 bajty
Dzięki Martin Ender za oszczędność 12 bajtów!
Wypróbuj online!
Wygenerowany obraz to:
Formuła zamkniętej formy wartości spiralnej zaczerpnięta bezpośrednio z tej mojej odpowiedzi .
źródło
#/2-.5
zapisuje bajt.p
dopóki jej nie potrzebujesz:...,{y,p=(1-#)/2,-p},{x,p,-p}
MATLAB:
115114110 bajtówJedna linijka (działająca w R2016b + jako funkcja w skrypcie ) 115 bajtów
Umieszczenie funkcji w osobnym pliku, jak sugeruje flawr, i użycie 1 dodatkowego bajtu na regułę dla dodatkowego pliku
W pliku
s.m
64 + 1 bajtów dla kodu + plikuOkno poleceń do zdefiniowania
I
, 45 bajtówŁącznie: 110 bajtów
Używa rekurencji zamiast
while
zapętlania, podobnie jak inne implementacje MATLAB ( gnovice , Adriaan ). Uruchom go jako skrypt (w wersji R2016b lub nowszej), definiuje to funkcję,I
którą można uruchomić w podobny sposóbI(n)
.Wersja strukturalna:
Przykład:
Uwagi:
Próbowałem też uczynić tę
s
funkcję anonimową, co oczywiście znacznie zmniejszyłoby liczbę. Istnieją jednak 2 problemy:Podczas korzystania z anonimowych funkcji trudno jest uniknąć nieskończonej rekurencji, ponieważ MATLAB nie ma potrójnego operatora oferującego warunek przerwania. Powiązanie operatora trójskładnikowego (patrz poniżej) również kosztuje bajty, ponieważ warunek jest potrzebny dwa razy.
Musisz przekazać do siebie anonimową funkcję, jeśli jest rekurencyjna (patrz tutaj ), która dodaje bajty.
Najbliżej tego doszedłem użyłem następujących linii, być może można to zmienić do pracy:
źródło
MATLAB -
126121 * bajtówSpróbowałem bardziej wektoryzowanego podejścia niż Adriaan i udało mi się ogolić więcej bajtów. Oto rozwiązanie jednoliniowe:
A oto ładnie sformatowane rozwiązanie:
* Uwaga: jeśli chcesz zezwolić na metryczny zbiór niepotrzebnych iteracji, możesz zmienić linię
while any(i),
nafor m=v,
i zapisać 5 bajtów.źródło
cumsum
wektoryzacji i unikaniannz(primes(...)
while any(i)
przezfor m=M
. Kogo to obchodzi, jeśli uruchomienie kodu zajmuje wiele godzin :-)n^2
zaszkodzi! ;)Python 3,
299265 bajtówZaoszczędzono 5 bajtów dzięki sugestiom formatowania autorstwa Jonathana Frecha i NoOneIsHere. Usunięto dodatkowe 34 bajty, usuwając definicję funkcji, która została wywołana tylko raz.
Jest to trochę dłużej niż niektóre inne, ponieważ python nie ma polecenia określającego prymityw ani spirali tablicy. Działa jednak stosunkowo szybko, około minuty
n = 700
.Przetestuj za pomocą
źródło
import
i*
.J, 121 bajtów
Definiuje funkcję:
źródło
R, 231 bajtów
Nieco mniej golfa:
Funkcja anonimowa. Dane wyjściowe w oknie graficznym. Skala jest na skali czerwonej, a najciemniejszy odcień równa się 0, a wyraźniejsze odcienie zwiększają wartości.
Wynik dla n = 101:
źródło