Twoim zadaniem, jeśli zdecydujesz się go zaakceptować, jest napisanie programu / funkcji, która przyjmuje liczbę całkowitą N jako dane wejściowe. Program / funkcja powinna wypisać / zwrócić listę pierwszych N liczb pierwszych. Ale oto haczyk: nie wolno używać znaków pierwszych w kodzie. Znak główny to znak, którego punkt kodu Unicode jest liczbą pierwszą. W zakresie ASCII do wydruku są to:
%)+/5;=CGIOSYaegkmq
Ale reguła ma również zastosowanie do znaków spoza ASCII, jeśli Twój kod ich używa.
- Poprawnym wejściem jest liczba całkowita N, gdzie 0 <N <= T , gdzie można wybrać T , ale musi ona być większa lub równa 10000. T nie musi być skończone.
- W przypadku niepoprawnych danych wejściowych (wartości nie będące liczbami całkowitymi, liczby całkowite poza zakresem) wyrzuć wyjątek lub wyślij / wyślij nic / null.
- Liczba całkowita z wiodącymi / końcowymi białymi znakami wejściowymi jest uważana za niepoprawną.
- Liczba całkowita ze
+
znakiem jako znak wejściowy jest uważana za niepoprawną. - Liczba całkowita z wiodącymi zerami na wejściu jest uważana za prawidłową.
- Jeśli Twój język pozwala na przekazanie już przeanalizowanej liczby całkowitej jako danych wejściowych, powyższe reguły analizy (z wyjątkiem zakresu 1) nie mają zastosowania, ponieważ int jest już przeanalizowany.
- Dane wejściowe zawsze mają wartość base-10.
- Korzystanie z wbudowanych generatorów liczb pierwszych i testerów pierwotności (w tym funkcji faktoryzacji liczb pierwszych) jest niedozwolone.
- Ograniczenie źródła jest nakładane na znaki Unicode, ale liczenie bajtów na wynik może być w innym kodowaniu, jeśli chcesz.
- Dane wyjściowe mogą zawierać pojedynczy znak nowej linii, ale nie jest to wymagane.
- Jeśli wypiszesz / zwrócisz listę liczb pierwszych jako ciąg znaków, to każda liczba pierwsza musi być oddzielona jednym lub wieloma niecyfrowymi znakami. Możesz wybrać używany ogranicznik.
- Jest to wyzwanie dla golfa , wygrywa najkrótszy kod w bajtach.
Stos Snippet, aby zweryfikować kod
Możesz użyć poniższego fragmentu stosu, aby sprawdzić, czy Twój kod nie zawiera znaków pierwszych:
var primes=[],max=10000;for(var i=2;i<=max;i++){primes.push(i);}for(var N=2;N<Math.sqrt(max);N++){if(primes.indexOf(N)===-1){continue;}primes=primes.filter(function (x){return x===N||x%N!==0;});}function setText(elem,text){var z=('innerText' in elem)? 'innerText' : 'textContent';elem[z]=text;}function verify(inputCode,resultSpan){var invalidChars=[];var success=true;for(var i=0;i<inputCode.length;i++){var cc = inputCode.charCodeAt(i);if (cc>max){setText(resultSpan,"Uh oh! The char code was bigger than the max. prime number calculated by the snippet.");success = false;break;}if (primes.indexOf(cc)!==-1){invalidChars.push(inputCode[i]);}}if (invalidChars.length===0&&success){setText(resultSpan, "Valid code!");}else if(success) { var uniqueInvalidChars = invalidChars.filter(function (x, i, self){return self.indexOf(x)===i;});setText(resultSpan, "Invalid code! Invalid chars: " + uniqueInvalidChars.join("")); }}document.getElementById("verifyBtn").onclick=function(e){e=e||window.event;e.preventDefault();var code=document.getElementById("codeTxt").value;verify(code,document.getElementById("result"));};
Enter your code snippet here:<br /><textarea id="codeTxt" rows="5" cols="70"></textarea><br /><button id="verifyBtn">Verify</button><br /><span id="result"></span>
code-golf
restricted-source
primes
ProgramFOX
źródło
źródło
;
zdarza się, że jest zbanowany ...+
, rozczarowanie wymaga ręcznego ich wyrzucenia.Odpowiedzi:
CJam,
191830343319172120 bajtówWypróbuj online.
Jest to prawdopodobnie jeden z najbardziej okropnie nieefektywnych algorytmów, jakie kiedykolwiek wdrożyłem. Ale zrobiłem to dla wielkości!
Moja odpowiedź składa się z bloku kodu, który działa jak anonimowa funkcja w CJam. Uruchom go z liczbą całkowitą bezpośrednio poprzedzającą go na stosie, a wynikowa lista zostanie zrzucona na stos. Górną granicę na wejściu traktuję jako nieskończoną, więc nie muszę jej sprawdzać.
Mój algorytm zaczyna się od podniesienia 3 do
input
tej potęgi, co gwarantuje, że da liczbę większą niżinput
-ta liczba pierwsza, jeśli dane wejściowe są prawidłowe. Następnie generowana jest lista liczb całkowitych od 2 do tej liczby minus jeden, która jest wystarczająco dużym pokosem, aby pomieścić wszystkie pożądane liczby pierwsze. Aby pozbyć się liczb zespolonych ... westchnienie ... tworzymy listę każdego produktu parami, który powinien wygenerować wszystkie liczby zespolone od 4 do jakiejś głupiej dużej wartości, wystarczająco dużej dla naszych celów. Następnie wystarczy usunąć każdy element z oryginalnej listy, która znajduje się na tej liście złożonej, i przyciąć go do pierwszegoinput
elementów i połączyć elementy znakiem nowej linii.Algorytm powinien działać dla każdego wejścia. Jednak to, czy tłumacz / komputer ma wystarczającą ilość pamięci lub czasu, to zupełnie inne pytanie, ponieważ wymagania dotyczące czasu i miejsca są wykładnicze w stosunku do danych wejściowych. Jeśli więc wkład jest większy niż około 5 dla tłumacza online lub około 8 dla tłumacza offline, wówczas odpowiedź na to pytanie jest prawdopodobnie nie.
źródło
S*
?S
jest główną postacią?Jawa. 474 bajty
Pobiera dane wejściowe za pomocą argumentu funkcji, dane wyjściowe przez zgłoszony wyjątek.
Zębaty:
Usunięte znaki ucieczki:
Wyjaśnienie:
Moje oryginalne rozwiązanie wykorzystało
return
oświadczenie. Po zadaniu tego pytania na StackOverflow, regettman był na tyle miły, że zapewnił sposób wyjścia / zwrotu bez użycia pierwszych liter.Jak zwykle sugestie są mile widziane :)
źródło
Ruby, 74
Wyjaśnienie:
*o
inicjuje pustą tablicę wyjściową. dopóki nie będzie zawierałn
przedmiotów, znajdziemy najmniejszą liczbę> = 2, która nie dzieli obecnie żadnego elementuo
, a następnie dodajemy goo
. Aby sprawdzić podział, chłopaki. Wszyscy dobrzy operatorzy są niedozwoleni i nawet nie mogę z nich korzystaćdivmod
. Najlepsze, co mogłem zobaczyć, to użyćx.div y
, która bierze x podzielone przez y i zaokrągla w dół, a następnie pomnoży to ponownie przez y. Jeśli jest równy x, nie było zaokrąglenia, więc y dzieli x.1.>x.^
jest testem równości, sprawdzającym, czy wynik xor wynosi 0..
Przed każdym operatorem jest to, że nie można mieszać.
wywołań operatora wolnych od nawiasów i wywołań metod bez nawiasów.Edycja: Myślę, że specyfikacje sprawdzania zasięgu zostały dodane po tym, jak to opublikowałem. Do spełnienia wymaga 79 znaków:
źródło
CJam,
383730 bajtówWypróbuj tutaj
Myślę, że powinno to być zgodne ze wszystkimi zasadami i działa dla każdego nieujemnego N (tj. T jest nieskończony). Jest to jednak okropnie nieefektywne, więc nie próbuj tego w przypadku dużych liczb.
Jest to blok - najbliższy funkcji (nienazwanej) - która oczekuje liczby całkowitej na stosie, drukuje wszystkie liczby pierwsze i pozostawia stos bez jego danych wejściowych. W przypadku wszystkich nieprawidłowych danych wejściowych spowoduje to wyświetlenie błędu lub nic nie wydrukuje.
Większość kodu to sprawdzanie poprawności danych wejściowych, a następnie sito Eratostenesa. Musiałem tylko obejść ograniczenie wejściowe w 3 miejscach:
)
jest przyrostem w CJam. Potrzebowałem tego raz, ale mogłem go zastąpić~
(uzupełnieniem bitowym), ponieważ i tak później kwadrowałem liczby.%
jest modulo. Używam37c~
zamiast tego, który najpierw tworzy postać,%
a następnie ewaluuje. To sprawia, że kod jest znacznie wolniejszy.;
wyskakuje i odrzuca element ze stosu. Muszę to zrobić na końcu. Zamiast tego używam,'<(~
który popycha postać<
, zmniejsza ją i ewaluuje.źródło
Bash + coreutils, 227 bajtów
To było dość trudne. Niektóre rzeczy, na które wpadłem:
while
iuntil
) jest bezużytecznych, ponieważ najbardziej się zbliżają,done
co jest słowem kluczowym powłoki i nie może być wynikiem zmiennego rozszerzenia (chyba żeeval
zostanie użyte, ale to też nie działa). Jedyną możliwą do użycia pętlą jestfor
/,in
która pozwala{
/}
zamiastdo
/done
.for (( ; ; ))
również nie nadaje się do użytku.=
jest obecnie niedostępny, dlatego potrzebujemy innego sposobu przypisywania zmiennych.printf -v
jest do tego dobry.jot
generuje listę potencjalnych czynników w wewnętrznej pętli. Jeśli potencjalny czynnik dzieli potencjalną liczbę pierwszą, to nie jest ona liczbą pierwszą i zaczynamy wcześniebreak
jest wbudowana powłoka, a nie słowo kluczowe, więc może zostać wygenerowana w wyniku rozszerzenia.dc
konwertuje liczbę podstawową 13 na bajteak
./
lub%
powłokowych operatorów arytmetycznych. Jest to zlecane operatorowidc
s~
, który wypycha iloraz i resztę na stos.-lt
- mniej niż - jest jedynym użytecznym operatorem porównywania powłok.echo
nie ma zastosowania dla danych wyjściowych.printf
działa tak długo, jak unikamy%
Właściwe sprawdzenie poprawności danych wejściowych jest trochę uciążliwe. Nic nie zwraca w przypadku nieprawidłowego wejścia.
Wydajność:
źródło
Haskell, 90 bajtów
Jest to anonimowa funkcja, która przyjmuje na
n
wejściu liczbę całkowitą .Jak to działa:
[p|p<-[2..],not$or[b>p-1&&b-1<p|b<-[u*v|u<-[2..p-1],v<-[2..p-1]]]]
(pierwszy przykład jednowierszowych liczb pierwszych na wiki Haskell, ale zelem
zastąpioną funkcją) tworzy nieskończoną listę liczb pierwszych.zip
z liczbami od1
do,n
aby utworzyć listę(prime, seq. number)
par. Usuń sekw. znowu numer. Wynikiem jest lista liczb pierwszychn
.źródło
Rdza, 64897 bajtów
(kod został wycięty z powodu limitu znaków, pełne rozwiązanie tutaj )
Następujące funkcje rdzy stają się niedostępne z powodu podstawowego ograniczenia:
Czego możesz technicznie użyć:
Po prostu nie mogłem nic skompletować za pomocą tych narzędzi. Przepraszam. Pozostało tylko pełne pierwsze 10000 liczb pierwszych, oczyszczonych z 5. Przynajmniej możesz go pokroić i mieć prawidłowe rozwiązanie, w najściślejszym możliwym sensie.
Bardzo chciałbym, aby eksperci od nurkowania na tarnecie Turinga (lub na Rust!) Powiedzieli mi, czy mogłem zrobić coś lepszego!
źródło
GNU APL,
75 68 67 65 59 5655 znaków⎕IO
musi być1
.Wróciłem w tym miesiącu później, zdając sobie sprawę, że mam dodatkową przestrzeń!
źródło
Pyth - 12 bajtów
Używa funkcji faktoryzacji liczby pierwszej Pytha, aby sprawdzić, czy liczba # jest liczbą pierwszą. Wykorzystuje
!tPT
sztuczkę zasugerowaną mi przy mojej odpowiedzi dla liczb pierwszych poniżej miliona problemów.Ponieważ filtr działa tylko dla liczb pierwszych poniżej n, a nie dla pierwszego n, po prostu sprawdziłem odwrotność pi (x) dla 10 000 i otrzymałem 104 000, więc używam liczb pierwszych poniżej 10 under i otrzymuję pierwsze n. To faktycznie nie biegać, więc należy przetestować zastępując
^T6
ze^T3
i ograniczyć n do poniżej 1000. Wejście ze standardowego wejścia i wyjścia na standardowe wyjście.źródło