Question:
Vous recevrez les entiers de début et de fin d'une séquence et devriez lui renvoyer le nombre d'entiers ne contenant pas le chiffre 5
. Les numéros de début et de fin doivent être inclus!
Exemples:
1,9 → 1,2,3,4,6,7,8,9 → résultat 8
4,17 → 4,6,7,8,9,10,11,12,13,14,16,17 → résultat 12
50,60 → 60 → résultat 1
-59, -50 → → résultat 0
Le résultat peut en contenir cinq.
Le numéro de départ sera toujours inférieur au numéro de fin. Les deux nombres peuvent être aussi négatifs!
Je suis très curieux de vos solutions et de la façon dont vous le résolvez. Peut-être que quelqu'un d'entre vous trouvera une solution simple de mathématiques pures.
Edit Ceci est un défi code-golf, donc le code le plus court gagne.
50, 59 -> 0
.Réponses:
JavaScript (ES6),
3633 octetsPrend les entrées avec la syntaxe de currying
(a)(b)
.Formaté et commenté
Cas de test
Afficher l'extrait de code
la source
test
plusexec
lorsque vous avez seulement besoin d' un booléen.)b<a
est là pour arrêter la récursion après avoir compté tous les nombres deb
àa
, de sorte que son élimination ne ferait que provoquer une récursion infinie.a
comme argument et retourne laF
fonction, qui à son tour prendb
pour argument et - comme vous l'avez remarqué - est appelée de manière récursive pour itérer deb
àa
, incrémentant un compteur pour tous les entiers ne contenant pas de valeur5
décimale. représentation.Gelée ,
87 octets-1 octet grâce à Dennis (sachant que l'indexation dans un nombre traite ce nombre comme une liste décimale)
TryItOnline!
Comment?
* La valeur absolue atome
A
est nécessaire puisqu'un nombre négatif converti en une liste décimale a des entrées négatives, dont aucune ne sera jamais un5
(l'exemple donné compterait les huit au lieu de deux).la source
rAw€5¬S
enregistre un octet.w
convertit un argument entier en chiffres décimaux.Bash + grep, 17 octets
Essayez-le en ligne!
la source
2sable ,
65 octetsEnregistrement d'un octet grâce à Adnan
Essayez-le en ligne!
Explication
Remarque: cela fonctionne en raison d'un bogue
¢
qui oblige la fonction à s'appliquer à chaque élément au lieu de compter les éléments correspondants dans la liste.la source
`
car il se comporte de la même façon sur les tableaux: p.Python2,
59555251474342 octetsUne solution récursive. Merci à @xnor de me motiver à trouver une solution à l'aide d'opérateurs logiques! Merci également à @JonathanAllan et à @xnor de m'avoir guidé coupé l'octet de 43 à 42!
Autres tentatives à 43 octets
la source
if!`x`.count('5')
travailler?not
opérateur qui est!
dans les langages de type C, mais cela prend 3 octets :(and
etor
.not
.Utilitaires Bash / Unix, 21 octets
Essayez-le en ligne!
la source
05AB1E ,
876 octetsEnregistrement d'un octet grâce à Adnan
Essayez-le en ligne!
Explication
la source
å
, which is.å
, so you can doŸ5.å_O
for 6 bytes.negate
meaning-n
, orn==0?1:0
?n==0?1:0
Pyth,
98 bytesSaved a byte thanks to FryAmTheEggman!
Explanation:
Try it online!
la source
Perl 6, 23 bytes
Try it online!
How it works
la source
Haskell, 39 bytes
Try it online! Usage:
Explanation:
la source
R, 33 bytes
Usage:
la source
Octave, 36 bytes
Try it online!
la source
Groovy,
47454340 bytesThis is an unnamed closure.
findAll
is similar to adding anif
condition in a list comprehension in python.Try it online!
la source
PHP 7.1,
5755 bytesRun with
php -r '<code>' <a> <b>
la source
Mathematica,
464442 bytesThanks to alephalpha and DavidC for saving 2 bytes each!
Unnamed function taking two integer arguments and returning an integer.
IntegerDigits@Range@##
converts all the numbers between the inputs into lists of digits;FreeQ@5
tests those lists to decide which ones do not contain any5
. ThenBoole
converts booleans to zeros and ones, andTr
sums the results.Other solutions (44 and 47 bytes):
IntegerDigits@x~FreeQ~5
determines whether the list of digits of a number is free of 5s, andCount[Range@##,x_/;...]&
counts how many numbers between the inputs pass that test.1##&@@IntegerDigits@#-5
takes the list of digits of a number, subtracts 5 from all of them, and multplies the answers together;Sign[...]^2
then converts all nonzero numbers to 1.la source
Count[Range@##,x_/;IntegerDigits@x~FreeQ~5]&
Tr@Boole[FreeQ@5/@IntegerDigits@Range@##]&
Ruby,
3635 bytesThx IMP1 for -1 byte
la source
?5
(the'5'
character) instead of/5
/ in the search to save a byte.Java 7,
8078 bytesUngolfed:
Test code:
Try it here.
Output:
la source
PowerShell,
4241 bytesCalled from the command line as .\no5s.ps1 1 20
la source
-replace3
or-split1
or-notmatch5
).Python 2,
6156 bytes-5 bytes thanks to tukkaaX
la source
not "5" in
:) Also, if you're using Python2, you can surroundx
with `` quotes, instead of doingstr(x)
.[]
. You also don't need the space beforeif
.lambda a,b:sum(not"5"in`n`for n in range(a,b+1))
works though. tio.run/nexus/…Swift 52 bytes
la source
Batch, 95 bytes
Manually looping saves some bytes because I need the loop counter in a variable anyway.
la source
PHP, 56 bytes
Run like this:
A version for PHP 7.1 would be 53 bytes (credits to Titus):
Explanation
la source
trim
parameter again.CJam "easy pure mathematics solution", 60
Try it online
It takes the numbers in any order, in an array.
Explanation:
One core problem is to calculate f(n) = the number of non-5 numbers from 1 to n (inclusive) for any positive n. And the answer is: take n's decimal digits, replace all digits after the first 5 (if any) with 9, then replace all digits 5..9 with 4..8 (decrement), and convert from base 9. E.g. 1752 → 1759 → 1648 → 1*9^3+6*9^2+4*9+8=1259. Basically, each digit position has 9 acceptable values, and a 5xxxx is equivalent to a 49999 because there are no more valid numbers between them.
Once we solved this, we have a few cases: if the input numbers (say a and b, a<b) are (strictly) positive, then the result is f(b)-f(a-1). If they are negative, then we can take the absolute values, reorder them and use the same calculation. And if a<=0<=b then the result is f(-a)+f(b)+1.
The program first implements the function F as described above (but applied to each number in an array), then reads the input, converts the numbers to the absolute value and reorders them, and uses one of the 2 calculations above, based on whether a*b>0 initially.
la source
Python 2, 54 bytes
Try it online!
Not the shortest Python answer Uses same algorithm but a different way of implementing with a while loop and is not a lambda function.
la source
Java 7, 77 bytes
This is an improvement of Kevins Answer, but since I don't have the reputation to comment yet, this new answer will have to do.
So what I did was:
indexOf
statements withcontains
(-1 byte)for-loop (77 bytes):
recursive (79 bytes):
Output:
Test it here !
la source
(""+a).contains("5")?0:1
be replacable by!(""+a).contains("5")
?(""+a).contains("5")||r++
?C#, 67 bytes
la source
for(int c=0;...)
but then it fails to compile because the return is outside the scope forc
JavaScript (ES6),
58 5649 bytesGolfed 7 bytes thanks to ETHproductions.
la source
c+=!/5/.test(s++)
to save a few bytes :-)MATL, 10 bytes
Try it online!
Explanation
la source
C#, 77 bytes
Anonymous lambda call.
Uses
n
(first number) andm
(last number) as input, then checks via string containment ("".Contains("")
).la source
5
in its number, so10
(which your answer wouldn't count) should be counted.g
must be initialised when stated as it is namedvar
so you needvar g="";
and you can use currying i.e.n=>m=>
Actually, 13 bytes
Try it online!
Explanation:
la source