Primes in diverse basi


17

Sfida:

Ti viene dato un numero di base 10. Per ogni base dal 10 alla rovescia alla base 2:

  1. Prendere il numero di ingresso originale come stringa base 10, e rimuovere eventuali cifre del numero che non sono validi per la base.
  2. Interpreta la stringa numerica risultante in quella base. Se questo dà 1 o 0, termina l'intero processo.
  3. Stampa o stampa il suo fattore primo più grande, come numero decimale.

L'output può essere una matrice dei maggiori fattori primi.

casi di esempio:

Ingresso:

987654321

Produzione:

379721
10593529
1091
179
1493
293
19
7

In alternativa:

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

Questo stampa i fattori primi più grandi di 987654321, 87654321 9 = 42374116 10 , 7654321 8 = 2054353 10 e così via fino a raggiungere 1 2 , dove si ferma.


2
Sono poco chiare sul processo. Potrei probabilmente capirlo dall'esempio, ma dovresti avere istruzioni chiare quindi non è necessario. Quindi convertiamo in una base inferiore, rimuoviamo le cifre non valide, quindi stampiamo il fattore primo più grande? Che che base il risultato della stampa questo fattore? Dobbiamo poi fare lo stesso processo con il più grande fattore primo e una base uno inferiore? O lo facciamo con il numero che abbiamo scomposto? Si comincia con 10 o 9?
XNOR

Benvenuti nel sito!
DJMcMayhem

2
Ho provato a riscrivere la sfida di renderlo più chiaro. Spero che questo sia quello che intendeva. In caso contrario, si sentono liberi di cambiarlo.
XNOR

4
Trovo che il passo più grande del fattore primo piuttosto attaccato all'operazione principale sia la conversione di base. Molte lingue lo fanno direttamente con una fattorizzazione in fattori primi incorporata, e il resto deve fondamentalmente fare una seconda sfida separata. Anche la conversione di base è integrata o meno. Quando le operazioni si presentano come incorporate, ci si aspetta che siano terreno ben battuto per i golf, e in effetti lo sono la fattorizzazione e la conversione di base. Comunque, buono per una prima sfida, ma cose da tenere a mente per la prossima volta.
xnor

3
Qualche possibilità è stata ispirata da Google Code Jam?
Mego

Risposte:


6

Pyth, 25 byte

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

Provalo qui.


4

Pyth - 16 byte

V_S9#ePi~-z`NhNB

Provalo online qui .

A volte ci sono poche righe vuote sugli ingressi senza tutte le cifre, fammi sapere se questo è un problema.


4

MATL , 17 15 byte

9:PQ"G@ZAYfXzX>

Questo prende il numero come una stringa tra virgolette, che è consentito per impostazione predefinita.

Provalo online!

Spiegazione

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

Questo alla fine emette uno 0 per gli ingressi che non finiscono in 1.
poi830

Per gli ingressi '98765432' e '98765' (esempi casuali), produce i numeri corretti quindi 0 prima di terminare.
poi830,

1
@ poi830 Risolto ora
Luis Mendo l'

1

Julia, 101 byte

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

Questa è una funzione ricorsiva che accetta l'input come stringa e restituisce un array.

Ungolfed:

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

1

Mathematica, 83 byte

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

Funzione anonima, restituisce un elenco. Non è così complicato, a dire il vero.


0

Rubino, 120 byte

Funzione ricorsiva, accetta l'input come stringa.

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

1
È possibile salvare alcuni byte utilizzando il -rprimeflag della riga di comando anziché require.
Maniglia della porta

-rprimenon funziona per me per qualche motivo ...
Value Ink

0

Pyke, 19 byte, non competitivo

(aggiungi funzione splat_node)
DTAbPe
;1TtD=T`"":r

Provalo qui!

Accetta le virgolette, esce con un errore.

Spiegazione (newline sostituita con \ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.