Écrire des nombres fait partie des mondes Hello de la programmation, souvent des nombres de 1 à 10.
Je veux écrire beaucoup de chiffres! Beaucoup, beaucoup de nombres. Mais combien de nombres dois-je écrire?
Tâche
Pour une entrée entière, donnez un nombre en sortie qui me donnerait le nombre de chiffres qui seraient dans une chaîne contenant tous les nombres entiers compris entre 0 et l'entrée, inclus. L'identifiant de négation ("-") compte pour un seul caractère.
Exemple d'E / S
Entrée: 8
Écrit: 0,1,2,3,4,5,6,7,8
Sortie: 9
Entrée: 101
écrit: 0,1,2,3 ...., 99,100,101
Sortie: 196
Entrée: 102
écrit: 0,1,2,3 ...., 100,101,102
sortie: 199
Entrée -10
Sortie écrite: 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10
sortie: 22
Ceci est un code-golf . Le plus petit nombre d'octets gagne!
Utilitaires Bash + OS X (BSD),
2422 octetsMerci à @seshoumara pour la sauvegarde de 2 octets.
Le test fonctionne sous Mac OS X:
Voici une version GNU:
Bash + coreutils,
4038 octetsEncore une fois, 2 octets sauvés grâce à @seshoumara.
Essayez-le en ligne!
la source
fold -1|wc -l
pour faire le comptage? C'est plus court.Python 2,
83,7864 octetsversion la plus courte:
cette version a économisé 5 octets, grâce à @numbermaniac:
Essayez-le en ligne!
celui-ci je suis venu seul avec cela après (même nombre d'octets):
Essayez-le en ligne!
la source
map
sur la deuxième ligne pour 78 octets:print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
. Vous pourriez économiser encore plus en en faisant un lambda.print sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
lambda x:sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
pour 71 octetsJava 7, 74 octets (récursif - comprenant le deuxième paramètre par défaut)
Explication (1):
Java 7,
8179 octets (boucle - paramètre unique)Si avoir un second paramètre par défaut
0
pour cette approche récursive n'est pas autorisé pour une raison quelconque, une boucle for telle que celle-ci pourrait être utilisée à la place:Explication (2)
Code de test:
Essayez ici.
Sortie:
la source
RProgN 2 , 5 octets
Explication
Solution simple, fonctionne comme un charme.
Essayez-le en ligne!
la source
Brachylog , 5 octets
Essayez-le en ligne!
Construit la plage [0, entrée], convertit chaque nombre en chaîne, se concatène en une seule chaîne et renvoie la longueur du résultat
la source
Z
. Qu'est-ce qui se passe avec ça? Devrait-il être dans le compte?Z
à l'interpréteur Brachylog lui dit d'ajouter un wrapper approprié pour rendre la fonction testable. (Si vous l'utilisiez comme un programme complet, il ne produirait aucun résultat.) Nous autorisons les soumissions de programme ou de fonction ici, donc cela ne devrait pas compter dans le nombre d'octets, car cela ne fait pas réellement partie de la soumission.PHP,
5960 octetsOutgolfé par Roberto06 - https://codegolf.stackexchange.com/a/112536/38505
Merci à roberto06 pour avoir remarqué que la version précédente ne fonctionnait pas pour les nombres négatifs.
Construit simplement un tableau de nombres, le met dans une chaîne, puis compte les chiffres (et le signe moins)
Exemple d'exécution:
php -f 112504.php 8
la source
join
au lieu deimplode
parce que c'est un alias.[--9]
Haskell ,
3938 octetsEssayez-le en ligne! Edit: sauvegardé 1 octet grâce à @xnor!
Explication:
En Haskell pour les nombres
a
,b
[a..b]
la plage va dea
àb
en incréments de 1 ou en incréments de 1, selon qu’elleb
est plus grandea
. Donc, pour un résultat positif,n
la première liste[0..n]++[n..0]
est[0,1,2,...,n]
et la seconde est vide. Pour négatif,n
la deuxième plage donne[0,-1,-2,...,n]
et la première est vide. Toutefois, si lesn=0
deux plages renvoient la liste[0]
, la concaténation[0,0]
donnerait un résultat faux2
. C'est pourquoi0
est traité comme un cas particulier.L'
=<<
opérateur sur une liste est identique àconcatMap
, de sorte que chaque nombre est converti en chaîne parshow
et que toutes ces chaînes sont concaténées dans une chaîne longue dont elleslength
sont finalement renvoyées.Avant le conseil de xnor, je l’utilisais à la
[0,signum n..n]
place[0..n]++[n..0]
.signum n
est-1
pour les nombres négatifs,0
pour zéro et1
pour les nombres positifs et une plage de la forme[a,b..c]
construit la liste des nombres dea
àc
avec incrémentationb
. Construit ainsi[0,signum n..n]
la gamme[0,1,2,...,n]
pour le positifn
et[0,-1,-2,...,n]
pour le négatifn
. Carn=0
cela construirait la liste infinie[0,0,0,...]
, nous avons donc besoin de le gérer0
comme un cas spécial.la source
[0..n]++[n..0]
devrait faire pour[0,signum n..n]
.PHP,
4135 octets6 octets sauvegardés grâce à user59178
Comme la réponse de ʰᵈ était fausse pour une entrée négative, j'ai pris sur moi de construire une nouvelle solution:
Cette fonction:
0
à$argv[1]
(alias l'entrée)Essayez-le ici!
la source
preg_match()
:(range()
s'il n'y avait pas eu votre solution, je suppose que nous sommes même;)join()
place deimplode()
. c'est un alias pour la même chose. php.net/manual/en/function.join.phpimplode
, mais je ne savais pas que je pouvais omettre le paramètre gue. Merci !Ruby ,
20 2629 octetsEssayez-le en ligne!
la source
R,
26 à20 octetssum(nchar(0:scan()))
Approche très basique:
Faire un vecteur 0: x
Compter les caractères dans chaque valeur (sera forcé à une chaîne automatiquement)
Vous ne savez pas s'il existe des astuces pour réduire la définition de la fonction?6 octets sauvés grâce à Giuseppe, en prenant les entrées de stdin à la place.la source
sum(nchar(0:scan()))
place et liren
stdin à la place.Mathematica,
484746 octets-1 octet grâce à Martin Ender !
Fonction anonyme, prenant le nombre comme argument.
Solution plus courte de Greg Martin , 39 octets
la source
Sign@#
pour#/Abs@#
.1-#~Min~0+Tr@IntegerLength@Range@Abs@#&
. Le1
compte initial correspond au chiffre 0, alors-#~Min~0
que tous les signes négatifs sont pris en compte si la saisie est négative.Lot, 110 octets
Calculs
sum(min(0,abs(n)+1-10^k),k=0..9)+(n<0?1-n:1)
. (Je n'ai qu'à y aller en9
raison des limitations de l'arithmétique entière de Batch.)la source
Python 2 , 68 octets
Essayez-le en ligne!
Plus long que mais différent des autres solutions Python. Définit une fonction récursive appelée par exemple
f(10)
la source
MATL , 11 octets
Essayez-le en ligne!
la source
PowerShell , 23 octets
Essayez-le en ligne! (sera sur TIO pour les très grandes entrées (absolues))
Utilise l'
..
opérateur de plage pour construire une plage allant de0
à l'entrée$args
(convertie en chaîne à convertir à partir du tableau d'entrée). C'est-join
édité ensemble dans une chaîne (par exemple,01234
) et ensuite leLe
ngth en est pris. Cela reste sur le pipeline et la sortie est implicite.la source
Perl 6 , 18 octets
L'essayer
Étendu:
la source
QBIC , 25 octets
Explication:
la source
JavaScript, 50 octets
Collaboré avec @ETHproductions
la source
Bash + GNU coreutils, 28
Essayez-le en ligne .
la source
Retina , 28 octets
Essayez-le en ligne!
Explication
Convertissez le nombre en unaire, en gardant le signe intact.
Chaque 1 est remplacé par tout jusqu'à lui-même, plus une nouvelle ligne. Avec cela, nous obtenons une plage de 1 à n si n était positif, de -1 à n avec une valeur supplémentaire
-
au début si elle était négative. Tous les nombres sont en unaire et séparés par des nouvelles lignes.Convertissez chaque séquence de uns en nombre décimal correspondant.
Mettez un
0
au début, remplacez le plus-
si c'est là.Comptez le nombre de caractères (non-newline).
la source
Emacs, 20 octets
La commande elle-même est composée de 20 frappes de touche, mais il me faut des éclaircissements sur la manière dont cela doit être compté en octets. Je pensais que compter chaque frappe de touche comme un octet serait le plus juste. La commande ci-dessus est écrite de manière conventionnelle pour en faciliter la lecture.
Explication
Commencez à définir une macro de clavier.
Créez un nouveau compteur de macros. Écrit
0
dans le tampon; la valeur du compteur est maintenant 1.Terminez la définition de la macro du clavier.
Après avoir appuyé sur META, tapez votre numéro d'entrée. Le
C-x e
puis exécute la macro que plusieurs fois.Définit mark en début de tampon (qui sélectionne tout le texte ainsi généré).
Exécuter le nombre de caractères sur la région sélectionnée. Le nombre de caractères sera imprimé dans le mini-tampon.
Exemple
Toutes mes excuses pour la terrible couleur de surbrillance. Voici un exemple d'utilisation de cette commande avec l'entrée 100. La sortie se trouve dans le mini-tampon en bas de l'écran.
la source
Lua, 52 octets
Itère dans une boucle for de 0 - entrée, convertit l'entier
i
en chaîne et ajoute la longueur de la chaînet
avant l'impressiont
la source
Perl 5 , 32 octets
31 octets de code +
-p
drapeau.Essayez-le en ligne!
la source
C #,
7773 octets-4 octets grâce à @ Kevin Cruijssen
Fonction lambda:
Ungolfed et avec des cas de test:
la source
while
pourfor
sauvegarder quelques octets:(r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};
( 73 octets )Func<int, int>
vous pouvez appeler les fonctionsr=>...
pour économiser 2 octets (vous pouvez probablement le faire quand même).JavaScript, 44 octets
la source
REXX, 56 octets
la source