Powtarzane liczby pierwsze

13

Kolejna sekwencja, kolejne wyzwanie. *

Definicja

Doskonałym pjest w tej sekwencji, nazwijmy to A, MFF dla każdej cyfry dw p„s ekspansji dziesiętnych, zamienić dz dkopiami di uzyskaną liczbą całkowitą jest nadal podstawowym; zera są niedozwolone.

Na przykład 11jest trywialnie w tej sekwencji (nawiasem mówiąc, jest to pierwsza liczba). Następny w kolejności jest 31, ponieważ 3331jest także liczbą pierwszą; Następnie 53, ponieważ 55555333to również pierwsza, i tak dalej.

Wyzwanie

Biorąc pod uwagę dane wejściowe n, return A(n), tj. nTh element w tej sekwencji.

Przykłady

Oto pierwsze 20 warunków na początek. To jest A057628 w OEIS.

11, 31, 53, 131, 149, 223, 283, 311, 313, 331, 397, 463, 641, 691, 937, 941, 1439, 1511, 1741, 1871

To oznacza A(0) = 11, A(1) = 31itp, przy użyciu zerowy indeksowanie.

Zasady

  • Możesz wybrać indeksowanie zerowe lub oparte na jednym; w odpowiedzi proszę podać, które.
  • Zamiast zwracać tylko ten nelement, możesz zamiast tego zwrócić pierwsze nwarunki.
  • Możesz założyć, że wejście / wyjście nie będzie większe niż natywny format liczb całkowitych twojego języka; jednak liczba pierwsza z powtarzającymi się cyframi może być większa niż format macierzysty Twojego języka, więc trzeba to uwzględnić.
  • Na przykład 1871ostatnia liczba przykładów ma odpowiadającą liczbę pierwszą 18888888877777771, która jest nieco większa niż standardowa INT32.
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Dane wyjściowe mogą być wysyłane do konsoli, zwracane z funkcji, wyświetlane w wyskakującym oknie alarmowym itp.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).

* Szczerze mówiąc, wymyśliłem kilka pierwszych elementów sekwencji, po prostu bawiłem się pewnymi liczbami, a potem poszedłem do OEIS, aby uzyskać resztę sekwencji.

AdmBorkBork
źródło
2
Zastanawiam się, czy istnieje liczba pierwsza, której wynik powtarzania cyfr również znajduje się w tej sekwencji, i którego wynik powtarzania cyfr również znajduje się w tej sekwencji i tak dalej, ad infinitum. Wydaje się bardzo mało prawdopodobne.
Steadybox
1
@ Steadybox 11 spełnia ten warunek, ad infinitum. Ale poza tym byłoby interesujące zobaczyć, ile razy można zastosować operację powtarzania cyfr i ciągle otrzymywać liczby pierwsze.
dylnan
Biorąc pod uwagę, że 1666666999999999 jest liczbą pierwszą, dlaczego nie jest 169 w sekwencji?
Pablo Oliva
2
@PabloOliva Ponieważ 169sam nie jest liczbą pierwszą, jest 13 * 13.
AdmBorkBork

Odpowiedzi:

6

Łuska , 15 bajtów

!fo§&öεpd´ṘΠdİp

Wypróbuj online!

!                 Index into
             İp     the list of primes
 f                    for which:
            d            the digits of p
  o§&                      satisfy both:
     öεpd´Ṙ                  repeated "themselves" times, they form a prime.
           Π                 they are all nonzero.

Erik the Outgolfer zapisał bajt. Użycie zamiast εpzaoszczędziłoby kolejny bajt, ale powoduje to, że program jest tak wolny, że razy nasz parzysty dla n = 2.

Lynn
źródło
1
@ H.PWiz Nie sądzę, że oceniamy tutaj szybkość ...
Erik the Outgolfer
Naprawdę powinienem przyspieszyć w
tłumaczu
6

05AB1E , 14 13 bajtów

-1 bajt dzięki Emignie !

µNSÐPŠ×JpNpPĀ½

Wypróbuj online!

Wyjaśnienie

µNSÐPŠ×JpNpPĀ½
µ              # Do until the input is reached...
 N              # Push the iteration counter
  S             # Split it to its digits
   Ð            # And push two copies of it to the stack
    P           # Get the digital product of the counter
     Š          # And place it two places down the stack
      ×J        # Repeat each digit by itself and join it back to a number
        p       # Check for primality on that result
         Np     # And on the original counter as well
           PĀ   # Create the product and truthify the result
                # Implicit: If it is true increment the input number
Datboi
źródło
5

Galaretka , 18 14 bajtów

ÆPaDxDḌÆPaDẠµ#

Wypróbuj online!

Pan Xcoder: -1 bajtów (wszystko logiczne)

Erik the Outgolfer: -2 bajty (jedna linia zamiast dwóch)

HyperNeutrino: -1 bajt (zwraca pierwsze n elementów sekwencji)

Wyjaśnienie

ÆPaDxDḌÆPaDẠµ#     First Link
ÆP                Is prime?
  a               logical and
   D              convert number to list of digits
    xD            repeat each digit as many times as it's value
      Ḍ           convert to an integer
       ÆP         is prime?
         a        logical and
          D       list of digits
           Ạ      logical all
            µ     the following link as a monad
             #    Do this until n matches are found and return them all

Edycja: pierwotnie przesłał odpowiedź, która zawierała cyfry 0 w reprezentacji dziesiętnej, co jest szczególnie niedozwolone.

dylnan
źródło
Próbowałem
udzielić
5

Wolfram Language (Mathematica) , 100 bajtów

Nest[#+1//.i_/;!PrimeQ@FromDigits[##&@@#~Table~#&/@(l=IntegerDigits@i)]||Min@l<1:>NextPrime@i&,1,#]&

Wypróbuj online!

Jonathan Frech zapisał 3 bajty

i -7 bajtów od JungHwan Min

-15 bajtów od Martina Endera

również dzięki Jenny Mathy

Glorfindel
źródło
4

Alice , 72 70 66 62 56 bajtów

Dzięki Leo za oszczędność 5 bajtów.

/.\&wh...tz~F0/*$\W.tzt$W?K/ o
\i/&.,a:.$K;d&\FR/K.!w.a%

Wypróbuj online!

Wykorzystuje dane wejściowe 1.

Wyjaśnienie

Najładniejsza sztuczka golfowa tutaj (mimo że pozwala zaoszczędzić tylko kilka bajtów) polega na tym, że używam testu pierwotności, który daje 0dla kompozytów n dla nkompozytów n . W ten sposób nie musimy używać wyniku warunkowo bezpośrednio, ale możemy przekazać go bezpośrednio do następnej części, która sprawdza, czy dane wejściowe nie zawierają zer.

/i\       Read all input in Ordinal mode (the usual way to read decimal input).
&w        Push the current IP position onto the return address stack (RAS)
          n times. This effectively begins our main loop. We will return
          here after each number we've checked, but whenever we come across
          a repeated digit prime (RDP), we will pop one copy of the address
          from the RAS, so that the loops ends once we've found n RDPs.

h.        Increment our main loop iterator X (initially an implicit zero on
          the empty stack) and duplicate it.
.         Make another copy.
.tz       Drop all factors less than X. This gives X for prime X and 1 for
          non-prime X.
~F        Check whether X divides this value. Of course, X divides X so this
          gives X for non-composite X. But X doesn't divide 1 (unless X is 1),
          so we get 0 for composite X. Call this Y.
0         Push a 0.
\         Switch to Ordinal mode.
F         Implicitly convert both to string and check whether Y contains 0.
$/K       If it does, return to the w. Either way, switch back to Cardinal mode.
          Note that the only numbers that get to this point are 1 and prime
          numbers which don't contain 0. It's fine that we let 1 through here,
          because we'll use a proper primality test for the digit-expanded
          version later on.
.!        Store a copy of X on the tape. Let's call the copy that remains on
          the stack Z, which we're now decomposing into digits while expanding
          them.
w         Push the current IP position to the RAS. This marks the beginning
          of an inner loop over the digits of Z.

  .a%       Duplicate Z and retrieve its last digit D by taking Z % 10.
  \./       Duplicate D (in Ordinal mode but that doesn't matter).
  &.        Duplicate D, D times. So we end up with D+1 copies of D.
  ,         Pop the top D and pull up the Dth stack element, which is Z.
  a:        Discard the last digit by taking Z / 10.
  .$K       If Z is zero now, skip the K and end the inner loop, otherwise
            repeat the inner loop.
;         Discard the 0 (what used to be Z).
          We now have D copies of each digit D on the stack, but the digits
          were processed in reverse order, so the last digit is at the bottom.
d&        Repeat the next command once for each stack element.
\*        Concatenate in Ordinal mode. This joins all the digits on the
          stack into a single string.
R         Reverse that string. This is the digit-expanded version of X.
/         Switch back to Cardinal mode.
W         Pop the inner loop's return address from the RAS. We could have done
          this right after the most recent K, but putting it here helps lining
          up the two Ordinal sections in the program layout.
.tzt      Is the digit-expanded number a prime?
$W        If so, we've found an RDP. Pop one copy of the main loop address 
          from the RAS.
g         Recover the current value of X from the top left grid cell.
K         Jump back to the w if any copies of the return address are left 
          on the RAS. Otherwise, we leave the main loop.
/o        Implicitly convert the result to a string and print it in
          Ordinal mode.
          The IP will then bounce off the top right corner and start
          travelling through the program in reverse. Whatever it does
          on the way back is utter nonsense, but it will eventually get
          back to the division (:). The top of the stack will be zero
          at that point and therefore the division terminates the program.
Martin Ender
źródło
4

Python 2 , 130 bajtów

  • Dzięki ArBo za to czterobajtowe krótsze rozwiązanie.
f=lambda n,c=9:n and f(n-(('0'in`c`)<p(c)*p(int("".join(d*int(d)for d in`c`)))),c+1)or~-c
p=lambda n:all(n%m for m in xrange(2,n))

Wypróbuj online!


Python 2 , 195 179 167 140 138 136 135 134 bajtów

  • Zaoszczędzono 27 bajtów dzięki ovs ; używanie xrangezamiast range, omijanie w ten sposób MemoryErrori kompaktowanie funkcji podstawowej; poprawa zliczania indeksu liczb całkowitych.
  • Zapisano dwa bajty; użycie potoku binarnego lub operacji w |celu zaoszczędzenia bajtów or.
  • Zapisano dwa bajty; odwrócenie funkcji pierwszej i wykonanie dalszych operacji logicznych.
  • Zapisano bajt; użycie ~-zamiast 0**odwrócić istnienie zera w j, &po którym następuje prawdziwa wartość logiczna izoluje właściwość logiczną tej wartości.
  • Oszczędność bajtu dzięki Lynn ; gra w golfa ~-A&B&C(odpowiednik (not A) and B and C) z A, B, Cbycia booleanami A<B==C.
def f(n,j=9,p=lambda n:all(n%j for j in xrange(2,n))):
 while n:j+=1;n-=("0"in`j`)<p(j)==p(int("".join(d*int(d)for d in`j`)))
 print j

Wypróbuj online! (1-indeksowany)

Wyjaśnienie

Definiuje główną funkcję, fktóra przyjmuje indeks liczb całkowitych ni domyślnie ustawioną wartość j, bieżącą sekwencję candify (inicjowaną w 9celu poprawy wydajności przy jednoczesnym zachowaniu wielkości programu) oraz funkcję sprawdzania liczby pierwszej.
Tak długo, jak nniezerowa, n-ta pozycja sekwencji nie została jeszcze znaleziona. W jten sposób zwiększa się i nzmniejsza o jeden iff jjest liczbą, która spełnia wymagane właściwości.
Kiedy pętla się kończy, jjest to n-ty wpis sekwencji i w ten sposób drukowany.

Jonathan Frech
źródło
Jestem trochę spóźniony na imprezę, ale możesz ogolić jeszcze 4 bajty
ArBo
@ArBo Dziękuję.
Jonathan Frech,
3

Pyth , 21 bajtów

.f&.AKjZT&P_ss*VK`ZP_

Wypróbuj tutaj!

Długo, ponieważ Pyth nie ma wbudowanego rozszerzenia dziesiętnego .

  • Weźmy pierwsze N dodatnich liczb całkowitych ( .f), które:
    • Wszystkie cyfry są zgodne z prawdą ( .AKjZT) i ( &) ...
    • Wektoryzowane zwielokrotnienie ich reprezentacji ciągów za pomocą ich cyfr ( *VK`Z), połączonych razem i przekonwertowanych na liczbę całkowitą ( ss) to liczba pierwsza ( P_) i ( &) ...
    • To są same liczby pierwsze ( P_).
Pan Xcoder
źródło
Możesz usunąć ezgodnie z nową poprawką do reguły.
Erik the Outgolfer
@EriktheOutgolfer Zrobione, dziękuję
Pan Xcoder
2

Perl 6 , 51 bajtów

{(grep {!/0/&is-prime $_&S:g/./{$/x$/}/},2..*)[$_]}

Wypróbuj online!

  • grep {...}, 2..*filtruje nieskończoną sekwencję liczb naturalnych, zaczynając od 2, używając funkcji predykatu między nawiasami klamrowymi. (...)[$_]indeksuje do tej filtrowanej listy za pomocą argumentu funkcji $_.
  • !/0/ odfiltrowuje liczby zawierające cyfrę zero.
  • S:g/./{$/ x $/}/ replikuje każdą cyfrę w rozwinięciu dziesiętnym numeru testu.
  • is-prime $_ & S:g/./{$/ x $/}/wywołuje funkcję wbudowaną is-primez łączeniem $_, numerem testu i liczbą wynikającą z replikacji jego cyfr. Funkcja zwróci true, jeśli obaj członkowie skrzyżowania i są pierwszymi.
Sean
źródło
2

J, 81 bajtów

f=.[:1&p:(*@(*/)*x:@#~)&.(10&#.inv)
[:{.(4&p:@{.@]([,]+f@[){:@])^:([>{:@])^:_&2 0

Jest to jedna z tych sytuacji, dla których nie znalazłem jeszcze dobrego rozwiązania J.

Niemniej jednak zamieszczam to w nadziei, że nauczę się czegoś nowego.

finformuje nas, czy dana liczba jest „liczbą pierwszą powtarzającą się”. Rozkłada się w następujący sposób:

[:1&p:                               is the following a prime?
      (*@                            the signum of...
         (*/)                        the product of the digits
             *                       times...
              x:@                    force extended precision of...
                 #~)                 self-duplicated digits
                    &.               "Under": perform this, then perform its inverse at the end
                      (10&#.inv)     convert to a list of digits

I wreszcie główny Do ... Chociaż czasownik, z jego nieznośnym, pozornie nieuniknionym szablonem, który wynika z faktu, że musimy używać listy do przechowywania naszych postępów, która wymaga rejestrowania zarówno „bieżącej liczby pierwszej”, jak i „dotychczas znalezionej” , ponieważ nasz lewy argument jest już zajęty do przechowywania warunku zatrzymania, tj n. Oznacza to, że musimy użyć wielu cennych bajtów do prostego zadania podania argumentów ( [i ]) i rozpakowania naszej listy 2 elementów ( {.i {:):

[:{.                                                take the first element of the final result, of the following Do... While:
    (4&p:@                                          the next prime after...
          {.@                                       the first element of...
             ]                                      the right arg 
                       {:@])                        the last (2nd) elm of the arg...
              ([,]+f@[)                             those two now become the left and right args to this verb...
               [,                                   left arg appended to...
                 ]+                                 right arg plus...
                   f@[                              f of the left arg...
                             ^:(      )^:_          keep doing all that while...
                                [>                  the left is bigger than...
                                  {:@]              the last elm of the right arg
                                          &2 0      seed the process with 2 0, ie,
                                                    the first prime, and 0 rdps found so far.

Wypróbuj online!

Jonasz
źródło
Czy naprawdę jest mniej bajtów, aby mieć funkcję pomocnika? Nie możesz po prostu zastąpić ffunkcji pomocnika owiniętej w nawiasy. Próbowałem też grać w golfa w funkcji pomocnika i wymyśliłem 1 p:('x',~"."0#])&.":, co niestety nie wyklucza liczb pierwszych z „0” w nich. Czy masz jakieś przemyślenia? Musi też mieć tę 'x',~część, by uzyskać dodatkową precyzję ...
cole
@cole yes re: funkcja pomocnicza dodaje bajt, ale w tym momencie polerujemy mosiądz na Titanicu, więc pomyślałem, dlaczego zawracaj sobie głowę, po prostu zachowaj jasność, a może mile lub FrownyFrog wpadną z pomysłem, który oszczędza prawdziwe bajty
Jonasz
Później sprawdzę twoją grę w golfa w funkcji pomocnika
Jonah
Do tej pory 57 bajtów (((0>.-)((*&(1&p:)0&e.|10#.#~),.&.":))([,(+*)~)])/^:_@,&2, użyj, 10xaby rozszerzyć zakres, w przeciwnym razie n = 15 pominie 937
mil
@miles, jesteś bogiem J. już znalazłem tu kilka fajnych nowych sztuczek. przejrzę to jutro ponownie, aby upewnić się, że rozumiem iterację / zmniejszanie. Nie wiem, czy zauważyłeś link do mojego pytania SO, ale czy powiedziałbyś, że to ogólna technika, która mogłaby rozwiązać problem, który tam podniosłem?
Jonasz