Останні ненульові цифри фактора в базі


22

Ви повинні написати програму або функцію, яка дала три позитивні цілі числа у n b kякості вхідних виходів або повертає останні kцифри перед кінцевими нулями в базовому bподанні n!.

Приклад

n=7 b=5 k=4
factorial(n) is 5040
5040 is 130130 in base 5
the last 4 digits of 130130 before the trailing zeros are 3013
the output is 3013

Вхідні дані

  • 3 натуральних числа, n b kде 2 <= b <= 10.
  • Порядок вхідних цілих чисел можна вибирати довільно.

Вихідні дані

  • Список цифр, що повертаються або виводяться у вигляді цілого чи цілого списку.
  • Провідні нулі необов’язкові.
  • Ваше рішення має вирішити будь-який приклад тестового випадку за хвилину на моєму комп’ютері (я перевіряю лише тісні випадки. У мене ПК нижче середнього рівня).

Приклади

Додано нові тести, щоб перевірити правильність поданих матеріалів. (Вони не входять до правила виконання, що не перевищує 1 хвилини.)

Вхід => Вихід (з вибором опущення провідних нулів)

3 10 1  =>  6

7 5 4  =>  3013

3 2 3  =>  11

6 2 10  =>  101101

9 9 6  =>  6127

7 10 4  =>  504

758 9 19  =>  6645002302217537863

158596 8 20  =>  37212476700442254614

359221 2 40  =>  1101111111001100010101100000110001110001

New tests:
----------

9 6 3  =>  144

10 6 3  =>  544

Це код-гольф, тому найкоротший запис виграє.


1
за хвилину на моєму комп’ютері трохи важко прицілитися, якщо ми не знаємо жодної конкретики.
Денніс

1
Буде 7 5 3висновок "013" або "13"?
Клавдіу

1
@Claudiu на основі 7 10 4тестового випадку я б сказав13
Maltysen

2
@Claudiu "Провідні нулі необов’язкові". тому обидві версії правильні.
randomra

1
Чи повинні ми прийняти будь-яке додатне ціле число для nабо k? Або ми можемо обмежити їх діапазоном цілочисельного типу мови?
Toby Speight

Відповіді:


1

Діалог APL , 23 байти

⌽k↑⌽{⍵↓⍨-⊥⍨0=⍵}b⊥⍣¯1⊢!n

Ця програма працює до тих пір, поки факториал не перевищить внутрішню межу представництва. У Dyalog APL ліміт можна підвищити ⎕FR←1287.

Припускаємо, що змінені n, b і k були встановлені (наприклад, n b k←7 5 4), але якщо ви хочете підказати для n , b і k (у такому порядку), замініть ці три символи .


Кожен тестовий випадок, який я накинув на нього, обчислювався приблизно на 11 мікросекундах на моїй машині (M540).
Адам

7

Математика, 57 48 байт

Збережено 9 байт завдяки @ 2012rcampion.

IntegerString[#!/#2^#!~IntegerExponent~#2,##2]&

Я ніколи не використовував математику, але чи не могли ви поміняти порядок аргументів, щоб bспочатку зберегти 2 байти?
FryAmTheEggman

@FryAmTheEggman Я новачок у спільноті з гольфу, чи міняється аргумент на порядок "кошерним"?
2012р. Кемпіон

1
IntegerString[#!#2^-#!~IntegerExponent~#2,##2]&
Дійсно

Автор запитував: "Порядок вхідних цілих чисел можна вибирати довільно". під введенням, тому в цьому випадку, безумовно, добре
FryAmTheEggman

@Fry Wow, схоже, я не читав досить уважно. Однак SlotSequenceхитрість, яку я використав у своєму коментарі, працює лише з поточним замовленням, тому ви більше не можете зберегти.
2012р. Кемпіон

7

Пітон, 198 192 181 символів

def F(n,b,k):
 p=5820556928/8**b%8;z=0;e=f=x=1
 while n/p**e:z+=n/p**e;e+=1
 z/=1791568/4**b%4;B=b**(z+k)
 while x<=n:f=f*x%B;x+=1
 s='';f/=b**z
 while f:s=str(f%b)+s;f/=b
 return s

Це досить швидко, ~ 23 секунди на найбільшому прикладі. І жодної факторної побудови (я дивлюся на тебе, Mathematica!).


[2,3,2,5,3,7,2,3,5][b-2]могло б int('232537235'[b-2])зберегти 3 байти. [1,1,2,1,1,1,3,2,1][b-2]аналогічно.
випадкова

Для останнього таблиця пошуку 111973>>2*(b-2)&3ще коротша. Це однакова кількість байтів для колишнього, хоча ( 90946202>>3*(b-2)&7).
Sp3000

nvm виглядає так, що ви мали рацію щодо справи з більш високими цифрами
Sp3000,

Я вважаю, що ви можете зберегти кілька байт, зробивши це програмою, а не функцією.
FryAmTheEggman

6

Pyth, 26 35 байт

M?G%GHg/GHH.N>ju%g*GhHT^T+YslNN1T_Y

Це функція з 3 аргументів, числа, бази, кількості цифр.

Демонстрація.

Самий повільний тестовий випадок, остаточний, займає 15 секунд на моїй машині.


@ Sp3000 Я додав виправлення, яке, на мою думку, повинно бути достатнім.
isaacg

2

PARI / GP, 43 байти

Швидкість торгів для простору дає цей прямий алгоритм:

(n,b,k)->digits(n!/b^valuation(n!,b)%b^k,b)

Кожен з тестових випадків працює на моїй машині менше секунди.


2

Mathematica - 48 байт

#!~IntegerDigits~#2/.{l__,0...}:>{l}~PadLeft~#3&

Безголівки:

Function[{n, b, k},
  IntegerDigits[n!, b] (* list of the base-b digits in n! *)
  /. {l__, 0...} (* match a sequence of elements l and some number of zeros*)
                 (* lucky for me, __ defaults to match the shortest number *)
     :> PadLeft[List[l], k] (* pad l to be k elements long with zeros on the left *)
                            (* this truncates the list if it is too long*)
]

Приклад:

#!~IntegerDigits~#2/.{l__,0...}:>{l}~PadLeft~#3 &
%[758, 9, 19] // Timing

(* {0.031250, {6, 6, 4, 5, 0, 0, 2, 3, 0, 2, 2, 1, 7, 5, 3, 7, 8, 6, 3}} *)

Для найбільш великих випадків обмежуючим фактором є не генерування цифр:

Length@IntegerDigits[359221!, 2] // Timing
(* {0.109375, 6111013} 6.1M digits in 100 ms *)

Здається, відповідність шаблону O(n^2)призводить до того , що два останні тестові випадки значно перевищують однохвилинні позначки.


2

Bash / coreutils / dc, 60 байт

dc<<<"1 `seq -f%g* $1`$2op"|sed -r s/0+$//|tail -c$(($3+1))

Використовує dcсценарій з моєї відповіді на пошук фактора , що виводиться в базі $2, з sedобрізанням кінцевих нулів і tailдля вибору останніх $3цифр.


Я мушу визнати, що з 40-бітовою базовою базовою схемою 2 надзвичайно повільно. Я спробував полегшити роботу sed, використовуючи revдля зменшення зворотного треку, але це те, dcщо їсть процесор ...
Toby Speight

2

Haskell, 111 109 байт

import Data.Digits
f n b k=digits b$foldl(((unDigits b.reverse.take k.snd.span(<1).digitsRev b).).(*))1[1..n]

Використання: f 158596 8 20->[3,7,2,1,2,4,7,6,7,0,0,4,4,2,2,5,4,6,1,4]

f 359221 2 40На моєму 4-річному ноутбуці потрібно 8 секунд .

Як це працює: складіть множення ( *) у список [1..n]. Перетворіть кожен проміжний результат у базу bяк список цифр (найменш значущих спочатку), зніміть ведучі нулі, потім візьміть перші kцифри і знову перетворіть на базу 10. Нарешті перетворіться на базу bзнову, але спочатку найзначнішою цифрою


у вас в голові була ідея, що я інтерпретую її за допомогою matlab, яка збігається: D
Abr001am

1

Python 3, 146 байт

import math
i,f=input(),int
n=i.split()
e=math.factorial(f(n[0]))
d=''
while e>0:
 d=str((e%f(n[1])))+d;e=e//f(n[1])
print(d.strip('0')[-f(n[2]):])

Я не впевнений, що тестові справи працюватимуть досить швидко - більші вони дуже повільні (як це перебирається через число).

Спробуйте його в Інтернеті тут (але будьте обережні).


1

Java, 303 299 296 байт

import java.math.*;interface R{static void main(String[]a){BigInteger c=new BigInteger(a[1]),b=c.valueOf(1);for(int i=new Integer(a[0]);i>0;i--){b=b.multiply(b.valueOf(i));while(b.mod(c).equals(b.ZERO))b=b.divide(c);b=b.mod(c.pow(new Integer(a[2])));}System.out.print(b.toString(c.intValue()));}}

На моєму комп’ютері це в середньому на третину секунди трохи менше третини секунди 359221 2 40. Здійснює введення через аргументи командного рядка.


1

bc, 75 байт

define void f(n,b,k){
obase=b
for(x=1;n;x%=b^k){
x*=n--
while(!x%b)x/=b}
x}

Для зменшення розміру коду використовуються деякі розширення GNU; еквівалент POSIX відповідає вазі 80 байт:

define f(n,b,k){
obase=b
for(x=1;n;x%=b^k){
x*=n--
while(x%b==0)x/=b}
return(x)}

Щоб тримати час виконання роботи розумним, ми обрізаємо кінцеві нулі ( while(!x%b)x/=b) і обрізаємо до кінцевих kцифр ( x%=b^k), коли обчислюємо факторіал ( for(x=1;n;)x*=n--).

Тестова програма:

f(3, 10, 1)
f(7, 5, 4)
f(3, 2, 3)
f(6, 2, 10)
f(9, 9, 6)
f(7, 10, 4)
f(758, 9, 19)
f(158596, 8, 20)
f(359221, 2, 40)
f(9, 6, 3)
f(10, 6, 3)
quit

Час виконання повного тестового набору становить приблизно 4¼ секунди на моїй вінтажній робочій станції 2006 року.


Це моя перша в історії bcпрограма (гольф чи ні), тому будь-які поради особливо вітаються ...
Toby Speight

0

PHP, 80 байт

function f($a,$b,$c){echo substr(rtrim(gmp_strval(gmp_fact($a),$b),"0"),-1*$c);}

Використовується як f(359221,2,40)для останнього тестового випадку. Працює досить гладко для всіх тестових випадків.

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

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