Primes in verschiedenen Basen

17

Herausforderung:

Sie erhalten eine Basis 10 Nummer. Für jede Basis von 10 abwärts bis zur Basis 2:

  1. Nehmen Sie die ursprüngliche Eingabenummer als Zeichenfolge zur Basis 10 und entfernen Sie alle Ziffern der Nummer, die für die Basis ungültig sind.
  2. Interpretieren Sie die resultierende Zahlenfolge in dieser Basis. Wenn dies 1 oder 0 ergibt, beenden Sie den gesamten Prozess.
  3. Gibt den größten Primfaktor als Dezimalzahl aus oder druckt ihn aus.

Die Ausgabe kann eine Reihe der größten Primfaktoren sein.

Beispielfälle:

Eingang:

987654321

Ausgabe:

379721
10593529
1091
179
1493
293
19
7

Abwechselnd:

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

Dies druckt die größten Primfaktoren von 987654321, 87654321 9 = 42374116 10 , 7654321 8 = 2054353 10 und so weiter, bis 1 2 erreicht ist und dort aufhört.

poi830
quelle
2
Ich bin unklar über den Prozess. Ich könnte es wahrscheinlich anhand des Beispiels herausfinden, aber Sie sollten klare Anweisungen haben, damit dies nicht benötigt wird. Also konvertieren wir auf eine niedrigere Basis, entfernen ungültige Ziffern und geben dann den größten Primfaktor aus? Auf welcher Basis drucken wir diesen Faktor aus? Tun wir dann den gleichen Prozess mit dem größten Primfaktor und einer niedrigeren Basis? Oder machen wir das mit der Zahl, die wir faktorisiert haben? Beginnen wir mit 10 oder 9?
XNOR
Willkommen auf der Seite!
DJMcMayhem
2
Ich habe versucht, die Herausforderung umzuschreiben, um sie klarer zu machen. Ich hoffe, das ist was du beabsichtigt hast. Wenn nicht, können Sie es jederzeit ändern.
Xnor
4
Ich finde, dass der größte Primfaktor-Schritt, der eher für die Hauptoperation von Bedeutung ist, die Basisumrechnung ist. Viele Sprachen tun dies einfach direkt mit einer eingebauten Primfaktorisierung, und der Rest muss im Grunde genommen eine zweite separate Herausforderung erledigen. Die Basisumwandlung ist ebenfalls eingebaut oder fehlgeschlagen. Wenn Operationen als eingebaute Operationen ausgeführt werden, ist zu erwarten, dass sie für Golfspieler ausgetreten sind, und Faktorisierung und Basisumwandlung sind es tatsächlich. Trotzdem gut für eine erste Herausforderung, aber Dinge, die Sie beim nächsten Mal berücksichtigen sollten.
Xnor
3
Gibt es eine Chance, dass dies von Google Code Jam inspiriert wurde?
Mego

Antworten:

6

Pyth, 25 Bytes

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

Probieren Sie es hier aus.

Türknauf
quelle
4

Pyth - 16 Bytes

V_S9#ePi~-z`NhNB

Probieren Sie es hier online aus .

Es gibt manchmal ein paar leere Zeilen auf Eingaben ohne alle Ziffern, ich weiß, ob das ein Problem ist.

Maltysen
quelle
4

MATL , 17 15 Bytes

9:PQ"G@ZAYfXzX>

Dabei wird die Zahl als Zeichenfolge mit Anführungszeichen verwendet, was standardmäßig zulässig ist.

Probieren Sie es online!

Erläuterung

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
quelle
Dieser gibt am Ende eine 0 für Eingaben aus, die nicht mit 1 enden.
poi830
Für die Eingänge '98765432' und '98765' (Zufallsbeispiele) werden vor dem Beenden die korrekten Zahlen und dann 0 ausgegeben.
Poi830
1
@ poi830 Jetzt gelöst
Luis Mendo
1

Julia, 101 Bytes

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

Dies ist eine rekursive Funktion, die die Eingabe als Zeichenfolge akzeptiert und ein Array zurückgibt.

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
Alex A.
quelle
1

Mathematica, 83 Bytes

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

Anonyme Funktion, gibt eine Liste zurück. Nicht so kompliziert, um ehrlich zu sein.

LegionMammal978
quelle
0

Ruby, 120 Bytes

Rekursive Funktion, nimmt die Eingabe als Zeichenfolge.

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]}
Wert Tinte
quelle
1
Sie können einige Bytes speichern, indem Sie das -rprimeBefehlszeilenflag anstelle von verwenden require.
Türklinke
-rprimefunktioniert aus irgendeinem Grund nicht für mich ...
Value Ink
0

Pyke, 19 Bytes, nicht konkurrierend

(füge splat_node hinzu)
DTAbPe
;1TtD=T`"":r

Probieren Sie es hier aus!

Nimmt Eingaben in Anführungszeichen vor, beendet mit einem Fehler.

Erklärung (Newline ersetzt durch \ 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
Blau
quelle