เลขศูนย์ในตอนท้ายของแฟคทอเรียล


35

เขียนโปรแกรมหรือฟังก์ชั่นที่ค้นหาจำนวนศูนย์ในตอนท้ายของn!ฐาน 10 ซึ่งnเป็นหมายเลขอินพุต (ในรูปแบบที่ต้องการ)

มันสามารถสันนิษฐานได้ว่าnเป็นจำนวนเต็มบวกซึ่งหมายความว่าn!เป็นจำนวนเต็มด้วย n!มีเลขหลังจุดทศนิยมในไม่มี นอกจากนี้ก็อาจจะคิดว่าการเขียนโปรแกรมภาษาของคุณสามารถจัดการค่าของและnn!


กรณีทดสอบ

1
==> 0

5
==> 1

100
==> 24

666
==> 165

2016
==> 502

1234567891011121314151617181920
==> 308641972752780328537904295461

นี่คือรหัสกอล์ฟ ใช้กฎมาตรฐาน รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

การส่ง

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

# Perl, 43 + 2 (-p flag) = 45 bytes

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

ลีดเดอร์บอร์ด

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา



เราสมมติได้ไหมว่า n! จะพอดีกับประเภทจำนวนเต็มในภาษาของเราหรือไม่
Alex A.

@AlexA ใช่คุณสามารถ.
Arcturus

สามารถnเป็นสตริงอินพุตได้หรือไม่
Conor O'Brien

15
ฉันคิดว่านี่จะเป็นคำถามที่ดีกว่าถ้าคุณไม่ได้รับอนุญาตให้คิดว่าn!จะเหมาะกับประเภทจำนวนเต็มของคุณ! บางทีอีกครั้ง
Simmons

คำตอบ:


43

Python 2, 27 ไบต์

f=lambda n:n and n/5+f(n/5)

เลขลงท้ายจะถูก จำกัด ด้วยปัจจัย 5 จำนวนหลายแห่ง5ที่มีมากที่สุดnคือn/5(ที่มีการแบ่งชั้น) 25, 125, ...แต่นี้ไม่นับปัจจัยซ้ำหลายรายการ เพื่อให้ได้เหล่านั้นหารnด้วย 5 และแบ่งเงิน


19

เยลลี่ 5 ไบต์

!Æfċ5

ใช้วิธีการต่อต้านในการค้นหาแฟคทอเรียลจากนั้นแยกตัวประกอบอีกครั้งโดยตรวจสอบเลขยกกำลัง 5 ในการแยกตัวประกอบเฉพาะ

ลองออนไลน์!

!              Factorial
 Æf            List of prime factors, e.g. 120 -> [2, 2, 2, 3, 5]
   ċ5          Count number of 5s

4
Yikes พูดคุยเกี่ยวกับการแลกเปลี่ยน! ในการรับโค้ดขนาดไม่เกิน 5 ไบต์ให้เพิ่มหน่วยความจำและเวลาด้วยจำนวนไร้สาระ
Ross Presser

19

Mornington Crescent, 1949 1909 ไบต์

Take Northern Line to Bank
Take Circle Line to Bank
Take District Line to Parsons Green
Take District Line to Cannon Street
Take Circle Line to Victoria
Take Victoria Line to Seven Sisters
Take Victoria Line to Victoria
Take Circle Line to Victoria
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take District Line to Turnham Green
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Turnham Green
Take District Line to Bank
Take Circle Line to Hammersmith
Take Circle Line to Blackfriars
Take Circle Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Bank
Take Circle Line to Blackfriars
Take District Line to Upminster
Take District Line to Temple
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Bank
Take Circle Line to Blackfriars
Take Circle Line to Hammersmith
Take District Line to Becontree
Take District Line to Cannon Street
Take District Line to Becontree
Take District Line to Cannon Street
Take District Line to Becontree
Take District Line to Blackfriars
Take Circle Line to Bank
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Bank
Take Circle Line to Bank
Take Northern Line to Angel
Take Northern Line to Bank
Take Circle Line to Bank
Take District Line to Upminster
Take District Line to Bank
Take Circle Line to Bank
Take Northern Line to Mornington Crescent

-40 ไบต์ขอบคุณ NieDzejkob


และนี่คือคำตอบที่ฉันโหวตสูงสุด
pppery

3
คำอธิบายสั้น ๆ สำหรับพวกเราที่ได้รับMornington Crescent-challenged จะเจ๋ง :)
Robert Benson

-40 ไบต์โดยใช้ชื่อบรรทัดที่สั้นกว่าถ้าเป็นไปได้
NieDzejkob

18

Pyth, 6 ไบต์

/P.!Q5

ลองที่นี่

/    5   Count 5's in
 P        the prime factorization of
  .!Q      the factorial of the input.

ทางเลือก 7 ไบต์ :

st.u/N5

การลดการสะสม.u/N5แบบแบ่งชั้นซ้ำ ๆ5จนกว่าจะได้รับการทำซ้ำซึ่งในกรณีนี้จะเกิดขึ้นหลังจากที่โดน 0

34 -> [34, 6, 1, 0]

องค์ประกอบแรกจะถูกลบออก ( t) และส่วนที่เหลือจะถูกรวม ( s)


13

ที่จริงแล้ว 10 ไบต์

!$R;≈$l@l-

ลองออนไลน์!

โปรดทราบว่ากรณีทดสอบล่าสุดล้มเหลวเมื่อรันอย่างจริงจังบน CPython เนื่องจากmath.factorialใช้ส่วนขยาย C (ซึ่ง จำกัด อยู่ที่จำนวนเต็ม 64 บิต) การใช้งาน PyPy อย่างจริงจังนั้นใช้ได้ผลดี

คำอธิบาย:

!$R;≈$l@l-
!           factorial of input
 $R         stringify, reverse
   ;≈$      make a copy, cast to int, then back to string (removes leading zeroes)
      l@l-  difference in lengths (the number of leading zeroes removed by the int conversion)

3
โอ้ว้าวฉันชอบวิธีที่วิธีนี้ไม่ใช้การหารด้วย 5 เคล็ดลับ
Arcturus

ฉันนับ 12 ไบต์ต่อหนึ่งนี้
คะแนน _ ต่ำกว่า

1
@Score_Under จริงใช้หน้ารหัส CP437 ไม่ใช่ UTF-8 อักขระแต่ละตัวมีหนึ่งไบต์
Mego

9

Haskell, 26 ไบต์

f 0=0
f n=(+)=<<f$div n 5

ชั้นแบ่งอินพุตโดย5จากนั้นเพิ่มผลลัพธ์ให้กับฟังก์ชันที่เรียกใช้ การแสดงออก(+)=<<fยิงอินพุตและเอาต์พุตxx+(f x)

ย่อจาก:

f 0=0
f n=div n 5+f(div n 5)

f 0=0
f n|k<-div n 5=k+f k

นิพจน์ที่ไม่ใช่แบบเรียกซ้ำมีขนาด 28 ไบต์:

f n=sum[n`div`5^i|i<-[1..n]]

คือiนับจาก1..n?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴใช่ แต่ขึ้นอยู่กับlog_5(n)เรื่องเท่านั้นส่วนที่เหลือให้ 0
xnor

8

MATL , 9 ไบต์

:"@Yf5=vs

ลองออนไลน์!

วิธีนี้ใช้ได้ผลกับตัวเลขจำนวนมากเนื่องจากไม่ต้องใช้แฟคทอเรียล

เช่นเดียวกับคำตอบอื่น ๆ การหาประโยชน์จากข้อเท็จจริงที่ว่าจำนวนครั้งที่2ปรากฏเป็นตัวหารของแฟคทอเรียลนั้นมากกว่าหรือเท่ากับจำนวนครั้งที่5ปรากฏ

:     % Implicit input. Inclusive range from 1 to that
"     % For each
  @   %   Push that value
  Yf  %   Array of prime factors
  5=  %   True for 5, false otherwise
  v   %   Concatenate vertically all stack contents
  s   %   Sum

6

05AB1E, 5 ไบต์

จะเป็น 4 ไบต์ถ้าเรารับประกันได้ว่า n> 4

รหัส:

Î!Ó7è

คำอธิบาย:

Î        # push 0 then input
  !      # factorial of n: 10 -> 2628800
   Ó     # get primefactor exponents -> [8, 4, 2, 1]
    7è   # get list[7] (list is indexed as string) -> 2
         # implicit output of number of 5s or 0 if n < 5

โซลูชัน 6 ไบต์ที่สลับกันเร็วขึ้นมาก:ได้แรงบันดาลใจจากคำตอบ MATL ของ Luis Mendo

LÒ€`5QO

คำอธิบาย:

L         # push range(1,n) inclusive, n=10 -> [1,2,3,4,5,6,7,8,9,10]
 Ò        # push prime factors of each number in list -> [[], [2], [3], [2, 2], [5], [2, 3], [7], [2, 2, 2], [3, 3], [2, 5]]
  €`      # flatten list of lists to list [2, 3, 2, 2, 5, 2, 3, 7, 2, 2, 2, 3, 3, 2, 5]
    5Q    # and compare each number to 5 -> [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
      O   # sum -> 2

แก้ไข:โซลูชันที่ลบออกโดยใช้¢ (นับ) เนื่องจากจำนวนเฉพาะทั้งหมดที่มี 5 จะถูกนับเป็น 5 เช่น 53

แก้ไข 2:เพิ่มโซลูชันที่มีประสิทธิภาพมากขึ้นสำหรับการป้อนข้อมูลที่สูงขึ้นเมื่อเปรียบเทียบ


ใช่แทน, 5Qควรจะทำงาน คำตอบที่ดีแม้ว่า! :)
Adnan

ฉันกำลังจะไปทดสอบในปัจจัยการผลิตขนาดใหญ่ที่มีความคิดเห็น "จะไม่นี้ล้มเหลวถ้าเอาท์พุทเป็น> 9" แต่การดำเนินงานเด็ก 05AB1E ของÓคือช้า
SP3000

Btw โค้ดแรกยังสามารถเป็นÎ!Ó2éได้ ข้อผิดพลาดคงที่เมื่อวานนี้
Adnan

หากคุณใช้ utf-8 Î!Ó7èคือ 8 ไบต์และวิธีแก้ปัญหา "6 ไบต์" คือ 10 ไบต์
Score_Under

@Score_Under ใช่ถูกต้อง อย่างไรก็ตาม 05AB1E ใช้การเข้ารหัส CP-1252
Adnan

6

Matlab (59) (54)(39)

เฮ้ dawg !!!! เราได้ยินมาว่าคุณชอบคณิตศาสตร์ ....

  @(n)sum(fix(n./5.^(1:fix(log(n)/1.6))))
  • นี้อยู่บนพื้นฐานของฉันสร้างคำตอบในการตรวจสอบรหัส

  • ยิ่งกว่าที่กล่าวไว้ในคำตอบของฉันในการทบทวนโค้ดสูตรสำหรับจำนวนศูนย์ในแฟคทอเรียล (n) คือ Sum (n / (5 ^ k)) โดยที่ k แตกต่างกันระหว่าง 1 และ log_5 (n)

  • เหตุผลเล็กน้อยที่ทำไมมันถึงไม่สามารถเล่นกอล์ฟได้นั่นคือมันlog5ไม่มีใน MATLAB เป็นแบบ builtin ดังนั้นฉันจึงแทนที่ log (5) โดย 1.6 ไม่เป็นไรเพราะมันจะถูกปูพื้น

ให้มันลอง


คำถามสองสามข้อ 1. คุณเรียกใช้สิ่งนี้ใน Matlab ได้อย่างไร? 2. ผลลัพธ์สำหรับ n = 1 คืออะไร
Stuart Bruff

@ StuartBruff เพื่อเรียกใช้ ans ประเภทนี้ (1) และมันคืนค่า 0
Abr001am

ตกลง. ขอบคุณ น่าสนใจ ฉันไม่ได้ใช้ฟังก์ชั่นในการจัดการกับ Matlab มากนักดังนั้นมันจึงสับสนนิดหน่อยกับวิธีใช้มัน ... ทำไม ans () ถึงไม่นับรวม? คำตอบที่ดี แต่ฉันลองมันใน Mathcad แต่ต้องแก้ไขขีด จำกัด บนของผลรวมเนื่องจาก Mathcad ทำการคำนวณอัตโนมัติโดยรวมตัวแปรการรวมกันถ้า "บน" น้อยกว่าขีด จำกัด "ต่ำ" (และด้วยเหตุนี้คำถามของฉันเกี่ยวกับ 0)
Stuart Bruff

5

Mathematica ขนาด 20 ไบต์

IntegerExponent[#!]&

IntegerExponentนับศูนย์ เพื่อความสนุกนี่คือเวอร์ชันที่ไม่คำนวณแฟคทอเรียล:

Tr[#~IntegerExponent~5&~Array~#]&

ฉันคิดว่าArrayบันทึกไบต์บนโซลูชันที่สอง
Martin Ender

5

C, 28 ไบต์

f(n){return(n/=5)?n+f(n):n;}

คำอธิบาย

จำนวนศูนย์ต่อท้ายเท่ากับจำนวนของห้าที่ทำขึ้นแฟคทอเรียล ของทุกหนึ่งในห้าของพวกเขามีส่วนร่วมในห้าดังนั้นเราจึงเริ่มต้นด้วย1..n n/5ในจำนวนเหล่านี้n/5หนึ่งในห้ามีค่าเป็นทวีคูณของ 25 ดังนั้นมีส่วนเพิ่มเป็นห้าและอื่น ๆ เราจบลงด้วยซึ่งเป็นf(n) = n/5 + n/25 + n/125 + ... f(n) = n/5 + f(n/5)เราจำเป็นต้องยกเลิกการเรียกซ้ำเมื่อnถึงศูนย์ นอกจากนี้เรายังใช้ประโยชน์จากจุดลำดับที่ที่?:จะหารnก่อนการบวก

ในฐานะโบนัสรหัสนี้เร็วกว่าสิ่งที่เยี่ยมชมแต่ละครั้ง1..n(และเร็วกว่าการคำนวณแฟคทอเรียล) มาก

โปรแกรมทดสอบ

#include<stdio.h>
#include<stdlib.h>
int main(int argc, char **argv) {
    while(*++argv) {
        int i = atoi(*argv);
        printf("%d: %d\n",i,f(i));
    }
}

ทดสอบผลลัพธ์

1: 0
4: 0
5: 1
24: 4
25: 6
124: 28
125: 31
666: 165
2016: 502
2147483644: 536870901
2147483647: 536870902


+1 สำหรับคำอธิบายที่ยอดเยี่ยม
Titus

4

JavaScript ES6, 20 ไบต์

f=x=>x&&x/5+f(x/5)|0

ชั้นเชิงเช่นเดียวกับคำตอบของ xnor แต่สั้นกว่า


4

Julia, 34 31 30 ไบต์

n->find(digits(prod(1:n)))[]-1

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่ยอมรับประเภทจำนวนเต็มใด ๆ ที่ลงนามและส่งกลับจำนวนเต็ม หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร กรณีทดสอบที่มีขนาดใหญ่นั้นจำเป็นต้องผ่านnประเภทที่มีขนาดใหญ่กว่าเช่น a BigInt.

เราคำนวณแฟคทอเรียลของn(การใช้ด้วยตนเองprodสั้นกว่าบิวท์อินfactorial) รับอาร์เรย์digitsในลำดับย้อนกลับfindดัชนีขององค์ประกอบที่ไม่ใช่ศูนย์รับดัชนีดังกล่าวก่อนและลบ 1

ลองออนไลน์! (รวมถึงทั้งหมดยกเว้นกรณีทดสอบครั้งสุดท้ายเพราะล่าสุดใช้เวลานานเกินไป)

บันทึกเป็นไบต์ขอบคุณ Dennis!



3

เรติน่า 33 ไบต์

ใช้อินพุตเป็น unary

ส่งคืนเอาต์พุตใน unary

+ `^ (? = 1) (1 {5}) * 1 *
$ # $ 1 * 1; $ # $ 1 *
;

(สังเกตการป้อนบรรทัดต่อท้าย)

ลองออนไลน์!

มันทำงานอย่างไร:

ขั้นตอนแรก:

+`^(?=1)(1{5})*1*
$#1$*1;$#1$*

ungolfed เล็กน้อย:

+`^(?=1)(11111)*1*\b
$#1$*1;$#1$*1

มันทำอะไร:

  • ประการแรกหาจำนวนที่มากที่สุดของ11111ที่สามารถจับคู่
  • แทนที่ด้วยหมายเลขนั้น
  • 5ได้อย่างมีประสิทธิภาพสูงจากพื้นโดยแบ่ง
  • Lookahead (?=1)ยืนยันว่าจำนวนเป็นบวก
  • +`วิธีการทำซ้ำจนกว่า idempotent
  • ดังนั้นขั้นแรกคือ "การแบ่งพื้นซ้ำ 5 ครั้ง"

หากอินพุตคือ 100 (เป็นเอกภาพ) ดังนั้นตอนนี้ข้อความจะเป็น:

;;1111;11111111111111111111

ขั้นตอนที่สอง:

;

เพียงลบเซมิโคลอนทั้งหมดออก


2

ทับทิมขนาด 22 ไบต์

หนึ่งในไม่กี่ครั้งที่ทับทิม0เป็นความจริงเป็นปัญหาสำหรับจำนวนไบต์

f=->n{n>0?f[n/=5]+n:0}

รอทำไมความ0จริง
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴใน Ruby nilและfalseเป็นเท็จและไม่มีอะไรอื่น มีหลายกรณีที่ช่วยในการเล่นกอล์ฟเนื่องจากมีความ0จริงหมายถึงฟังก์ชั่นดัชนีและดัชนี regex ใน Ruby กลับnilหากไม่มีการแข่งขันแทน-1และบางที่มันเป็นปัญหาเช่นสตริงว่างยังคงเป็นความจริง
หมึกมูลค่า

@ KevinLau-notKenny นั่นสมเหตุสมผลแล้ว
Conor O'Brien

2

Perl 6 , 23 ไบต์

{[+] -$_,$_,*div 50}
{sum -$_,$_,*div 5...0}

ฉันจะได้รับมันสั้นลงถ้า^...ถูกบันทึกอยู่ในPerl {sum $_,*div 5^...0}6
มันควรจะมีหน่วยความจำที่มีประสิทธิภาพมากขึ้นสำหรับตัวเลขที่มีขนาดใหญ่ขึ้นถ้าคุณเพิ่มlazyตัวดัดแปลงระหว่างsumและตัวสร้างลำดับ

คำอธิบาย:

{ # implicitly uses $_ as its parameter
  sum

    # produce a sequence
    -$_,     # negate the next value
     $_,     # start of the sequence

     * div 5 # Whatever lambda that floor divides its input by 5

             # the input being the previous value in the sequence,
             # and the result gets appended to the sequence

     ...     # continue to do that until:

     0       # it reaches 0
}

ทดสอบ:

#! /usr/bin/env perl6

use v6.c;
use Test;

my @test = (
     1,   0,
     5,   1,
   100,  24,
   666, 165,
  2016, 502,
  1234567891011121314151617181920,
        308641972752780328537904295461,

  # [*] 5 xx 100
  7888609052210118054117285652827862296732064351090230047702789306640625,
        1972152263052529513529321413206965574183016087772557511925697326660156,
);

plan @test / 2;

# make it a postfix operator, because why not
my &postfix:<!0> = {[+] -$_,$_,*div 5...0}

for @test -> $input, $expected {
  is $input!0, $expected, "$input => $expected"
}

diag "runs in {now - INIT now} seconds"
1..7
ok 1 - 1 => 0
ok 2 - 5 => 1
ok 3 - 100 => 24
ok 4 - 666 => 165
ok 5 - 2016 => 502
ok 6 - 1234567891011121314151617181920 => 308641972752780328537904295461
ok 7 - 7888609052210118054117285652827862296732064351090230047702789306640625 => 1972152263052529513529321413206965574183016087772557511925697326660156
# runs in 0.0252692 seconds

(บรรทัดสุดท้ายนั้นทำให้เข้าใจผิดเล็กน้อยเนื่องจาก MoarVM ต้องเริ่มโหลดคอมไพเลอร์ Perl 6 และรันไทม์รวบรวมรหัสและรันมันดังนั้นจริง ๆ แล้วมันใช้เวลาประมาณหนึ่งวินาทีครึ่ง
ซึ่งยังเร็วกว่า คือการตรวจสอบผลการทดสอบครั้งสุดท้ายกับ WolframAlpha.com)


2

Mathcad, [tbd] ไบต์

ป้อนคำอธิบายรูปภาพที่นี่

Mathcad เป็นประเภทของ "ไวท์บอร์ด" ทางคณิตศาสตร์ที่อนุญาตให้มีรายการของนิพจน์ข้อความและพล็อตแบบสองมิติ มันใช้สัญลักษณ์ทางคณิตศาสตร์สำหรับการดำเนินการหลายอย่างเช่นการรวมความแตกต่างและการรวม ตัวดำเนินการเขียนโปรแกรมเป็นสัญลักษณ์พิเศษซึ่งโดยปกติจะป้อนเป็นชุดแป้นพิมพ์เดียวของการควบคุมและ / หรือการเลื่อนบนคีย์มาตรฐาน

สิ่งที่คุณเห็นด้านบนเป็นลักษณะแผ่นงาน Mathcad มีลักษณะเหมือนกับที่พิมพ์ในและเป็น Mathcad ประเมินมัน ตัวอย่างเช่นการเปลี่ยน n จาก 2016 เป็นค่าอื่น ๆ จะทำให้ Mathcad อัปเดตผลลัพธ์จาก 502 เป็นค่าใหม่ใด ๆ

http://www.ptc.com/engineering-math-software/mathcad/free-download


วิธีการให้คะแนนความเท่าเทียมไบต์ของ Mathcad ยังไม่ได้รับการพิจารณา การใช้สัญลักษณ์ที่เทียบเท่ากันโซลูชันใช้เวลาประมาณ 24 "ไบต์" (สามารถป้อนโอเปอเรเตอร์ในขณะที่ใช้การรวมคีย์ "ctl-]" เท่านั้น (หรือจากแถบเครื่องมือ) วิธี Matlab ของ Agawa001 ใช้เวลาประมาณ 37 ไบต์เมื่อแปลเป็น Mathcad (ตัวดำเนินการรวมถูกป้อนโดย ctl-shft- $)


ฟังดูเป็นเครื่องมือที่น่าทึ่งในการจัดการฉันจะไม่สำรองไว้สำหรับการดาวน์โหลดครั้งที่สอง!
Abr001am

2

dc, 12 ไบต์

[5/dd0<f+]sf

ฟังก์ชันนี้กำหนดฟังก์ชันfที่ใช้อินพุตจากด้านบนของสแต็กและปล่อยเอาต์พุตที่ด้านบนของสแต็ก ดูคำตอบ C ของฉันสำหรับพื้นฐานทางคณิตศาสตร์ เราหารด้วย 5 ซ้ำ ๆ สะสมค่าบนสแต็กจากนั้นเพิ่มผลลัพธ์ทั้งหมด:

5/d   # divide by 5, and leave a copy behind
d0<   # still greater than zero?
f+    # if so, apply f to the new value and add

โปรแกรมทดสอบ

# read input values
?
# print prefix
[  # for each value
    # print prefix
    [> ]ndn[ ==> ]n
    # call f(n)
    lfx
    # print suffix
    n[  
]n
    # repeat for each value on stack
    z0<t
]
# define and run test function 't'
dstx

ทดสอบผลลัพธ์

./79762.dc <<<'1234567891011121314151617181920 2016 666 125 124 25 24 5 4 1'
1 ==> 0  
4 ==> 0  
5 ==> 1  
24 ==> 4  
25 ==> 6  
124 ==> 28  
125 ==> 31  
666 ==> 165  
2016 ==> 502  
1234567891011121314151617181920 ==> 308641972752780328537904295461  

1

Jolf, 13 ไบต์

Ώmf?H+γ/H5ΏγH

กำหนดฟังก์ชั่นซ้ำซึ่งเรียกว่าในการป้อนข้อมูล ลองที่นี่!

Ώmf?H+γ/H5ΏγH  Ώ(H) = floor(H ? (γ = H/5) + Ώ(γ) : H)
Ώ              Ώ(H) =
       /H5                           H/5
      γ                         (γ =    )
     +    Ώγ                              + Ώ(γ)
   ?H       H               H ?                  : H
 mf                   floor(                        )
               // called implicitly with input

1

J, 28 17 16 ไบต์

<.@+/@(%5^>:@i.)

ค่อนข้างเหมือนกับเทคนิคที่ไม่เกิดซ้ำจากคำตอบของ xnor


นี่เป็นรุ่นเก่าที่ฉันเก็บไว้ที่นี่เพราะฉันชอบมันมากกว่านี้โดยคิดเป็น 28 ไบต์:

+/@>@{:@(0<;._1@,'0'&=@":@!)

ในขณะที่ไม่ต้องการฉันได้รวมไว้x:ในกรณีทดสอบเพื่อเพิ่มความแม่นยำ

   tf0 =: +/@>@{:@(0<;._1@,'0'&=@":@!@x:)
   tf0 5
1
   tf0 100
24

   tf0g =: tf0"0
   tf0g 1 5 100 666 2016
0 1 24 165 502

หมายเลขสุดท้ายใช้ไม่ได้กับฟังก์ชั่นนี้

คำอธิบาย

นี้ทำงานโดยการคำนวณn!, '0'การแปลงไปยังสตริงและตรวจสอบสมาชิกแต่ละคนเพื่อความเท่าเทียมกันด้วย สำหรับn = 15กระบวนการนี้จะเป็น:

15
15! => 1307674368000
": 1307674368000 => '1307674368000'
'0' = '1307674368000' => 0 0 1 0 0 0 0 0 0 0 1 1 1

ตอนนี้เราใช้;._1เพื่อแยกรายการในองค์ประกอบแรก (ศูนย์), มวยแต่ละผลการแยกให้ผลกล่องเต็มไปด้วยเอซ ( a:) หรือวิ่งของ1s เช่น:

┌┬─┬┬┬┬┬┬┬─────┐
││1│││││││1 1 1│
└┴─┴┴┴┴┴┴┴─────┘

เรารับสมาชิกคนสุดท้าย ( {:) ปลดกล่องมัน ( >) และทำผลรวมของมัน+/โดยยอมจำนวนศูนย์

นี่คือรุ่นที่อ่านได้มากขึ้น:

split =: <;._1@,
tostr =: ":
is =: =
last =: {:
unbox =: >
sum =: +/
precision =: x:
n =: 15

NB. the function itself
tf0 =: sum unbox last 0 split '0' is tostr ! precision n
tf0 =: sum @ unbox @ last @ (0 split '0'&is @ tostr @ ! @ precision)
tf0 =: +/ @ > @ {: @ (0 <;._1@, '0'&= @ ": @ ! )

>:@i.สามารถเขียน1+i.เพื่อบันทึกไบต์
algorithmshark

เวอร์ชันที่เก่ากว่าของคุณสามารถทำได้[:#.~'0'=":@!13 ไบต์โดยเปลี่ยนวิธีการนับ 1 ต่อท้าย
โคล




1

Perl, 24 22 + 1 ( -pตั้งค่าสถานะ) = 23 ไบต์

$\+=$_=$_/5|0while$_}{

โดยใช้:

> echo 2016 | perl -pe '$\+=$_=$_/5|0while$_}{'

โปรแกรมเต็มรูปแบบ:

while (<>) {
# code above added by -p
    while ($_) {
        $\ += $_ = int($_ / 5);
    }
} {
# code below added by -p
    print;  # prints $_ (undef here) and $\
}

1

Java, 38 ไบต์

int z(int n){return n>0?n/5+z(n/5):0;}

โปรแกรมเต็มรูปแบบด้วยวิธี ungolfed:

import java.util.Scanner;

public class Q79762{
    int zero_ungolfed(int number){
        if(number == 0){
            return 0;
        }
        return number/5 + zero_ungolfed(number/5);
    }
    int z(int n){return n>0?n/5+z(n/5):0;}
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.close();
        System.out.println(new Q79762().zero_ungolfed(n));
        System.out.println(new Q79762().z(n));
    }
}

1

J, 7 ไบต์

ฟังก์ชัน Monadic รับอาร์กิวเมนต์ทางด้านขวา

3{:@q:!

หากxเป็นค่าบวกx q: yส่งคืนเลขชี้กำลังในการแยกตัวประกอบเฉพาะของyเฉพาะxช่วงเวลาแรก 3นายก -rd คือ 5 และ{:ต้องใช้หางของรายการ

โปรดทราบว่าคุณต้องป้อนจำนวนเต็มด้วยxท้ายมิฉะนั้น J จะถือว่าพวกเขาเป็นลอย

   3{:@q:! 100x
24
   3{:@q:! 666x
165
   3{:@q:! 2016x
502

ลองด้วยตัวคุณเองที่tryj.tkแม้ว่าจะได้รับคำเตือนว่าล่ามออนไลน์นี้จะบ่นถ้าคุณลองอะไรที่ใหญ่กว่า 1343

ถ้าคุณต้องการบางสิ่งที่ไม่คำนวณn ! <.@%&5(+$:@)^:*และด้วยเหตุนี้ไม่จำเป็นต้องใช้มันพอดีในจำนวนเต็มใช้วิธีการแก้ปัญหา recursive (tryj.tk ยังคงเป็นปัญหากับอินพุตขนาดใหญ่)


1

Ruby, 70 61 51 49 ไบต์

เวอร์ชัน 3พร้อมขอบคุณ Kenny Lau และ daniero

->n{(n-n.to_s(5).chars.map(&:to_i).reduce(:+))/4}

แก้ไข:เปิดออกคุณสามารถบันทึกไบต์ที่สองโดยการทำแผนที่to_i ก่อนที่reduceคุณ แปลก: P

ฟังก์ชั่นนี้จะหักผลรวมของn'ฐานตัวเลข 5 หลักจากnนั้นแบ่งผลโดย 4 1+5+25+..+5**n = (5**n+1)/4นี้จะเกี่ยวข้องกับผลรวมของชุดเรขาคณิต

เป็นตัวอย่าง (อีกครั้งขอบคุณ Kenny Lau) ให้พิจารณา358( 2413ในฐาน 5) ลบด้วยฐาน 5 หลัก

2413-2-4-1-3 
= (2000-2) + (400-4) + (10-1) + (3-3)
# consider that 1000-1=444 and you'll see why every 5**n is multiplied by 4
= 2*444 + 4*44 + 1*4 + 3*0
= 2*(4*5**0+4*5**1+4*5**2) + 4*(4*5**0+4*5**1) + 1*(4*5**0) + 3*()
= 348

แบ่ง348โดยและคุณได้รับ4f(358) = 87

รุ่น 2พร้อมขอบคุณ Kenny Lau

->n{s=(1..n).reduce(:*).to_s;s.size-s.reverse.to_i.to_s.size}

ฟังก์ชั่นนี้จะคำนวณn!แล้วหักลบsizeของn!จากsizeของ(n!).reverse.to_i.to_sที่เอาเลขทั้งหมดจึงกลับมาsizeของศูนย์ของตัวเอง

รุ่น 1

->n{s=n.to_s(5).chars;(0...s.size).reduce{|a,b|a+(s[0,b]*'').to_i(5)}}

นี่เป็นรูปแบบของ "มีกี่ตัว5ในการแยกตัวประกอบเฉพาะของn!?" เคล็ดลับที่ใช้บิวอินการแปลงฐานง่ายๆ

สนามกอล์ฟที่เป็นบิตของความเจ็บปวด แต่กับการแปลงจากIntegerการStringที่จะArrayคว้าส่วนหนึ่งของArrayและแปลงที่จะStringไปอีกครั้งสำหรับInteger reduceคำแนะนำการเล่นกอล์ฟใด ๆ ยินดีต้อนรับ


มันสั้นลงเล็กน้อยเพื่อแมto_iก่อนลด: ->n{(n-n.to_s(5).chars.map(&:to_i).reduce(:+))/4}(ประหยัดไบต์ที่สอง)
daniero

@daniero ฉันจะไม่คาดหวังว่า ขอบคุณ: D
Sherlock9


1

Dyalog APLขนาด 9 ไบต์

⊥⍨'0'=⍕!⎕

แจ้งหมายเลข

! factorialize

stringify

'0'= ตรวจสอบความเท่าเทียมกับอักขระศูนย์

⊥⍨ นับความจริงที่ตามมา *


* แท้จริงแล้วเป็นการแปลงแบบผสมเป็นเบส -10 โดยใช้รายการบูลีนเป็นทั้งตัวเลขและเบส:

⊥⍨0 1 0 1 1เป็นเช่นเดียวกับ0 1 0 1 1⊥⍨0 1 0 1 1ที่ 0×(0×1×0×1×1) 1×(1×0×1×1) 0×(0×1×1) 1×(1×1) + 1×(1)ซึ่งอีกครั้งคือสอง (จำนวนต่อท้าย 1s)

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