Faktör Sonunda Sıfırlar


35

n!Taban 10'un sonunda sıfır sayısını bulan bir program veya işlev yazın ; burada nbir giriş numarasıdır (istediğiniz herhangi bir biçimde).

nOlumlu bir tamsayı olduğu, yani n!aynı zamanda bir tamsayı olduğu varsayılabilir . Ondalık bir noktadan sonra sıfır yok n!. Ayrıca, programlama dili değerini işleyebilir olduğu kabul edilebilir nve n!.


Test durumları

1
==> 0

5
==> 1

100
==> 24

666
==> 165

2016
==> 502

1234567891011121314151617181920
==> 308641972752780328537904295461

Bu kod golfü. Standart kurallar geçerlidir. Bayt cinsinden en kısa kod kazanır.

gönderimler

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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

Liderler Sıralaması

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var.



Bunu varsayabilir miyiz! dillerimizin yerel tamsayı tipine uyacak mı?
Alex A.

@AlexA. Evet yapabilirsin.
Arcturus,

Can nbir giriş dizesi olabilir?
Conor O'Brien,

15
n!Tamsayı tipinize uyduğunu varsaymanıza izin verilmemesi durumunda bunun daha iyi bir soru olacağını düşünüyorum ! Şey, belki başka bir zaman.
bir Simmons

Yanıtlar:


43

Python 2,27 bayt

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

Bitiş sıfırları, 5 faktörü ile sınırlıdır. Bunun katlarının sayısı 5en nfazladır n/5(kat bölme ile), ancak bu, katların tekrarındaki faktörleri saymaz 25, 125, .... Bunları almak için n5'e bölün ve tekrarlayın.


19

Jöle , 5 bayt

!Æfċ5

Faktör bulma işleminde karşı-üretken yaklaşımı kullanır, sonra tekrar çarpanlara ayırır, asal çarpanlaştırmada 5'in üslerini kontrol eder.

Çevrimiçi deneyin!

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

4
yikes. Takaslar hakkında konuşun! Kodu 5 bayta indirmek için, belleği ve zamanı saçma miktarlarla artırın.
Ross Presser,

19

Mornington Crescent, 1949 1909 bayt

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

NieDzejkob sayesinde -40 bayt


Ve bu şimdi benim en çok oy alan cevabım.
pppery

3
Mornington CrescentMücadele edilenler için kısa bir açıklama güzel olurdu. :)
Robert Benson

-40 mümkünse daha kısa satır adları kullanarak.
NieDzejkob

18

Pyth, 6 bayt

/P.!Q5

Burada dene.

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

Alternatif 7 bayt :

st.u/N5

Kümülatif azalma, .u/N5tekrar 5edene kadar tekrar tekrar zemine bölünür , bu durumda 0'a çarptıktan sonra gerçekleşir.

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

İlk eleman daha sonra kaldırılır ( t) ve gerisi toplanır ( s).


13

Aslında 10 bayt

!$R;≈$l@l-

Çevrimiçi deneyin!

Son test durumunun CPython üzerinde Ciddi bir şekilde çalışırken başarısız olduğuna dikkat edin, çünkü math.factorialC uzantısı kullanır (64 bit tam sayılarla sınırlıdır). PyPy'de Cidden Çalışmak Yine de İyi Çalışıyor.

Açıklama:

!$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
Vay canına, bu yöntemi 5 numarayla bölmeyi kullanma şeklini seviyorum.
Arcturus,

Bu konuda 12 bayt sayıyorum
Score_Under

1
@Score_Under Aslında UTF-8 değil CP437 kod sayfasını kullanır. Her karakter bir bayttır.
Mego

9

Haskell, 26 bayt

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

Kat, girişi bölüştürür 5, ardından sonucu üzerinde çağrılan işleve ekler. İfade (+)=<<fbir girdi alır xve çıktılar x+(f x).

Kısaltıldı:

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

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

Özyinelemeli olmayan olmayan bir ifade 28 bayt verdi:

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

iBir sayaç mı 1..n?
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Evet, yalnızca mesele bitse de log_5(n), gerisi 0 veriyor
xor

8

MATL , 9 bayt

:"@Yf5=vs

Çevrimiçi deneyin!

Bu, faktörün hesaplanmasından kaçınıldığından çok büyük sayılar için çalışır.

Diğer cevaplarda olduğu gibi, bu durum, 2faktörlemenin bölen olarak göründüğü sayıların, göründüğünden daha büyük veya eşit olması gerçeğinden yararlanır 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 bayt

N> 4 garanti edersek 4 bayt olur

Kod:

Î!Ó7è

Açıklama:

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

Alternatif, çok daha hızlı, 6 baytlık çözüm: Luis Mendo'in MATL yanıtından ilham aldı

LÒ€`5QO

Açıklama:

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

Düzenleme: kullanılarak çıkarıldı çözeltiler ¢ 5 içeren tüm asal 5 örneğin 53 ile sayılabilecektir olarak (miktar).

Düzenleme 2: Karşılaştırma olarak daha yüksek girdi için daha etkili bir çözüm ekledi.


Evet, yerine , 5Qçalışması gerekir. Yine de güzel cevap! :)
Adnan

Ben "çıkışı ise bu> 9 başarısız olmaz" yorum ile büyük girişlere testine gidiyordu, ama oğlan 05AB1E en uygulanması Óolduğunu yavaş
SP3000

BTW, ilk kod da olabilir Î!Ó2é. Hata dün düzeltildi .
Adnan,

Utf-8 kullanıyorsanız Î!Ó7è, 8 bayttır ve "6 bayt" çözümü 10 bayttır
Score_Under

@Score_Under Evet bu doğru. Bununla birlikte, 05AB1E, CP-1252 kodlamasını kullanır.
Adnan,

6

Matlab (59) (54)(39)

Hey hanımefendi !!!! matematikten hoşlandığını duyduk ....

  @(n)sum(fix(n./5.^(1:fix(log(n)/1.6))))
  • Bu kod incelemesinde yarattığım cevaba dayanıyor .

  • kod incelemesinde cevabımda belirtilenlerin ötesinde, faktör (n) 'deki sıfır sayısının formülü, k'nin 1 ile log_5 (n) arasında değiştiği Sum (n / (5 ^ k))' dır.

  • Golf alamamasının en önemsiz nedeni, matlabda log5yerleşik olarak bulunmamasıdır, bu yüzden logu (5) 1.6 ile değiştirdim, önemli değil çünkü zaten zemini döşeyecek.

Bir şans ver


Birkaç soru. 1. Bunu gerçekten Matlab'da nasıl yürütüyorsunuz? 2. n = 1 için sonuç nedir?
Stuart Bruff

@StuartBruff bu tip ans (1) 'ı çalıştırır ve 0 döndürür.
Abr001,

TAMAM. Teşekkürler. İlginç. Matlab'da fonksiyon tutamaçlarını fazla kullanmadım, bu yüzden nasıl çalıştırılacağı konusunda biraz şaşırdı ... neden ans () toplamı saymıyor? Düzgün bir cevap olsa da, Mathcad'de denedim ancak "üst" "alt" sınırdan daha küçükse (ve dolayısıyla benim sorumu 0 ile ilgili olarak) sorumu Mathcad'in toplama değişkenini otomatik olarak değiştirdiği için toplamın üst sınırını değiştirmek zorunda kaldım.
Stuart Bruff

5

Mathematica, 20 bayt

IntegerExponent[#!]&

IntegerExponentsıfırları sayar. Eğlenmek için, burada faktöriyel hesaplamayan bir sürüm var:

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

Sanırım Arrayikinci çözüme bir bayt kazandırıyor.
Martin Ender

5

C, 28 bayt

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

açıklama

İzleyen sıfırların sayısı, faktoringi oluşturan beşleme sayısına eşittir. Hepsinden, 1..nbeşte biri beşe katkıda bulunuyor, biz de başlıyoruz n/5. Bunların n/5beşte biri 25'in katlarıdır, bu yüzden fazladan bir beşe katkıda bulunurlar, vs. Sonunda bittik f(n) = n/5 + n/25 + n/125 + ..., ki öyle f(n) = n/5 + f(n/5). nSıfıra ulaştığında özyinelemeyi sonlandırmamız gerekir ; ayrıca toplama ?:işleminden nönce bölmek üzere olan dizilim noktasından faydalanırız .

Bir bonus olarak, bu kod, her birini ziyaret ettiğinden çok daha hızlıdır 1..n(ve faktoringin hesaplanmasından çok daha hızlıdır).

Test programı

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

Test çıkışı

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


Mükemmel bir açıklama için +1
Titus

4

JavaScript ES6, 20 bayt

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

Xnor'ın cevabında olduğu gibi taktik, ama daha kısa.


4

Julia, 34 31 30 bayt

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

Bu, herhangi bir işaretli tamsayı tipini kabul eden ve bir tamsayı döndüren adsız bir işlevdir. Aramak için değişkene atayın. Daha büyük test durumları n, a gibi daha büyük bir tür olarak geçmeyi gerektirir BigInt.

Faktörünü hesaplar n(manuel olarak kullanmak prod, yerleşikten daha kısadır factorial), digitsters sırayla bir dizi elde eder find, sıfır olmayan öğelerin indekslerini alır, ilk dizini alır ve 1'i çıkarırız.

Çevrimiçi deneyin! (son test çok uzun sürdüğü için son test senaryosunun dışındakileri içerir)

Dennis sayesinde bir bayt kurtardı!



3

Retina , 33 bayt

Aynı zamanda girdi alır.

Çıktıyı unary olarak döndürür.

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

(İzleyen satır akışını not edin.)

Çevrimiçi deneyin!

Nasıl çalışır:

İlk aşama:

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

Biraz ungolfed:

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

Bu ne yapar:

  • İlk olarak, 11111eşleştirilebilecek en büyük sayıyı bulun .
  • Bu numarayla değiştir
  • Etkili zemine göre böler 5.
  • Bakış açısı (?=1), sayının pozitif olduğunu garanti eder.
  • +`Aracı İdempotent kadar yineleyin.
  • Yani, ilk aşama "tekrarlayan kat bölünmesi 5'e"

Girdi 100 ise (tekdüze), o zaman metin şudur:

;;1111;11111111111111111111

İkinci sahne:

;

Sadece tüm yarı-kolonları kaldırır.


2

Ruby, 22 bayt

Ruby'nin 0acımasız olduğu birkaç kereden biri bayt sayısı için bir problemdir.

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

bekle neden 0truthy?
Conor O'Brien,

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ yılında Yakut, nilve falseFalsey, ve başka bir şey değildir. Golf konusunda yardımcı olan pek çok durum vardır, çünkü 0truthy nilolması -1, yerine eşleşme yoksa endeksin ve regex endeksinin Ruby dönüşünde işlev gösterdiği anlamına gelir; bazıları ise boş dizgiler gibi hala trutiyen gibi bir sorun olduğu anlamına gelir.
Değerli Mürekkep

@ KevinLau-notKenny Bu mantıklı.
Conor O'Brien,

2

Perl 6 , 23 bayt

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

Perl 6'ya^... eklenirse daha kısa alabilirim . Dizi oluşturucu ile arasına bir değiştirici eklerseniz, daha büyük sayılar için daha fazla bellek kullanması gerekir . {sum $_,*div 5^...0}
lazysum

Açıklama:

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

Ölçek:

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

(Bu son çizgi hafifçe yanıltıcı MoarVM başlatmak için olduğu gibi, Perl 6 derleyici ve çalışma zamanını yüklemek kodunu derlemek, ve çalıştırın. Aslında bir saniye ve toplam bir buçuk sürer Yani olduğunu.
Yani bunun önemli ölçüde daha hızlı hala WolframAlpha.com ile son testin sonucunu kontrol etmek oldu ()


2

Mathcad, [tbd] bayt

görüntü tanımını buraya girin

Mathcad ifadelerin, metinlerin ve parsellerin 2D girişine izin veren bir tür matematiksel "beyaz tahta" dır. Toplama, farklılaşma ve entegrasyon gibi birçok işlem için matematiksel semboller kullanır. Programlama operatörleri, standart bir tuş üzerinde genellikle tek bir klavye kontrol ve / veya kaydırma tuş takımı kombinasyonu olarak girilen özel sembollerdir.

Yukarıda gördüğünüz tam olarak Mathcad çalışma sayfasının yazıldığı gibi göründüğü ve Mathcad'ın değerlendirdiği gibi. Örneğin, n'yi 2016'dan başka bir değere değiştirmek, Mathcad'ın sonucu 502'den yeni değer ne olursa olsun güncellemesine neden olur.

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


Mathcad'ın bayt denklik skorlama yöntemi henüz belirlenmedi. Bir sembol denkliği alarak, çözüm yaklaşık 24 "bayt" alır (while operatörü sadece "ctl-]" tuş kombinasyonunu kullanarak (veya bir araç çubuğundan) girilebilir). Agawa001'in Matlab yöntemi Mathcad'a çevrildiğinde yaklaşık 37 bayt alır (toplama işleci ctl-shft- $ ile girilir).


İşlemek için çarpıcı bir araç geliyor, indirirken bir saniye yedek almayacağım!
Abr001,

2

dc, 12 bayt

[5/dd0<f+]sf

Bu, fgirişini yığının üstünden tüketen ve çıktısını yığının tepesinde bırakan bir işlevi tanımlar . Matematiksel temel için C cevabımı görün . Yığındaki değerleri toplayarak, art arda 5'e bölün ve tüm sonuçları ekleriz:

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

Test programı

# 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

Test çıkışı

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

Ώmf?H+γ/H5ΏγH

Girdide çağrılan özyinelemeli bir işlev tanımlar. Burada dene!

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

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

Xnor'ın cevabındaki özyinelemeli olmayan teknikle hemen hemen aynı.


Burada sakladığım daha eski bir sürüm var, çünkü kişisel olarak daha çok seviyorum, 28 byte'da saat:

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

Gerekmediği sürece, daha fazla x:hassasiyet için test durumlarına dahil oldum .

   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

Son numara bu fonksiyonla çalışmıyor.

açıklama

Bu, hesaplayarak n!, dizgeye dönüştürerek ve her üyeyi eşitlik için kontrol ederek çalışır '0'. Çünkü n = 15bu süreç şöyle olacaktır:

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

Şimdi, ;._1listeyi ilk elemanında (sıfır) bölmek, her bölünmüş sonucu kutulamak, aslar ( a:) veya 1s ile dolu bir kutu elde etmek için kullanıyoruz :

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

Son üyeyi ( {:) basitçe alıyoruz , kutusundaki işareti kaldırıyoruz ( >) ve bunun üzerinde bir toplamı gerçekleştiriyoruz +/, sıfır sayısını veriyoruz.

İşte daha okunaklı versiyon:

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.Bir bayt kaydetmek için yazılabilir .
algorithmshark

Eski sürümünüz [:#.~'0'=":@!takip eden 1'leri sayma yöntemini değiştirerek 13 byte için hazırlanabilir .
cole,

1

Python 3, 52 bayt

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

Bu işe yaramazsa, test durumlarını deneyin.
xnor

Şimdi çalışması gerekiyor.
Macenta

1

Pyke, 5 bayt

SBP5/

Burada dene!

S     -    range(1,input()+1)
 B    -   product(^)
  P   -  prime_factors(^)
   5/ - count(^, 5)

1

DÖNÜŞ , 17 bayt

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

Try it here.

Özyinelemeli operatör lambda. Kullanımı:

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

açıklama

[             ]=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 ( -pbayrak) = 23 bayt

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

Kullanımı:

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

Tam program:

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

1

Java, 38 bayt

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

Ungolfed yöntemi ile tam program:

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 bayt

Monadic işlevi, sağdaki tartışmayı alıyor.

3{:@q:!

Eğer xolumlu, x q: ybir asal çarpanlara Çin'li döndürür ysadece ilk için, xasal. 3-RD asal 5'tir ve {:bir listenin kuyruk alır.

xSonuna bir tamsayı girmeniz gerektiğini unutmayın , aksi takdirde J bunları yüzer olarak değerlendirir.

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

Tryj.tk adresinde kendiniz deneyin , ancak 1343'ten daha büyük bir şey denerseniz bu çevrimiçi tercümanın şikayet edeceği konusunda uyarılmalısınız.

Eğer hesaplamayan bir şey istiyorsan n ! ve bu nedenle bir tamsayıya sığmasını gerektirmez, özyinelemeli çözümü kullanın <.@%&5(+$:@)^:*. (tryj.tk hala büyük girdilerde sızlanıyor.)


1

Ruby, 70 61 51 49 bayt

Kenny Lau ve daniero sayesinde Sürüm 3

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

Düzenleme: Size dışarı dönüşler eşleyerek iki bayt kaydedebilirsiniz to_i önce size reduce. Garip: P

Bu işlev, ntemel 5 basamağın toplamını çıkarır ve nsonucu 4'e böler. Bu, geometrik serilerin toplamıyla ilgilidir 1+5+25+..+5**n = (5**n+1)/4.

Örnek olarak (tekrar, Kenny Lau sayesinde), 358( 24135. tabanda) eksi 5 basamağını düşünü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

Divide 348tarafından 4ve almak f(358) = 87.

Kenny Lau sayesinde Sürüm 2

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

Bu fonksiyon, hesaplar n!sonra çıkarır sizearasında n!gelen sizebir (n!).reverse.to_i.to_sdönen ve böylece bütün sıfırları kaldırır, sizesıfır kendilerini.

Versiyon 1

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

Bu, " 5Asal çarpanlara ayırmada kaç tane var n!?" Ruby'nin basit temel dönüşüm yerleşiklerini kullanan bir numara.

Golf oynamak biraz acı vericidir, ancak birinden Integerdiğerine Stringgeçmek Array, bir kısmını kapmak Arrayve Stringbunu Integertekrar için dönüştürmek reduce. Herhangi bir golf önerisi açıktır.


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

@ daniero Bunu ummazdım. Teşekkürler: D
Sherlock9


1

Dyalog APL , 9 bayt

⊥⍨'0'=⍕!⎕

sayı istemi

! factorialize

stringify

'0'= sıfıra eşitliği kontrol et

⊥⍨ sondaki sayıların sayılması *


* Kelimenin tam anlamıyla, boolean listesini hem sayı hem de temel olarak kullanan karma-taban-10 dönüşümü:

⊥⍨0 1 0 1 1aynı 0 1 0 1 1⊥⍨0 1 0 1 1olan 0×(0×1×0×1×1) 1×(1×0×1×1) 0×(0×1×1) 1×(1×1) + 1×(1)iki olan ile aynıdır (sondaki 1s sayısı).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.