Gib mir nicht fünf!

38

Frage:

Sie erhalten die Start- und Endzahlen einer Sequenz und müssen die Anzahl der Ganzzahlen zurückgeben, die die Ziffer nicht enthalten 5. Die Start- und Endnummern sollten enthalten sein!

Beispiele:

1,9 → 1,2,3,4,6,7,8,9 → Ergebnis 8

4,17 → 4,6,7,8,9,10,11,12,13,14,16,17 → Ergebnis 12

50,60 → 60 → Ergebnis 1

-59, -50 → → Ergebnis 0

Das Ergebnis kann fünf enthalten.

Die Startnummer ist immer kleiner als die Endnummer. Beide Zahlen können auch negativ sein!

Ich bin sehr neugierig auf Ihre Lösungen und die Art und Weise, wie Sie sie lösen. Vielleicht findet jemand von euch eine einfache reine Mathematiklösung.

Bearbeiten Dies ist eine Code-Golf-Herausforderung, bei der der kürzeste Code gewinnt.

Arasuvel
quelle
3
@betseq: Das ist knapp; Aber dieser hat einen variablen Bereich (und erfordert kein Modulo).
Titus
4
Ich würde den kürzesten Code als Gewinnkriterium und den Code-Golf-Tag empfehlen (ich habe nicht einmal gemerkt, dass dies nicht der Fall ist!). Außerdem sollten Sie wahrscheinlich einen Testfall erstellen, der sich über 50 oder 500 erstreckt. Vielleicht wäre auch eine, die -50 und eine, die 0 überspannt, eine gute Idee.
Jonathan Allan
1
@ JonathanAllan: Ich werde Beispiele aktualisieren.
Arasuvel
4
Testfall: 50, 59 -> 0.
Zgarb
14
Sie sagen: "Die Startnummer ist immer kleiner als die Endnummer." aber eines ihrer beispiele (-50, -59) widerspricht dem direkt
theonlygusti

Antworten:

21

JavaScript (ES6), 36 33 Bytes

Übernimmt Eingaben mit Curry-Syntax (a)(b).

a=>F=b=>b<a?0:!/5/.test(b)+F(b-1)

Formatiert und kommentiert

a =>                 // outer function: takes 'a' as argument, returns F
  F = b =>           // inner function F: takes 'b' as argument, returns the final result
    b < a ?          // if b is less than a
      0              //   return 0
    :                // else
      !/5/.test(b) + //   add 1 if the decimal representation of b does not contain any '5'
      F(b - 1)       //   and do a recursive call to F with b - 1

Testfälle

Arnauld
quelle
(Ich ziehe normalerweise testüber , execwenn Sie nur einen boolean benötigen.)
Neil
@Neil Das macht ja mehr Sinn. Aktualisiert.
Arnauld
NB: Ich konnte keinen Tipp zur ES6-Currysyntax finden, also habe ich einen geschrieben .
Arnauld
5
@TheLethalCoder b<aist dazu da, die Rekursion zu stoppen, nachdem alle Zahlen von bbis durchgezählt wurden. Das aEntfernen würde also nur eine unendliche Rekursion verursachen.
ETHproductions
1
@HristiyanDodov Die unbenannte äußere Funktion nimmt aals Argument und gibt die FFunktion zurück, die wiederum bals Argument dient und - wie Sie bemerkt haben - rekursiv aufgerufen wird, um von bbis zu iterieren. Dabei awird ein Zähler für alle Ganzzahlen inkrementiert, die 5in ihrer Dezimalzahl kein a enthalten Darstellung.
Arnauld
17

Gelee , 8 7 Bytes

-1 Byte dank Dennis (verwenden Sie die Tatsache, dass die Indizierung in eine Zahl diese Zahl als Dezimalliste behandelt)

rAw€5¬S

TryItOnline!

Wie?

rAw€5¬S - Main link: from, to    e.g. -51, -44
r       - range(from, to)        e.g. [-51,-50,-49,-48,-47,-46,-45,-44]
 A      - absolute value         e.g. [51,50,49,48,47,46,45,44]
  w€    - first index of... for €ach (0 if not present)
    5   - five                   e.g. [1,1,0,0,0,0,2,0]
     ¬  - logical not            e.g. [0,0,1,1,1,1,0,1]
      S - sum                    e.g. 5

* Das Absolutwertatom Aist erforderlich, da eine negative Zahl, die in eine Dezimalliste umgewandelt wird, negative Einträge enthält, von denen keines jemals ein sein würde 5(das angegebene Beispiel würde alle acht statt zwei zählen).

Jonathan Allan
quelle
rAw€5¬SSpeichert ein Byte.
Dennis
@ Tennis danke! Ist meine Beschreibung "Behandelt diese Zahl als Dezimalliste" korrekt?
Jonathan Allan
2
Ziemlich viel. wWandelt ein ganzzahliges Argument in Dezimalstellen um.
Dennis
13

2sable , 6 5 Bytes

Ein Byte dank Adnan gespeichert

Ÿ5¢_O

Probieren Sie es online!

Erläuterung

 Ÿ      # inclusive range
  5¢    # count 5's in each element of the range
    _   # negate
     O  # sum

Hinweis: Dies funktioniert aufgrund eines Fehlers, bei ¢dem die Funktion sich auf jedes Element bezieht, anstatt übereinstimmende Elemente in der Liste zu zählen.

Emigna
quelle
Sie können das entfernen, `wie es sich auf Arrays genauso verhält: p.
Adnan
@Adnan: Danke! Ich wollte das testen, habe es aber vergessen;)
Emigna
9

Python2, 59 55 52 51 47 43 42 Bytes

f=lambda a,b:a<=b and-(`5`in`a`)-~f(a+1,b)

Eine rekursive Lösung. Vielen Dank an @xnor für die Motivation, mit logischen Operatoren eine Lösung zu finden! Vielen Dank auch an @JonathanAllan und @xnor , die mich angeleitet und das Byte von 43 auf 42 gehackt haben !

Andere Versuche mit 43 Bytes

f=lambda a,b:a<=b and-~-(`5`in`a`)+f(a+1,b)
f=lambda a,b:a<=b and 1-(`5`in`a`)+f(a+1,b)
Yytsi
quelle
Würde if!`x`.count('5')funktionieren
Titus
2
@ Titus Python hat notOperator, die !in C-ähnlichen Sprachen ist, aber das dauert 3 Bytes :(
Yytsi
1
Denken Sie darüber nach, logische Kurzschlüsse mit andund zu verwenden or.
20.
1
Ja, schön gemacht! Denken Sie jetzt darüber nach, das zu verkürzen not.
20.
1
Du bist wirklich nah dran! Versuche es weiter.
20.
6

05AB1E , 8 7 6 Bytes

Ein Byte dank Adnan gespeichert

Ÿ5.å_O

Probieren Sie es online!

Erläuterung

Ÿ         # inclusive range
 5.å      # map 5 in y for each y in the list
    _     # logical negation 
     O    # sum
Emigna
quelle
05AB1E hat auch vektorisiert å, das heißt , Sie können dies Ÿ5.å_Ofür 6 Bytes tun .
Adnan
negateSinn -n, oder n==0?1:0?
ETHproductions
@ETHproductions: Sorry, das war unklar. Ich meinte logische Verneinung, alson==0?1:0
Emigna
6

Pyth, 9 8 Bytes

Dank FryAmTheEggman ein Byte gespart!

lf-\5T}E

Erläuterung:

        Q # Input
      }E  # Form an inclusive range starting from another input
          #   order is reversed, but doesn't matter
 f-\5T    # Filter by absence of '5'
l         # Count the number of elements left

Probieren Sie es online!

busukxuan
quelle
5

Perl 6 , 23 Bytes

{+grep {!/5/},$^a..$^b}

Probieren Sie es online!

Wie es funktioniert

{                     }  # A lambda.
              $^a..$^b   # Range between the two lambda arguments.
  grep {!/5/},           # Get those whose string representation doesn't match the regex /5/.
 +                       # Return the size of this list.
smls
quelle
5

Haskell , 39 Bytes

s!e=sum[1|x<-[s..e],notElem '5'$show x]

Probieren Sie es online! Verwendung:

Prelude> 4 ! 17
12

Erläuterung:

             [s..e]                     -- yields the range from s to e inclusive
          x<-[s..e]                     -- for each x in this range
          x<-[s..e],notElem '5'$show x  -- if the char '5' is not in the string representation of x
       [1|x<-[s..e],notElem '5'$show x] -- then add a 1 to the resulting list      
s!e=sum[1|x<-[s..e],notElem '5'$show x] -- take the sum of the list
Laikoni
quelle
4

R, 33 Bytes

f=function(x,y)sum(!grepl(5,x:y))

Verwendung:

> f=function(x,y)sum(!grepl(5,x:y))
> f(40,60)
[1] 10
> f(1,9)
[1] 8
> f(4,17)
[1] 12
Plannapus
quelle
4

Groovy, 47 45 43 40 Bytes

{a,b->(a..b).findAll{!(it=~/5/)}.size()}

Dies ist eine namenlose Schließung. findAllähnelt dem Hinzufügen einer ifBedingung zu einem Listenverständnis in Python.

Probieren Sie es online!

Gurupad Mamadapur
quelle
4

PHP 7.1, 57 55 Bytes

for([,$a,$b]=$argv;$a<=$b;)$n+=!strstr($a++,53);echo$n;

Laufen Sie mit php -r '<code>' <a> <b>

Titus
quelle
Ist das nicht PHP7.1 Syntax?
am
@aross: Es ist. Aber PHP 7.1 ist älter als 5 Stunden ( veröffentlicht am 1. Dezember )
Titus
1
Natürlich habe ich nur gefragt, weil ich es gewohnt bin, die Version anzugeben, wenn sie 7 oder höher ist. Das ist auch eine Art Konvention für Python
am
1
Konvention für PHP - soweit ich gesehen habe - ist die Verwendung der neuesten Version, sofern nicht anders angegeben.
Titus
Ich glaube nicht, dass viele Leute die neueste Nebenversion haben. Der kleinste gemeinsame Nenner wäre derzeit wahrscheinlich 5,5. Persönlich verwende ich FC 25 (ziemlich modern), das derzeit PHP 7.0 verteilt. Wenn Sie unter Windows arbeiten, müssen Sie wahrscheinlich manuell aktualisieren.
Am
4

Mathematica, 46 44 42 Bytes

Dank an Alephalpha und DavidC für das Speichern von jeweils 2 Bytes!

Tr@Boole[FreeQ@5/@IntegerDigits@Range@##]&

Unbenannte Funktion, die zwei Ganzzahlargumente verwendet und eine Ganzzahl zurückgibt. IntegerDigits@Range@##wandelt alle Zahlen zwischen den Eingaben in Ziffernlisten um; FreeQ@5testet diese Listen, um zu entscheiden, welche keine enthalten 5. Dann Boolewandelt booleans zu Nullen und Einsen, und Trfasst die Ergebnisse.

Andere Lösungen (44 und 47 Bytes):

Count[Range@##,x_/;IntegerDigits@x~FreeQ~5]&

IntegerDigits@x~FreeQ~5Bestimmt, ob die Liste der Ziffern einer Zahl 5 Sekunden lang ist, und Count[Range@##,x_/;...]&zählt, wie viele Zahlen zwischen den Eingaben diesen Test bestehen.

Tr[Sign[1##&@@IntegerDigits@#-5]^2&/@Range@##]&

1##&@@IntegerDigits@#-5Nimmt die Liste der Ziffern einer Zahl, subtrahiert 5 von allen und multipliziert die Antworten miteinander. Sign[...]^2konvertiert dann alle Zahlen ungleich Null in 1.

Greg Martin
quelle
1
Count[Range@##,x_/;IntegerDigits@x~FreeQ~5]&
DavidC
1
Tr@Boole[FreeQ@5/@IntegerDigits@Range@##]&
Alephalpha
3

Ruby, 36-35 Bytes

->a,b{(a..b).count{|x|!x.to_s[?5]}}

Thx IMP1 für -1 Byte

GB
quelle
1
Gibt dies nicht die Liste ohne die Zahlen zurück, die 5 enthalten, und nicht die Größe dieser Liste?
IMP1
Sie haben Recht, ich habe die falsche Version kopiert / eingefügt.
GB
1
Sie können auch ?5(das '5'Zeichen) anstelle von /5/ in der Suche verwenden, um ein Byte zu speichern.
IMP1
3

Java 7, 80 78 Bytes

int c(int a,int b){int r=0;for(;a<=b;)r+=(""+a++).contains("5")?0:1;return r;}

Ungolfed:

int c(int a, int b){
  int r = 0;
  for (; a <= b; ) {
    r += ("" + a++).contains("5")
          ? 0
          : 1;
  }
  return r;
}

Testcode:

Probieren Sie es hier aus.

class M{
  static int c(int a,int b){int r=0;for(;a<=b;)r+=(""+a++).contains("5")?0:1;return r;}

  public static void main(String[] a){
    System.out.println(c(1, 9));
    System.out.println(c(4, 17));
  }
}

Ausgabe:

8
12
Kevin Cruijssen
quelle
3

PowerShell, 42 - 41 Byte

param($a,$b)$a..$b|%{$z+=!($_-match5)};$z

Wird von der Befehlszeile aus als. \ No5s.ps1 1 20 aufgerufen

mcmurdo
quelle
1
Sie können den Speicherplatz löschen, um ein Byte zu speichern. Bei streng numerischen Regex-Mustern benötigen Sie kein Trennzeichen (z. B. -replace3oder -split1oder -notmatch5).
AdmBorkBork
Ah, schön, danke @AdmBorkBork
mcmurdo
2

Python 2, 61 56 Bytes

lambda a,b:len([n for n in range(a,b+1) if not"5"in`n`])

-5 Bytes dank tukkaaX

sagiksp
quelle
Lass dich nicht entmutigen! Es ist wichtig, Spaß zu haben und sich selbst herauszufordern. Sie können zwei Leerzeichen unter not "5" in:) entfernen. Wenn Sie Python2 verwenden, können Sie xstattdessen auch Anführungszeichen verwenden str(x).
Yytsi
@ TuukkaX Danke! Außerdem wurde das Leerzeichen zwischen "in" und "x" entfernt
sagiksp
Sie können das entfernen []. Den Platz brauchst du auch vorher nicht if.
Dennis
@Dennis Das habe ich schon probiert, aber es klagt, dass "Objekt vom Typ 'Generator' kein len () hat".
Yytsi
@ TuukkaX Richtig. lambda a,b:sum(not"5"in`n`for n in range(a,b+1))funktioniert aber. tio.run/nexus/…
Dennis
2

Schnelle 52 Bytes

($0...$1).filter { !String($0).contains("5") }.count
Arasuvel
quelle
Da es sich bei Ihrer Herausforderung um eine Codegolf-Herausforderung handelt, sollten Sie Ihren bytecount angeben. Außerdem müssen im Codegolf (zumindest hier) alle Programme miteinander konkurrieren (z. B. kann Ihr Funktionsname nur ein einzelnes Zeichen sein, Ihre tatsächliche Funktion kann wahrscheinlich auf eine einzelne Zeile reduziert werden). Ich kenne Swift nicht, vielleicht musst du mich in Sachen korrigieren.
Clismique
2

Batch, 95 Bytes

@set/an=0,i=%1
:g
@if "%i%"=="%i:5=%" set/an+=1
@set/ai+=1
@if %i% leq %2 goto g
@echo %n%

Manuelles Schleifen spart einige Bytes, da ich den Schleifenzähler in einer Variablen trotzdem brauche.

Neil
quelle
2

PHP, 56 Bytes

for($i=$argv[1];$i<=$argv[2];)trim(5,$i++)&&$x++;echo$x;

Laufen Sie wie folgt:

php -r 'for($i=$argv[1];$i<=$argv[2];)trim(5,$i++)&&$x++;echo$x;' 1 9 2>/dev/null;echo
> 8

Eine Version für PHP 7.1 wäre 53 Bytes (Credits für Titus):

for([,$i,$e]=$argv;$i<=$e;)trim(5,$i++)&&$x++;echo$x;

Erläuterung

for(
  $i=$argv[1];          # Set iterator to first input.
  $i<=$argv[2];         # Loop until second input is reached.
)
  trim(5,$i++) && $x++; # Trim string "5" with the characters in the
                        # current number; results in empty string when
                        # `5` is present in the number. If that is not
                        # the case, increment `$x`

echo$x;                 # Output `$x`
aross
quelle
Ah, verdammt, ich habe den zweiten trimParameter wieder vergessen .
Titus
2

CJam "einfache reine Mathematiklösung", 60

{{Ab5+_,\_5#)<\9e]);_4f>.m9b}%}:F;q~_:z$\:*0>{((+F:-}{F:+)}?

Probieren Sie es online aus

Die Zahlen werden in einer beliebigen Reihenfolge in einem Array aufgeführt.

Erläuterung:

Ein Kernproblem besteht darin, f (n) = die Anzahl der Nicht-5-Zahlen von 1 bis n (einschließlich) für jedes positive n zu berechnen. Und die Antwort lautet: Nimm ns Dezimalstellen, ersetze alle Stellen nach den ersten 5 (falls vorhanden) durch 9, ersetze dann alle Stellen 5..9 durch 4..8 (Dekrement) und konvertiere von Basis 9. Bsp. 1752 → 1759 → 1648 → 1 * 9 ^ 3 + 6 * 9 ^ 2 + 4 * 9 + 8 = 1259. Grundsätzlich hat jede Ziffernposition 9 zulässige Werte, und ein 5xxxx entspricht einem 49999, da keine gültigen Zahlen mehr zwischen ihnen stehen.

Sobald wir das gelöst haben, haben wir ein paar Fälle: Wenn die eingegebenen Zahlen (sagen wir a und b, a <b) (streng) positiv sind, dann ist das Ergebnis f (b) -f (a-1). Wenn sie negativ sind, können wir die absoluten Werte nehmen, neu ordnen und dieselbe Berechnung verwenden. Und wenn a <= 0 <= b, dann ist das Ergebnis f (-a) + f (b) +1.

Das Programm implementiert zuerst die Funktion F wie oben beschrieben (aber auf jede Zahl in einem Array angewendet), liest dann die Eingabe, konvertiert die Zahlen in den absoluten Wert und ordnet sie neu und verwendet eine der beiden obigen Berechnungen, basierend darauf, ob a * b> 0 anfangs.

aditsu
quelle
Nicht "rein", aber nette Methode. Hier bekommst du +1 :)
Matthew Roh
@MatthewRoh danke, aber was meinst du nicht rein? Es ist eine Lösung, die ziemlich direkte mathematische Berechnungen der eingegebenen Zahlen durchführt, ohne den Bereich zu durchlaufen. Was haben Sie noch erwartet?
Aditsu
2

Python 2 , 54 Bytes

i,j=input();k=0
while i<=j:k+=not"5"in`i`;i+=1
print k

Probieren Sie es online!

Nicht die kürzeste Python-Antwort Verwendet denselben Algorithmus, aber eine andere Art der Implementierung mit einer while-Schleife und ist keine Lambda-Funktion.

ElPedro
quelle
Es ist ein Programm und keine Funktion und verwendet while anstelle von for. Was ist nicht anders? OK, es wird immer noch nach einer Zeichenfolge "5" in der inkrementierten Eingabe gesucht, die vereinbart wurde. Gibt es einen besseren Weg?
ElPedro
Das ist genau das, was es ist, und deshalb ist es ehrerbietig. Entschuldigung, vielleicht hätte mein Kommentar anders lauten sollen.
ElPedro
Gleicher Algorithmus, andere Art der Implementierung. Kein Problem mit Ihren Kommentaren. Ist das besser formuliert?
ElPedro
Es ist, ja :) Ich werde diese Kommentare entfernen, damit der Kommentarbereich sauber aussieht.
Yytsi
1

Java 7, 77 Bytes

Dies ist eine Verbesserung von Kevins Answer , aber da ich noch nicht den Ruf habe, Kommentare abzugeben, muss diese neue Antwort genügen.

Also, was ich getan habe, war:

  • Ersetzen Sie die indexOfAnweisungen durch contains(-1 Byte)
  • Verschieben Sie den inkrementierenden Teil der for-Schleife in die bedingte Anweisung (-2 Byte).

for-Schleife ( 77 Bytes ):

int c(int a,int b){int r=1;for(;a++<b;)r+=(""+a).contains("5")?0:1;return r;}

rekursiv ( 79 Bytes ):

int d(int r,int a,int b){r+=(""+a).contains("5")?0:1;return a!=b?d(r,a+1,b):r;}

Ausgabe:

8
12

8
12

Teste es hier !

Tobias Meister
quelle
Willkommen bei PPCG! Schöne Erkenntnisse in einer bereits recht gelungenen Antwort. Ich weiß nicht viel über Java, sollte aber nicht (""+a).contains("5")?0:1durch Java ersetzbar sein !(""+a).contains("5").
Christoph
1
@Christoph leider nicht, da in Java ein Boolean wirklich nur ein Boolean ist. Eine ternäre Operation ist also der einzige Weg.
Tobias Meister
Hm das ist traurig. Was ist (""+a).contains("5")||r++?
Christoph
1
@Christoph, das wird auch nicht funktionieren, weil Sie keinen eigenen booleschen Ausdruck haben können. Ich habe versucht, es an anderen Stellen (wie der for-loop-Deklaration) zum Laufen zu bringen, aber nicht mit viel Erfolg. Schöne Idee tho;)
Tobias Meister
1

C #, 67 Bytes

a=>b=>{int c=0;for(;a<=b;)c+=(a+++"").Contains("5")?0:1;return c;};
TheLethalCoder
quelle
Ich hatte gehofft, zu verwenden, for(int c=0;...)aber dann kann es nicht kompiliert werden, weil die Rückgabe außerhalb des Bereichs fürc
TheLethalCoder 20.01.17
1

JavaScript (ES6), 58 56 49 Bytes

let f =

(s,e)=>{for(c=0;s<=e;)c+=!/5/.test(s++);return c}

console.log(f(1, 9));
console.log(f(4, 17));
console.log(f(-9, -1));

Golf 7 Bytes dank ETHproductions .

Hristiyan Dodov
quelle
1
Sie können verwenden c+=!/5/.test(s++), um ein paar Bytes zu speichern :-)
ETHproductions
Vielen Dank! Ich musste jedoch meine Golfplätze löschen. Ich war so stolz auf sie. :(
Hristiyan Dodov
Ich denke, Sie können Curry verwenden, dh `s => e =>`
TheLethalCoder
In der oberen Antwort wird die Currysyntax verwendet. Ich werde meins nicht bearbeiten, weil es fast gleich werden würde. Vielen Dank für den Hinweis!
Hristiyan Dodov
1

MATL , 10 Bytes

&:!V53-!As

Probieren Sie es online!

Erläuterung

        % Implicitly grab two input arguments
&:      % Create an array from [input1....input2]
!V      % Convert to a string where each number is it's own row
53-     % Subtract ASCII '5' from each character.
!A      % Detect which rows have no false values (no 5's). Returns a logical array
s       % Sum the logical array to get the # numbers without 5's
        % Implicitly display the result
Suever
quelle
1

C #, 77 Bytes

(n,m)=>{var g=0;for(var i=n;i<m+1;i++)g+=(i+"").Contains("5")?0:1;return g;};

Anonymer Lambda-Anruf.

Verwendet n(erste Nummer) und m(letzte Nummer) als Eingabe und prüft dann über String Containment ( "".Contains("")).

devRicher
quelle
Ich bin nicht derjenige, der abstimmt, aber modulo 5 ist nicht die richtige Lösung für die Herausforderung durch OP. Es sollte alles ausschließen, das die Ziffer 5in seiner Nummer enthält, daher sollte 10(was Ihre Antwort nicht zählen würde) gezählt werden.
Kevin Cruijssen
@ KevinCruijssen Behoben.
devRicher
Dies wird nicht kompiliert, da ges initialisiert werden muss, wenn angegeben wird, wie es benannt ist, vardamit Sie es benötigen, var g="";und Sie können Currying verwenden, dhn=>m=>
TheLethalCoder
Auch dies gibt die Liste nicht die Zählung aus
TheLethalCoder
1
@ KevinCruijssen Mit Ihren Änderungen ist dies im Wesentlichen meine Antwort ...
TheLethalCoder
1

Eigentlich 13 Bytes

u@x`$'5íuY`░l

Probieren Sie es online!

Erläuterung:

u@x`$'5íuY`░l
u@x            range(a, b+1)
   `$'5íuY`░   take where:
    $            string representation
     '5íuY       does not contain "5"
            l  length
Mego
quelle