MATL , 25 bytes

2

MATL , 25 bytes

Isso funciona para entrada até 16:

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

A versão a seguir usa 31 bytes e funciona até 18. Para 19isso, requer cerca de 4 GB de memória (não consegui executá-lo).

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

Exemplo

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

Explicação

Considere a entrada de concretude 6. Primeiro, os principais divisores de 111111são calculados; neste caso, os resultados são 3, 7, 11, 13, 37. Em seguida, a operação de módulo (resto de divisão) é calculado para todas as combinações de números 1, 11, ... 111111e os divisores computados. Isso explora a expansão implícita de singleton do MATL. O resultado é, neste caso, uma matriz 6x 5, com cada coluna correspondendo a um dos divisores. Divisores aceitos (colunas) são aqueles para os quais apenas o 1valor (ou seja, o último) fornece zero restante.

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

(*) Removido na versão curta

Luis Mendo
fonte
Essa é uma maneira inteligente de fazer isso.
AdmBorkBork

Respostas:

2

Julia, 103 bytes

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])))

Esta é uma função sem nome que chama uma função auxiliar R. Para chamá-lo, dê um nome à função principal, por exemplo f=n->....

Ungolfed:

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.
fonte
2

LabVIEW, 33 Primitivas do LabVIEW

19 leva uma eternidade ...

Trabalhe salvando todos os Primes e excluindo elementos do último conjunto quando eles forem encontrados na outra matriz.

Eumel
fonte
1

J, 24 bytes

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

Espera valores numéricos de precisão estendida após 6 (por exemplo, em 19xvez de 19).

Experimente online!

Provavelmente existe uma maneira mais curta de gerar as repunições, o que evita os limites também.

Explicação

[: ({: -. }:) @: 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)

Como funciona, visualmente

Penso que este tipo de explicação visual é mais fácil de suportar para quem não conhece J. Estes são resultados do 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
Cole
fonte