Amorces dans différentes bases

17

Défi:

On vous donne un numéro de base 10. Pour chaque base de 10 à rebours jusqu'à la base 2:

  1. Prenez le numéro d'entrée d'origine comme une chaîne de base 10 et supprimez tous les chiffres du numéro qui ne sont pas valides pour la base.
  2. Interprétez la chaîne numérique résultante dans cette base. Si cela donne 1 ou 0, arrêtez tout le processus.
  3. Affiche ou imprime son plus grand facteur premier, sous forme de nombre décimal.

La sortie peut être un tableau des plus grands facteurs premiers.

Exemples de cas:

Contribution:

987654321

Production:

379721
10593529
1091
179
1493
293
19
7

Alternativement:

[379721,10593529,1091,179,1493,293,19,7]

Cela imprime les plus grands facteurs premiers de 987654321, 87654321 9 = 42374116 10 , 7654321 8 = 2054353 10 , et ainsi de suite jusqu'à ce qu'il atteigne 1 2 , où il s'arrête.

poi830
la source
2
Je ne suis pas clair sur le processus. Je pourrais probablement le comprendre à partir de l'exemple, mais vous devriez avoir des instructions claires afin que ce ne soit pas nécessaire. Nous convertissons donc en une base inférieure, supprimons les chiffres invalides, puis imprimons le plus grand facteur premier? Dans quelle base imprimons-nous ce facteur? Faisons-nous alors le même processus avec le plus grand facteur premier et un plus bas? Ou le faisons-nous avec le nombre que nous avons pris en compte? Commençons-nous par 10 ou 9?
xnor
Bienvenue sur le site!
DJMcMayhem
2
J'ai essayé de réécrire le défi pour le rendre plus clair. J'espère que c'est ce que vous vouliez. Sinon, n'hésitez pas à le changer.
xnor
4
Je trouve que la plus grande étape du facteur premier plutôt que l’opération principale est la conversion de base. De nombreuses langues le font directement avec une factorisation intégrée, et les autres doivent essentiellement relever un deuxième défi distinct. La conversion de base est également intégrée ou non. Lorsque les opérations sont intégrées, vous vous attendez à ce qu'elles soient bien rodées pour les golfs, tout comme la factorisation et la conversion de base. Toujours bon pour un premier défi, mais des choses à garder à l'esprit pour la prochaine fois.
xnor
3
Y a-t-il une chance que cela ait été inspiré par Google Code Jam?
Mego

Réponses:

6

Pyth, 25 octets

sfTm>1PiFdC,.u-N`tYKrT1zK
                       z   get input as a string
            .u      rT1    cumulative reduce over [10,9,...,2]
              -N`tY        remove one minus the number (10,9,...) from the input
          C,       K    K  pair each step along the chain with corresponding base
   m                       map over [["987654321", 10],...]:
       iFd                   apply the base-conversion (splat over i)
      P                      prime factorization, smallest to largest
    >1                       take [the last element], or [] if empty (1 or 0)
 fT                        remove the []s from 0s or 1s
s                          join the one-element arrays together

Essayez-le ici.

Poignée de porte
la source
4

Pyth - 16 octets

V_S9#ePi~-z`NhNB

Essayez-le en ligne ici .

Il y a parfois quelques lignes vides sur les entrées sans tous les chiffres, laissez-moi savoir si c'est un problème.

Maltysen
la source
4

MATL , 17 15 octets

9:PQ"G@ZAYfXzX>

Cela prend le nombre sous forme de chaîne avec des guillemets, ce qui est autorisé par défaut.

Essayez-le en ligne!

Explication

9:PQ     % Push array [10, 9, ..., 2]
"        % For each number in that array. These are the bases to be considered
  G      %   Push input. Forces for input to be taken implicitly first time
  @      %   Push current base
  ZA     %   Convert from that base to base 10, discarding non-valid digits
  Yf     %   Prime factors. Gives empty for input 1, and 0 for input 0
  Xz     %   Non-zero values. Gives empty if previous result was 0, or else
         %   leaves it as it was
  X>     %   Maximum of array. For empty input gives empty
         % Implicitly end for each
         % Implicitly display. Empty arrays are not displayed
Luis Mendo
la source
Celui-ci émet un 0 à la fin pour les entrées ne se terminant pas par 1.
poi830
Pour les entrées '98765432' et '98765' (exemples aléatoires), il sort les bons nombres puis 0 avant de terminer.
poi830
1
@ poi830 Résolu maintenant
Luis Mendo
1

Julia, 101 octets

f(s,x=[],b=10)=(t=filter(c->c<=47+b,s))>"1"&&b>1?f(s,[x;maximum(keys(factor(parse(Int,t,b))))],b-1):x

Il s'agit d'une fonction récursive qui accepte l'entrée en tant que chaîne et renvoie un tableau.

Non golfé:

function f(s, x=[], b=10)
    # Filter the string down to only the digits valid for base b
    t = filter(c -> c <= 47 + b, s)

    # If the filtered string isn't "1" or "0" and b is a valid base
    if t > "1" && b > 1
        # Call the function again, appending the maximum prime factor
        # of t in base b to the argument x and decrementing the base
        f(s, [x; maximum(keys(factor(parse(Int, t, b))))], b-1)
    else
        # Otherwise return the array
        x
    end
end
Alex A.
la source
1

Mathematica, 83 octets

FactorInteger[Select[IntegerDigits@#,#<a&]~FromDigits~a][[-1,1]]~Table~{a,10,2,-1}&

Fonction anonyme, retourne une liste. Pas si compliqué, pour être honnête.

LegionMammal978
la source
0

Rubis, 120 octets

Fonction récursive, prend l'entrée comme une chaîne.

f=->n,b=2{require'prime';i=n.tr([*b.to_s..?9].join,"").to_i(b)
b>10?[]:f[n,b+1]+[*i>1?Prime.prime_division(i).max[0]:p]}
Encre de valeur
la source
1
Vous pouvez enregistrer certains octets en utilisant l' -rprimeindicateur de ligne de commande au lieu de require.
Poignée de porte
-rprimene fonctionne pas pour moi pour une raison quelconque
Value Ink
0

Pyke, 19 octets, sans concurrence

(ajouter splat_node functon)
DTAbPe
;1TtD=T`"":r

Essayez-le ici!

Prend l'entrée entre guillemets, quitte avec une erreur.

Explication (nouvelle ligne remplacée par \ n):

D                    - Duplicate the first item on the stack (And get it from input first time)
 TAb                 - Convert input to base (whatever's in T, 10 default)
    Pe               - get the highest prime factor of the number
      \n;1           - print it out and get rid of it
          TtD=T      - T -= 1
               `"":  - input = input.replace(str(t), "")
                   r - GOTO start
Bleu
la source