Nullen im Intervall


14

Ihre Aufgabe ist es, eine Funktion oder ein Programm zu schreiben, die bzw. das zwei nicht negative ganze Zahlen iund k( ik) enthält, und herauszufinden, wie viele Nullen Sie schreiben würden, wenn Sie alle ganzen Zahlen von ibis k(einschließlich) in die Basis Ihrer Wahl auf einem Stück schreiben würden aus Papier. Geben Sie diese Ganzzahl, die Anzahl der Nullen, als stdout oder ähnlich aus.

-30%Wenn Sie auch ein drittes Argument akzeptieren b, wird die Ganzzahlbasis zum Aufschreiben der Zahlen verwendet. Um diesen Bonus zu erhalten, müssen mindestens zwei Basen behandelt werden.

  • Sie können die Eingabe in einer beliebigen Basis akzeptieren und die Basis zwischen Testfällen ändern.
  • Sie können die Argumente akzeptieren i, kund gegebenenfalls bin beliebiger Reihenfolge.
  • Die Antworten müssen mindestens eine nicht unäre Basis behandeln.

Testfälle (in Basis 10):

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

Das ist Code-Golf; Wenigste Bytes gewinnen.


2
Wenn Sie von Fall zu Fall mit einer beliebigen Basis arbeiten können, können Sie dann nicht jede in der Basis k ausführen und 0 oder 1 ausgeben, je nachdem, ob i = 0 ist?
StephenTG

4
Vielleicht möchten Sie Unary als Basis ausschließen, oder dieses Problem ist trivial: Eingaben abrufen, 0
ausgeben

Können Sie einige Testfälle für andere Basen hinzufügen?
Morgan Thrapp

3
Ich denke, das wäre interessanter, wenn das Basisargument benötigt würde. "Basis Ihrer Wahl" ist komisch für mich.
Alex A.

1
Ja, @AlexA. Aber zu spät, um das jetzt zu ändern, 10 Antworten in.
Filip Haglund

Antworten:


17

Gelee, 1 Byte

¬

Dies verwendet base k+2. In diesem Fall gibt es eine einzelne 0, wenn f 0 iist. Es werden zwei Argumente verwendet, aber das logische NOT wird nur auf das erste angewendet.

Wenn wir nicht schummeln wollen:

7 Bytes - 30% = 4,9

-1,1 Punkte von @Dennis

rb⁵$¬SS

Das bringt den 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

7
Dies ist das zweite Jelly-Programm, das ich auf meinem Handy geschrieben habe.
Lirtosiast

13
Verdammt, 1 Byte? Gib uns eine Chance.
29.

2
Dies kann in sehr wenigen Bytes in jeder anderen Sprache problemlos durchgeführt werden. Ich sage bleibe bei der nicht betrügenden Version.
ETHproductions

13
@ETHproductions Die Regeln der Frage erlauben dies ausdrücklich . Betrogen oder nicht, das ist die Antwort, nach der die Regeln verlangen.
Dennis

8

Python 2, 36 Bytes

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

Kredit muddyfish für den `` Trick.


1
Willkommen bei Programming Puzzles & Code Golf! Dies ist eine schöne erste Antwort. :)
Alex A.

Beeindruckend! Ich wusste nicht, dass es funktioniert!
Dantal,

6

05AB1E , 3 1 Byte

Verwendet Base k+2wie die Jelly-Antwort, Code:

_

Erläuterung:

_  # Logical NOT operator

Nicht betrügende 3-Byte-Version:

Code:

Ÿ0¢

Erläuterung:

Ÿ    # Inclusive range
 0¢  # Count zeroes

Der Bonus gibt mir 3,5 Bytes wegen eines Fehlers:

ŸB)0¢

Erläuterung:

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

Verwendet die CP-1252-Codierung.


Wie funktioniert das?
Lirtosiast

@ ThomasKwa Erklärung hinzugefügt
Adnan

5

Japt, 3 Bytes

+!U

Verwendet Base k+2, als die Gelee-Antwort. Es gibt eine Null iff i==0. Online testen!

Bessere Version, 10 8 Bytes

UòV ¬è'0

Dieser verwendet Base 10. Testen Sie es online!

Bonusversion, 14 12 Bytes - 30% = 8,4

UòV msW ¬è'0

Leider lohnt sich der Bonus beim Golfen nicht mehr ... Testen Sie ihn online!

Wie es funktioniert

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 Bytes

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

Oder speichern Sie 3 (2.1) Bytes, wenn b nicht standardmäßig 10 sein muss.

Die beste Nicht-Bonus-Version, die ich machen konnte, war 65 Bytes:

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

Bearbeiten: 5 Bytes mit dem Zero-Counting-Trick von @ edc65 gespeichert.


Da ich keine Stimmen für meine Antwort bekomme, stimme ich deiner zu (zumindest mein Name)
edc65

4

Im Ernst, 10 Bytes

'0,,u@xεjc

Erläuterung:

'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

Probieren Sie es online!

Mit Bonus: 11,9 Bytes

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

Probieren Sie es online!

Erläuterung:

'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 Bytes

li!

Dies geschieht mit der Verknüpfung @ThomasKwa.

Wenn dies nicht zulässig ist, ist hier eine 10-Byte-Antwort.

q~),>s'0e=

Schön und kurz! Funktioniert wie @ Megos Ernsthafte Antwort.

Vielen Dank @Dennis!

Viel Spaß beim Schreiben meiner ersten CJam-Antwort!

Probieren Sie es hier aus!


3

T-SQL, 394 Bytes (kein Bonus)

Ich denke , warum nicht ?

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)

Und der Freundliche:

-- 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)

Das ist Hingabe.
Colsw

3

Ruby, 46 - 30% = 32,2 Bytes

Sie könnten wahrscheinlich mehr Golf spielen, aber zumindest bekomme ich den 30% Bonus!

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

... oder ohne den Bonus (27 Bytes)

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

Trinkgelder sind willkommen und lernen immer noch diese ganze "Ruby" -Sache.


Gute Antwort, Sie brauchen den splat-Operator nicht, wenn Sie eine Karte verwenden, dies könnte 1 Byte einsparen. (i..k)ist so gut wie [*i..k]im ersten Fall.
GB

2

Brachylog , 26 Bytes

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

Übernimmt die Eingabe als Liste [i,k].

Erläuterung

,{    }?: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 Bytes - 30% = 33,6

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

Dies ist eine Funktion, die drei Ganzzahlen akzeptiert und eine Ganzzahl zurückgibt. Da eines der Argumente die Basis angibt, ist dies für den Bonus qualifiziert.

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

Das Implementieren des Bonus ergibt eine Punktzahl, die kaum besser ist als das Nicht-Implementieren (34 Bytes):

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


2

Pyth, 6,3 Bytes, mit Bonus (9 Bytes - 30%)

/sjRQ}EE0

Erläuterung:

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

Probieren Sie es hier aus

Oder 7 Bytes ohne den Bonus:

/`}EE\0

Erläuterung:

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

Probieren Sie es hier aus

Oder verwenden Sie eine Testsuite


Ich denke, der Bonus ist es wert:/sjRQ}EE0
FryAmTheEggman

Ehh, es ist derselbe Code mit einer Basisumwandlung, ich bin mir ziemlich sicher, dass Sie wissen, was Sie tun, nur das Problem eines Bonus, der Sie dazu zwingt, verschiedene
Dinge

2

PHP, 50 Bytes

unterstützt nur dezimal

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

unterstützt dezimal und binär mit Bonus 63

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

Unterstützt Dezimal, Hexadezimal, Oktal und Binär mit Bonus 77.7

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

unterstützt Base 2 - 36 mit Bonus 78.4

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

Nette Sammlung! Möchten Sie eine Version 3a mit Base 64 erstellen? : D
Titus

@Titus Wie ist die Reihenfolge der Basis 64? Warum nicht en.wikipedia.org/wiki/Ascii85 oder machen Sie ein wenig mehr mit allen druckbaren ASCII-Zeichen
Jörg Hülsermann

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

Kein Bonus, Basis k + 2 ist 10 Bytes(i,k)=>+!i

Kein Bonus, unär ist 8 Bytes(i,k)=>0

PRÜFUNG

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>


Wenn Sie die o='0'vor der Schleife verschieben, funktioniert Ihr Code auch dann noch k<i.
Neil

@Neil nett, aber die Spezifikation sagt (i ≤ k). Update Ich habe dies versucht, aber in der Tat funktioniert es nicht für k <i
edc65

Nun, es hat bei mir funktioniert (und ich weiß, dass die Spezifikation garantiert, dass i <= k ist, aber Ihr Code stürzt ab, wenn k <i ist; im Vergleich dazu stürzt mein Code nur ab, wenn k <i - 1 ist!)
Neil

@Neil uh ok jetzt verstehe ich es. Es gibt keine vernünftige Antwort, aber es stürzt zumindest nicht ab
edc65

1
@ForcentVintier trotzdem nach Ihrer Eingabe habe ich den Code überarbeitet, um einige Bytes zu sparen
edc65

1

Jolf, 7 Bytes

Ersetzen durch \x11. Probieren Sie es hier aus!

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 Bytes

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

Es muss einen effektiveren Weg geben, dies zu tun ...

Ich dachte, ich wäre wirklich auf etwas hier:

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)

Aber leider ... Es wird immer länger, als ich merke, dass es immer mehr Nullen gibt, die ich vergessen habe ...


1

APL, 22 Bytes

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

Dies ist eine monadische Funktion, die die Bereichsgrenzen links und rechts akzeptiert und eine Ganzzahl zurückgibt.

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

Probieren Sie es hier aus


1

Haskell, 29 Bytes

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

Ich benutze Basis 10 .

Anwendungsbeispiel: 100 # 200->22

So funktioniert es: Verwandle jedes Element in der Liste von ibis kin seine Zeichenfolgendarstellung, verkette es zu einer einzelnen Zeichenfolge, nimm ein 1für jedes Zeichen '0'und summiere diese 1s.


1

MATL , 7 (10 Bytes - 30% Bonus)

2$:i:qYA~z

Probieren Sie es online!

Dies funktioniert in Release 11.0.2 , die als diese Herausforderung ist.

Erläuterung

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 Bytes

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

Erstellt einen Vektor von einer niedrigeren zu einer größeren Zahl, konvertiert dann alle Zahlen in eine Zeichenfolge und zählt alle '0'-Symbole.


1

Python 3, 52.

Versucht, den Bonus umzusetzen, aber es scheint sich nicht zu lohnen.

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

Mit Testfällen:

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

1
Ich habe vor diesem Kommentar buchstäblich noch nie von der Behauptung gehört. Danke Kumpel!
Sagiksp

1

Perl 6 , 23 Bytes

{+($^i..$^k).comb(/0/)}
  1. erstellt einen Bereich ( $^i..$^k )
  2. verbindet die Werte implizit mit Leerzeichen ( .comb ist eine Str-Methode)
  3. Erstellt eine Liste nur der Nullen ( .comb(/0/) )
  4. gibt die Anzahl der Elemente in dieser Liste zurück ( +)

Verwendung:

my &zero-count = {…}

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

Weißt du, dieser Kommentar am Ende deines Codes lässt es länger erscheinen ...
ETHproductions

@ETHproductions Ich mache das normalerweise so, dass ich, wenn ich mehr als eine Möglichkeit finde, Dinge zu tun, die ich sehen kann, wenn sie kürzer sind als andere. Ich füge einfach weitere Möglichkeiten hinzu, bis ich das finde, was ich für den kürzesten Weg halte.
Brad Gilbert b2gills

1

Mathematica, 39 Bytes, 27,3 mit Bonus

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

1

C # 112 Bytes

int z(int i,int k)=>String.Join("",Enumerable.Range(i,k-i+1)).Count(c=>c=='0')
  1. Erstellen Sie eine Zeichenfolge mit Zahlen von der ersten bis zur letzten Zahl
  2. Zählen Sie die Nullzeichen in der Zeichenfolge

Willkommen bei PPCG! Ich bin nicht besonders vertraut mit C #, aber ich denke, Sie könnten wahrscheinlich ein paar Bytes sparen, wenn Sie einige der Leerzeichen entfernen würden.
0 '

danke 0, du hast recht aber nur ein paar bytes. Ich glaube, meine bearbeitete Antwort entfernt alle Leerzeichen, die ich kann. :)
Lee

1

PHP, 84 Bytes * .7 = 58,8 (Basen 2 bis 36)

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

oder

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

Nimmt dezimale Eingaben von Befehlszeilenargumenten entgegen. renn mit -r.


Zum Spaß: <?=0Unterstützt unär und alphabetisch. ;)
Titus

1

PowerShell, 56 54 51 48 42 Byte

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

Nimmt Eingaben auf, erstellt einen Bereich mit den $i..$kdann -joinzusammen in einer Zeichenfolge, gefolgt von einem Regex- -splitBefehl, der die Zeichenfolge in ein Array trennt, indem er am Ende der Zeichenfolge ein Slice erstellt 0. Wir kapseln das mit ().count-1, um zu messen, wie viele Nullen es gibt. Das bleibt in der Pipeline und die Ausgabe ist implizit.

6 Bytes gespart dank @ConnorLSW

Probieren Sie es online!


Das Base-Handling in PowerShell ist begrenzt und unterstützt keine willkürlichen Basen. Daher werde ich den Bonus nicht in Anspruch nehmen.


param($i,$k)(-join($i..$k)-split'0').Length-1Funktioniert bei mir, -3, oder .Count-1um noch mehr zu sparen, habe das aber noch nicht getestet.
Colsw

@ConnorLSW Danke! Benötigen Sie nicht die Anführungszeichen herum '0', so dass ein paar mehr abgeschnitten.
AdmBorkBork

schön, ich vergesse immer, dass Powershell mit solchen Zahlen umgeht.
Colsw

0

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

Warum nicht.

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

Ohne den Bonus 96 Bytes (also verbessert der Bonus tatsächlich meine Punktzahl!):

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

Dies implementiert Folgendes:

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

@ mbomb007 Das Problem besteht darin, dass durch diese Formatierung die Antwort im Leaderboard in der Frage als 102 Byte dargestellt wird.
HyperNeutrino

Das ist ein Fehler in der Bestenliste, nicht in der Post. Sehen Sie sich an, wie die meisten anderen Antworten es genauso machen.
mbomb007

@ mbomb007 Ich schaue mir die Antworten an und sehe eine Menge verschiedener Formate, von denen einige mit der Bestenliste funktionieren, andere nicht.
HyperNeutrino

0

Clojure, 50 49 Bytes

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

Oh Regex ist kürzer als Filtern. Original:

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

Sehr einfach, verwendet den Zeichensatz \0, um andere zu entfernen und zählt, wie viele gefunden wurden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.