Liczby pierwsze w różnych bazach

17

Wyzwanie:

Otrzymujesz podstawową liczbę 10. Dla każdej bazy od 10 odliczającej do bazy 2:

  1. Weź oryginalny numer wejściowy jako ciąg podstawowy 10 i usuń wszelkie cyfry numeru, które są nieprawidłowe dla podstawy.
  2. Interpretuj wynikowy ciąg liczbowy w tej bazie. Jeśli daje to 1 lub 0, zakończ cały proces.
  3. Wydrukuj lub wydrukuj jego największy współczynnik pierwszy jako liczbę dziesiętną.

Wynik może być tablicą największych czynników pierwszych.

Przykładowe przypadki:

Wejście:

987654321

Wynik:

379721
10593529
1091
179
1493
293
19
7

Na przemian:

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

Drukuje to największe czynniki pierwsze: 987654321, 87654321 9 = 42374116 10 , 7654321 8 = 2054353 10 i tak dalej, aż osiągnie 1 2 , gdzie się zatrzymuje.

poi830
źródło
2
Nie jestem pewien procesu. Prawdopodobnie mógłbym to zrozumieć na przykładzie, ale powinieneś mieć jasne instrukcje, aby nie było to konieczne. Więc przechodzimy do niższej bazy, usuwamy nieprawidłowe cyfry, a następnie drukujemy największy współczynnik pierwszy? Na jakiej podstawie drukujemy ten czynnik? Czy zatem wykonujemy ten sam proces z największym współczynnikiem podstawowym i podstawowym niższym? A może robimy to z podanym przez nas numerem? Czy zaczynamy od 10 czy 9?
xnor
Witamy na stronie!
DJMcMayhem
2
Próbowałem przepisać wyzwanie, aby było jaśniejsze. Mam nadzieję, że to właśnie zamierzałeś. Jeśli nie, możesz to zmienić.
xnor
4
Uważam, że krokiem największej liczby pierwszych czynników, który jest raczej skierowany na główną operację, jest konwersja podstawowa. Wiele języków robi to bezpośrednio z wbudowaną funkcją faktoryzacji pierwszorzędnej, a reszta w zasadzie musi wykonać drugie osobne wyzwanie. Konwersja bazy jest również wbudowana w biust. Kiedy operacje są dostarczane jako wbudowane, spodziewamy się, że będą one dobrze zdeptane pod pola golfowe, a tak naprawdę faktoryzacja i konwersja bazy. Nadal jest dobry na pierwsze wyzwanie, ale należy pamiętać o tym następnym razem.
xnor
3
Czy jest jakaś szansa, że ​​inspiracją był Google Code Jam?
Mego

Odpowiedzi:

6

Pyth, 25 bajtów

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

Wypróbuj tutaj.

Klamka
źródło
4

Pyth - 16 bajtów

V_S9#ePi~-z`NhNB

Wypróbuj online tutaj .

Czasami na wejściach jest kilka pustych wierszy bez wszystkich cyfr, nie wiem, czy to jest problem.

Maltysen
źródło
4

MATL , 17 15 bajtów

9:PQ"G@ZAYfXzX>

Pobiera to liczbę jako ciąg znaków z cudzysłowami, co jest domyślnie dozwolone.

Wypróbuj online!

Wyjaśnienie

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
źródło
Ten wyświetla na końcu 0 dla danych wejściowych nie kończących się na 1.
poi830 11.04.16
Dla danych wejściowych „98765432” i „98765” (przykłady losowe), wypisuje prawidłowe liczby, a następnie 0 przed zakończeniem.
poi830 11.04.16
1
@ poi830 Rozwiązane teraz
Luis Mendo
1

Julia, 101 bajtów

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

Jest to funkcja rekurencyjna, która przyjmuje dane wejściowe jako ciąg znaków i zwraca tablicę.

Nie golfowany:

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.
źródło
1

Mathematica, 83 bajty

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

Funkcja anonimowa zwraca listę. Szczerze mówiąc, nie jest to takie skomplikowane.

LegionMammal978
źródło
0

Rubin, 120 bajtów

Funkcja rekurencyjna przyjmuje dane wejściowe jako ciąg znaków.

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]}
Wartość tuszu
źródło
1
Możesz zapisać niektóre bajty, używając -rprimeflagi wiersza poleceń zamiast require.
Klamka
-rprimez jakiegoś powodu nie działa dla mnie ...
Wartość tuszu
0

Pyke, 19 bajtów, niekonkurujące

(dodaj funkcję splat_node)
DTAbPe
;1TtD=T`"":r

Wypróbuj tutaj!

Pobiera dane wejściowe w cudzysłowie, wychodzi z błędem.

Objaśnienie (nowa linia zastąpiona przez \ 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
niebieski
źródło