বেসে কারখানার শেষ ননজারো ডিজিটস


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
  • ইনপুট পূর্ণসংখ্যার ক্রমটি নির্বিচারে চয়ন করা যেতে পারে।

আউটপুট

  • পূর্ণসংখ্যা বা পূর্ণসংখ্যার তালিকা হিসাবে ফিরে আসা বা আউটপুট হওয়া সংখ্যার একটি তালিকা।
  • শীর্ষস্থানীয় শূন্যগুলি alচ্ছিক।
  • আপনার সমাধানটি আমার কম্পিউটারে এক মিনিটের মধ্যে যে কোনও উদাহরণ পরীক্ষার কেস সমাধান করতে হবে (আমি কেবল নিকটবর্তী কেসগুলি পরীক্ষা করব I আমার নীচে গড় পিসি রয়েছে))।

উদাহরণ

জমা দেওয়ার নির্ভুলতা পরীক্ষা করতে নতুন পরীক্ষা যুক্ত করা হয়েছে। (এগুলি 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
@ ক্লাউডিউ 7 10 4পরীক্ষার কেসের ভিত্তিতে আমি বলব13
মালতীসেন

2
@ ক্লাউডিউ "শীর্ষস্থানীয় শূন্যগুলি optionচ্ছিক" " সুতরাং উভয় সংস্করণ সঠিক।
এলোমেলো

1
আমরা বা কোন ইতিবাচক পূর্ণসংখ্যার গ্রহণ করতে হবে ? বা আমরা কী তাদের ভাষার পূর্ণসংখ্যার প্রকারের মধ্যে সীমাবদ্ধ করতে পারি? nk
টবি স্পিড 21

উত্তর:


1

ডায়ালগ এপিএল , 23 বাইট

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

এই প্রোগ্রামটি ততক্ষণ কাজ করে যতক্ষণ না ফ্যাক্টরিয়াল অভ্যন্তরীণ উপস্থাপনের সীমা অতিক্রম না করে। ডায়ালগ এপিএলে সীমাটি বাড়ানো যায় ⎕FR←1287

ধরে নিন এন, বি এবং কে ভেরিয়েবল সেট করা হয়েছে (উদাঃ n b k←7 5 4), তবে আপনি যদি এন , বি এবং কে এর জন্য প্রম্পট করতে চান (সেই ক্রমে) তবে তিনটি অক্ষরকে প্রতিস্থাপন করুন


আমি এটি ফেলেছি এমন প্রতিটি পরীক্ষার কেস আমার মেশিনে প্রায় 11 মাইক্রোসেকেন্ডে গণনা করা হয়েছিল (এম 540)।
অ্যাডম

7

গণিত, 57 48 বাইট

@ 2012 ক্র্যাম্পিয়নকে 9 টি বাইট সংরক্ষণ করা হয়েছে।

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

আমি সত্যই কখনও গণিত ব্যবহার করি নি, তবে আপনি b2 টি বাইট সংরক্ষণ করার জন্য প্রথমে যুক্তিগুলির ক্রমটি পরিবর্তন করতে পারেন নি ?
FryAmTheEggman

@ ফ্রাইআম দ্য এজিগম্যান আমি গল্ফিং সম্প্রদায়ের কাছে নতুন, আর্গুমেন্ট অর্ডার "কোশার" অদলবদল করছি?
2012campion

1
আপনি প্রকৃতপক্ষে 47 এ যেতে পারেন: IntegerString[#!#2^-#!~IntegerExponent~#2,##2]&(এটি এবং আপনার আসল দুটিই বেশ দ্রুত)
2012campion

প্রশ্নকারী লিখেছেন: "ইনপুট পূর্ণসংখ্যার ক্রমটি নির্বিচারে চয়ন করা যেতে পারে।" ইনপুট অধীনে, সুতরাং এই ক্ষেত্রে এটি অবশ্যই ভাল
FryAmTheEggman

@ ফ্রাই বাহ, দেখে মনে হচ্ছে আমি যথেষ্ট পরিমাণে পড়িনি। তবে, SlotSequenceআমি আমার মন্তব্যে যে কৌশলটি ব্যবহার করেছি তা কেবলমাত্র বর্তমান অর্ডারের সাথে কাজ করে, সুতরাং আপনি আর কোনও সংরক্ষণ করতে পারবেন না।
2012campion

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 সেকেন্ড। এবং কোনও ফ্যাকটোরিয়াল বিল্টিন নেই (আমি আপনাকে দেখছি, ম্যাথামেটিকা!)।


[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

এনভিএম দেখে মনে হচ্ছে আপনি উচ্চতর অঙ্কের জিনিসটি সম্পর্কে সঠিক ছিলেন
Sp3000

আমি বিশ্বাস করি আপনি এটি কোনও প্রোগ্রাম না করে কয়েকটি বাইট সংরক্ষণ করতে পারবেন না কোনও ফাংশন।
FryAmTheEggman

6

পাইথ, 26 35 বাইট

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

এটি 3 টি আর্গুমেন্ট, সংখ্যা, বেস, সংখ্যাগুলির সংখ্যা a

প্রদর্শন.

সবচেয়ে ধীরতম পরীক্ষার কেস, চূড়ান্ত একটিটি আমার মেশিনে 15 সেকেন্ড সময় নেয়।


@ Sp3000 আমি একটি ফিক্স যুক্ত করেছি যা আমার মনে হয় যথেষ্ট হওয়া উচিত।
isaacg

2

PARI / GP, 43 বাইট

স্থানের জন্য ব্যবসায়ের গতি এই সরল অ্যালগরিদম দেয়:

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

প্রতিটি পরীক্ষার কেস আমার মেশিনে এক সেকেন্ডেরও কম সময়ে চলে।


2

গণিত - 48 বাইট

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

Ungolfed:

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

বাশ / কোর্টিল / ডিসি, 60 বাইট

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

অনুক্রমের সন্ধান করুন, বেসে আউটপুট , পিছনের শূন্যগুলি ছাঁটাতে এবং শেষ সংখ্যাগুলি নির্বাচন করতে আমার উত্তরdc থেকে স্ক্রিপ্টটি ব্যবহার করে ।$2sedtail$3


আমাকে স্বীকার করতে হবে যে এটি 40-বিট বেস -2 টেস্টকেসের সাথে অত্যন্ত ধীর। আমি revব্যাকট্র্যাকিং হ্রাস করার জন্য সেডের কাজটি সহজ করার চেষ্টা করেছি , তবে এটি dcসিপিইউ খাচ্ছে ...
টবি স্পিড

2

হাস্কেল, 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আবার বেসে রূপান্তর করুন তবে প্রথমে সবচেয়ে উল্লেখযোগ্য অঙ্ক সহ।


আপনার মনে আমার ধারণা ছিল, আমি
মাতলাব

1

পাইথন 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

জাভা, 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

বিসি, 75 বাইট

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

কোডের আকার হ্রাস করতে এটি কিছু জিএনইউ এক্সটেনশন ব্যবহার করে; একটি পসিক্স-কনফর্মিং সমমানের ওজন 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

সম্পূর্ণ টেস্ট স্যুটটির রানটাইম আমার 2006-মদ ওয়ার্কস্টেশনে প্রায় 4¼ সেকেন্ড।


এটি আমার প্রথম bcপ্রোগ্রাম (গল্ফ বা না), তাই কোনও
পরামর্শটি

0

পিএইচপি, 80 বাইট

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

f(359221,2,40)সর্বশেষ পরীক্ষার ক্ষেত্রে হিসাবে ব্যবহৃত হয় । সমস্ত পরীক্ষার ক্ষেত্রে খুব সুচারুভাবে চালায়।

এখানে চেষ্টা করুন!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.