„Mrówka główna” jest upartym zwierzęciem, które porusza się po liczbach całkowitych i dzieli je, aż zostaną tylko liczby pierwsze!
Początkowo mamy nieskończoną tablicę A zawierającą wszystkie liczby całkowite> = 2: [2,3,4,5,6,.. ]
Niech p
będzie pozycją mrówki na tablicy. Początkowo p = 0
(tablica jest indeksowana 0)
W każdej turze mrówka porusza się w następujący sposób:
- jeśli
A[p]
jest liczbą pierwszą, mrówka przechodzi do następnej pozycji:p ← p+1
- w przeciwnym razie, jeśli
A[p]
jest liczbą złożoną, niechq
będzie jej mniejszym dzielnikiem> 1. DzielimyA[p]
przezq
i dodajemyq
doA[p-1]
. Mrówka przesuwa się do poprzedniej pozycji:p ← p-1
Oto pierwsze ruchy mrówki:
2 3 4 5 6 7 8 9 ...
^
2 3 4 5 6 7 8 9 ...
^
2 3 4 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 7 3 7 8 9 ...
^
Twój program powinien wyświetlać pozycję mrówki po n
ruchach. (możesz założyć n <= 10000
)
Przypadki testowe:
0 => 0
10 => 6
47 => 9
4734 => 274
10000 => 512
Edytować. możesz również użyć 1-indeksowanych list, dopuszczalne jest wyświetlanie wyników 1, 7, 10, 275, 513 dla powyższego przypadku testowego.
To jest code-golf, więc wygrywa kod z najkrótszym kodem w bajtach.
n
(czy też przypadek złożony mógłby kiedykolwiek przesunąć mrówkę na lewo od inicjału2
).1,7,10,275,513
jeśli podano indeksowanie 1? Czy nadal będą musieli dopasować twoje wyniki.Odpowiedzi:
Alice , 45 bajtów
Wypróbuj online!
Przeważnie prosta implementacja.
n
Czasy zapętlania w Alicji zwykle wykonuje się przez naciśnięcien-1
czasów adresu zwrotnego , a następnie powrót na końcu każdej iteracji za pomocąk
. Ostatnim razem przez pętlęk
instrukcja nie ma dokąd wrócić, a wykonywanie postępuje dalej.Ten program używa tej samej
k
instrukcji, aby zatrzymać wcześnie, gdy liczba jest liczbą pierwszą. W rezultacie końcowa iteracja zawsze przesunie mrówkę w lewo. Aby zrekompensować ten błąd, wykonujemyn+1
iteracje na 1-indeksowej tablicy, co daje dokładnie pożądany rezultat (i daje skrzynkęn=0
za darmo).źródło
Python 2 , 120 bajtów
Wypróbuj online!
Ach, rzadki
for
-else
pętla!else
Klauzula jest wykonywana tylko wtedy, gdyfor
organizm nie wyszła zabreak
. W naszym przypadku oznacza to, że sprawdziliśmy wszystkieq
s i nie znaleźliśmy żadnego z nich do podzieleniap
.źródło
Oktawa ,
109 103 10194 bajtyWypróbuj online!
Ten kod wyświetli pozycję w indeksowaniu 1, więc wyniki dla przypadków testowych to:
Ta wersja korzysta z niektórych optymalizacji Octave, więc nie jest kompatybilna z MATLAB. Poniższy kod jest wersją zgodną z MATLAB.
MATLAB,
130 123 118117 bajtówUżywa indeksowania 1, jak w wersji Octave. Przetestowałem to dla wszystkich przypadków testowych w MATLAB. Jako przykład dane wyjściowe przy 100000 wynoszą 3675 (jednoindeksowanie).
Skomentowana wersja powyższego kodu:
Co ciekawe, są to pozycje mrówek w funkcji liczby iteracji dla pierwszych 10000 wartości n.
Wydaje się prawdopodobne, że Mrówka prawdopodobnie dąży do nieskończoności, ale kto wie, wygląd może być mylący.
for
zamiastwhile
i usuwaniem nawiasów zif
- Dzięki @Giuseppe\=
i+=
operacji - Dzięki @Giuseppei++
ii--
- Dzięki @LuisMendoźródło
end
dopasować sygnaturę funkcjiend
jest opcjonalny.end
jest również opcjonalny w Octave. Jest to potrzebne tylko dlatego, że masz kod po funkcjiJavaScript (ES6), 91 bajtów
Próbny
Uwaga: Może być konieczne zwiększenie domyślnego rozmiaru stosu silnika, aby przeszedł on wszystkie przypadki testowe.
Wypróbuj online!
źródło
Haskell ,
10810694 bajtówWypróbuj online! Przykładowe użycie:
([0]#[2..]!!) 10
plony6
(indeksowane 0).Funkcja
#
działa na dwóch listach, odwróconym przodzie tablicy[p-1, p-2, ..., 1]
i nieskończonej reszcie tablicy[p, p+1, p+2, ...]
. Konstruuje nieskończoną listę pozycji, z którejn
zwracana jest pozycja th na podstawie danych wejściowychn
.Wzór
((a:b)#(p:q))
wiążep
się z wartością bieżącej pozycji mrówki ia
wartością poprzedniej pozycji.b
jest prefiks tablicy od pozycji 1 dop-2
iq
nieskończony reszty od pozycjip+1
.Budujemy listę wywołań rekurencyjnych w następujący sposób: Patrzymy na każdy dzielnik
d
zp
(który jest większy niż jeden i mniejszy niżp
) w kolejności rosnącej i dodaćb#(a+d:div p d:q)
do każdej z nich, to bieżąca wartośćp
dzieli się przezd
i mrówka porusza jeden krok w lewo, gdzied
jest dodawanya
. Następnie dołączamy(p:a:b)#q
na końcu tej listy, co oznacza, że mrówka przesuwa się o krok w prawo.Następnie pobieramy pierwsze z tych rekurencyjnych wywołań z listy i przygotowujemy bieżącą pozycję, która pokrywa się z długością listy prefiksów
b
. Ponieważ dzielniki są w porządku rosnącym, wybranie pierwszego z listy wywołań rekurencyjnych gwarantuje, że użyjemy najmniejszego. Ponadto, ponieważ(p:a:b)#q
jest dodawany na końcu listy, jest wybierany tylko wtedy, gdy nie ma dzielników, ap
zatem jest liczbą pierwszą.Edycja:
-2 bajty, przełączając listę funkcji z malejącej na rosnącą.
-12 bajtów dzięki pomysłowi Zgarba na indeksowanie do nieskończonej listy zamiast obsługi licznika i przejście na indeksowanie 0.
źródło
TI-BASIC,
10810310298 bajtówWejścia i wyjścia są przechowywane w
Ans
. Dane wyjściowe są indeksowane 1.źródło
fPart(∟A(P)/F:
zfPart(F¹∟A(P:
. To samo w następnym wierszu.not(fPart(7⁻¹7
wynosi 0, alenot(fPart(7/7
wynosi 1.MATL , 41 bajtów
Wyjście jest oparte na 1. Limit czasu programu dla ostatniego przypadku testowego w tłumaczu online.
Wypróbuj online!
Wyjaśnienie
Program stosuje procedurę opisaną w wyzwaniu. W tym celu niezwykle intensywnie wykorzystuje ręczne i automatyczne schowka MATL.
Najmniejszy dzielnik jest uzyskiwany jako pierwszy wpis w rozkładzie czynnika pierwszego.
„Podziału” zmiana odbywa się poprzez zastępowanie odpowiedniego wpisu tablicy A . „Dodaj” zmiana odbywa się poprzez element mądry dodanie do A w tablicy, który zawiera same zera, z wyjątkiem w pożądanym położeniu.
źródło
Pyth - 44 bajty
Proste wdrożenie proceduralne.
Pakiet testowy .
źródło
PARI / GP, 87 bajtów
Dość oczywiste (nie tak golfowo). Jeśli nie policzysz
f(n)=
części, to jest 82 bajtów. Możesz także zacząć odn->
(85 bajtów).Jest to język indeksowany 1.
Edycja: Modyfikacja
illustrate(n,m)=A=[2..m+1];p=1;for(i=1,n,for(j=1,m,printf("%5s",if(j==p,Str(">",A[j],"<"),Str(A[j]," "))));print();q=factor(A[p])[1,1];if(A[p]!=q,A[p]/=q;p--;A[p]+=q,p++))
wydrukuje ilustrację spaceru mrówki (biorąc pod uwagę wystarczająco szeroki terminal). Na przykładillustrate(150,25)
da pierwsze 150 kroków na 25 kolumnach, takich jak to:źródło
Python 2 ,
142127 bajtówWypróbuj online!
źródło
P(n)
n<=4
Mathematica,
118103 bajtyWypróbuj online!
Martin Ender zapisał 15 bajtów
źródło
Divisors
, możesz użyć notacji infix dlaDo
i możesz po prostu wrócićt
zamiastt-1
(wynik na podstawie 1).Python 3 ,
158149133 bajtówJest to prosta implementacja proceduralna z jednym lub dwoma dziwactwami, aby upewnić się, że kod działa dla wszystkich przypadków testowych. Używam,
[*range(2,n+9)]
aby upewnić się, że A jest wystarczająco duże (z wyjątkiemn<3
, żen+9
jest więcej niż wystarczające).else
Klauzula dzieli staryA[p]
przezd
, ubytkówp
, a następnie dodajed
się nowyA[p]
, który jest zdecydowanie złe praktyki kodowania. W przeciwnym razie całkiem proste. Zapraszamy do gry w golfa!Edycja: -9 bajtów bez
sympy
podziękowań dla Halvarda Hummela. -14 bajtów od Felipe Nardi Batista, -6 bajtów z niektórych wskazówek z odpowiedzi Jonathana Frecha na Python 2Wypróbuj online!
źródło
if d-m:A[p]...
ielse:p+=1
by uratować bajtelse
oświadczeniaelse
instrukcji nie ma różnicy w bajtach w stosunku do wersji funkcjiPHP, 102 + 1 bajtów
Uruchom jako potok z
-R
lub spróbuj online .Puste wyjście dla danych wejściowych
0
; wstaw+
poecho
literał0
lub użyj tej 1-indeksowanej wersji (103 + 1 bajtów):
źródło
R , 123 bajty
Prosta implementacja. Jest on dostarczany jako funkcja, która przyjmuje liczbę ruchów jako dane wejściowe i zwraca pozycję p.
Zapętla sekwencję i przesuwa wskaźnik do przodu i do tyłu zgodnie z zasadami. Dane wyjściowe są oparte na 0.
Uwaga: aby znaleźć najmniejszy czynnik pierwszy liczby x, oblicza moduł x względem wszystkich liczb całkowitych od 0 do x. Następnie wyodrębnia liczby o module równym 0, które zawsze wynoszą [0,1, ..., x]. Jeśli trzecią taką liczbą nie jest x, to jest to najmniejszy czynnik pierwszy x.
Wypróbuj online!
źródło
C (gcc),
152148 bajtówZminimalizowane
Sformułowany z kilkoma komentarzami
Główna funkcja do testowania
Za pokazanie każdego kroku
Deklaracja wyświetlania () wewnątrz f ()
Wyświetlanie połączeń ()
Wyświetlanie połączeń ()
źródło
Clojure, 185 bajtów
Otóż edytowanie „stanu” nie jest idealne w Clojure. Musisz zwiększyć wykładnik w przypadku większych nakładów.
źródło
loop
? Bez tego powinieneś być w stanie stracić kilka bajtów.first
rzecz nasome
instrukcję.recur
dwa razy, po jednym dla każdejif-let
gałęzi. Zostanie również(dec i)
skopiowany.some
potrzebuje predykatu, mógłbym użyć,+
ponieważ mamy do czynienia z liczbami, ale jest to jeden znak dłuższy niżfirst
. CMIIWJava 8,
138135 bajtówWyjaśnienie:
Wypróbuj tutaj.
źródło
Clojure,
198193191 bajtówTo wymaga poważnego golfa ...
Golf 1 : Zapisano 5 bajtów, zmieniając
(first(filter ...))
na(some ...)
Golf 2 : Zapisano 2 bajty, zmieniając
(zero? ...)
na(= ... 0)
Stosowanie:
Nieskluczony kod:
źródło