Addytywne liczby pierwsze spośród pierwszych x liczb pierwszych

16

Definicja addytywnych liczb pierwszych:

  • Liczby, które mają dokładnie 2 dzielniki są nazywane Prime liczb.

  • Liczby pierwsze, a ich suma cyfr jest również liczbą pierwszą, nazywamy liczbami dodatkowymi


Zadanie:

Biorąc pod uwagę liczbę całkowitą x, należy obliczyć wszystkie dodatkowe liczby pierwsze spośród pierwszych xliczb pierwszych, z 2uwzględnieniem zarówno pierwszej liczby pierwszej, jak i dodatkowej liczby pierwszej. Liczby są reprezentowane w podstawie 10.

Zasady:

  • Wynik składa się ze wszystkich liczb pierwszych addytywnych spośród pierwszych xliczb pierwszych
  • 0 < x < 151, dla tego wyzwania, dla celów funkcjonalnych
  • Ponieważ wszystkie liczby dodatkowe są liczbami całkowitymi, ułamki dziesiętne są niedozwolone (np .: powinieneś wyprowadzać 2, a nie 2.0) i nie mogą być wyświetlane jako ułamek.

Przykłady:

10 -> 2 3 5 7 11 23 29

Wyjaśnienie:

Pierwsze 10 liczb pierwszych jest 2 3 5 7 11 13 17 19 23 29i 2 3 5 7 11 23 29ma tylko ich sumę liczb pierwszych liczb, odpowiednio 2,3,5,7,2,5,11, więc są to liczby pierwsze addytywne

Po wyjaśnieniu od example 1innych przypadków testowych mogą być:

2 -> 2 3

25 -> 2 3 5 7 11 23 29 41 43 47 61 67 83 89

7 -> 2 3 5 7 11

Tabela liderów:


UWAGA: Przeczytaj nowo edytowaną regułę 1, wprowadza ona nieznacznie zmiany w formacie wyjściowym


Twój kod powinien być możliwie jak najkrótszy, ponieważ jest to , więc wygrywa najkrótsza odpowiedź w bajtach. Powodzenia!

Pan Xcoder
źródło
W porządku. Polecam jednak czekać około 24 godzin, ponieważ za każdym razem, gdy zaakceptujesz odpowiedź, otrzymają 15 powtórzeń, ale tracą ją, gdy nie akceptujesz. Czasami frustrujące jest jazda na rollercoasterze i ciągłe gubienie i zdobywanie przedstawicieli.
Rɪᴋᴇʀ

Odpowiedzi:

8

Pyke, 9 7 bajtów

~p>#Yss

Wypróbuj online!

Pojedynczy bajt is_primezostał przesunięty dopiero 3 godziny temu. Github commit .

~p      -    All the prime numbers
  >     -   first input of them
   #Yss -  filter(^)
    Y   -     digits(^)
     s  -    sum(^)
      s -   is_prime(^)
niebieski
źródło
3
Czy właśnie edytowałeś swój język, aby sprostać temu wyzwaniu? : D
Džuris,
więc ... soznacza is_prime na liczbach i suma na listach?
Conor O'Brien
@ ConorO'Brien tak, przeciążam go dla list i liczb całkowitych
Blue
@ Džuris nie, miałem na myśli przez jakiś czas, ponieważ nie miałem ani jednego węzła do sprawdzania liczb pierwszych, tylko rozkładając na liczby pierwsze i dzielniki. Wcześniej musiałbym to zrobić, _Pczyli o 1 bajt dłużej w tym przypadku
Blue
1
nowy pretendent do „najmłodszej funkcji językowej, aby wygrać wyzwanie”? pod drutem przez ~ 2 godziny?
Sparr,
8

Python 2, 124 118 bajtów

Z pomocą Riker:

n,f,P=input(),filter,lambda n:all(n%i for i in range(2,n))
f(lambda x:P(sum(map(int,`x`)))&P(x),f(P,range(2,n*n))[:n])

Oryginalny:

n,o,c,P=input(),0,2,lambda n:all(n%i for i in range(2,n))
while o<n:
 o+=P(c)
 if P(sum(map(int,`c`)))and P(c):print c
 c+=1

Sprawdzanie pierwszeństwa w Pythonie nie jest zabawne.

Daniel
źródło
I (czytaj: mam conora do napisania fajnego kodu J dla mnie) przetestowałem to z 9n, nie działa. : / n ** 2 działa, ale kosztuje 1 bajt.
Rɪᴋᴇʀ
Spróbuj n*nzan**2
Conor O'Brien
8

Röda , 136 135 bajtów

f n{P=[2]S=[2]seq 3,863|{|i|{P|{P+=i;s=0;((""..i)/"")|parseInteger _|s+=_;S+=i if[s in P and not(i in S)]}if{|p|[i%p>0]}_}if[#P<n]}_;S}

Wypróbuj online!

Jest to funkcja zwracająca wymagane liczby dodatkowe.

Użycie: main { f(25) | print ap for ap }Kod używa wersji 0.12, która znajduje się w oddziale roda-0.12.

Nie golfowany:

function f(n) {
    primes := [2]
    ultraprimes := [2]
    seq(3, 863) | for i do
        break if [ #primes = n ]
        if [ i%p != 0 ] for p in primes do
            primes += i
            sum := 0
            ((""..i)/"") | parseInteger _ | sum += digit for digit
            ultraprimes += i if [ sum in primes and not (i in ultraprimes) ]
        done
    done
    ultraprimes
}
fergusq
źródło
1
Fajny język! Zrobiłeś to już dawno, jak to wygląda? 10/10, wygląda całkiem fajnie.
Rɪᴋᴇʀ
Czysty język! Jak uruchamiasz program?
Kritixi Lithos
Właśnie miałem zapytać o to samo. Chociaż przejrzałem dokumentację, nie mogę w ogóle uruchomić ani skompilować źródła. Jakie jest twoje podejście?
Pan Xcoder,
@KritixiLithos @ Xcoder123 Wymaga Java 8 i Gradle. Wersja, której używam w tej odpowiedzi, to 0.12 (we własnym oddziale). Repozytorium musi być klonowane rekurencyjnie. Aby zrobić działający słoik, wywołaj gradle fatJar. Czy podczas kompilacji występują jakieś błędy?
fergusq
@fergusq Bieganie gradle fatJarnie wydaje się tworzyć dla mnie słoika
Kritixi Lithos
5

Perl 6 , 53 bajtów

{grep *.comb.sum.is-prime,grep(*.is-prime,0..*)[^$_]}

Spróbuj

Rozszerzony:

{
  grep
    *.comb.sum.is-prime, # find the ultra primes from:
    grep(
      *.is-prime,        # find the primes
      0..*               # from all integers
    )[ ^$_ ]             # grab only the first x primes
}

Jeśli to wyzwanie zostanie zmienione, abyś wziął pierwsze x ultraprime, można to skrócić do sprawiedliwego

{grep({($_&.comb.sum).is-prime},0..*)[^$_]}
Brad Gilbert b2gills
źródło
5

Python 2 , 96 87 bajtów

p=-input(),0;m=k=1
while sum(p):
 m*=k*k;k+=1;p+=m%k,
 if m%k*p[int(`k`,36)%35]:print k

Dzięki @xnor za grę w golfa przy 9 bajtach!

Wypróbuj online!

Dennis
źródło
Wygląda na to, że użycie listy zmiennych wskaźnikowych jest krótsze.
xnor
Suma cyfr może być wykonana krócej, jak jest int(`k`,36)%35. Wszystkie dane wejściowe będą na tyle małe, że to wystarczy.
xnor
Łał! Nie jestem pewien, jak myślałem o boolowskim dykcie, ale nie o krotce boolowskiej (z perspektywy czasu 20/20), ale sum(p)i int(`k`,36)%35są czymś innym ... Dzięki!
Dennis
5

Mathematica, 61 47 bajtów

Prime@Range@#~Select~PrimeQ@*Tr@*IntegerDigits&
Martin Ender
źródło
Niezupełnie zaznajomiony ze składnią stenografii Mathematiki - co to jest @*? *Nie wygląda to w odpowiednim miejscu, aby być mnożenia?
numbermaniac
3
@numbermaniac to kompozycja funkcji. f@*gjest zasadniczo f@g@##&.
Martin Ender,
4

Galareta , 10 bajtów

ÆNDS$€ĖÆPM

Wypróbuj online!

W jaki sposób?

Nieco inne podejście ...

ÆNDS$€ĖÆPM - Main link: n (>0)           e.g. 10
ÆN         - nth prime number                 29
     €     - for each in range(1,nth prime)   [1,    2,    3,   ..., 27,    28,     29]
    $      - last two links as a monad
  D        -     decimal digit list          [[1],  [2],  [3],  ...,[2,7], [2,8],  [2,9]]
   S       -     sum                          [1,    2,    3,   ..., 9,     10,     11]
      Ė    - enumerate                       [[1,1],[2,2],[3,3],...,[9,27],[10,28],[11,29]]
       ÆP  - is prime? (vectorises)          [[0,0],[1,1],[1,1],...,[0,1], [0,0],  [1,1]]
         M - indices of maximal elements     [       2,    3,   ...,                29]
Jonathan Allan
źródło
3
Niezłe wykorzystanie Ė.
Dennis
3

Galaretka , 11 bajtów

ÆN€DS$ÆP$Ðf

Wypróbuj online!

Wyjaśnienie:

ÆN € DS $ ÆP $ Ðf Główny link (argumenty: z)
ÆN € Wygeneruj pierwsze liczby pierwsze z.
   DS $ Weź cyfrową sumę.
      ÆP Sprawdź, czy jest pierwsza.
        $ Dołącz do dwóch ostatnich linków i stwórz monadę.
         Keepf Zachowaj tylko elementy, które spełniają powyższe kryterium.

Zostałem rozzłoszczony.

Erik the Outgolfer
źródło
2

MATL, 15 13 bajtów

2 bajty zapisane dzięki @Luis

:Yq"@V!UsZp?@

Wypróbuj w MATL Online

Wyjaśnienie

        % Implicitly grab input as a number (N)
:       % Create an array [1...N]
Yq      % Get the k-th prime for each element k in that array
"       % For each element in this list
  @     % Get the current element
  V!U   % Break it into digits
  s     % Sum up the digits
  Zp    % Determine if this is a prime number
  ?@    % If it is, push the value to the stack
        % Implicit end of for loop and implicit display of the stack
Suever
źródło
@LuisMendo Ah! Wiedziałem, że istnieje sposób na skrócenie tej pierwszej części. Dzięki
Suever
1

Bash + coreutils, 97 bajtów

p()(factor $1|wc -w)
for((;++n,c<$1;)){((`p $n`-2||(c++,`p $[n%10+n/10%10+n/100]`-2)))||echo $n;}

Wypróbuj online!

Mitchell Spector
źródło
1

Ohm , 10 bajtów (CP437)

@▓_π;░_}Σp

Byłoby to znacznie krótsze, gdybym miał wektoryzację lub komponent dla pierwszych N liczb pierwszych, ale niestety, nie zrobiłem tego wyzwania (ale teraz !).

Wyjaśnienie:

@▓_π;░_}Σp    Main wire, arguments: a

@▓  ;         Map...over the range (1..n)
  _π            nth prime
     ░        Select from ToS where...
      _}Σ       The sum of all digits
         p      is prime
Nick Clifford
źródło
1

PowerShell , 120 bajtów

for($n=$args[0];$n){for(;'1'*++$i-notmatch($s='^(?!(..+)\1+$)..')){}if('1'*([char[]]"$i"-join'+'|iex)-match$s){$i};$n--}

Wypróbuj online!

Pierwsze sprawdzanie w PowerShell jest do bani.

Zewnętrzna forpętla przechodzi od wejścia $ndo 0. W wewnętrznej pętli, używamy doskonałą generator na $i, a następnie sprawdzić ifcyfrę sumy ( -join'+'|iex) jest także głównym. Jeśli tak, uruchamiamy $irurociąg. W obu przypadkach zmniejszamy się, $n--a zewnętrzna forpętla trwa. Wynikowe $is są zbierane z potoku i niejawne Write-Outputdzieje się po zakończeniu programu.

AdmBorkBork
źródło
1

Bash + narzędzia GNU + pakiet bsd-games, 69

primes 2|sed -rn 'h;s/./ + &/g;s/.*/expr &|factor/e;/\w\s/!{x;p};'$1q

Wypróbuj online .

Cyfrowa trauma
źródło
0

MATL , 13 bajtów

:YqtFYA!XsZp)

Wypróbuj w MATL Online!

Wyjaśnienie

:      % Range [1 2 ... n], where n is implicit input
Yq     % Array of first n prime numbers
t      % Duplicate
FYA    % Convert to decimal digits. Gives a matrix, where each original 
       % number corresponds to a row. Left-pads with zeros if needed
!Xs    % Sum of rows
Zp     % Is prime? (element-wise)
)      % Use as logical index into the array of the first n prime numbers
       % Implicitly display
Luis Mendo
źródło