MATL , 25 octets

2

MATL , 25 octets

Cela fonctionne pour l'entrée jusqu'à 16:

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

La version suivante utilise 31 octets et fonctionne jusqu'à 18. Car 19il nécessite environ 4 Go de mémoire (je n'ai pas pu l'exécuter).

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

Exemple

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

Explication

Tenez compte de la saisie du concret 6. D'abord, les diviseurs premiers de 111111sont calculés; dans ce cas , les résultats sont 3, 7, 11, 13, 37. Ensuite , l'opération modulo (reste de la division) est calculé pour toutes les combinaisons de nombres 1, 11, ... 111111et les diviseurs calculés. Ceci exploite l'expansion implicite singleton de MATL. Le résultat est dans ce cas une matrice 6x 5, chaque colonne correspondant à l'un des diviseurs. Les diviseurs (colonnes) acceptés sont ceux pour lesquels seule la 1valeur (à savoir la dernière) donne zéro reste.

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

(*) Supprimé dans la version courte

Luis Mendo
la source
C'est une façon intelligente de le faire.
AdmBorkBork

Réponses:

2

Julia, 103 octets

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

Il s'agit d'une fonction sans nom qui appelle une fonction d'assistance R. Pour l'appeler, donnez un nom à la fonction principale, par exemple f=n->....

Non golfé:

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.
la source
2

LabVIEW, 33 primitives LabVIEW

19 prend une éternité ...

Travaillez en enregistrant tous les amorces et en supprimant les éléments du dernier ensemble lorsqu'ils se trouvent dans l'autre tableau.

Eumel
la source
1

J, 24 octets

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

Attend une précision numérique étendue après 6 (par exemple 19xau lieu de 19).

Essayez-le en ligne!

Il existe probablement un moyen plus court de générer les remboursements, ce qui évite également les plafonds.

Explication

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

Comment ça marche, visuellement

Je pense que ce genre d'explications visuelles est plus facile à digérer pour ceux qui ne connaissent pas J. Ce sont des résultats du 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
la source