Прайми на різних засадах


17

Виклик:

Вам надається базове число 10. Для кожної бази від 10 відлік до бази 2:

  1. Візьміть початковий номер введення як базовий рядок 10 і видаліть будь-які цифри числа, недійсні для бази.
  2. Інтерпретуйте отриманий рядок числа в цій базі. Якщо це дає 1 або 0, припиніть весь процес.
  3. Виведіть або надрукуйте його найбільший простий коефіцієнт, як десяткове число.

Вихід може бути масивом найбільших простих факторів.

Зразки випадків:

Вхід:

987654321

Вихід:

379721
10593529
1091
179
1493
293
19
7

По черзі:

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

Це друкує найбільші прості коефіцієнти 987654321, 87654321 9 = 42374116 10 , 7654321 8 = 2054353 10 тощо, до тих пір, поки вона не досягне 1 2 , де вона зупиняється.


2
Мені незрозуміло щодо процесу. Можливо, я міг би це зрозуміти з прикладу, але ви повинні мати чіткі інструкції, тому це не потрібно. Тож ми перетворюємо на нижчу базу, видаляємо недійсні цифри, а потім друкуємо найбільший основний коефіцієнт? На якій основі ми друкуємо цей фактор? Чи робимо ми тоді той самий процес з найбільшим простим коефіцієнтом і базовим нижчим? Або ми робимо це з числом, яке ми створили? Почнемо з 10 чи 9?
xnor

Ласкаво просимо на сайт!
DJMcMayhem

2
Я спробував переписати виклик, щоб зробити його більш зрозумілим. Я сподіваюся, що це ви задумали. Якщо ні, сміливо міняйте це.
xnor

4
Я вважаю, що найбільший крок основного фактора, який досить прив’язаний до основної операції, - це перетворення бази. Багато мов просто роблять це безпосередньо за допомогою вбудованої основної факторизації, а решті в основному доводиться робити другий окремий виклик. Базова конверсія також є вбудованим або бюстом. Коли операції стають вбудованими, ви очікуєте, що вони будуть добре протоптані для гольфів, і справді факторизація та перетворення бази є. Все-таки добре для першого виклику, але про це слід пам’ятати наступного разу.
xnor

3
Чи є шанс на це надихнути Google Code Jam?
Мего

Відповіді:


6

Pyth, 25 байт

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

Спробуйте тут.



4

MATL , 17 15 байт

9:PQ"G@ZAYfXzX>

Це сприймає число як рядок із лапками, що дозволено за замовчуванням.

Спробуйте в Інтернеті!

Пояснення

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

Цей виводить 0 в кінці для входів, які не закінчуються на 1.
poi830

Для входів "98765432" та "98765" (випадкові приклади), він виводить правильні числа, а потім 0 ​​перед завершенням.
poi830

1
@ poi830 Вирішено зараз
Луїс Мендо

1

Джулія, 101 байт

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

Це рекурсивна функція, яка приймає введення як рядок і повертає масив.

Безумовно:

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

Математика, 83 байти

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

Анонімна функція, повертає список. Якщо не чесно, то не так складно.


0

Рубін, 120 байт

Рекурсивна функція, приймає вхід як рядок.

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
Ви можете зберегти деякі байти, використовуючи -rprimeпрапор командного рядка замість require.
Дверна ручка

-rprimeчомусь не працює для мене ...
Чорнило про вартість

0

Пайк, 19 байт, неконкурентоспроможний

(додати функцію splat_node functon)
DTAbPe
;1TtD=T`"":r

Спробуйте тут!

Здійснює введення в лапки, виходить з помилкою.

Пояснення (новий рядок замінено на \ 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.