Aralıktaki sıfırlar


14

Göreviniz bir işlev veya program iki negatif olmayan tamsayılar alır yazmaktır ive k( ikaralarından bütün tam sayıları yazdım eğer yazacağımı kaç sıfır dışarı) ve şekil iiçin kbir parça üzerinde seçtiğiniz tabanında (dahil) kağıt. Bu tamsayı, sıfır sayısı, stdout veya benzeri çıktılar.

-30%üçüncü bir argümanı da kabul ederseniz b, sayıları yazmak için tam sayı tabanı. Bu bonusu elde etmek için en az iki taban ele alınmalıdır.

  • İstediğiniz herhangi bir bazdaki girişi kabul edebilir ve test senaryoları arasındaki tabanı değiştirebilirsiniz.
  • Sen argümanları kabul edebilir i, kisteğe bağlı olarak ve bsizin gibi herhangi bir sırada.
  • Cevaplar, tekli olmayan en az bir tabanı işlemelidir.

Test senaryoları (taban 10'da):

i k -> output
10 10 -> 1
0 27 -> 3
100 200 -> 22
0 500 -> 92

Bu kod golfü; en az bayt kazanır.


2
Durumdan duruma istediğiniz herhangi bir temel ile gidebiliyorsanız, her ikisini de taban k'de yapamaz ve i = 0 olup olmamasına bağlı olarak 0 veya 1 yazdıramaz mısınız?
StephenTG

4
Birliği temel olarak dışlamak isteyebilirsiniz, aksi takdirde bu sorun önemsizdir: girdi alın, 0 yazdırın.
Mego

Diğer üsler için bazı test senaryoları ekleyebilir misiniz?
Morgan Thrapp

3
Temel argümanın gerekmesi halinde bunun daha ilginç olacağını düşünüyorum. "Seçtiğiniz üs" benim için garip.
Alex

1
Evet, @AlexA. ama şimdi değiştirmek için çok geç, 10 cevap.
Filip Haglund

Yanıtlar:


17

Jöle, 1 bayt

¬

Bu baz kullanır k+2, bu durumda tek bir 0 iff i0 olur. İki argüman alır, ancak mantıksal DEĞİL yalnızca ilkine uygulanır.

Hile yapmak istemiyorsak:

7 bayt -% 30 = 4.9

@Dennis tarafından -1.1 puan

rb⁵$¬SS

Bu bonusu alır.

             dyadic link:
r            inclusive range
 b⁵$           Convert all to base input.
    ¬          Vectorized logical NOT
     S         Sum up 0th digits, 1st digits, etc.
      S        Sum all values

7
Bu, telefonumda yazdığım ikinci Jelly programı.
lirtosiast

13
Lanet olsun, 1 bayt? Bize bir şans ver.
Rɪᴋᴇʀ

2
Bu, başka herhangi bir dilde çok az bayt ile kolayca yapılabilir. Hile yapmayan versiyona sadık kaldım.
ETHproductions

13
@ETHproductions Sorunun kuralları açıkça buna izin verir. Ucuz ya da değil, kuralların gerektirdiği cevap bu.
Dennis

8

Python 2, 36 bayt

lambda a,b:`range(a,b+1)`.count('0')

Denizanası için `` hile için kredi .


1
Programlama Bulmacaları ve Kod Golf hoş geldiniz! Bu güzel bir ilk cevap. :)
Alex

Vaov! Çalıştığını bilmiyordum!
Dantal

6

05AB1E , 3 1 bayt

k+2Jelly cevabı gibi kod kullanır , Kod:

_

Açıklama:

_  # Logical NOT operator

3 bayt aldatıcı olmayan sürüm:

Kod:

Ÿ0¢

Açıklama:

Ÿ    # Inclusive range
 0¢  # Count zeroes

Bonus bir hata nedeniyle bana 3.5 bayt veriyor :

ŸB)0¢

Açıklama:

Ÿ      # Inclusive range
 B     # Convert to base input
  )    # Wrap into an array (which should not be needed)
   0¢  # Count zeroes

CP-1252 kodlamasını kullanır.


Bu nasıl çalışıyor?
lirtosiast

@ThomasKwa Açıklama eklendi
Adnan

5

Japt, 3 bayt

+!U

Baz k+2, Jelly cevabı olarak kullanır . Sıfır iff var i==0. Çevrimiçi test edin!

Daha iyi sürüm, 10 8 bayt

UòV ¬è'0

Bu temel 10 kullanır. Çevrimiçi test edin!

Bonus sürümü, 14 12 bayt -% 30 = 8.4

UòV msW ¬è'0

Ne yazık ki, yaptığım golf ile, bonus artık buna değmez ... Çevrimiçi test edin!

Nasıl çalışır

UòV msW ¬è'0   // Implicit: U = start int, V = end int, W = base
UòV            // Create the inclusive range [U..V].
    msW        // Map each item by turning it into a base-W string.
        ¬      // Join into a string.
         è'0   // Count the number of occurances of the string "0".

5

ES6, 91 86 -% 30 = 60,2 bayt

(i,k,b=10)=>([...Array(k+1-i)].map((_,n)=>(i+n).toString(b))+'0').match(/0/g).length-1

Veya b'nin varsayılan olarak 10 olması gerekmiyorsa 3 (2.1) bayt kaydedin.

Yapabileceğim en iyi bonus olmayan sürüm 65 bayttı:

(i,k)=>([...Array(k+1).keys()].slice(i)+'0').match(/0/g).length-1

Düzenleme: @ edc65'in sıfır sayma hilesi kullanılarak 5 bayt kaydedildi.


Cevabım için oy almayı başaramadığım için, sizinkini oylayacağım (en azından içeride ismim)
edc65

4

Ciddi, 10 bayt

'0,,u@xεjc

Açıklama:

'0,,u@xεjc
'0,,u       push "0", i, k+1
     @x     swap i and k+1, range(i, k+1)
       εjc  join on empty string and count 0s

Çevrimiçi deneyin!

Bonus ile: 11,9 bayt

'0,,u@x,╗`╜@¡`Mεjc

Çevrimiçi deneyin!

Açıklama:

'0,,u@x,╗`╜@¡`MΣc
'0,,u@x             push "0", range(i, k+1)
       ,╗           push b to register 0
         `   `M     map:
          ╜@¡         push b, push string of a written in base b
               Σc   sum (concat for strings), count 0s

3

CJam, 12 10 3 bayt

li!

@ThomasKwa kısayolunu kullanır.

Buna izin verilmiyorsa, burada 10 baytlık bir cevap var.

q~),>s'0e=

Güzel ve kısa! @ Mego Ciddi cevap gibi çalışır.

Teşekkürler @Dennis!

İlk CJam cevabımı yazarken eğlendim!

Burada deneyin!


3

T-SQL, 394 Bayt (Bonus yok)

'Neden olmasın ' diyorum , değil mi?

DECLARE @i INT, @k INT SET @i = 100 SET @k = 200  WITH g AS (SELECT @i AS n UNION ALL SELECT n+1 FROM g WHERE n+1<=@k ) SELECT LEN(n) AS c FROM (SELECT STUFF((SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(n, 1, ''), 2, ''), 3, ''), 4, ''), 5, ''), 6, ''), 7, ''), 8, ''), 9, ''), ' ', '') FROM g FOR XML PATH ('')) ,1,0,'') n ) a OPTION (maxrecursion 0)

Ve arkadaşça olan:

-- CG!

DECLARE @i INT, @k INT 
SET @i = 100
SET @k = 200

WITH g AS 
(
    SELECT @i AS n
    UNION ALL
    SELECT n+1 FROM g WHERE n+1<=@k
)

SELECT LEN(n) AS c FROM 
(
    SELECT 
        STUFF((SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(n, 1, ''), 2, ''), 3, ''), 4, ''), 5, ''), 6, ''), 7, ''), 8, ''), 9, ''), ' ', '')
FROM g FOR XML PATH ('')) ,1,0,'') n
) a

OPTION (maxrecursion 0)

bu özveri.
31'te colsw

3

Yakut,% 46-30 = = 32.2 bayt

Muhtemelen daha fazla golf olabilir, ama en azından% 30 bonus kazanıyorum!

->i,k,b{((i..k).map{|a|a.to_s b}*"").count ?0}

... veya bonus olmadan (27 bayt.)

->i,k{([*i..k]*"").count ?0}

Hala tüm bu "Ruby" şeyi öğrenmek, ipuçları bekliyoruz.


Güzel cevap, harita kullanırken uyarıcı operatöre ihtiyacınız yok, bu 1 bayt tasarruf edebilir. ilk durumda (i..k)olduğu kadar iyidir [*i..k].
GB

2

Brachylog , 26 bayt

,{,.e?}?:1frcS:0xlI,Sl-I=.

Girişi liste olarak alır [i,k].

açıklama

,{    }?:1f                § Unify the output with a list of all inputs which verify the
                           § predicate between brackets {...} with output set as the input
                           § of the main predicate

  ,.e?                     § Unify the input with a number between i and k with the ouput
                           § being the list [i,k]

           rcS             § Reverse the list and concatenate everything into a single
                           § number (we reverse it to not lose the leading 0 if i = 0 when
                           § we concatenate into a single number). Call this number S.

              :0xlI        § Remove all occurences of 0 from S, call I the length of this new
                           § number with no zeros

                   ,Sl-I=. § Output the length of S minus I.

2

Julia, 48 bayt -% 30 = 33,6

f(i,k,b)=sum(j->sum(c->c<49,[base(b,j)...]),i:k)

Bu, üç tamsayıyı kabul eden ve bir tam sayı döndüren bir işlevdir. Argümanlardan biri tabanı belirtir, bu yüzden bu bonus için yeterlidir.

Ungolfed:

function f(i, k, b)
    # For each j in the inclusive range i to k, convert j to base
    # b as a string, splat the string into a character array, and
    # compare each character to the ASCII code 49 (i.e. '1'). The
    # condition will only be true if the character is '0'. We sum
    # these booleans to get the number of zeros in that number,
    # then we sum over the set of sums to get the result.
    sum(j -> sum(c -> c < 49, [base(b, j)...]), i:k)
end

Bonusun uygulanması, uygulanmadığından çok daha iyi bir puan verir (34 bayt):

f(i,k)=sum(c->c<49,[join(i:k)...])


2

Pyth, 6.3 bayt, bonus ile (9 bayt -% 30)

/sjRQ}EE0

Açıklama:

  jRQ     - [conv_base(Q, d) for d in V]
     }EE  - inclusive_range(eval(input), eval(input))
 s        - sum(^, [])
/       0 - ^.count(0)

Burada deneyin

Veya bonus olmadan 7 bayt:

/`}EE\0

Açıklama:

  }EE   - inclusive_range(eval(input), eval(input))
 `      - repr(^)
/    \0 - ^.count("0")

Burada deneyin

Veya bir test takımı kullanın


Bonus almak buna değer olduğunu düşünüyorum:/sjRQ}EE0
FryAmTheEggman

Ehh, temel dönüşümle aynı kod, eminim ne yaptığınızı biliyorsunuz, sadece farklı şeyler denemeye ve saymaya zorlayan bir bonus problemi ...: P
FryAmTheEggman

2

PHP, 50 Bayt

yalnızca ondalığı destekler

<?=substr_count(join(range($argv[1],$argv[2])),0);

Bonus 63 ile ondalık ve ikili desteği

<?=substr_count(join(array_map([2=>decbin,10=>""][$argv[3]],range($argv[1],$argv[2]))),0);

Bonus 77.7 ile ondalık, onaltılık, sekizli ve ikili desteği destekler

<?=substr_count(join(array_map([2=>decbin,8=>decoct,10=>"",16=>dechex][$argv[3]],range($argv[1],$argv[2]))),0);

Bonus 78.4 ile taban 2 - 36'yı destekler

<?=substr_count(join(array_map(function($i){return base_convert($i,10,$_GET[2]);},range($_GET[0],$_GET[1]))),0);

Güzel kolleksiyon! Temel 64 de dahil olmak üzere bir 3a sürümü yapmak ister misiniz? : D
Titus

@Titus Base 64'ün sırası nasıl? Neden tüm yazdırılabilir ascii karakterlerle en.wikipedia.org/wiki/Ascii85 veya biraz daha fazlasını
yapmıyorsunuz

2

JavaScript (ES6), 50 (% 71 - 30)

(n,k,b)=>eval("for(o=0;n<=k;++n)o+=n.toString(b)").match(/0/g).length-1

Bonus yok, baz k + 2 10 bayt(i,k)=>+!i

Bonus yok, tekli 8 bayt(i,k)=>0

ÖLÇEK

f=(n,k,b)=>eval("for(o=0;n<=k;++n)o+=n.toString(b)").match(/0/g).length-1

function go() {
  var i=I.value.match(/\d+/g)
  R.textContent = f(i[0],i[1],i[2])
}

go()
i,k,b:<input id=I value='0,500,10' oninput="go()">
<span id=R></span>


Döngüden o='0'önce hareket ederseniz , kodunuz zaman bile çalışmaya devam eder k<i.
Neil

@ Neil güzel, ama spec diyor (i ≤ k). Güncelleme Bunu denedim ama aslında k <i için çalışmıyor
edc65

Peki, benim için çalıştı (ve spec i <= k garanti garanti biliyorum, ama k <i kodunuzu çöküyor; karşılaştırıldığında benim kod sadece k <i - 1 olduğunda çöküyor)
Neil

@Neil uh tamam şimdi anladım. Mantıklı bir cevap vermez, ancak en azından çökmez
edc65

1
@ForcentVintier yine de girişinizden sonra bazı bayt tasarrufu kodunu revize ettim
edc65

1

Jolf, 7 bayt

Değiştir ile \x11. Burada deneyin!

Zl♂sjJ0
   sjJ  inclusive range between two numeric inputs
  ♂      chopped into single-length elements
Zl    0  and count the number of zeroes
        implicitly printed

1

Lua 74 bayt

z,c=io.read,""for a=z(),z()do c=c..a end o,b=string.gsub(c,"0","")print(b)

Bunu yapmanın daha etkili bir yolu olmalı ...

Gerçekten burada bir şey üzerinde olduğumu düşündüm:

c,m,z=0,math,io.read for a=z(),1+z()do c=c+((m.floor(a/10))%10==0 and 1 or a%100==0 and 1 or a%10==0 and 1 or 0) end print(c)

Ama ne yazık ki ... Unuttuğum sıfırların daha fazla olduğunu fark ettiğim için gittikçe uzuyor ...


1

APL, 22 bayt

{+/'0'⍷∊0⍕¨(⍺-1)↓⍳⍵}

Bu, sol ve sağdaki aralık sınırlarını kabul eden ve bir tamsayı döndüren monadik bir işlevdir.

Ungolfed:

           (⍺-1)↓⍳⍵}  ⍝ Construct the range ⍺..⍵ by dropping the first
                      ⍝ ⍺-1 values in the range 1..⍵
       ∊0⍕¨           ⍝ Convert each number to a string
{+/'0'⍷               ⍝ Count the occurrences of '0' in the string

Burada deneyin


1

Haskell, 29 bayt

i#k=sum[1|'0'<-show=<<[i..k]]

Baz 10 kullanıyorum .

Kullanım örneği: 100 # 200->22

Nasıl çalışır: dan listedeki her eleman çevirmek iiçin k's dize gösterimine içine, tek bir dize halinde concatenate, bir alacak 1her char '0've bu Özetle 1s.


1

MATL , 7 (10 bayt -% 30 bonus)

2$:i:qYA~z

Çevrimiçi deneyin!

Bu sürüm 11.0.2'de çalışır , bu daha önceki .

açıklama

2$:      % implicitly input two numbers and generate inclusive range
i:q      % input base b and generate vector [0,1,...,b-1]
YA       % convert range to base b using symbols 0,1,...,b-1. Gives 2D array
~        % logical negation. Zeros become 1, rest of symbols become 0
z        % number of nonzero elements in array

1

Matlab: 27 bayt

@(q,w)nnz(num2str(q:w)==48)

düşük sayıdan büyük sayıya bir vektör oluşturur, ardından tüm sayıları dizeye dönüştürür ve tüm '0' sembollerini sayar.


1

Python 3, 52.

Bonusu uygulamaya çalıştı, ama buna değmez gibi görünüyor.

lambda a,b:''.join(map(str,range(a,b+1))).count('0')

Test durumları ile:

assert f(10, 10) == 1
assert f(0, 27) == 3
assert f(100, 200) == 22
assert f(0, 500) == 92

1
Bu açıklamadan önce iddia beyanını hiç duymadım. Teşekkürler dostum!
sagiksp

1

Perl 6 , 23 bayt

{+($^i..$^k).comb(/0/)}
  1. bir Aralık oluşturur ( $^i..$^k )
  2. değerleri dolaylı olarak boşluklarla birleştirir ( .combbir Str yöntemidir)
  3. yalnızca sıfırların ( .comb(/0/)) bir listesini oluşturur
  4. bu listedeki elem sayısını döndürür ( + )

Kullanımı:

my &zero-count = {…}

for (10,10), (0,27), (100,200), (0,500), (0,100000) {
  say zero-count |@_
}
1
3
22
92
38895

Bilirsiniz, kodunuzun sonundaki yorum daha uzun
görünür

@ETHproductions Bunu genellikle yaparım, böylece işleri yapmak için birden fazla yol bulursam, diğerlerinden daha kısa olup olmadığını görebiliyorum. En kısa yol olduğunu düşündüğüm şeyi bulana kadar bunu yapmak için daha fazla yol eklemeye devam ediyorum.
Brad Gilbert b2gills

1

Mathematica, 39 bayt, bonus ile 27,3

Count[#~Range~#2~IntegerDigits~#3,0,2]&

1

C # 112 Bayt

int z(int i,int k)=>String.Join("",Enumerable.Range(i,k-i+1)).Count(c=>c=='0')
  1. İlk sayıdan son sayıya kadar sayılar içeren bir dize oluşturma
  2. Dizedeki sıfır karakterleri sayma

PPCG'ye Hoşgeldiniz! Ben C # aşina değilim ama bazı boşlukları kaldırırsanız muhtemelen birkaç bayt kaydedebilirsiniz düşünüyorum.
0

teşekkür ederim 0, haklısın ama sadece birkaç bayt. Düzenlenmiş cevabımın yapabileceğim tüm alanları kaldırdığına inanıyorum. :)
lee

1

PHP, 84 bayt * .7 = 58,8 (baz 2 ila 36)

for(;($v=$argv)[2]>$a=$v[1]++;)$n+=substr_count(base_convert($a,10,$v[3]),0);echo$n;

veya

for(;($v=$argv)[2]>$v[1];)$n+=substr_count(base_convert($v[1]++,10,$v[3]),0);echo$n;

komut satırı bağımsız değişkenlerinden ondalık girdi alır; ile çalıştırın -r.


Eğlenmek için: <?=0tekli ve alfabetik destekler. ;)
Titus

1

PowerShell, 56 54 51 48 42 bayt

param($i,$k)(-join($i..$k)-split0).count-1

Girdiyi alır, $i..$ksonra -joins ile birlikte bir dize içine bir aralık oluşturur , ardından -splitdizeyi 0s'ye dilimleyerek diziye ayıran bir regex komutu gelir . Biz bunu().count-1 kaç sıfır ölçmek için. Bu, boru hattında kaldı ve çıktı örtük.

@ConnorLSW sayesinde 6 bayt tasarruf edildi

Çevrimiçi deneyin!


PowerShell'de taban kullanımı sınırlıdır ve keyfi tabanları desteklemez, bu yüzden bonus için gitmiyorum.


param($i,$k)(-join($i..$k)-split'0').Length-1benim için çalışıyor, -3 veya .Count-1daha fazla tasarruf etmek için kullan , henüz test etmedim.
colsw

@ConnorLSW Teşekkürler! Tırnaklara gerek yok '0', bu yüzden birkaç tane daha kesilmiş.
AdmBorkBork

iyi olanı, her zaman böyle powershell kolları sayılar unutuyorum.
colsw

0

Java 8, 102 bayt -% 30 = 71,4

Neden olmasın.

(i,k,b)->{int j=0;for(;i<=k;i++)for(char c:Integer.toString(i,b).toCharArray())if(c==48)j++;return j;}

Bonus olmadan, 96 bayt (bonus aslında puanımı artırır!):

(i,k)->{int j=0;for(;i<=k;i++)for(char c:String.valueOf(i).toCharArray())if(c==48)j++;return j;}

Bu aşağıdakileri uygular:

interface Function {
    public int apply(int i, int k, int b);
}

@ mbomb007 Sorun, bu şekilde biçimlendirmenin, soruyu Liderler Tablosunda 102 bayt olarak göstermesidir.
HyperNeutrino

Bu afişle değil, afişle ilgili bir kusur. Diğer cevapların çoğunun aynı şekilde yaptıklarına bakın.
mbomb007

@ mbomb007 Cevaplara bakıyorum ve bazıları skor tablosu ile çalışan, bazıları çalışmayan bir ton farklı format görüyorum.
HyperNeutrino

0

Clojure, 50 49 bayt

#(count(re-seq #"0"(apply str(range %(inc %2)))))

Regex filtrelemekten daha kısadır. Orijinal:

#(count(filter #{\0}(apply str(range %(inc %2)))))

Çok basit, \0başkalarını kaldırmak için karakter kümesini kullanır ve kaç tanesinin bulunduğunu sayar.

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.