Dwie liczby pierwsze są definiowane jako liczby pierwsze bliźniacze, jeśli różnią się o dwa. Na przykład 3 i 5 są liczbami podwójnymi, podobnie jak 29 i 31.
Napisz program, który znajdzie n-tą parę podwójnych liczb pierwszych (gdzie n pochodzi od STDIN) i wydrukuje je na STDOUT, oddzielone przecinkiem i spacją. To jest golf golfowy, więc wygrywa najkrótszy kod.
Przykładowe dane wejściowe:
3
Przykładowe dane wyjściowe:
11, 13
Odpowiedzi:
Haskell 118
Brute-force wszystkie bliźniacze liczby pierwsze i drukuje n- tą parę.
źródło
interact
zamiast tegoputStrLn
możesz pójść jeszcze dalej i sprowadzić to do 105:a#b=all((>0).rem a)[2..a-b];main=interact$(!!)[show n++", "++show(n+2)|n<-[2..],n#1,(n+2)#2].(+)(-1).read
CJam,
2926 bajtówWypróbuj online.
Przykłady
Jak to działa
źródło
Perl,
1018787 znaków, w oparciu o komentarz ascheplera
101 znaków, wcześniejsza odpowiedź
Stosowanie:
Wyjaśnienie
Działanie wyrażenia regularnego innego niż pierwotne wyjaśniono w tym pytaniu SO .
źródło
$n=pop;$r='^1$|^(11+?)\1+$';($t=1x$s)=~$r||"11$t"=~$r||--$n||exit say("$s, ",$s+2)while++$s
C: 113
Przykładowy przebieg:
Dzięki za pomoc Dennisa, Bebe i Alchymist.
źródło
scanf
zamiast argumentów wiersza poleceń. Ponadto nieo=0
jest konieczne, ponieważo
ma charakter globalny.main
może zawierać domyślną zmienną int, inkrementacja,c
ai
pomiędzy przypisaniami i instrukcjami może skrócić kod, przypisaniel
może zostać przeniesione z powrotem do trzeciego bloku pierwszej pętli, więc nie potrzebujesz nawiasów klamrowych i użycie tylko jednego znaku separatora w printf może zdecydowanie uczynić go bardziej kompaktowym.c<=i-1
, co jest po prostu głupie.i
wl
wyrażenia przypisania, ponieważ (nowy) wartościi
służy do ubytkun
. Jakieś wskazówki?CJam - 26
Działa dla liczb pierwszych mniejszych niż 10000; możesz zastąpić
4
wyższym wykładnikiem dla większych liczb (potencjalnie do 10 20 ), ale program będzie działał wolniej i zużyje więcej pamięci.Wypróbuj na http://cjam.aditsu.net/
Wyjaśnienie:
1e4,
tworzy tablicę [0 1 2 ... 9999]{mp},
wybiera tylko liczby pierwsze_2f-
kopiuje tablicę i odejmuje 2 od każdego elementu&
przecina dwie tablice, w ten sposób znajdując niższe liczby pierwsze z każdej pary podwójnych liczb pierwszychqi
odczytuje dane wejściowe i konwertuje na liczbę całkowitą(=
dostosowuje indeksuje i pobiera odpowiadającą (niższą) liczbę pierwszą z tablicy_2+
kopiuje liczbę pierwszą i dodaje 2", "\
wstawia przecinek i spację między dwiema liczbami pierwszychźródło
Mathematica - 63 znaki
Uwagi
Jest to w rzeczywistości dość prosta implementacja. Skrócenie spowodowało prawie brak zaciemnienia.
NextPrime
jest wbudowanym, który znajduje następną liczbę pierwszą po liczbie.NestWhile[NextPrime,#,#2-#1!=2&,2]&
to anonimowa funkcja, która znajduje większą liczbę pierwszą następnej pary liczb pierwszych po liczbie.Nest
stosuje tę anonimową funkcjęn
razy.Print[#-2,", ",#]&
to anonimowa funkcja, która drukuje na standardowe wyjście zgodnie ze specyfikacjami. Niestety samo to zajmuje 18 znaków z 63-znakowego rozwiązania.Przykład
Aktualizacja: Dwa znaki mogą zostać zapisane poprzez ponowne wdrożenie tego rozwiązania CJam . Jednak ten algorytm ogranicza maksymalną wartość
n
. Po prostu zamieńNest...
część naIntersection[#,#-2][[5]]&@Prime@Range[999]
źródło
JavaScript (E6) 92
96Krótszy i zgodny - użyj powłoki spidermonkey do odczytu standardowego wejścia / standardowego zapisu (przecinkiem i spacją). Znajduje 10000. parę 1260989, 1260991 w niecałą minutę na moim komputerze
Może być krótszy przy użyciu
p[n]=o=n
zamiastp.push(o=n)
, tak że tablica p jest rzadka. Ale to jest wolniejsze i i tak nie zamierzam wygrywać w kwestii długości kodu.Aby spróbować w konsoli Firefox:
Nie golfił
Funkcja, która znalazła wszystkie pierwsze m bliźniaków (zwraca największą wartość):
Przykład:
console.log(T(50))
[5, 7, 13, 19, 31, 43, 61, 73, 103, 109, 139, 151, 181, 193, 199, 229, 241, 271, 283, 313, 349, 421, 433, 463, 523, 571, 601, 619, 643, 661, 811, 823, 829, 859, 883, 1021, 1033, 1051, 1063, 1093, 1153, 1231, 1279, 1291, 1303, 1321, 1429, 1453, 1483, 1489]
Tylko ostatni:
Następnie weź te 2 linie i dodaj IO
źródło
J -
49 60 5551 bajtówZdecydowałem się na proste podejście. Funkcja
t
znajduje następną podwójną liczbę pierwszą, podając jako liczbę pierwszą liczbę pierwszą (teraz jest to uwzględnione wf
funkcji). Funkcjaf
znajduje n-tą podwójną liczbę pierwszą. To też jest pierwszy rzeczywisty program, który napisałem w J.Przykłady:
Tylko dla niektórych brwi, miej wersję bez golfa.
Wyjaśnienie:
źródło
C #, 265
źródło
.Count(x=>j%x==0)==2)
->.Count(x=>j%x<1)<3)
P
zamiast,Program
a parametra
zamiastargs
.)
po.Count(...)<3
. Możesz także trochę zaoszczędzić, zmieniającvar i=int.Parse(args[0]);int f=0,c=0;
naint i=int.Parse(args[0]),f=0,c=0;
. Możesz dodatkowo zaoszczędzić, wyodrębniając inicjator z pętli, więcc=0;for(int j=1;
=>c=0,j=1;for(;
.for
pętli oraz użycie w pełni kwalifikowanej nazwy zamiastusing System
:using System.Linq;class P{static void Main(string[]args){int i=int.Parse(args[0]),f=0,c=0,j=1;for(;;j+=2)if(Enumerable.Range(1,j).Count(x=>j%x<1)>2)f=0;else if(f<1)f=j;else{if(++c==i){System.Console.WriteLine(f+", "+j);break;}j-=2;f=0;}}}
238 znaków.Ruby 94
Test online: http://ideone.com/B2wxnG
źródło
Perl,
10095Nie golfowany:
źródło
T-SQL (2008+): 344
Brute force CTE, aby znaleźć liczby pierwsze, funkcja okna, by policzyć n, a następnie łączyć, aby znaleźć bliźniaka. Działa w ciągu sekundy dla wyjść <1000, nieco poniżej minuty dla wyjść <10 000.
Gra w golfa ( tutaj SQLFiddle ):
Czytelny:
źródło
GolfScript 46
Test online: link
Kod z adnotacjami:
źródło
PHP 5.4, 223
Nie mniejszy, ale jeden z php.
źródło
C 309
Przechowuje kolejne liczby pierwsze i zapisuje nieparzyste, a nawet terminy, a następnie sprawdza, czy różnica wynosi dwa.
źródło
for (int i=2;i*i<=k;i++)
R, 91 znaków
Nic szczególnego:
Stosowanie:
źródło
Japt,
2319 bajtów-4 bajty dzięki Shaggy
Uruchom to online
źródło
JavaScript (Node.js), 162 znaków
Odczytuje ze standardowego wejścia, wyjścia na standardowe wyjście, wychodzi „wcześnie” na wejście
<= 0
.Użycie (powyższy skrypt zapisany jako
ntp.js
):źródło
AWK - 129
Plik
fsoe-pairs.awk
:Uruchamianie:
(Pierwszy wiersz po wprowadzeniu polecenia, drugi jest wyprowadzany)
Opiera się to na własnym algorytmie generatora liczb pierwszych, który nazywam „pływającym sitem erastostenów” (dopóki nie znajdę go opisanego gdzie indziej), który przechowuje tylko potrzebną część sita i już obliczone liczby pierwsze.
źródło
Python 2 (75)
Co tu się dzieje?
Najpierw spójrzmy na wyrażenie
all(n%i&~2for i in range(2,n-2))
, które sprawdza, czy(n-2,n)
są parą bliźniaczych liczb pierwszych.Prostsze wyrażenie
all(n%i for i in range(2,n))
po prostu sprawdza, czyn
jest liczbą pierwszą, wypróbowując każdy dzielniki
w zakresie2<=i<=n-1
i sprawdzając, czy wszystkie pozostałe są niezerowe. Toall
sprawdza dokładnie to, ponieważ Python traktuje0
jakFalse
i wszystkie inne liczby jakoTrue
.Teraz obserwuj to
(n-2)%i==0
dokładnie w przypadkun%i==2
dzielnikówi>2
. Tak więc, możemy przeprowadzić kontrolę na pierwszościn
in-2
jednocześnie sprawdzając pozostałości zarówno dla0
i2
. Można to zrobić jakoall(n%i not in [0,2] for i in range(2,n-2))
. Próbujemy dzielników w zakresie2<=i<=n-3
tylko ze względu nan-2
, ale to wystarczan
również od tego czasun-1
in-2
nie możemy być dzielnikami, chyba żen<=4
. Spróbujemy tylkon
od nieparzystej,5
aby uniknąć tej komplikacji i dzielnikai=2
.My golf wyrażenie
n%i not in [0,2]
don%i&~2
pamiętając, że0
jest fałszywa i inne numery sąTrue
. Priorytet operatora(n%i)&(~2)
jest dokładnie tym, czego potrzeba. Uzupełnianie bitów~2
jest...11111101
więc bitoweand
z liczbą zerującą2
wartość binarną miejsca. To daje0
(tj.False
) Tylko0
i2
dokładnie to, czego chcemy.Uff! Teraz mamy, że wyrażenie
all(n%i&~2for i in range(2,n-2))
sprawdza, czyn
jest najwyższą liczbą bliźniaczych liczb pierwszych. Pozostaje iterować nad nimi, dopóki ich nie zobaczymyc
, gdziec
jest wprowadzona liczba. Zaczynamy od5
i odliczamy,2
aby uniknąć problemów z dzielnikami. Zmniejszamy się zac
każdym razem, gdy napotykamy coś,n
co działa, zatrzymując się, kiedyc=0
. Na koniec drukujemy podwójną parę pierwszą, którą kończymy.źródło
T-SQL (2012 +), 255 znaków
Bardziej kompaktowa wyszukiwarka podwójnych liczb pierwszych T-SQL, która również trochę przyspiesza.
Format czytelny dla człowieka:
Podstawowa zasada polega na tym, że używamy wbudowanej tabeli liczb (master..spt_values type = 'p') i aliasu tego z CTE jako czegoś krótkiego. Dodajemy 2, aby wyeliminować problem ciągnięcia 0 lub 1 trywialnych błędów dla naszego zestawu, więc teraz mamy kandydatów na 2,2050.
Z najbardziej wewnętrzne zapytanie otrzymuje wszystkie liczby pierwsze od 2 do 2050, odfiltrowując dowolną liczbę n, która jest podzielna przez liczbę mniejszą niż n. Następnie używamy fajną T-SQL 2012 okienkowy funkcję
lag
, która pozwala nam wyciągnąć poprzedni wynik, więc teraz wyniki oo za aib są liczbami pierwszymiP[n]
iP[n-1]
odpowiednio. Zapytanie R tworzy ciąg wyjściowy i odfiltrowuje niepodzielne liczby pierwsze, a także tworzy numer sekwencyjny dla wyniku, który nazywamy K. Wreszcie ostatnie zapytanie R pozwala nam filtrować i uzyskać Kth liczbę pierwszą przez zmianę jego zmiennej.źródło
Mathematica - 71 bajtów
źródło