Zerowe w przedziale

14

Twoim zadaniem jest napisanie funkcji lub programu, który przyjmuje dwie nieujemne liczby całkowite ii k( ik), i dowiedzieć się, ile zer byś napisał, gdybyś napisał wszystkie liczby całkowite od ido k(włącznie) w wybranej bazie na kawałku z papieru. Wypisuje tę liczbę całkowitą, liczbę zer, na standardowe wyjście lub podobne.

-30%jeśli zaakceptujesz również trzeci argument b, podstawa liczb całkowitych do zapisania liczb. Aby uzyskać ten bonus, należy obsłużyć co najmniej dwie podstawy.

  • Możesz zaakceptować dane wejściowe w dowolnej bazie i możesz zmienić bazę między przypadkami testowymi.
  • Można przyjąć argumenty i, ki ewentualnie bw dowolnej kolejności.
  • Odpowiedzi muszą obsługiwać co najmniej jedną bazę, która nie jest jednostkowa.

Przypadki testowe (w bazie 10):

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

To jest golf golfowy; najmniej bajtów wygrywa.

Filip Haglund
źródło
2
Jeśli możesz przejść z dowolną bazą, którą chcesz od przypadku do przypadku, czy nie możesz zrobić każdego z bazy k i wydrukować 0 lub 1, w zależności od tego, czy i = 0?
StephenTG
4
Możesz wykluczyć jednoargumentowy jako podstawę, w przeciwnym razie ten problem jest trywialny: zdobądź dane wejściowe, wydrukuj 0
Mego
Czy możesz dodać jakieś przypadki testowe dla innych baz?
Morgan Thrapp
3
Myślę, że byłoby to bardziej interesujące, gdyby wymagany był argument podstawowy. „Podstawa twojego wyboru” jest dla mnie dziwna.
Alex A.
1
Tak, @AlexA. ale za późno, żeby to zmienić, 10 odpowiedzi.
Filip Haglund

Odpowiedzi:

17

Galaretka, 1 bajt

¬

Używa podstawy k+2, w którym to przypadku jest jeden 0 iffi wynosi 0. To wymaga dwóch argumentów, ale logiczne NIE stosuje tylko do pierwszego.

Jeśli nie chcemy oszukiwać:

7 bajtów - 30% = 4,9

-1.1 punktów autor: @Dennis

rb⁵$¬SS

To dostaje bonus.

             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
lirtosiast
źródło
7
To drugi program Jelly, który napisałem na telefonie.
lirtosiast
13
Cholera, 1 bajt? Daj nam szansę.
Rɪᴋᴇʀ
2
Można to łatwo zrobić w kilku bajtach w dowolnym innym języku. Mówię trzymaj się wersji nie zdradzającej.
ETHprodukcje
13
@ETHproductions Reguły pytania wyraźnie na to pozwalają. Oszustwo czy nie, to odpowiedź, której wymagają reguły.
Dennis
8

Python 2, 36 bajtów

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

Kredyt dla muddyfish dla `` sztuczki.

Dantal
źródło
1
Witamy w Programowaniu Puzzle i Code Golf! To miła pierwsza odpowiedź. :)
Alex A.
Łał! Nie wiedziałem, że to działa!
Dantal
6

05AB1E , 3 1 bajt

Używa bazy k+2jak odpowiedź Jelly, Code:

_

Wyjaśnienie:

_  # Logical NOT operator

3-bajtowa wersja bez oszustwa:

Kod:

Ÿ0¢

Wyjaśnienie:

Ÿ    # Inclusive range
 0¢  # Count zeroes

Bonus daje mi 3,5 bajta z powodu błędu:

ŸB)0¢

Wyjaśnienie:

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

Wykorzystuje kodowanie CP-1252.

Adnan
źródło
Jak to działa?
lirtosiast
@ThomasKwa Wyjaśnienie zostało dodane
Adnan
5

Japt, 3 bajty

+!U

Używa bazy k+2, jak odpowiada galaretka. Jest zero iff i==0. Przetestuj online!

Lepsza wersja, 10 8 bajtów

UòV ¬è'0

Ten używa bazy 10. Przetestuj online!

Wersja premiowa, 14 12 bajtów - 30% = 8,4

UòV msW ¬è'0

Niestety, gdy grałem w golfa, bonus nie jest już tego wart ... Przetestuj online!

Jak to działa

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".
ETHprodukcje
źródło
5

ES6, 91 86-30 % = 60,2 bajtów

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

Lub zapisz 3 (2.1) bajty, jeśli b nie musi mieć domyślnie 10.

Najlepsza wersja bez premii, jaką mogłem zrobić, to 65 bajtów:

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

Edycja: Zapisano 5 bajtów, używając sztuczki liczenia zera @ edc65.

Neil
źródło
Ponieważ nie uda mi się zdobyć głosów na moją odpowiedź, będę głosować za twoją (przynajmniej tam moje imię w środku)
edc65
4

Poważnie, 10 bajtów

'0,,u@xεjc

Wyjaśnienie:

'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

Wypróbuj online!

Z premią: 11,9 bajtów

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

Wypróbuj online!

Wyjaśnienie:

'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
Mego
źródło
3

CJam, 12 10 3 bajtów

li!

Używa to skrótu @ThomasKwa.

Jeśli nie jest to dozwolone, oto 10-bajtowa odpowiedź.

q~),>s'0e=

Miło i krótko! Działa jak poważna odpowiedź @ Mego.

Dzięki @Dennis!

Bawiłem się pisząc moją pierwszą odpowiedź CJam!

Wypróbuj tutaj!

TanMath
źródło
3

T-SQL, 394 bajtów (bez premii)

Myślę, że „dlaczego nie ”, prawda?

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)

I przyjazny:

-- 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)
Nelz
źródło
to poświęcenie.
colsw
3

Rubinowy, 46–30% = 32,2 bajtów

Prawdopodobnie mógłbyś zagrać w golfa więcej, ale przynajmniej dostaję 30% bonus!

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

... lub bez premii (27 bajtów)

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

Wskazówki są mile widziane, wciąż ucząc się tego całego „Rubinowego”.

ślimak_
źródło
Dobra odpowiedź, nie potrzebujesz operatora splat podczas korzystania z mapy, to może zaoszczędzić 1 bajt. (i..k)jest tak samo dobry jak [*i..k]w pierwszym przypadku.
GB
2

Brachylog , 26 bajtów

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

Pobiera dane wejściowe jako listę [i,k] .

Wyjaśnienie

,{    }?: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.
Fatalizować
źródło
2

Julia, 48 bajtów - 30% = 33,6

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

Jest to funkcja, która akceptuje trzy liczby całkowite i zwraca liczbę całkowitą. Jeden z argumentów określa podstawę, więc kwalifikuje się do premii.

Nie golfowany:

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

Wdrożenie premii daje wynik niewiele lepszy niż brak implementacji (34 bajty):

f(i,k)=sum(c->c<49,[join(i:k)...])
Alex A.
źródło
2

Poważnie, 2 bajty

Może to doprowadzić do wyczerpania sztuczki z odpowiedzią Jelly, ale oto prosty 2-bajtowy Poważnie.

,Y

Wypróbuj online!

TanMath
źródło
2

Pyth, 6,3 bajtów, z premią (9 bajtów - 30%)

/sjRQ}EE0

Wyjaśnienie:

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

Wypróbuj tutaj

Lub 7 bajtów bez premii:

/`}EE\0

Wyjaśnienie:

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

Wypróbuj tutaj

Lub użyj pakietu testowego

niebieski
źródło
Myślę, że warto zdobyć bonus:/sjRQ}EE0
FryAmTheEggman
Ech, to ten sam kod z podstawową konwersją, jestem pewien, że wiesz, co robisz, tylko problem premii zmuszającej cię do wypróbowania różnych rzeczy i liczenia ...: P
FryAmTheEggman
2

PHP, 50 bajtów

obsługuje tylko dziesiętne

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

obsługuje dziesiętne i binarne z Bonus 63

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

obsługuje dziesiętne, szesnastkowe, ósemkowe i binarne z Bonusem 77.7

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

obsługuje bazę 2 - 36 z Bonusem 78,4

<?=substr_count(join(array_map(function($i){return base_convert($i,10,$_GET[2]);},range($_GET[0],$_GET[1]))),0);
Jörg Hülsermann
źródło
Niezła kolekcja! Chcesz zrobić wersję 3a z bazą 64? : D
Tytus
@Titus Jaka jest kolejność bazy 64? Dlaczego nie en.wikipedia.org/wiki/Ascii85 lub zrobić coś więcej ze wszystkimi drukowanymi
znakami
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

Bez premii, podstawa k + 2 to 10 bajtów(i,k)=>+!i

Bez premii, jednoosobowy to 8 bajtów(i,k)=>0

TEST

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>

edc65
źródło
Jeśli przeniesiesz o='0'pętlę przed, Twój kod będzie działał nawet wtedy, gdy k<i.
Neil
@ Nee nice, ale specyfikacja mówi (i ≤ k). Aktualizacja Próbowałem tego, ale w rzeczywistości nie działa dla k <i
edc65
Cóż, zadziałało dla mnie (i wiem, że specyfikacja gwarantuje, że i <= k, ale twój kod ulega awarii, gdy k <i; w porównaniu mój kod ulega awarii tylko, gdy k <i - 1!)
Neil
@ Nee uh ok teraz rozumiem. Nie daje sensownej odpowiedzi, ale przynajmniej nie ulega awarii
edc65 30.01.2016
1
@ForcentVintier i tak po wprowadzeniu poprawiłem kod, oszczędzając niektóre bajty
edc65
1

Jolf, 7 bajtów

Wymień się \x11. Wypróbuj tutaj!

Zl♂sjJ0
   sjJ  inclusive range between two numeric inputs
  ♂      chopped into single-length elements
Zl    0  and count the number of zeroes
        implicitly printed
Conor O'Brien
źródło
1

Lua 74 bajty

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

Musi być bardziej skuteczny sposób, aby to zrobić ...

Myślałem, że naprawdę mnie tu coś interesuje:

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)

Ale niestety ... To staje się coraz dłuższe, ponieważ zdaję sobie sprawę, że jest coraz więcej zer, o których zapomniałem ...

Skyl3r
źródło
1

APL, 22 bajty

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

Jest to funkcja monadyczna, która akceptuje granice zakresu po lewej i prawej stronie i zwraca liczbę całkowitą.

Nie golfowany:

           (⍺-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

Wypróbuj tutaj

Alex A.
źródło
1

Haskell, 29 bytes

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

I'm using base 10.

Usage example: 100 # 200 -> 22

How it works: turn each element in the list from i to k into it's string representation, concatenate into a single string, take a 1 for every char '0' and sum those 1s.

nimi
źródło
1

MATL, 7 (10 bytes − 30% bonus)

2$:i:qYA~z

Try it online!

This works in release 11.0.2, which is earlier than this challenge.

Explanation

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
Luis Mendo
źródło
1

Matlab: 27 bytes

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

creates a vector from lower number to larger one, then converts all numbers to string and counts all the '0' symbols.

brainkz
źródło
1

Python 3, 52.

Tried to implement the bonus, but it doesn't seem to be worth it.

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

With test cases:

assert f(10, 10) == 1
assert f(0, 27) == 3
assert f(100, 200) == 22
assert f(0, 500) == 92
Morgan Thrapp
źródło
1
I literally never heard about the assert statement before this comment. Thanks mate!
sagiksp
1

Perl 6, 23 bytes

{+($^i..$^k).comb(/0/)}
  1. creates a Range ( $^i..$^k )
  2. joins the values with spaces implicitly ( .comb is a Str method )
  3. creates a list of just the zeros ( .comb(/0/) )
  4. returns the number of elems in that list ( + )

Usage:

my &zero-count = {…}

for (10,10), (0,27), (100,200), (0,500), (0,100000) {
  say zero-count |@_
}
1
3
22
92
38895
Brad Gilbert b2gills
źródło
You know, that comment at the end of your code makes it seem longer...
ETHproductions
@ETHproductions I usually do that so that if I come up with more than one way to do things that I can see if it is shorter than others. I just keep adding more ways to do it until I come up with what I think is the shortest way.
Brad Gilbert b2gills
1

Mathematica, 39 bytes, 27.3 with bonus

Count[#~Range~#2~IntegerDigits~#3,0,2]&
A Simmons
źródło
1

C# 112 Bytes

int z(int i,int k)=>String.Join("",Enumerable.Range(i,k-i+1)).Count(c=>c=='0')
  1. Create a string with numbers from the first number up to the last number
  2. Count the zero characters in the string
lee
źródło
Welcome to PPCG! I'm not super familiar with C# but I think you could probably save a few bytes if you removed some of the spaces.
0 '
thank you 0, you are right but only a couple bytes. I believe my edited answer removes all the spaces I can. :)
lee
1

PHP, 84 bytes *.7=58.8 (bases 2 to 36)

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

or

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

takes decimal input from command line arguments; run with -r.

Titus
źródło
For fun: <?=0 supports unary and alphabetic. ;)
Titus
1

PowerShell, 56 54 51 48 42 bytes

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

Takes input, creates a range with $i..$k then -joins that together into a string, followed by a regex -split command that separates the string into an array by slicing at the 0s. We encapsulate that with ().count-1 to measure how many zeros. That's left on the pipeline, and output is implicit.

Saved 6 bytes thanks to @ConnorLSW

Try it online!


Base-handling in PowerShell is limited and doesn't support arbitrary bases, so I'm not going for the bonus.

AdmBorkBork
źródło
param($i,$k)(-join($i..$k)-split'0').Length-1 works for me, -3, or use .Count-1 to save even more, haven't tested that yet though.
colsw
@ConnorLSW Thanks! Don't need the quotes around '0', so that trimmed off a few more.
AdmBorkBork
nice one, I always forget powershell handles numbers like that.
colsw
0

Java 8, 102 bytes - 30% = 71.4

Why not.

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

Without the bonus, 96 bytes (so the bonus actually improves my score!):

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

This implements the following:

interface Function {
    public int apply(int i, int k, int b);
}
HyperNeutrino
źródło
@mbomb007 The problem is that formatting it this way renders the answer as 102 bytes on the Leaderboard in the question.
HyperNeutrino
That's a flaw with the leaderboard, not the post. Look at how most of the other answers are doing it the same way.
mbomb007
@mbomb007 I'm looking at the answers and I see a ton of different formats, some of which work with the leaderboard, some of which don't.
HyperNeutrino
0

Clojure, 50 49 bytes

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

Oh regex is shorter than filtering. Original:

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

Very basic, uses the set of character \0 to remove others and counts how many were found.

NikoNyrh
źródło