Avec une entrée de chaîne, écrivez un programme qui affiche une valeur de vérité dans STDOUT ou son équivalent si l’entrée est un UUID valide, sans utiliser de regex.
Un UUID valide est
32 chiffres hexadécimaux, affichés en cinq groupes séparés par des traits d'union, sous la forme 8-4-4-4-12 pour un total de 36 caractères (32 caractères alphanumériques et quatre traits d'union).
Cas de test
0FCE98AC-1326-4C79-8EBC-94908DA8B034
=> true
00000000-0000-0000-0000-000000000000
=> true
0fce98ac-1326-4c79-8ebc-94908da8b034
=> true
0FCE98ac-1326-4c79-8EBC-94908da8B034
=> true
{0FCE98AC-1326-4C79-8EBC-94908DA8B034}
=> false (the input is wrapped in brackets)
0GCE98AC-1326-4C79-8EBC-94908DA8B034
=> false (there is a G in the input)
0FCE98AC 1326-4C79-8EBC-94908DA8B034
=> false (there is a space in the input)
0FCE98AC-13264C79-8EBC-94908DA8B034
=> false (the input is missing a hyphen)
0FCE98AC-13264-C79-8EBC-94908DA8B034
=> false (the input has a hyphen in the wrong place)
0FCE98ACD-1326-4C79-8EBC-94908DA8B034
=> false (one of the groups is too long)
0FCE98AC-1326-4C79-8EBC-94908DA8B034-
=> false (has a trailing hyphen)
0FCE98AC-1326-4C79-8EBC-94908DA8B034-123
=> false (too many groups)
0FCE98AC13264C798EBC94908DA8B034
=> false (there is no grouping)
Règles
- Les expressions régulières ne sont pas autorisées
- La correspondance de motif littéral qui ressemble à une expression régulière n'est pas autorisée. Par exemple, en utilisant
[0-9a-fA-F]
ou d'autres identifiants hexadécimaux (nous appellerons celan
), puis en correspondancennnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn
oun[8]-n[4]-n[4]-n[4]-n[12]
non. - L'entrée peut être prise à partir de
STDIN
ou comme argument d'une fonction - L'entrée est insensible à la casse
- Il est prudent de supposer que l'entrée ne contiendra pas de sauts de ligne ou de saut de ligne.
- L'entrée peut contenir des caractères ASCII imprimables (espaces compris).
- Une valeur de vérité doit être imprimée
STDOUT
ou équivalente si la saisie est un uuid valide - Une valeur de falsey doit être imprimée
STDOUT
ou équivalente si la saisie n’est pas un uuid valide - Si vous utilisez une fonction, au lieu d’utiliser
STDOUT
, la sortie peut être la valeur de retour de la fonction - La valeur vérité / falsey ne peut pas être imprimée
STDERR
. - Les failles standard s'appliquent
- C'est le code-golf , donc le programme le plus court en octets gagne. Bonne chance!
Classement
Il s'agit d'un extrait de pile qui génère un classement et un aperçu des gagnants par langue.
Pour que votre réponse apparaisse, commencez votre réponse par un titre utilisant le modèle Markdown suivant.
## Language Name, N bytes
Où N est la taille, en octets, de votre soumission
Si vous souhaitez inclure plusieurs numéros dans votre en-tête (par exemple, en supprimant d'anciens scores ou en incluant des indicateurs dans le nombre d'octets), assurez-vous que le score réel est le dernier numéro de votre en-tête.
## Language Name, <s>K</s> X + 2 = N bytes
la source
\h{8}-\h{4}-\h{4}-\h{4}-\h{12}
(où\h
est un chiffre hexadécimal) sont valides.Réponses:
CJam,
313029 octetsExécutez tous les cas de test ici.
Explication
Au lieu de mettre en correspondance directe le motif avec l'entrée, nous le transformons d'abord en un formulaire plus simple qui peut être facilement comparé à une chaîne de motif unique.
la source
JavaScript ES6,
735556 caractèresLa version précédente à 55 caractères a un problème avec les espaces de fin dans le groupe:
Tester:
la source
PowerShell,
2921844937 octetsUn grand merci aux personnes dans les commentaires qui ont aidé à la pratique du golf pour suivre l'évolution des règles - TessellatingHeckler , iFreilicht , Jacob Krall et Joey . Veuillez consulter l'historique des modifications pour les révisions et les versions antérieures.
Cette révision prend les entrées comme
$g
, puis crée une nouvelle table de hachage@{}
avec un élément, index36
étant défini sur égal$g-as[guid]
. Ceci utilise l'-as
opérateur intégré pour tenter la conversion entre deux types de données .NET - de[string]
à[guid]
. Si la conversion aboutit, un[guid]
objet est renvoyé, sinon$null
est renvoyé. Cette partie garantit que la chaîne d'entrée est un GUID .NET valide.L'étape suivante consiste à indexer dans la table de hachage
[$g.length]
. Si la$g
longueur n'est pas exactement de 36 caractères, la table de hachage retournera$null
, qui sera sortie en tant que valeur de falsey. Si$g
est composé de 36 caractères, le résultat de l'appel .NET sera généré. Si$g
n'est pas un GUID .NET valide (sous quelque forme que ce soit), il sera$null
alors affiché sous forme de valeur falsey. Sinon, un objet GUID .NET sera généré en tant que valeur de vérité. Le seul moyen de générer une sortie est celui-ci s'il correspond au format demandé pour le défi.Exemples
Ici, j'encapsule l'appel de script entre parenthèses et le transforme explicitement en booléen pour plus de clarté.
la source
!!($args[0]-as[guid])
à 21 octets.!!()
? Comme les valeurs$NULL
et[guid]
sont mutuellement exclusifs, ils se qualifient pour représenter les valeurs de truthey et Falsey, non? Quoi qu'il en soit, excellent moyen de convertir en booléen, aimez la solution!True
pour0FCE98AC13264C798EBC94908DA8B034
, qui n'a pas de trait d'union0FCE98AC-1326-4C79-8EBC-94908DA8B034D
(D supplémentaire à la fin) renvoie falsey$TRUE
, car cela élimine simplement le chiffre incriminé et les 36 premiers caractères sont valides.Emacs Lisp, 236 octets
Ungolfed:
la source
En raison de changements dans les règles , cette réponse n’est plus compétitive :(
C, 98
Surtout assez explicite. Le
%n
spécificateur de format indique le nombre d'octets lus jusqu'à présent, qui devrait être 36.scanf()
renvoie le nombre d'éléments correspondants, qui devrait être 6. La finale%c
ne doit correspondre à rien. Si c'est le cas, il y a un texte de fin, et le résultatscanf()
est 7.Compilez avec
-w
pour supprimer les avertissements embêtants (il y en a plusieurs).la source
JavaScript ES6, 70
83NOTE: merci à @Qwertiy pour avoir trouvé un bogue (et suggéré quelques améliorations et corrections)
Thx @ CᴏɴᴏʀO'Bʀɪᴇɴ 2 octets enregistrés
Autres 9 octets enregistrés simplifiant la vérification de la longueur (la manière complexe était plus courte dans le premier brouillon, mais pas maintenant)
A expliqué
Extrait de test
la source
-1-('0x'+h)
=>1/('0x'+h)
00000000-0000-0000-000 -000000000000
every
appelu
est une chaîne, pas un tableauEn raison de changements dans les règles , cette réponse n’est plus compétitive :(
Pure Bash (aucun utilitaire externe), 78
Prend une entrée à partir de la ligne de commande.
printf
construit la chaîne suivante- - - -
.p=
ligne transforme ce le schéma suivant:[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]
. Notez que cela ressemble beaucoup à une expression régulière. Cependant, ce n'est pas dans ce contexte. C'est un modèle de correspondance de modèle de shell . Ce concept est similaire à une expression régulière, mais constitue une construction (et une syntaxe) différente.Idiomatique pour shell, un code de retour de 0 indique succès / VRAI et 1 indique un échec / FAUX. Le code de retour peut être inspecté
echo $?
après l'exécution du script.la source
tr
utilise également les classes de caractères Posix, mais n’est pas un analyseur de regex.Jolf, 32 octets
Essayez-le ici!
À cause d'une erreur dans mon code, c'est plus long que cela ne devrait être. :(
[8,4,4,4,12]
devrait être identique à{8444*26}
, mais}
est aussi la fermeture d'une fonction: Pla source
MATL , 55 octets
Je me suis abstenu d'utiliser la
Yb
fonction (strsplit
) parce que c'est un peu similaire àregexp(..., 'split')
. Cela utilise uniquement l'indexation et les comparaisons de caractères.Exemple
Explication
la source
CJam,
5242 octetsEssayez-le en ligne . Affiche la chaîne d'origine si vrai et la chaîne vide si faux ( ceci est autorisé ).
Explication:
la source
A7*)<
ne supprimera pas beaucoup de caractères non valides, tels que les espaces+
,?
...Julia, 86 octets
C'est une fonction anonyme qui accepte une chaîne et retourne un booléen. Pour l'appeler, donnez-lui un nom, par exemple
f=s->...
.Ungolfed:
la source
C # 196 octets
Ungolfed:
La méthode
T
peut être appelée avec n'importe quelle chaîne non NULL et retourneratrue
les GUID valides,false
sinon. Ceci est une validation à temps constant; au prix de trois caractères que vous pouvez sortir en début de la méthode (changementi < v.Length
dei < v.Length && r
).Je vais essayer d'obtenir le décompte plus tard.
J'ai évidemment laissé de côté le
Guid.ParseExact
chemin, car où est le plaisir? La voici, sans trop d’efforts, pour la jouer encore plus loin dans 86 octets :Ungolfed:
la source
Python 2,
99112 octetsSur une entrée valide, il imprime
True
. Sur une entrée non valide, il est impriméFalse
ou0
, en fonction de la raison, invalide.False
et0
sont tous les deux falsey en python.La fonction doit vérifier 3 choses:
ABCDEF
Voici une ventilation pour montrer comment il vérifie pour eux. Il est légèrement obsolète mais j'ai faim alors je le mettrai à jour plus tard.
la source
return
avecprint
. (Dans ce cas, vous voudrez certainement être en Python 2, car celaprint
fonctionne différemment en Python 3.)map
renvoie maintenant un "objet map", pas une liste.int
fonction autorise les espaces -0FCE98ac-1326-4c79-8EBC-94908da8B03
avec un espace de fin. Voir le commentaire dans la réponse Pyth supprimée ici si possible.Python 2, 57 octets
Dieu merci pour construit! - assurez-vous de mettre les chaînes entre guillemets.
la source
1
pour l'entrée12345678123456781234567812345678
.try:print uuid.UUID(input())
car tout ce dont vous avez besoin est d’imprimer une valeur de véritéPyth, 39 octets
Essayez ici .
la source
\
caractère dans votre lien "essayez-le ici"K\-k
, il ne s'exécute donc pas tel quel.Perl 6 ,
8367 octets(les chiffres n'incluent pas les nouvelles lignes ni les retraits car ils ne sont pas nécessaires)
usage:
la source
Common Lisp - 161
La valeur renvoyée si true est le hachage, en tant que nombre, ce qui est un résultat utile à obtenir.
Ungolfed
la source
F # 44 caractères
En F #, les fonctions avec des
out
paramètres peuvent être appelées en omettant le paramètre out; sa valeur au retour sera combinée avec la valeur de retour vraie de la fonction dans un tuple.Ici, le tuple est dirigé vers la
fst
fonction, qui retourne son premier membre, qui est dans ce cas la valeur de retour booléenne de TryParseExact, indiquant le succès ou l'échec de l'appel.Pour vérifier le format correct, nous
true
ne renvoyons que si la chaîne comporte 36 caractères.Avant de voir la réponse C # de RobIII, je n'avais pas pensé à utiliser TryParseExact; ma réponse était donc d'avoir été trois caractères plus longs:
TryParse(string, Guid)
accepte les entrées dans les formats suivants:Parmi ceux-ci, seul le second comporte 36 caractères.
la source
Python 2,
938985 octetsL'
map()
appel garantit que les sections ont la bonne longueur etall()
teste chaque caractère en tant que trait d'union ou chiffre hexadécimal à casse quelconque. L'expression du générateur teste chaque caractère en effectuant une itération sur l'ensemble de la chaîne. Ce n'est donc pas la méthode la plus performante, mais elle devrait satisfaire les cas de test:la source
f=
et les espaces autour de la chaîne dans leall
bloc.all(..)
pour définir les tests d'inclusion:set(u)<=set("-0123456789abcdefABCDEF")
.SAS,
171144141Utilise en fait stdin et stdout - l’une des fonctionnalités les moins connues de ce langage particulier. Fonctionne pour les exemples donnés jusqu'à présent, mais peut-être pas dans tous les cas. Peut probablement être amélioré.
Meilleure approche - un personnage à la fois:
Golfé 6 autres caractères de l'expression centrale!
Ungolfed:
Cela génère pas mal d'avertissements et de notes dans le journal, mais cela ne les imprime pas sur stdout ou stderr, je pense donc que c'est un jeu juste.
la source
C, 391 octets
la source
MATLAB, 126 octets
la source
Python 3, 134 octets
int (k, 16) essaye de convertir k en base 16 int. Sur un caractère autre que 0-9a-fA-F-, il échoue, auquel cas nous renvoyons 0, ce qui est faux. Ajoutez 1 à cet int et vous obtenez une valeur de vérité garantie - nous avons supprimé tous les tirets avec str.split () afin que nous ne puissions pas obtenir la valeur -1 et que tous les éléments non-0 sont vrais.
la source
Fonction C, 102
Un changement de règle a annulé ma
scanf()
réponse précédente basée sur le c , alors voici une autre réponse c à l' aide deisxdigit()
laquelle je pense qu'il devrait être autorisé à concurrencer :Essayez-le en ligne.
-
caractères (ASCII 45) aux positions appropriées - le cas échéant, remplacez-les par0
s (ASCII 48 (= 45 + 3))isxdigit()
la source
Lot,
148139 + 2 =150141 octetsAjout de 2 octets car vous devez utiliser le
/v
commutateur pourCMD.EXE
.Quitte avec ERRORLEVEL 0 en cas de succès, 1 en cas d'échec.
Edit: Sauvegardé des octets principalement parce qu’il
:=
est insensible à la casse, mais il y avait aussi d’autres réglages.la source
Java, 345 octets
L'entrée est le premier argument de la ligne de commande. La sortie est un code d'erreur (0 signifie UUID valide, 1 signifie non valide)
Ungolfed avec des commentaires:
EDIT: N'a pas remarqué la partie STDOUT. Oups, corrigé maintenant.
la source
if(b.length>36||b.length<36)
par simplementif(b.length!=36)
. De plus, comme vous pouvez imprimer des valeurs conformes à la vérité , vous pouvez simplement imprimer0
au lieu de1<0
, et1
au lieu de1>0
.if(truthy_value){ doSomethingOnYes(); } else{ doSomethingOnFalse(); }
So en Java un booléen est une valeur truthy, mais1
ou0
est pas. Seulement lorsque l'OP d'un défi dit quelque chose comme: « Votre sortie peut être vrai / faux, 0/1, vide / non vide, tant que vous indiquez ce que vous utilisez. » En effet , vous pouvez alors utiliser0
et au1
lieu detrue/false
comme truthy / valeur falsey.if(b.length!=36)
;||
peut être|
sur plusieurs endroits, ainsi que&&
pour&
;if(...!='-')
peut êtreif(...!=45)
;int i=-1; ... while(++i<b.length){
peut être remplacé parfor(int i=-1;++i<b.length;){
;'F'
peut être70
('f'
pourrait être 102, mais cela n'a pas d'importance puisqu'il s'agit du même nombre d'octets). J'aime la façon dont vous avez utiliséjava.io.PrintStream u=System.out;
, je devrais m'en rappeler! Donc merci.Swift 3, 50 octets
Passer dans une ficelle
s
la source
PHP, 109 octets
affiche 1 pour vrai et 0 pour faux
$i>7&$i<24&!($i%5-3)
est 5 octets plus court alorsin_array($i,[8,13,18,23])
112 octets
113 octets
la source
Java,
172 octets168 octets (Assistant Merci Wheat)Un peu cheaty depuis que java.util.UUID est utilisé, mais voici:
Version non-golfée:
la source
try
et{
.String[]
eta
. En outre, vous devriez pouvoir remplacerprintln
parprint
.java.util.UUID.fromString
au lieu d'importer.AWK, 98 octets
Fractionne simplement la ligne à chaque caractère et vérifie si chaque caractère est un chiffre hexadécimal et s'il y a des traits d'union aux endroits appropriés.
strtonum
convertit les caractères non valides en0
. Faire la comparaison entre0
etm
(et un caractère invalide choisi arbitrairement) nécessite des étapes supplémentaires. Heureusement,01
c'est un nombre hexadécimal valide, mais cem1
n'est pas le cas.Au départ, j’ai écrit deux
for
boucles, mais j’ai économisé 1 octet en les comprimant ensemble. :)REMARQUE:
GAWK
peut lire les entrées sous forme de nombres hexadécimaux, mais cela nécessite une très longue option en ligne de commande.la source