Selon http://en.cppreference.com/w/cpp/language/integer_literal , les littéraux entiers se composent d'un littéral décimal / hex / octal / binaire et d'un suffixe entier facultatif, ce qui est évidemment complètement inutile, gaspille de précieux octets et est pas utilisé dans ce défi.
Un littéral décimal est a non-zero decimal digit (1, 2, 3, 4, 5, 6, 7, 8, 9), followed by zero or more decimal digits (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
.
Un littéral octal est the digit zero (0) followed by zero or more octal digits (0, 1, 2, 3, 4, 5, 6, 7)
.
Un littéral hexadécimal est the character sequence 0x or the character sequence 0X followed by one or more hexadecimal digits (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C, d, D, e, E, f, F)
(notez l'insensibilité à la casse de abcdefx
).
Un littéral binaire est the character sequence 0b or the character sequence 0B followed by one or more binary digits (0, 1)
.
De plus, il peut éventuellement y avoir des '
s comme séparateur de chiffres. Ils n'ont aucun sens et peuvent être ignorés.
Contribution
Une chaîne qui représente un littéral entier C ++ 14 ou un tableau de ses codes de caractères.
Sortie
Le nombre représenté par la chaîne d'entrée en base 10, avec une nouvelle ligne de fin facultative. La sortie correcte ne dépassera jamais 2 * 10 ^ 9
Critères gagnants
Les contributeurs du GCC ont besoin de plus de 500 lignes de code pour ce faire, donc notre code doit être aussi court que possible!
Cas de test:
0 -> 0
1 -> 1
12345 -> 12345
12345'67890 -> 1234567890
0xFF -> 255
0XfF -> 255
0xAbCdEf -> 11259375
0xa'bCd'eF -> 11259375
0b1111'0000 -> 240
0b0 -> 0
0B1'0 -> 2
0b1 -> 1
00 -> 0
01 -> 1
012345 -> 5349
0'123'4'5 -> 5349
0
pourrait être un bon cas de test à ajouter (elle a révélé un bug dans l'une de mes révisions récentes).Réponses:
Japt , 6 octets
Essayez-le en ligne!
la source
'
de l'entrée puis l'évalue comme Jscode machine x86 (32 bits),
5957 octetsCette fonction prend
esi
comme pointeur vers une chaîne terminée par un caractère nul et renvoie la valeur dansedx
. (La liste ci-dessous est une entrée GAS dans la syntaxe AT&T.)Et un démontage avec nombre d'octets - au format Intel cette fois, au cas où vous préférez celui-là.
Et au cas où vous voudriez l'essayer, voici le code du pilote de test C ++ que j'ai lié avec lui (y compris la spécification de convention d'appel dans la syntaxe asm GCC):
-1 octet dû au commentaire de Peter Cordes
-1 octet de mise à jour pour utiliser deux décrémentations pour passer de 10 à 8
la source
rdx
et rbx? Then you can use 1-byte
cdq` à zéro àrdx
partir deeax
.JavaScript (nœud Babel) , 26 octets
lol x2
Essayez-le en ligne!
la source
Number
car il gère le binaire et l'hex, mais apparemment pas l'octalNumber("010") === 10
C ++ (gcc),
141138134120 octetsIl s'agit d'une fonction qui prend un tableau de caractères (spécifié comme une paire de pointeurs au début et à la fin - à l'aide de la paire d'itérateurs idiome) et renvoie le nombre. Notez que la fonction mute le tableau d'entrée.
(Cela dépend du comportement de gcc / libstdc ++ qui
#include<cstdlib>
place également les fonctions dans une portée globale. Pour du code conforme strictement standard, remplacez-le par#include<stdlib.h>
pour un coût d'un caractère de plus.)Brève description: Le code premières utilisations
std::remove
pour filtrer les'
caractères (ASCII 39). Ensuite,strtol
avec une base de 0, les cas décimaux, octaux et hexadécimaux seront déjà traités, de sorte que le seul autre cas à vérifier est un début0b
ou0B
, si tel est le cas, définissez la base pourstrtol
2 et commencez l'analyse après les 2 premiers caractères.Essayez-le en ligne.
Enregistré 3 octets en raison de la suggestion de plafond et d'autres golfs qui ont suivi.
4 octets enregistrés grâce aux suggestions de grastropner.
-2 octets par Lucas
-12 octets par l4m2
la source
#import
au lieu de#include
?0
pour la base 2Python 2 , 32 octets
Essayez-le en ligne!
lol
(nécessite Python 2 car Python 3 a changé les littéraux octaux en
0o(...)
).la source
Perl 5 (-p), 14 octets
TIO
la source
R ,
797169 octetsEssayez-le en ligne!
strtoi
fait tout sauf les conversions en base 2 et en ignorant le'
, donc il y a pas mal d'octets juste pour corriger ces choses.Merci à Aaron Hayman pour -6 octets, et inspirant -4 autres octets (et ça compte!)
Vérifier tous les cas de test (ancienne version)
la source
sub("0b|B"
avecsub("b|B"
, depuis le premier « 0 » n'affectera pas la valeur. Peut en obtenir un autre en renommantstrtoi
na.omit
auparavant. Super pratique ici, et j'ai joué un peu plus au golf :-)strtoi
est un binaire, vous pouvez utilisersubstring
au lieu d'sub
enregistrer un autre octet: Essayez-le en ligne!s
utilisation à lasub
place,sub('..','',s)
ce qui est un autre octet plus court!05AB1E ,
1614 octetsEnregistré 2 octets grâce à Grimy
Essayez-le en ligne! ou comme suite de tests
Explication
la source
0010
).ï
!Excel, 115 octets
Entrée à partir de A1, sortie à l'endroit où vous mettez cette formule. Formule matricielle, utilisez donc Ctrl+ Shift+ Enterpour la saisir.
J'ai ajouté quelques cas de test que vous pouvez voir dans l'image - certaines premières tentatives ont traité correctement tous les cas de test donnés, mais les lignes 16 et / ou 17 étaient incorrectes.
la source
code machine x86-64, 44 octets
(Le même code machine fonctionne également en mode 32 bits.)
La réponse de @Daniel Schepler était un point de départ pour cela, mais cela a au moins une nouvelle idée algorithmique (pas seulement un meilleur golf de la même idée): les codes ASCII pour
'B'
(1000010
) et'X'
(1011000
) donnent 16 et 2 après le masquage avec0b0010010
.Donc, après avoir exclu décimal (premier chiffre non nul) et octal (le caractère après
'0'
est inférieur à'B'
), nous pouvons simplement définir base =c & 0b0010010
et sauter dans la boucle numérique.Appelable avec x86-64 System V as
unsigned __int128 parse_cxx14_int(int dummy, const char*rsi);
Extraire la valeur de retour EDX de la moitié supérieure duunsigned __int128
résultat avectmp>>64
.Les blocs modifiés par rapport à la version de Daniel sont (principalement) indentés moins que les autres instructions. La boucle principale a également sa branche conditionnelle en bas. Cela s'est avéré être un changement neutre car aucun des deux chemins ne pouvait tomber dans le haut, et l'
dec ecx / loop .Lentry
idée d'entrer dans la boucle s'est avérée ne pas être une victoire après avoir traité octal différemment. Mais il a moins d'instructions à l'intérieur de la boucle avec la boucle sous forme idiomatique faire {} tout en structure, donc je l'ai gardée.Le harnais de test C ++ de Daniel fonctionne inchangé en mode 64 bits avec ce code, qui utilise la même convention d'appel que sa réponse 32 bits.
Démontage, y compris les octets de code machine qui sont la réponse réelle
D'autres changements par rapport à la version de Daniel incluent l'enregistrement de l'
sub $16, %al
intérieur de la boucle numérique, en utilisant plussub
au lieu detest
dans le cadre de la détection des séparateurs, et des chiffres par rapport aux caractères alphabétiques.Contrairement à Daniel, chaque personnage ci
'0'
- dessous est traité comme un séparateur, pas seulement'\''
. (Sauf' '
:and $~32, %al
/jnz
dans nos deux boucles traite l'espace comme un terminateur, ce qui est peut-être pratique pour tester avec un entier au début d'une ligne.)Chaque opération qui se modifie
%al
à l'intérieur de la boucle a un indicateur de consommation de branche défini par le résultat, et chaque branche va (ou tombe) à un emplacement différent.la source
eax
étant donné que AIUI en opcodes en mode 64 bits avec une petite destination réinitialise les bits supérieurs à 0?setcc r/m8
ensetcc r/m32
, nous avons donc toujours besoin d'une stupide instruction 2-xor
zéro / définir des drapeaux /setcc %al
séquence pour créer un 32/64 bits 0 ou 1 variable, et il a besoin du registre mis à zéro avant la mise en drapeau. (Ou utilisez à lamov $0, %eax
place, ou utilisezmovzx
sur le chemin critique).Rétine , 96 octets
Essayez-le en ligne! Le lien inclut une suite de tests. Explication:
Supprimez
'
s et convertissez tout en minuscules.Séparez les chiffres, car tout chiffre hexadécimal doit être converti en décimal.
Identifiez la base du numéro.
Convertissez les caractères
a-g
en nombres10-16
.Effectuez la conversion de base sur la liste des chiffres.
$.($`*$1*_*$2*
est court pour$.($`*$1*_*$2*_)
lequel se multiplie$`
et$1
ensemble et ajoute$2
. ($`
est la partie de la chaîne qui précède;
la base.)Supprimez la base.
la source
J , 48 octets
Essayez-le en ligne!
Évalue après substitution de chaîne.
la source
0b
: tio.run/##FcwxCsIwFAbg/…Perl 6 , 29 octets
Essayez-le en ligne!
Perl 6 nécessite un
0o
préfixe explicite pour octal et ne prend pas en charge les préfixes majuscules comme0X
.Explication
la source
Octave ,
292120 octetsEssayez-le en ligne!
-8 octets grâce à @TomCarpenter
la source
@(x)str2num(x(x~="'"))
@(x)str2num(x(x~=39))
f=("077")
retourneans = 77
quand il devrait être 63. Ou, comme dans le cas de test dans OPf=("012345")
devrait retourner 5349 mais à la placeans = 12345
Bash, 33 octets
TIO
Zsh,
2927 octets-2 octets grâce à @GammaFunction
TIO
la source
setopt octalzeroes
serait nécessaire pour Zsh.<<<$[...]
au lieu deecho $[...]
Allez, 75
la source
JavaScript (ES6), 112 octets
la source
Gelée , 27 octets
Essayez-le en ligne!
Presque tout cela est en octal. On dirait qu'il pourrait être mieux joué au golf.
la source
Rubis avec
-n
, 17 octetsSauter dans le
eval
train, vraiment.Essayez-le en ligne!
la source
Java (JDK) , 101 octets
Essayez-le en ligne!
Long.decode
traite de toutes sortes de littéraux à l'exception des binaires.Modèle emprunté à la réponse de Benjamin
la source
C (gcc) ,
120118 bytes-1 octet grâce au plafond
Essayez-le en ligne!
la source
C (gcc),
1019783 octetsEssayez-le en ligne
la source
PHP - 43 octets
Même méthode que /codegolf//a/185644/45489
la source
C ++, G ++, 189 octets
Pas besoin de tests
Nécessite l'installation de
g++
avec le support C ++ 14Maintenant, explications:
la source
Pyth , 27 octets
Essayez-le en ligne!
Contrairement à la réponse Pyth précédente (maintenant supprimée), celle-ci passe tous les cas de test dans la question, bien qu'elle soit plus longue de 3 octets.
la source
C (gcc) / Bash / C ++, 118 octets
Essayez-le en ligne!
la source
popen
etsystem
. G ++ a un drapeau, je pense-x
, à lire depuis stdin. C'est peut-être plus court que des fopen, mais je ne sais pas comment invoquer avec stdin en C.popen
commandeprintf
->echo
semble fonctionner. Vous allez bientôt programmer en bash.Java,
158154 octetsCela n'attend que d'être surpassé. Essaie juste les expressions rationnelles jusqu'à ce que quelque chose fonctionne et par défaut à hex.
-4 octets grâce à @ValueInk
Essayez-le en ligne
Utilisation de ScriptEngine,
9287 octetsLe train Eval passe. Techniquement, cela passe le flambeau à JS, ce n'est donc pas ma principale soumission.
TIO
la source
[bBxX]
et0[bB].+
pour quelques optimisations regex rapides.0x9999999999
)Long
place duInteger
golf. De plus, si vous avez raison, Python ne peut pas rivaliser car il a effectivement des entiers de précision arbitraire. De plus,long
en Java est un entier représenté avec 64 bits au lieu de 32. Il n'y a pas de décimales.The correct output never will exceed 2*10^9
cela indique clairement que cela signifie que le long ne peut pas être utilisé seul parce que je peux le donner0x9999999999
et cela produira un nombre supérieur à 2 * 10 ^ 9 alors que C ++ cela créerait un problème de dépassement de mémoire car vous utilisez plus de 32 bits en mémoire lorsque vous n'avez alloué que 32 bits de mémoire à ce nombre