ตัวเลขที่ไม่ใช่ศูนย์สุดท้ายของ n!


22

รับจำนวนเต็ม1 ≤ N ≤ 1,000,000เป็นอินพุตเอาต์พุตหลักที่ไม่ใช่ศูนย์สุดท้ายของN! ที่ไหน! เป็นแฟคทอเรียล (ผลิตภัณฑ์ของตัวเลขทั้งหมดตั้งแต่1ถึงNรวมถึง) นี่คือ OEIS ลำดับA008904

โปรแกรมของคุณต้องการเสร็จสิ้นภายใน 10 วินาทีบนเครื่องที่เหมาะสมสำหรับการป้อนข้อมูลที่ถูกต้องใด ๆ

กรณีทดสอบ

1 => 1
2 => 2
3 => 6
4 => 4
5 => 2
6 => 2
7 => 4
8 => 2
9 => 8
10 => 8
100 => 4
1000 => 2
10000 => 8
100000 => 6
1000000 => 4

นี่คือเพื่อให้โค้ดที่สั้นที่สุดเป็นไบต์ชนะ!


ฟังก์ชั่นเดียวหรือโปรแกรมที่สมบูรณ์?
Joey

@joey ไม่พวกเขาเป็นเพียงกรณีทดสอบ อินพุตเดี่ยว, เอาต์พุตเดี่ยว
fR0DDY

@joey โปรแกรมที่สมบูรณ์
fR0DDY

1
ข้อกำหนดสำหรับโปรแกรมเต็มรูปแบบนั้นเป็นสิ่งท้อแท้ ...
Erik the Outgolfer

2
@EriktheOutgolfer นี้มาจาก ~ 7 ปีที่แล้วดังนั้นฉันไม่คิดว่าจะถูกกำหนดในเวลา
NoOneIs ที่นี่

คำตอบ:


8

Ruby - 63 ตัวอักษร

f=->n{n<2?1:6*[1,1,2,6,4,4,4,8,4,6][n%10]*3**(n/5%4)*f[n/5]%10}

แหล่งที่มา - http://oeis.org/A008904

จัดการได้ไม่เกินพันหลักในไม่กี่วินาที

ทดสอบ

irb(main):014:0> for n in 2..6
irb(main):015:1> puts f[10**n]
irb(main):016:1> end
4
2
8
6
4

11

Mathematica, 45 36 ไบต์

Last@Select[IntegerDigits[#!],#>0&]&

สามารถอ่านได้มากสำหรับคำตอบที่ชนะ :) (จากนั้นอีกครั้งยังไม่มีการส่ง GolfScript & Co. )

สิ่งนี้จะจัดการอินพุต 1,000,000 ในเวลาประมาณ 5 วินาทีบนเครื่องของฉัน


1
Mathematica เป็นภาษาที่สมบูรณ์แบบสำหรับคำถามนี้
Michael Stern


3

PARI / GP - 27 ไบต์

การซื้อขายนี้เร็วขึ้นสำหรับขนาด - ตู้ทดสอบใช้เวลานาน (~ 6 วินาที)

n->n!/10^valuation(n!,5)%10

รุ่นนี้เร็วกว่ามาก (~ 15 microseconds) แต่ใช้เวลา 81 ไบต์:

n->r=1;while(n,r*=Mod(4,10)^(n\10%2)*[1,2,6,4,2,2,4,2,8][max(n%10,1)];n\=5);lift(r)

คุณสามารถใช้รหัสนี้ (ไม่ใช่กอล์ฟ) เพื่อทดสอบ:

[%(10^n) | n <- [1..6]]

2

Windows PowerShell, 53 56 59 60 63 73 90

($a=1).."$input"|%{$a="$($a*$_)".trim('0')%1e7}
$a%10

หมายเหตุ:

  • ใช้เวลานานกว่าหนึ่งนาทีในจำนวนที่ใกล้ถึง 100,000 อย่างไรก็ตามการลบศูนย์ในตอนท้ายต้องใช้การแปลงเป็นสตริงการคำนวณต้องใช้ตัวเลขดังนั้นการแปลงจะหลีกเลี่ยงไม่ว่าในกรณีใด ๆ

ประวัติความเป็นมา:

  • 2011-02-08 10:31 (90) - ความพยายามครั้งแรก
  • 2011-02-08 10:33 (73) - โมดูลัสสั้นกว่าการแบ่งส่วนและการเข้าร่วม
  • 2011-02-08 10:34 (63) - การตัดแต่งที่ไม่จำเป็น
  • 2011-02-08 10:37 (60) - โยนหมายเลขที่ไม่จำเป็นออกไป โมดูลัสทำเช่นนั้นได้ดีแล้ว
  • 2011-02-08 10:40 (59) - อินไลน์บางส่วน
  • 2011-02-08 11:00 (56) - ฉันพูดอะไรมาก่อนเกี่ยวกับโมดูลัสที่สั้นลง? ใช้กับเอาต์พุตเช่นกัน
  • 2011-02-08 11:01 (53) - การ$inputส่งสตริงให้เพียงพอ การส่งไปยังintถูกนำไปใช้โดยนัย

2

Perl, 53 58 61 ตัวละคร

ช่องว่างทั้งหมดสามารถลบได้ แต่ฉันทิ้งไว้เพื่อ "อ่านได้" หมายเหตุ: ไม่ได้ใช้สูตรที่ไม่ชัดเจนบางอย่างจาก Sloane

sub f {
    $_ = $1 * ++$n || 1, /(.{1,7}?)0*$/ while $n < $_[0];
    $1 % 10
}

คำนวณ f (10 ^ 6) ใน 8.7 วินาทีบนเครื่องของฉัน

อัปเดต : OP ต้องการให้เป็นโปรแกรมทั้งหมด:

$_ = $1 * ++$n || 1, /(.{1,7}?)0*$/ while $n < $ARGV[0];
print $1 % 10

นั่นทำให้มันมี 55 ตัว


2

CJam - 28

1ri{I)*_AbW%{}#A\#/1e7%}fIA%

คุณสามารถลองได้ที่http://cjam.aditsu.net/สำหรับค่ามากถึง 10,000 หรือมากกว่านั้น สำหรับตัวเลขขนาดใหญ่คุณควรใช้ล่ามภาษาจาวา 1000000 ทำงานภายใน 3 วินาทีบนแล็ปท็อปของฉัน

คำอธิบาย:

น่าเสียดายที่วิธีแก้ปัญหาตรงไปตรงมาช้าเกินไปดังนั้นฉันจึงเก็บเฉพาะตัวเลข 7 หลักสุดท้าย (ก่อนหน้าเลขศูนย์ต่อท้าย) หลังจากการคูณแต่ละครั้ง

1           push 1 on the stack
ri          read a token and convert to integer
{           loop (for I from 0 to N - 1)
    I)      push I and increment
    *       multiply with the previous value (initially 1)
    _Ab     duplicate and convert to array of digits
    W%      reverse array
    {}#     find the position of the first non-zero digit
    A\#     raise 10 to that power
    /       divide, thus removing all trailing zeros
    1e7%    keep the remainder modulo 10000000
}fI         end for loop
A%          get the last digit

หมายเหตุ:ภาษานี้ใหม่กว่าคำถามมาก



2

05AB1E , 4 ไบต์

!0м¤

ลองออนไลน์!

คำอธิบาย

!0    # Push the factorial of the input and 0
  м   # Remove the occurences of 0 in the factorial
   ¤  # Push the last element, implicit display

1
รุ่น TIO หมดเวลา (60 วินาที) ในกรณีทดสอบล่าสุด - คุณได้รับภายใน 10 วินาทีใน "เครื่องที่เหมาะสม" ได้อย่างไร
Toby Speight

2

เยลลี่ 4 ไบต์

!Ṛȯ/

ลองออนไลน์!

คำอธิบาย

ใช้ความจริงที่ว่าเมื่อ(ย้อนกลับรายการ; ไม่ vectorize) ถูกนำไปใช้กับจำนวนเต็มมันจะใช้เวลาD(หลัก) ก่อนโดยอัตโนมัติ

ด้วยอินพุต 8:

!Ṛȯ/
!     Factorial: 8! = 40320
 Ṛ    Reverse: [0,2,3,0,4]
   /  Reduce by...
  ȯ   ...logical OR: ((((0ȯ2)ȯ3)ȯ0)ȯ4) = first truthy element = 2

ฉันไม่คิดว่าจะมีองค์ประกอบ "ความจริงแรก" หนึ่งไบต์ (ซึ่งȯ/ทำหน้าที่เป็น) แต่ถ้ามีก็จะสามารถย่อให้เหลือสามไบต์ทั้งหมด


2

Java (OpenJDK 8) , 62 ไบต์

n->{long f=n;for(;n>1||f%10==0;)f=n>1?f*--n:f/10;return f%10;}

ลองออนไลน์!

คล้ายกับ @Kevin Cruijssen แต่ประหยัดได้ 5 ไบต์ด้วยการรวมลูป


ยินดีต้อนรับสู่ PPCG! โพสต์แรกที่ดี! หวังว่าคุณจะไปรอบ ๆ !
Rɪᴋᴇʀ

ยินดีต้อนรับสู่ PPCG! ฉันเห็นด้วยกับ @Riker โพสต์แรกที่ดี ทำได้ดีมากการเล่นรหัสของฉันด้วยการรวมลูป คุณสามารถกอล์ฟ 1 ไบต์เพิ่มเติมในคำตอบของคุณในปัจจุบันโดยการแทนที่||ด้วย|และไบต์เพิ่มเติมโดยการแทนที่ด้วย==0 <1เพลิดเพลินไปกับการพักผ่อนของคุณ!
Kevin Cruijssen

2

C, 150 140 135 ไบต์

r,d;f(k,x){r=x<5?3:f(k+1,x/5);return(d=x%5)?r*"33436"[d]*(1<<d*k%4)%5:r;}main(int c,char**v){c=atoi(*++v);printf("%d",c<2?1:2*f(0,c));}

นี่เป็นเวอร์ชั่นสำหรับระบบ ASCII; แทนที่สตริง33436ด้วย11214สำหรับระบบ EBCDIC หรือด้วย\1\1\2\1\4โปรแกรมพกพา

การแก้ปัญหา C นั้นค่อนข้าง จำกัด โดยความต้องการในการจัดหาโปรแกรมเต็มรูปแบบ อย่างไรก็ตามสิ่งนี้จะตอบคำถามได้อย่างเต็มที่

ลองออนไลน์ (ต้องใช้ Javascript):

คำอธิบาย

มันขึ้นอยู่กับอัลกอริทึมที่ระบุไว้ในNon-Zero Digit ที่สำคัญน้อยที่สุดของ n! หันกลับมาเพื่อที่เราจะได้เข้าไปค้นหาพลังสูงสุดห้าและทำการคำนวณให้ได้ ตารางค่าคงที่มีขนาดใหญ่เกินไปดังนั้นฉันจึงลดความมันลงโดยการค้นหาความสัมพันธ์ระหว่างส่วนที่เหลือก่อนหน้าจำนวนrหลักปัจจุบันdและความลึกแบบเรียกซ้ำk:

     0    1       2       3    4  =d
  0  0  3×2^k  1×2^2k  3×2^3k  2
  1  1  1×2^k  2×2^2k  1×2^3k  4
r 2  2  2×2^k  4×2^2k  2×2^3k  3
  3  3  3×2^k  3×2^2k  3×2^3k  2
  4  4  4×2^k  4×2^2k  4×2^3k  1

สำหรับการr>0แก้นี้ให้คงที่ครั้งrครั้ง2^dk(สมัย 5) ค่าคงที่อยู่a[]ด้านล่าง (ขีดเส้นใต้ในรหัส golfed) นอกจากนี้เรายังสังเกตได้ว่า(2^4)%5เป็น 1 intเพื่อให้เราสามารถลดตัวแทนเพื่อหลีกเลี่ยงการล้นช่วงของ

const int a[] = { 1, 1, 2, 1, 4 };
int f(int k, int x){
    int r = x<5 ? 3 : f(k+1,x/5); /* residue - from recursing to higher-order quinary digits */
    int d = x%5;
    if (!d)
        return r;
    return r * a[d] * (1<<d*k%4) % 5;
}

int main(int c, char **v)
{
    c = atoi(*++v);
    printf("%d",
           c<2
           ? 1                  /* special-case 0 & 1 */
           : 2*f(0,c));         /* otherwise, it's 2 times r */
}

แบบทดสอบ:

$ for i in 100 1000 10000 100000; do echo $i: `./694 $i`; done
100: 4
1000: 2
10000: 8
100000: 6
1000000: 4

ประสิทธิภาพก็น่านับถือเช่นกัน นี่คืออินพุตสูงสุดสำหรับระบบที่มี 32- บิตint:

$ time ./694 2147483647
8
real    0m0.001s
user    0m0.000s
sys     0m0.000s

ฉันได้รับการกำหนดเวลาเดียวกันด้วยสูงสุด 64 บิตintด้วย


1
อาจเป็นที่สนใจที่จะทราบว่า2147483647!มีมากกว่า 19 พันล้านหลักและ(2^63-1)!มากกว่า 170,000,000,000,000,000,000 หลักดังนั้นนี่จึงเป็นชัยชนะครั้งใหญ่ในการคำนวณแฟคทอเรียล 1000000!ตามที่ระบุในคำถามเป็นไปได้ในการคำนวณบนฮาร์ดแวร์ปัจจุบัน นั่นเป็นเพียง5½ล้านหลัก :-)
Toby Speight

1

PHP - 105

 <?foreach(explode("\n",`cat`)as$n)if($n){$f=rtrim(gmp_strval(gmp_fact($n)),'0');echo substr($f,-1)."\n";}

ทำงานต่ำกว่า 10 วินาทีด้วย testcase ที่กำหนด


1

Python3

239 ตัวอักษร

สามารถทำ10,000ใน ~ 3.2 วินาที (Ideone ตัดฉันออกที่ 8 วินาทีฉันแน่ใจว่ามันจะใช้เวลานานกว่า 10 วินาทีแม้ว่า :()

from functools import *
N=100
r=range
s=(p for p in r(2,N)if all(p%n>0for n in r(2,p)))
f=lambda n,x:n//x+(n//x>0and f(n//x,x)or 0)
e=list([p,f(N,p)]for p in s)
e[0][1]-=e[2][1]
e[2][1]=0
print(reduce(lambda x,y:x*y,map(lambda x:x[0]**x[1],e))%10)

Python2.6

299 Chars (เร็วขึ้นเล็กน้อย)

from itertools import *
N=100000
r=xrange
def s(c=count(2)):
        while 1:p=c.next();c=ifilter(p.__rmod__,c);yield p
f=lambda n,x:n//x+(n//x>0and f(n//x,x)or 0)
e=[[p,f(N,p)]for p in takewhile(lambda x:x<N,s())]
e[0][1]-=e[2][1]
e[2][1]=0
print(reduce(lambda x,y:x*y,map(lambda x:pow(x[0],x[1],10),e))%10)

1

Haskell, 78 ตัวอักษร

f n=head$dropWhile(=='0')$reverse$show$product[1..n]
main=interact(show.f.read)

(อาจต้องมีการรวบรวมเพื่อคำนวณ 1,000,000! ใน 10 วินาที)


บันทึกสองตัวอักษรแทนที่foldl1ด้วยproduct(cf codegolf.stackexchange.com/questions/607/find-the-factorial/ ...... ) แต่คุณลองด้วย 1000000 จริง ๆ ! ?
JB

PS: ไม่ใช่โปรแกรมที่สมบูรณ์
JB

ขออภัยทำก่อนที่จะมีการชี้แจงในความคิดเห็น ฉันจะอัปเดต
stusmith

1

J - 42 40 ตัวอักษร

โปรแกรมทั้งหมด jconsole script.ijs 1234บันทึกโปรแกรมนี้ในไฟล์และทำงานด้วย ขอให้สังเกตว่าโปรแกรมนี้ไม่ได้ออกจากล่ามหลังจากพิมพ์ผลลัพธ์ พิมพ์^Dหรือexit]0เพื่อออกจากล่าม

echo([:{:@(#~*)10&#.inv@*)/1+i.".>{:ARGV

นี่คือคำอธิบาย:

  • x #. yตีความเวกเตอร์จำนวนเต็มyเป็นxตัวเลขฐาน ตัวอย่างเช่นอัตราผลตอบแทน10 #. 1 2 3 41234
  • u invถัวเฉลี่ยผกผันuของคำกริยา โดยเฉพาะอย่างยิ่งx #. inv yแสดงyว่าเป็นxหมายเลขฐาน ตัวอย่างเช่นอัตราผลตอบแทน10 #. 1234 1 2 3 4ขอให้สังเกตว่าinvถูกกำหนดให้เป็น^:_1ซึ่งก็คือuใช้เวลา -1
  • x * yเป็นผลคูณของxและyทำให้ได้x 10&#.inv@* yค่าฐาน -10 แทนค่าของxและyและ
  • x # yคัดลอกรายการn-ของyบ่อยเท่าที่รายการn-ของx; เมื่อxใดที่เวกเตอร์ของ booleans xเลือกรายการที่yจะใช้ ตัวอย่างเช่น 1 0 1 0 # 1 2 3 4ผลผลิต1 3อัตราผลตอบแทน
  • * yถัวเฉลี่ยSignumของyของ
  • x u~ yเป็นสะท้อนของu, ที่อยู่, y u xเช่นเดียวกับ
  • ดังนั้นy #~ * yผลผลิตเวกเตอร์ของทุกรายการyที่เป็นบวก ในสัญกรณ์โดยปริยายนี้สามารถเขียนด้วยเบ็ด(#~ *)เป็น
  • {: yyอัตราผลตอบแทนถัวรายการสุดท้ายใน
  • ([:{:@(#~*)10&#.inv@*)ชุมนุมกันที่เราได้รับวลีโดยปริยาย
  • u/ yคือการลดลงของการyที่เป็นคำกริยา dyadic แทรกระหว่างองค์ประกอบของu yยกตัวอย่างเช่น+/1 2 3 4เป็นเหมือนและอัตราผลตอบแทน1 + 2 + 3 + 410
  • ดังนั้นคำพูดที่ว่าอัตราผลตอบแทนหลักสุดท้ายของผลิตภัณฑ์ของรายการของ([:{:@(#~*)10&#.inv@*)/ yy
  • ARGV เป็นเวกเตอร์ชนิดบรรจุกล่องของอาร์กิวเมนต์บรรทัดคำสั่ง
  • ".>{:ARGV เป็นอาร์กิวเมนต์สุดท้ายที่ไม่ได้ทำกล่องและตีความเป็นตัวเลข
  • i. y คำนวณตัวเลขธรรมชาติจาก 0y - 1เพื่อ
  • ดังนั้น1+i. yผลตอบแทนถัวเฉลี่ยจำนวนธรรมชาติจากไป1 yฉันสามารถใช้ส่วน>: เพิ่มได้ ที่นี่ แต่1+ชัดเจนกว่าด้วยค่าใช้จ่ายของตัวละครเดียวกัน
  • โปรแกรมทั้งหมดเพียงแค่ใช้1+i.".>{:ARGV(เวกเตอร์ของ1ไปยังหมายเลขในอาร์กิวเมนต์บรรทัดคำสั่งสุดท้าย) กริยาและพิมพ์ผลด้วย([:{:@(#~*)10&#.inv@*)/echo


1

R , 63 55 51 46 46 ไบต์

คำนวณแฟคทอเรียล, แยกตัวเลขที่ไม่ใช่ศูนย์สุดท้าย ขอบคุณ Giuseppe ที่ให้บริการโครงสร้างพื้นฐาน

(y=(gamma(scan()+1))%/%10^(0:1e5)%%10)[!!y][1]

ลองออนไลน์!

อีกวิธีหนึ่งคำตอบ 51 ไบต์เก่าของฉัน:

คำนวณแฟกทอเรียลแปลงเป็นอักขระลบ0s ทั้งหมดแล้วใช้อักขระตัวสุดท้าย บันทึก 2 ไบต์ต้องขอบคุณ Giuseppe

substring(x<-gsub("0","",gamma(scan())+1),nchar(x))

ลองออนไลน์!


1
gamma(x+1)สั้นกว่าfactorial(x)
Giuseppe

ไม่มีการแปลงสตริงสิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือ(y=(x<-gamma(scan()+1))%/%10^(0:nchar(x))%%10)[!!y][1]54 ไบต์
Giuseppe

@Giuseppe เราสามารถแทนที่nchar(x)ด้วย1e5โซลูชัน 46 ไบต์! ยินดีที่ได้
rturnbull


1

Perl 6 ,  26  35 ไบต์

{[*](1..$_)~~/.*<(<-[0]>/}

ลองมัน


ในฐานะโปรแกรมเต็มรูปแบบ:

put [*](1..@*ARGS[0])~~/.*<(<-[0]>/

ลองมัน

ขยาย:

{
  [*]( 1..$_ ) # reduce using &infix:« * »
  ~~           # match with
  /
    .*         # any number of values (so it matches from the end)
    <(         # only capture the following
    <-[0]>     # any value but 0 (negated character class)
  /
}

1

C (gcc) , 72 ไบต์ (ฟังก์ชั่น)

f(n,d)long long n,d;{for(d=1;n;d%=10000)for(d*=n--;d%10<1;d/=10);d%=10;}

ลองออนไลน์!

C (gcc) , 101 99 ไบต์ (โปรแกรมทั้งหมด)

main(){long long n,d=1;for(scanf("%lld",&n);n;d%=10000)for(d*=n--;d%10<1;d/=10);printf("%d",d%10);}

ลองออนไลน์!

คำถามนี้แค่ 8 ปีเพราะ "เครื่องจักรที่สมเหตุสมผล" นั้นไม่เหมือนเดิม แต่ฉันได้รับเวลา ~ 0.01 วินาทีในคอมพิวเตอร์ของฉันเมื่อทำกรณีทดสอบทั้งหมดเข้าด้วยกันดังนั้นถ้าคอมพิวเตอร์มีความเร็วเพิ่มขึ้น โดย 1,000 ปัจจัยในทศวรรษที่ผ่านมามันควรจะดี


กฎของมัวร์ยังคงถืออยู่ดังนั้นควรเร็วขึ้นประมาณ 16 เท่า
ASCII- เท่านั้น

นอกจากนี้ฟังก์ชั่นยังใช้ได้
เพียง ASCII เท่านั้น


0

ทูตขนาด 26 ไบต์

Last@`\&:(All@V)@Digits@`!

ลองออนไลน์!

คำอธิบาย

Last@`\&:(All@V)@Digits@`!

นี่คือองค์ประกอบของ 4 ฟังก์ชั่น:

  • `! - นี่เป็นเวอร์ชั่นที่ใช้งานได้ของผู้ประกอบการแบบแฟกทอเรียล
  • Digits - นี่จะได้ตัวเลขของแฟคทอเรียล
  • \&:(All@V)- นี่คือฟังก์ชั่นการเลือก มันทำงานได้โดย left-bonding ( &:) ฟังก์ชั่นAll@Vถึง\ซึ่งเลือก ในทางกลับกันAll@Vก็เป็นวิธีสั้น ๆ ในการทดสอบว่าตัวเลขไม่ใช่ 0 มันทำงานได้โดยการส่งสัญญาณไปยังเวกเตอร์0 -> [0]จากนั้นทำการสอบถามว่าสมาชิกทั้งหมดนั้นเป็นจริงหรือไม่ (เช่นไม่ใช่ 0) สิ่งนี้จะให้ตัวเลขของตัวเลขที่ไม่มี 0
  • Last - นี่เป็นเพียงการรับสมาชิกล่าสุดของอาร์เรย์นี้

ดูเหมือนว่าจะช้าอย่างไม่น่าเชื่อ - TIO หมดเวลา (1 นาที) ในกรณีทดสอบ 100000 - คุณได้ผลลัพธ์ 1000000 ภายใน 10 วินาทีได้อย่างไร
Toby Speight

@TobySpeight เมื่อฉันตอบคำถามนี้ความต้องการเฉพาะนั้นไม่ได้อยู่ที่นั่น (ตรวจสอบประวัติการแก้ไข)
Conor O'Brien

อ่าฉันควรจะดูประวัติ! คุณยืนยันผลการทดสอบทั้งหมดในคำถามได้หรือไม่
Toby Speight

ดูเหมือนว่าจะมีคำตอบที่วุ่นวายในช่วงเวลาที่ จำกัด เวลาถูกลบออกจากคำถาม - นั่นเป็นเรื่องที่โชคร้ายจริงๆ
Toby Speight

@TobySpeight ใช่ฉันทำ มันโชคร้ายและฉันไม่แน่ใจเกี่ยวกับนโยบายที่เกี่ยวข้องกับเรื่องนี้
Conor O'Brien

0

APL (Dyalog Unicode) , 18 15 ไบต์

{⊢/⍵/⍨0≠⍎¨⍵}⍕∘!

ลองออนไลน์!

ฟังก์ชั่นนำหน้า Tacit ส่งคืนตัวเลขที่ถูกต้องสำหรับกรณีทดสอบเดียวหรือสตริงตัวเลขสำหรับกรณีทดสอบหลายรายการ

ขอบคุณ @ Adámและ @ErikTheOutgolfer สำหรับ 3 ไบต์

อย่างไร?

{⊢/⍵/⍨0≠⍎¨⍵}⍕∘!  Main function. Argument is a number following the !.
              !  Factorial
                then
                Format (stringify)
        ⍎¨⍵}     Execute (turn to number) each digit of the argument
      0         Check if each is 0. This returns a boolean vector
                Swap arguments for the following fn/op
   ⍵/            Replicate. This takes a boolean vector as left arg and returns the truthy elements of the right arg. E.g.: 1 1 0/1 2 3  1 2.
{⊢/              Reduce. This returns the rightmost (last) element of a vector argument.

0

APL NARS 28 ไบต์ 14 ตัวอักษร

{↑≠v/v←⌽⍎¨⍕!⍵}

ฉันไม่รู้ว่าทำไม แต่ผ่านการทดสอบนี้:

  q←{↑≠v/v←⌽⍎¨⍕!⍵}       
  q¨1 2 3 4 5 6 7 8 9 10 11 12 13 14
1 2 6 4 2 2 4 2 8 8 8 6 8 2 

0

AWK , 47 57 ไบต์

{for(p=$1;--$1;p=(p*$1)%1e4)while(!(p%10))p/=10;$0=p%10}1

ลองออนไลน์!

โซลูชันดั้งเดิมไม่สามารถจัดการกับค่าอินพุต "ใหญ่" ได้เป็นอย่างดี อาจเพิ่ม-Mเพื่อบังคับให้ทำงาน แต่ยังต้องใช้เวลาในการประมวลผลมากขึ้น


ใช่ @TobySpeight infไม่%ดีมาก :(
Robert Benson

อ่า ... ดูคำถามที่ฉันตอบรุ่นจำนวนมากไม่จำเป็น
Robert Benson

-2

Japt , 6 ไบต์

มากับ 6 byters ที่แตกต่างกันเล็กน้อย แต่ฉันชอบอันนี้ที่สุด ฉันเชื่อว่าต้องมีวิธีที่จะทำใน 5 แม้ว่า

Êsw ìv

ลองมัน


คำอธิบาย

Êคำนวณแฟกทอเรียลของอินพุตsแปลงเป็นสตริงและกลับไปเป็นจำนวนเต็มหลังจากwกลับรายการแล้วìแปลงผลลัพธ์เป็นอาร์เรย์ของตัวเลขและvส่งกลับองค์ประกอบแรก


ทางเลือก

Êì w æ
ÊìÈf Ì
Êì f o
Êsw sg
Êìf ìo
Êìf ìÌ

ต้องใช้เวลานานเท่าไรในการดำเนินการกรณีทดสอบทั้งหมด?
Toby Speight

@TobySpeight; มันง่ายมากที่จะทดสอบโดยไปที่ลิงค์เพื่อทดลองใช้ โปรดทราบว่ากรณีทดสอบ 4 รายการสุดท้ายจะล้มเหลวเนื่องจากแฟคทอเรียลมีขนาดใหญ่กว่าจำนวนเต็มสูงสุดของ JavaScript
Shaggy

ดังนั้นมันไม่ได้แก้ปัญหาจริงเหรอ? คำถามที่บอกว่ามันต้องประสบความสำเร็จสำหรับ1 ≤ N ≤ 1,000,000 คำตอบอื่น ๆ แสดงให้เห็นว่าคุณไม่จำเป็นต้องเก็บแฟกทอเรียลเพื่อคำนวณคำตอบ
Toby Speight

ฉันลองทดสอบออนไลน์ แต่หมดเวลาในกรณีทดสอบครั้งแรกที่ฉันลอง (1,000)
Toby Speight

-2

Perl 5 , 36 + 10 ( -p -Mbigint) = 46 ไบต์

$"=$_;$_*=$"while$"-=1;($_)=/(.)0*$/

ลองออนไลน์!


รุ่น TIO ล้มเหลวในสองกรณีทดสอบแรกที่ฉันลอง: 1000000 ⇒ f(ควรเป็น4 ) และ 100 ⇒ 7(ควรเป็น4 )
Toby Speight

มันมีขนาดใหญ่เกินไป รุ่นใหม่ทำงานโดยใช้ bigint การแสดงยังคงทิ้งบางสิ่งบางอย่างไว้ให้เป็นที่ต้องการเนื่องจากเป็นการคำนวณแรงเดรัจฉาน นั่นหมายความว่าหมดเวลาสำหรับ TIO สำหรับจำนวนที่มากขึ้น
Xcali
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.