0xUsernames
Il y a tellement de gens qui utilisent un service de messagerie qu'ils manquent d'espace pour stocker tous les noms d'utilisateur! Pour résoudre ce problème, ils vont commencer à stocker les noms d'utilisateur sous forme hexadécimale, si possible.
Si un nom d'utilisateur se compose uniquement des caractères 0123456789ABCDEF
(insensible à la casse), il peut être converti en hexadécimal et stocké sous forme d'entier. Par exemple, le nom d'utilisateur ba5eba11
peut être interprété comme 0xBA5EBA11
un entier hexadécimal.
Mais qu'en est-il 05AB1E
? Cela a un zéro de tête, qui serait perdu. Ainsi, chaque fois que nous convertissons un nom d'utilisateur, nous nous assurons de faire précéder un 1
avant de le lire comme un entier.
Le défi
Votre tâche consiste à écrire un programme ou une fonction qui, étant donné un nom d'utilisateur non vide sous forme de chaîne, «hexa-compresse» le nom d'utilisateur:
- S'il peut être interprété comme un entier hexadécimal, ajoutez un 1, interprétez-le comme hexadécimal, puis imprimez le résultat en base 10.
- Sinon, renvoyez simplement la chaîne non modifiée.
Il s'agit de code-golf , donc la solution la plus courte (en octets) l'emporte! Les fonctions de conversion de base intégrées sont autorisées.
Cas de test
Vous pouvez supposer que tous les entiers résultants se trouvent dans la plage d'entiers standard de votre langue.
Comme pour les noms d'utilisateur sur la plupart des systèmes de messagerie, les chaînes d'entrée ne contiendront que des caractères alphanumériques et des traits de soulignement.
N'oubliez pas, vous devez toujours ajouter un interligne 1
avant la conversion!
"ba5eba11" -> 7421737489
"05AB1E" -> 17148702
"dec0de" -> 31375582
"Beef" -> 114415
"da7aba5e" -> 7960443486
"500" -> 5376
"DENNIS" -> "DENNIS"
"Garth" -> "Garth"
"A_B_C" -> "A_B_C"
"0x000" -> "0x000"
Pour référence, voici une implémentation de Python 3 que j'ai utilisée pour les cas de test (non golfée):
import re
def convert_name(name):
if re.fullmatch('^[0-9A-Fa-f]+$', name):
return int('1' + name.upper(), base = 16)
else:
return name
Réponses:
05AB1E , 4 octets
Explication
Si l'entrée contient des caractères hexadécimaux invalides,
H
elle ne poussera rien, donc la dernière valeur de la pile sera l'entrée dupliquée, c'est pourquoi le programme imprime son entrée en cas d'entrée invalide.Essayez-le en ligne!
la source
05AB1E
est un nom d'utilisateur valide.JavaScript (ES6), 15 octets
Comment ça marche
'0x1'+s
convertit l'entrée en une chaîne hexadécimale littérale avec un préfixe1
, par exemple0x105ab1e
.-0
Convertit ensuite le résultat en un nombre. JavaScript voit le0x
au début et essaie implicitement de convertir de l'hexadécimal; sis
contient des caractères non hexadécimaux, cela renvoieNaN
. Puisque c'est faux (et que la sortie0
ne peut jamais être donnée à cause du préfixé1
), nous pouvons utiliser||s
pour retourners
si la conversion hexadécimale a échoué.Extrait de test
la source
Python 2 , 44 octets
Prend l'entrée comme une chaîne entre guillemets. -2 octets grâce à Rod!
Comme nous sommes garantis que l'entrée ne contiendra que des caractères alphanumériques et des traits de soulignement, il n'y a aucun moyen de créer un Python valide après
0x1
avoir une chaîne hexadécimale. Si l'entrée est autre chose, l'erreur est ignorée et s'imprime telle qu'elle était à l'origine.Je n'arrivais pas à faire une correspondance regex plus courte que
try/except
. En fait, l'expression régulière s'est avérée terriblement verbeuse:la source
a=int('1'+a,16)
parexec'a=0x1'+a
(probablement, besoin de tester)"+input()"
.()
àinput()
Perl 6 , 19 octets
Essaye-le
Étendu:
la source
Perl, 27 octets
-1 octet grâce à @ardnew .
26 octets de code +
-p
indicateur.Fournissez l'entrée sans nouvelle ligne finale. Avec
echo -n
par exemple:Explication
C'est assez simple:
/[^0-9a-f]/i
c'est vrai si l'entrée contient un caractère autre que ceux autorisés à l'intérieur des nombres hexadécimaux. S'il est faux,$_
(qui contient l'entrée), il est défini sur la valeur convertie (la conversion est effectuée par la fonction intégréehex
).Et
$_
est implicitement imprimé grâce au-p
drapeau.la source
$_=hex"1$_"if!/[^0-9a-f]/i
Pyth - 9 octets
Même idée que la réponse de fliptack . Essayez une conversion hexadécimale-décimale, sinon sortez l'entrée.
Essayez-le ici!
la source
Lot, 33 octets
Comment ça marche
Une chaîne est passée en argument, 1 y est ajoutée et la chaîne est implicitement convertie en décimal et imprimée. Si la chaîne n'est pas hexadécimale valide, elle est simplement affichée.
Il convient de noter que, puisque les calculs par lots utilisent des entiers 32 bits signés, le plus grand nom d'utilisateur autorisé est
FFFFFFF
.cmd /c
prend la commande suivante, l'exécute dans un nouveau terminal et quitte.set /a
effectue des calculs et affiche implicitement le résultat en décimal lorsqu'il n'est pas stocké dans une variable.0x1%1
indique à set de ajouter un 1 au premier argument (c'est facile car toutes les variables batch sont des chaînes) et indique que la chaîne doit être traitée comme hexadécimale.2>nul
supprime toutes les erreurs résultant d'un nombre hexadécimal non valide||
est un OU logique et exécute la commande à droite si la commande à gauche échoue. Les parenthèses font tout jusqu'à ce point une commande.echo %1
affiche simplement le premier argument.la source
Lisp commun, 71
Les tests
Définir la fonction
Citez une liste des entrées attendues, comme indiqué par la question:
Analyser et collecter les résultats
Vérifiez que les sorties attendues correspondent aux sorties réelles:
la source
C, 108 octets
Il s'agit d'une fonction qui prend la chaîne en argument et imprime le résultat dans STDOUT.
la source
int
:)JavaScript:
4641 octetsla source
/[^0-9a-f]/i
0-9
par\d
, 3 octets en ajoutant l'indicateur insensible à la casse (merci @GilZ) et 2 octets supplémentaires en supprimantF=
, ce qui n'est pas nécessaire. Merci pour la suggestion.PHP, 42 octets
hex2bin () renvoie false si l'entrée n'est pas une chaîne hexadécimale valide. C'est plus court que d'utiliser l'expression régulière pour rechercher des chiffres non hexadécimaux, mais nous avons besoin de l'opérateur @ car il n'est pas silencieux lorsqu'il échoue.
la source
hex2bin
échoue pour les cordes de longueurs inégales. Encore deux octets de moins qu'avecpreg_match
:<?=@hex2bin($s=$argv[1])|@hex2bin($s.a)?hexdec("1$s"):$s;
pour 57 octets.frapper,
463531 octetsEnregistrez en tant que script et passez le nom d'utilisateur en argument.
la source
Python 2 -
63,52,50, 46 octetsCela utilise Python
int()
qui convertit n'importe quelle chaîne avec sa base appropriée en base 10. Dans ce cas, la chaîne est le numéro 1 attaché à l'entrée. Si l'entrée n'est pas valide (a des caractères autres que0123456789ABCDEF
(insensible à la casse), elle renvoieValueError
:Essayez-le ici!
Merci à @FlipTack pour avoir économisé 15 octets!
la source
Rubis,
4744 octetsJe pourrais supprimer 3 octets en changeantputs
pourp
, mais j'ai l'impression que la sortie serait considérée comme incorrecte car elle a une nouvelle ligne à la fin.Edit: Changement
puts
pourp
que sont généralement sauts de lignes acceptées, merci @Mego.la source
Japt , 11 octets
Essayez-le en ligne!
Un grand merci à ETHproductions!
la source
Dyalog APL , 37 octets
N'utilise aucune validation intégrée ou conversion hex-dec. Requiert
⎕IO←0
ce qui est par défaut sur de nombreux systèmes.Non golfé:
d ← ⎕D , 6 ↑ ⎕A
d obtient D igits suivi des 6 premiers éléments de l' alphabet Au ← 1 (819⌶) ⍵
u se met en majuscule (819 argument "Big") argument∧/ u ∊ d:
si tous les éléments de u sont membres de d , alors:16 ⊥ 1 , d ⍳ u
trouver les indices de u dans d , ajouter un 1 au début et évaluer comme base 16⍵
else: retourne l'argument (non modifié)TryAPL en ligne:
Mettre
⎕IO
à zéro, définir un remplacement pour⌶
(interdit sur TryAPL pour des raisons de sécurité), et un ensemble⎕PP
( P Rint P recision) à 10 pour les grands résultatsEssayez tous les cas de test
la source
REXX,
4948 octetsLe
signal on syntax
dit à l'interpréteur de sauter à l'étiquettesyntax
chaque fois qu'une erreur de syntaxe se produit. Le programme essaie de se réaffectera
avec une version convertie hexadécimale en décimale avec un 1 en tête, mais passe à l'syntax
étiquette en cas d'échec. Si la conversion réussit, elle ignore simplement l'étiquette et génère la variable réaffectée.la source
PowerShell , 35 octets
Essayez-le en ligne! ou Exécutez tous les cas de test!
Explication
$v
)0
) est le résultat d'une chaîne contenant0x1$v
piped intoInvoke-Expression
(iex
), tout en affectant simultanément cette valeur à$h
. Si la conversion échoue,$h
restera$null
.-not
valeur booléenne de$h
. Tout ce qui$h
est sera implicitement converti en[bool]
($null
dans le cas d'une conversion invalide deviendra$false
, un entier positif dans le cas d'une conversion réussie deviendra$true
) avant d'être annulé, qui est ensuite implicitement converti en[int]
par l'indexeur de tableau[]
($true
sera1
,$false
sera0
), entraînant ainsi le premier élément du tableau (le résultat de la conversion) choisi si la conversion a réussi, et le deuxième élément choisi si la conversion a échoué.la source
Scala, 40 octets
Usage:
Explication:
la source
C #, 58 octets
Non golfé avec des cas de test:
Essayez en ligne
la source
Fléchette, 51 octets
Essayez-le ici
La plupart des frais généraux proviennent de paramètres nommés ... Eh bien!
Au moins Dart vous permet de taper dynamiquement, si vous voulez: D
la source