MATL , 25 bajtów

2

MATL , 25 bajtów

Działa to dla danych wejściowych do 16:

10,i:^9/Y[t0)Yftb!w\~s1=)

Następująca wersja wykorzystuje 31 bajtów i działa do 18. Dla 19wymaga około 4 GB pamięci (nie udało się go uruchomić).

10,i:^9/Y[t0)5X2Y%Yfotb!w\~s1=)

Przykład

>> matl
 > 10,i:^1-,9/t0)5X2Y%Yfotb!w\~s1=)
 > 
> 6
7 13

Wyjaśnienie

Rozważ wprowadzenie konkretności 6. Najpierw 111111obliczane są główne dzielniki ; w tym przypadku wyniki są 3, 7, 11, 13, 37. Wtedy operacja modulo (podział reszta) oblicza się dla wszystkich kombinacji liczb 1, 11... 111111i obliczone dzielnikami. Wykorzystuje to ukrytą ekspansję MATL-a. Wynik jest w tym przypadku macierzą 6x 5, przy czym każda kolumna odpowiada jednemu z dzielników. Akceptowane dzielniki (kolumny) to te, dla których tylko 1wartość (a mianowicie ostatnia) daje zero pozostałej.

10,i:^9/Y[   % generate vector with `1`, `11`, ... depending on input number, say "n"
t0)          % pick the last element: `111...1` (n ones)
5X2Y%        % * convert to uint64, so that larger numbers can be handled
Yf           % prime factors                                             
o            % * convert to double precision, so that modulus can be done
t            % duplicate                                                 
b            % bubble up element in stack                                
!            % transpose                                                 
w            % swap elements in stack                                    
\            % modulus after division (element-wise, singleton expansion)
~s           % number of zero values in each column
1=           % is equal to 1? (element-wise, singleton expansion)
)            % index divisors with that logical index

(*) Usunięto w krótkiej wersji

Luis Mendo
źródło
To sprytny sposób na zrobienie tego.
AdmBorkBork,

Odpowiedzi:

2

Julia, 103 bajty

R(n)=[keys(factor((10^n-19))...]
n->(r=R(n);isprime(r)?r:setdiff(r,reduce(vcat,[R(i)for i=1:n-1])))

Jest to nienazwana funkcja, która wywołuje funkcję pomocnika R. Aby go wywołać, nadaj głównej funkcji nazwę, npf=n->... .

Nie golfowany:

function R(n::Integer)
    collect(keys(factor((10^n - 1) ÷ 9)))
end

function f(n::Integer)
    r = R(n)
    if isprime(r)
        r
    else
        setdiff(r, reduce(vcat, [R(i) for i = 1:n-1]))
    end
end
Alex A.
źródło
2

LabVIEW, 33 LabVIEW Prymitywy

19 trwa wiecznie ...

Pracuj, zapisując wszystkie liczby pierwsze i usuwając elementy z ostatniego zestawu, gdy zostaną znalezione w drugiej tablicy.

Eumel
źródło
1

J, 24 bajty

[:({:-.}:)@:q:[:+/\10^i.

Oczekuje liczb o rozszerzonej precyzji po 6 (np. 19xZamiast 19).

Wypróbuj online!

Prawdopodobnie istnieje krótszy sposób generowania powtórek, który pozwala również uniknąć limitów.

Wyjaśnienie

[: ({: -. }:) @: q: [: +/\ 10 ^ i.
                                i. Range [0, input)
                           10 ^    10 raised to the power of the range
                       +/\         Running sum of this list (list of repunits)
                 q:                Prime factors of the repunits
              @:                   Composed with
   ({: -. }:)                      Unique prime factors of last repunit
    {:                              Factors of last repunit (tail of matrix)
       -.                           Set subtraction with
          }:                        Rest of the matrix (curtail)

Jak to działa wizualnie

Myślę, że tego rodzaju wizualne wyjaśnienia są łatwiejsze do zniesienia dla tych, którzy nie znają J. To są wyniki REPL.

   10 ^ i.6
1 10 100 1000 10000 100000

   +/\ 10 ^ i. 6
1 11 111 1111 11111 111111

   q: +/\ 10 ^ i. 6
 0   0  0  0  0
11   0  0  0  0
 3  37  0  0  0
11 101  0  0  0
41 271  0  0  0
 3   7 11 13 37

   ({: -. }:) q: +/\ 10 ^ i. 6
7 13
kapusta
źródło