Số không ở cuối giai thừa


35

Viết chương trình hoặc hàm tìm số lượng số 0 ở cuối n!cơ sở 10, trong đó nlà số đầu vào (ở bất kỳ định dạng mong muốn nào).

Có thể giả định rằng đó nlà một số nguyên dương, nghĩa n!là cũng là một số nguyên. Không có số 0 nào sau dấu thập phân n!. Ngoài ra, có thể giả định rằng ngôn ngữ lập trình của bạn có thể xử lý giá trị của nn!.


Các trường hợp thử nghiệm

1
==> 0

5
==> 1

100
==> 24

666
==> 165

2016
==> 502

1234567891011121314151617181920
==> 308641972752780328537904295461

Đây là mã golf. Quy tắc tiêu chuẩn áp dụng. Mã ngắn nhất tính bằng byte thắng.

Đệ trình

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành một liên kết mà sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.



Chúng ta có thể cho rằng n! sẽ phù hợp với loại số nguyên của ngôn ngữ của chúng tôi?
Alex A.

@AlexA. Có bạn có thể.
Arcturus

Có thể nlà một chuỗi đầu vào?
Conor O'Brien

15
Tôi nghĩ rằng đây sẽ là một câu hỏi tốt hơn nếu bạn không được phép giả định n!sẽ phù hợp với loại số nguyên của bạn! Vâng, có thể một thời gian khác.
Một Simmons

Câu trả lời:


43

Python 2, 27 byte

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

Các số 0 kết thúc bị giới hạn bởi các yếu tố 5. Số lượng bội số của nhiều 5nhất nn/5(với phân chia sàn), nhưng điều này không tính các yếu tố lặp lại trong bội số của 25, 125, .... Để có được những cái đó, chia ncho 5 và tái diễn.


19

Thạch , 5 byte

!Æfċ5

Sử dụng phương pháp phản tác dụng của việc tìm giai thừa sau đó tính lại nó, kiểm tra số mũ của 5 trong thừa số nguyên tố.

Hãy thử trực tuyến!

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

4
yike. Nói về sự đánh đổi! Để lấy mã xuống còn 5 byte, hãy tăng bộ nhớ và thời gian bằng số lượng vô lý.
Ross Presser

19

Mornington Crescent, 1949 1909 byte

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 byte nhờ NieDzejkob


Và đây là câu trả lời được đánh giá cao nhất của tôi.
pppery 17/05/2016

3
Một lời giải thích ngắn gọn cho những người trong chúng ta là những người bình thường Mornington Crescentsẽ rất tuyệt. :)
Robert Benson

-40 byte bằng cách sử dụng tên dòng ngắn hơn nếu có thể.
NieDzejkob

18

Bình thường, 6 byte

/P.!Q5

Hãy thử nó ở đây.

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

7 byte thay thế :

st.u/N5

Việc giảm tích lũy .u/N5liên tục chia sàn 5cho đến khi nó lặp lại, trong trường hợp này xảy ra sau khi nó chạm 0.

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

Phần tử đầu tiên sau đó được loại bỏ ( t) và phần còn lại được tính tổng ( s).


13

Trên thực tế, 10 byte

!$R;≈$l@l-

Hãy thử trực tuyến!

Lưu ý rằng trường hợp thử nghiệm cuối cùng không thành công khi chạy Nghiêm túc trên CPython vì math.factorialsử dụng tiện ích mở rộng C (giới hạn ở số nguyên 64 bit). Chạy Nghiêm túc trên PyPy hoạt động tốt, mặc dù.

Giải trình:

!$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
Ôi chà, tôi thích cách phương pháp này không sử dụng phép chia cho 5 mẹo.
Arcturus

Tôi đếm 12 byte cho cái này
Score_Under

1
@Score_Under Thực tế sử dụng trang mã CP437, không phải UTF-8. Mỗi ký tự là một byte.
Mego

9

Haskell, 26 byte

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

Tầng chia đầu vào cho 5, sau đó thêm kết quả cho hàm được gọi trên đó. Biểu thức (+)=<<fcó một đầu vào xvà đầu ra x+(f x).

Rút gọn từ:

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

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

Một biểu thức không đệ quy cho 28 byte:

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

imột truy cập từ 1..n?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Có, mặc dù chỉ có log_5(n)vấn đề, phần còn lại cho 0.
xnor

8

MATL , 9 byte

:"@Yf5=vs

Hãy thử trực tuyến!

Điều này hoạt động với số lượng rất lớn, vì nó tránh tính toán giai thừa.

Giống như các câu trả lời khác, điều này khai thác thực tế là số lần 2xuất hiện dưới dạng ước số của giai thừa là lớn hơn hoặc bằng số lần 5xuất hiện.

:     % 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 byte

Sẽ là 4 byte nếu chúng tôi có thể đảm bảo n> 4

Mã số:

Î!Ó7è

Giải trình:

Î        # 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

Giải pháp 6 byte thay thế, nhanh hơn nhiều: Lấy cảm hứng từ câu trả lời MATL của Luis Mendo

LÒ€`5QO

Giải trình:

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

Chỉnh sửa: loại bỏ các giải pháp sử dụng ¢ (count) như tất cả các số nguyên tố có chứa 5 sẽ được tính là 5 ví dụ 53.

Chỉnh sửa 2: thêm một giải pháp hiệu quả hơn cho đầu vào cao hơn khi so sánh.


Vâng, thay vì , 5Qnên làm việc. Câu trả lời tốt đẹp mặc dù! :)
Ad Nam

Tôi sẽ kiểm tra các đầu vào lớn hơn với nhận xét "sẽ không thất bại nếu đầu ra> 9", nhưng việc triển khai của cậu bé 05AB1E Órất chậm
Sp3000

Btw, mã đầu tiên cũng có thể được Î!Ó2é. Lỗi đã được sửa vào ngày hôm qua .
Ad Nam

Nếu bạn đang sử dụng utf-8, Î!Ó7èlà 8 byte và giải pháp "6 byte" là 10 byte
Score_Under

@Score_Under Đúng vậy. Tuy nhiên, 05AB1E sử dụng mã hóa CP-1252.
Ad Nam

6

Matlab (59) (54)(39)

Này dawg !!!! chúng tôi nghe nói bạn thích môn toán ....

  @(n)sum(fix(n./5.^(1:fix(log(n)/1.6))))
  • Điều này dựa trên câu trả lời được tạo của tôi trong đánh giá mã .

  • xa hơn những gì được đề cập trong câu trả lời của tôi trong đánh giá mã, công thức cho số không trong giai đoạn (n) là Sum (n / (5 ^ k)) trong đó k thay đổi giữa 1 và log_5 (n)

  • Lý do tầm thường duy nhất tại sao nó không thể có được gôn thủ là nó log5không có sẵn trong matlab dưới dạng dựng sẵn, do đó tôi đã thay thế log (5) bằng 1.6, không quan trọng bởi vì nó sẽ được thả nổi.

Hãy thử một lần


Một vài câu hỏi. 1. Làm thế nào để bạn thực sự chạy cái này trong Matlab? 2. Kết quả cho n = 1 là gì?
Stuart Bruff

@StuartBruff để chạy loại này ans (1) và nó sẽ trả về 0.
Abr001am

ĐƯỢC. Cảm ơn. Hấp dẫn. Tôi chưa sử dụng hàm xử lý nhiều trong Matlab, vì vậy có một chút bối rối về cách chạy nó ... tại sao ans () không được tính vào tổng số? Mặc dù câu trả lời gọn gàng, tôi đã thử nó trong Mathcad nhưng phải sửa đổi giới hạn trên của tổng vì Mathcad tự động điều chỉnh biến tổng nếu giá trị "trên" nhỏ hơn giới hạn "dưới" (và do đó câu hỏi của tôi về 0).
Stuart Bruff

5

Toán học, 20 byte

IntegerExponent[#!]&

IntegerExponentđếm số không. Để giải trí, đây là phiên bản không tính giai thừa:

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

Tôi nghĩ Arraytiết kiệm một byte trên giải pháp thứ hai.
Martin Ender

5

C, 28 byte

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

Giải trình

Số lượng các số 0 ở cuối bằng số lượng các số tạo nên giai thừa. Trong tất cả 1..n, một phần năm trong số họ đóng góp năm, vì vậy chúng tôi bắt đầu với n/5. Trong số này n/5, một phần năm là bội số của 25, vì vậy đóng góp thêm năm, v.v. Chúng tôi kết thúc với f(n) = n/5 + n/25 + n/125 + ..., đó là f(n) = n/5 + f(n/5). Chúng ta cần chấm dứt đệ quy khi nđạt đến 0; chúng tôi cũng tận dụng điểm thứ tự tại ?:để phân chia ntrước khi bổ sung.

Như một phần thưởng, mã này nhanh hơn nhiều so với mã truy cập mỗi 1..n(và nhanh hơn nhiều so với tính toán giai thừa).

Chương trình kiểm tra

#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));
    }
}

Đầu ra thử nghiệm

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


+1 cho một lời giải thích tuyệt vời
Titus

4

JavaScript ES6, 20 byte

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

Chiến thuật tương tự như trong câu trả lời của xnor, nhưng ngắn hơn.


4

Julia, 34 31 30 byte

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

Đây là một hàm ẩn danh chấp nhận mọi loại số nguyên đã ký và trả về một số nguyên. Để gọi nó, gán nó cho một biến. Các trường hợp thử nghiệm lớn hơn yêu cầu chuyển qua nnhư một loại lớn hơn, chẳng hạn như a BigInt.

Chúng tôi tính toán giai thừa của n(sử dụng thủ công prodngắn hơn so với tích hợp factorial), lấy một mảng digitstheo thứ tự ngược lại, findcác chỉ số của các phần tử khác 0, lấy chỉ số đầu tiên như vậy và trừ đi 1.

Hãy thử trực tuyến! (bao gồm tất cả trừ trường hợp thử nghiệm cuối cùng vì lần cuối mất quá nhiều thời gian)

Đã lưu một byte nhờ Dennis!



3

Võng mạc , 33 byte

Đưa đầu vào trong unary.

Trả về đầu ra trong unary.

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

(Lưu ý nguồn cấp dữ liệu theo dõi.)

Hãy thử trực tuyến!

Làm thế nào nó hoạt động:

Giai đoạn đầu tiên:

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

Hơi vô dụng:

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

Những gì nó làm:

  • Đầu tiên, tìm số lượng lớn nhất 11111có thể được khớp.
  • Thay thế bằng số đó
  • Hiệu quả phân chia sàn bằng 5.
  • Cái nhìn (?=1)đảm bảo rằng con số là tích cực.
  • Các +`phương tiện lặp lại cho đến khi idempotent.
  • Vì vậy, giai đoạn đầu tiên là "phân chia tầng lặp lại cho 5"

Nếu đầu vào là 100 (không đồng nhất), thì văn bản hiện là:

;;1111;11111111111111111111

Giai đoạn thứ hai:

;

Chỉ cần loại bỏ tất cả các dấu chấm phẩy.


2

Ruby, 22 byte

Một trong số ít lần Ruby 0là sự thật là vấn đề về số byte.

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

chờ đợi tại sao là 0sự thật?
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Trong Ruby, nilfalselà chim ưng, và không có gì khác. Có rất nhiều trường hợp giúp chơi golf, vì sự 0thật có nghĩa là chỉ số và chức năng chỉ số regex trong Ruby trở lại nilnếu không có kết quả thay thế -1, và một số vấn đề, như chuỗi trống vẫn là sự thật.
Mực giá trị

@ KevinLau-notKenny Điều đó thật có ý nghĩa.
Conor O'Brien

2

Perl 6 , 23 byte

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

Tôi có thể rút ngắn hơn nếu ^...được thêm vào Perl 6 {sum $_,*div 5^...0} .
Nó sẽ có hiệu quả bộ nhớ cao hơn cho các số lớn hơn nếu bạn thêm một lazybộ sửa đổi giữa sumvà trình tạo trình tự.

Giải trình:

{ # 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
}

Kiểm tra:

#! /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

(Dòng cuối cùng hơi sai lệch, vì MoarVM phải khởi động, tải trình biên dịch Perl 6 và thời gian chạy, biên dịch mã và chạy nó. Vì vậy, nó thực sự mất khoảng một giây rưỡi.
Nó vẫn nhanh hơn đáng kể so với nó là để kiểm tra kết quả của bài kiểm tra cuối cùng với WolframAlpha.com)


2

Mathcad, [tbd] byte

nhập mô tả hình ảnh ở đây

Mathcad là một loại "bảng trắng" toán học cho phép nhập các biểu thức, văn bản và cốt truyện 2D. Nó sử dụng các ký hiệu toán học cho nhiều hoạt động, chẳng hạn như tính tổng, phân biệt và tích hợp. Toán tử lập trình là các ký hiệu đặc biệt, thường được nhập dưới dạng kết hợp bàn phím điều khiển và / hoặc dịch chuyển trên một phím tiêu chuẩn.

Những gì bạn thấy ở trên chính xác là bảng tính Mathcad trông như thế nào khi được nhập vào và như Mathcad đánh giá nó. Ví dụ: thay đổi n từ năm 2016 sang bất kỳ giá trị nào khác sẽ khiến Mathcad cập nhật kết quả từ 502 thành bất kỳ giá trị mới nào.

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


Phương pháp tính điểm tương đương byte của Mathcad vẫn chưa được xác định. Lấy một biểu tượng tương đương, giải pháp mất khoảng 24 "byte" (chỉ có thể nhập toán tử while bằng cách sử dụng tổ hợp phím "ctl-]" (hoặc từ thanh công cụ)). Phương thức Matlab của Agawa001 mất khoảng 37 byte khi được dịch sang Mathcad (toán tử tổng được nhập bởi ctl-shft- $).


Âm thanh là một công cụ tuyệt vời để xử lý, tôi sẽ không dành một giây tải nó!
Abr001am

2

dc, 12 byte

[5/dd0<f+]sf

Điều này xác định một chức năng f tiêu thụ đầu vào của nó từ đầu ngăn xếp và để đầu ra của nó ở đầu ngăn xếp. Xem câu trả lời C của tôi cho cơ sở toán học. Chúng tôi liên tục chia cho 5, tích lũy các giá trị trên ngăn xếp, sau đó thêm tất cả các kết quả:

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

Chương trình kiểm tra

# 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

Đầu ra thử nghiệm

./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 byte

Ώmf?H+γ/H5ΏγH

Xác định hàm đệ quy được gọi trên đầu vào. Hãy thử nó ở đây!

Ώ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 byte

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

Khá giống với kỹ thuật không đệ quy từ câu trả lời của xnor.


Đây là phiên bản cũ hơn tôi đã giữ ở đây vì cá nhân tôi thích nó hơn, với tốc độ 28 byte:

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

Trong khi không cần thiết, tôi đã đưa x:vào các trường hợp thử nghiệm để có độ chính xác mở rộng.

   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

Số cuối cùng không hoạt động với chức năng này.

Giải trình

Điều này hoạt động bằng cách tính toán n!, chuyển đổi nó thành một chuỗi và kiểm tra sự bình đẳng của từng thành viên '0'. Đối với n = 15, quá trình này sẽ là:

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

Bây giờ, chúng tôi sử dụng ;._1để phân chia danh sách trên phần tử đầu tiên của nó (không), đóng hộp từng kết quả phân tách, thu được một hộp chứa đầy con át chủ bài ( a:) hoặc chạy 1s, như vậy:

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

Chúng tôi đơn giản lấy thành viên cuối cùng ( {:), bỏ hộp thư ( >) và thực hiện tổng kết trên nó +/, thu được số lượng không.

Đây là phiên bản dễ đọc hơn:

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.có thể được viết 1+i.để lưu một byte.
thuật toán

Phiên bản cũ hơn của bạn có thể được tạo thành [:#.~'0'=":@!13 byte bằng cách thay đổi phương pháp đếm số 1 theo sau.
cole

1

Python 3, 52 byte

g=lambda x,y=1,z=0:z-x if y>x else g(x,y*5,z+x//y)

Điều này không hoạt động, hãy thử các trường hợp thử nghiệm.
xnor

Nó nên hoạt động ngay bây giờ.
Magenta


1

TRẢ LẠI , 17 byte

[$[5÷\%$F+][]?]=F

Try it here.

Toán tử đệ quy lambda. Sử dụng:

[$[5÷\%$F+][]?]=F666F

Giải trình

[             ]=F  Lambda -> Operator F
 $                 Check if top of stack is truthy
  [       ][]?     Conditional
   5÷\%$F+         If so, do x/5+F(x/5)

1

Perl, 24 22 + 1 ( -pcờ) = 23 byte

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

Sử dụng:

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

Chương trình đầy đủ:

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

1

Java, 38 byte

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

Chương trình đầy đủ, với phương pháp vô căn cứ:

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 byte

Chức năng đơn trị, lấy đối số bên phải.

3{:@q:!

Nếu xlà dương, x q: ytrả về số mũ trong một thừa số nguyên tố của y, chỉ cho các xsố nguyên tố đầu tiên . Số 3nguyên tố thứ 5 là 5 và {:lấy đuôi của một danh sách.

Lưu ý rằng bạn phải nhập số nguyên xở cuối hoặc nếu không J sẽ coi chúng là số float.

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

Hãy tự thử tại tryj.tk , mặc dù được cảnh báo rằng trình thông dịch trực tuyến này sẽ khiếu nại nếu bạn thử bất cứ điều gì lớn hơn 1343.

Nếu bạn muốn một cái gì đó không tính n ! và do đó không yêu cầu nó phù hợp với một số nguyên, sử dụng giải pháp đệ quy <.@%&5(+$:@)^:*. (tryj.tk vẫn còn xuất hiện trên các đầu vào lớn.)


1

Ruby, 70 61 51 49 byte

Phiên bản 3 với lời cảm ơn đến Kenny Lau và daniero

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

Chỉnh sửa: Hóa ra bạn có thể lưu hai byte bằng cách ánh xạ to_i trước khi bạnreduce . Lạ: P

Hàm này trừ tổng n5 chữ số cơ sở từ nvà sau đó chia kết quả đó cho 4. Điều này có liên quan đến tổng của chuỗi hình học 1+5+25+..+5**n = (5**n+1)/4.

Ví dụ (một lần nữa, nhờ có Kenny Lau), hãy xem xét 358( 2413trong cơ sở 5) trừ đi 5 chữ số cơ bản của nó.

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

Chia 348cho 4và bạn nhận được f(358) = 87.

Phiên bản 2 cảm ơn Kenny Lau

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

Chức năng này sẽ tính toán n!sau đó trừ đi sizecác n!từ sizecủa (n!).reverse.to_i.to_s, mà loại bỏ tất cả các zero, do đó, trả lại sizecủa zero mình.

Phiên bản 1

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

Đây là một biến thể của "Có bao nhiêu 5s trong hệ số nguyên tố củan! ?" thủ thuật sử dụng các nội dung chuyển đổi cơ sở đơn giản của Ruby.

Các chơi golf là một chút đau đớn, mặc dù với chuyển đổi từ Integerđể Stringđến Array, lấy một phần của Arrayvà chuyển đổi đó để Stringđể Integerlại cho reduce. Bất kỳ đề nghị chơi golf đều được chào đón.


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

@daniero Tôi không mong đợi điều đó. Cảm ơn: D
Sherlock9


1

APL Dyalog , 9 byte

⊥⍨'0'=⍕!⎕

nhắc số

! giai thừa

xâu chuỗi

'0'= kiểm tra sự bằng nhau cho ký tự không

⊥⍨ đếm dấu vết *


* Theo nghĩa đen, nó là một chuyển đổi hỗn hợp giữa cơ sở sang cơ sở 10, sử dụng danh sách boolean làm cả số và cơ sở:

⊥⍨0 1 0 1 1là giống như 0 1 0 1 1⊥⍨0 1 0 1 1cái 0×(0×1×0×1×1) 1×(1×0×1×1) 0×(0×1×1) 1×(1×1) + 1×(1)mà lại là hai (số lượng dấu 1s).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.