Inspiré d' un récent article du Daily WTF ...
Écrivez un programme ou une fonction qui prend un GUID (chaîne au format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
, où chaque X représente un chiffre hexadécimal) et génère le GUID incrémenté de un.
Exemples
>>> increment_guid('7f128bd4-b0ba-4597-8f35-3a2f2756dfbb')
'7f128bd4-b0ba-4597-8f35-3a2f2756dfbc'
>>> increment_guid('06b86883-f3e7-4f9d-87c5-a047e89a19fa')
'06b86883-f3e7-4f9d-87c5-a047e89a19fb'
>>> increment_guid('89f25f2f-2f7b-4aa6-b9d7-46a98e3cb2cf')
'89f25f2f-2f7b-4aa6-b9d7-46a98e3cb2d0'
>>> increment_guid('89f25f2f-2f7b-4aa6-b9d7-46a98e3cb29f')
'89f25f2f-2f7b-4aa6-b9d7-46a98e3cb2a0'
>>> increment_guid('8e0f9835-4086-406b-b7a4-532da46963ff')
'8e0f9835-4086-406b-b7a4-532da4696400'
>>> increment_guid('7f128bd4-b0ba-4597-ffff-ffffffffffff')
'7f128bd4-b0ba-4598-0000-000000000000'
Remarques
- Contrairement à l'article lié, l'incrémentation d'un GUID qui se termine par F doit «porter» au chiffre hexadécimal précédent. Voir les exemples ci-dessus.
- Vous pouvez supposer que l'entrée ne le sera pas
ffffffff-ffff-ffff-ffff-ffffffffffff
. - Pour les chiffres hexadécimaux supérieurs à 9, vous pouvez utiliser des majuscules (AF) ou des minuscules (af).
- Oui, les GUID peuvent commencer par a
0
. - Votre sortie doit être composée exactement de 32 chiffres hexadécimaux et de 4 traits d'union dans le format attendu, y compris les éventuels interlignes
0
. - Vous n'avez pas à conserver le numéro de version ou d'autres bits fixes du GUID. Supposons que ce soit juste un entier de 128 bits où aucun des bits n'a de signification particulière. De même, les GUID sont supposés trier dans un ordre lexicographique simple plutôt que dans l'ordre binaire d'une
GUID
structure Windows . - Si vous écrivez une fonction, l'entrée peut être d'une séquence-of-
char
type de données:string
,char[]
,List<char>
, etc.
GUID
structure Windows .89f25f2f-2f7b-4aa6-b9d7-46a98e3cb29f
pour s'assurer que les réponses peuvent faire la transition9 -> a
.foreach (char ch in theInput)
est valide.Réponses:
05AB1E ,
171518 octetsEnregistré 2 octets grâce à Kevin Cruijssen
Essayez-le en ligne! ou comme suite de tests
Explication
la source
žKÃ
au lieu de'-K
. Btw, vous pouvez économiser 2 octets en passant•É]•S3+
àŽ¦˜S·
.Ž
c'est une chose maintenant ...Python 2 , 50
Essayez-le en ligne!
la source
JavaScript (ES6), 85 octets
La chaîne de sortie est en minuscules.
Essayez-le en ligne!
Commenté
la source
Python 2 , 82 octets
Essayez-le en ligne!
Aucune importation ou conversion hexadécimale.
Cela balaye de l'arrière de la chaîne, en déplaçant chaque caractère le long du cycle
0123456789abcdef
, avec-
aller à lui-même. Après avoir touché un symbole autre quef
ou-
, il arrête de balayer vers la gauche et renvoie simplement le reste inchangé. Cette solution n'est pas spécifique au format UUID - n'importe quel nombre de blocs de n'importe quel nombre de lettres hexadécimales fonctionnerait.Le cas de base
[str,f][s[-1]in'f-'](s[:-1])
est un truc que je n'avais jamais vu utilisé dans un golf auparavant. Il met fin à la récursivité sansif
,and
,or
ou un autre flux de contrôle explicite.En fonction de la condition
[s[-1]in'f-']
du dernier caractère, le code retournef(s[:-1])
ous[:-1]
reste inchangé. Étant donné questr
l'identité est sur les chaînes, nous pouvons sélectionner l'une des fonctions[str,f]
et l'appliquers[:-1]
. Notez que l'appel récursiff
n'est pas effectué s'il n'est pas choisi, contournant le problème courant que Python évalue avec impatience les options inutilisées, conduisant à une régression infinie dans les récursions.la source
APL (Dyalog Unicode) , 46 octets SBCS
Fonction de préfixe tacite anonyme.
Essayez-le en ligne!
⎕CY'dfns'
c op y la bibliothèque "dfns" (pour obtenirhex
etdec
)(
...)
⊢
les arguments≠
diffère de'-'
la planche de bord(
...)@
sur le sous - ensemble constitué par les emplacements à laquelle le critère ci - dessus est vrai, sont applicables:dec¨
convertir chaque caractère hexadécimal à un nombre décimal...
@32
à la position 32 (le dernier chiffre), sont applicables:1+
incrément16(
...)⍣≡
appliquer de façon répétée avec argument de gauche 16 jusqu'à ce qu'il soit stable:=
comparer (donne un masque où les chiffres hexadécimaux sont 16)1⌽
faire pivoter cycliquement d'un pas vers la gauche (c'est le bit de retenue)|+
à cela, ajouter le reste de la division lorsqu'il est divisé (par seize, faisant ainsi tous les 16 en 0) tourner chiffres en représentations de caractères hexadécimaux de longueur un ϵ nlist (aplatir)1hex
∊
la source
Java 11,
152149111 111108 octets-38 octets merci à @ OlivierGrégoire .
-3 octets grâce à @ ASCII uniquement .
Essayez-le en ligne.
Explication:
Ancienne réponse de 149 octets:
Essayez-le en ligne.
Explication:
la source
Rubis
-pl
,625755 octetsEssayez-le en ligne!
la source
Python 3 , 50 octets
Essayez-le en ligne!
la source
Python 2 ,
113112 octetsEssayez-le en ligne!
Sans importations
la source
Retina 0.8.2 , 21 octets
Essayez-le en ligne! Le lien inclut des cas de test.
9
devienta
. Explication: l'expression régulière correspond à tous lesf
s et-
s de fin plus un caractère précédent. La translittération incrémente ensuite cycliquement ces caractères comme s'il s'agissait de chiffres hexadécimaux. Approche alternative, également 21 octets:Essayez-le en ligne! Le lien inclut des cas de test. Fonctionne en minuscule l'entrée pour simplifier la translittération. Serait donc de 15 octets s'il ne devait prendre en charge que les minuscules. Essayez-le en ligne! Le lien inclut des cas de test.
la source
MATLAB, 138 octets
Correction d'un bug au cas où un morceau serait entièrement composé de zéros. Golfé aussi beaucoup en abusant de try / catch. Résultat net: 0 octet enregistré.
Une tentative de «triche» en utilisant a
java.util.UUID
échoué car lalong
valeur renvoyée parjava.util.UUID.get[Most/Least]SignificantBits
est convertie en undouble
qui entraîne une perte de précision. Je vous invite à jeter un œil à ce tableau et à prononcer silencieusement "... mais pourquoi? "Explication
La
hex2dec
fonction crache undouble
, donc elle ne peut pas traiter tout le GUID à la fois pour éviter de dépasserflintmax
. Au lieu de cela, nous devons traiter le bloc GUID par chunck, en utilisantsplit
. La variablea
vérifie si nous devons en porter un, et triche également est l'incrément initial que nous ajoutons. La condition de report est de savoir si les longueurs des chaînes originales et incrémentées ne sont plus égales.La version originale était un peu moins de 160 octets, donc j'aimerais penser que cela ne devrait pas être facile à surpasser.
la source
Python 2 , 99 octets
Essayez-le en ligne!
Pas d'
uuid.UUID
utilisation.la source
C # (Visual C # Interactive Compiler) , 77 octets
Essayez-le en ligne!
-1 octet grâce à @ASCIIOnly!
Fonction anonyme qui prend une
char[]
entrée et une sortie en modifiant un argument .L'entrée est analysée de droite à gauche et remplacée à l'aide des règles suivantes.
-
caractère est ignoré et le traitement continueF
personnage est converti en0
et le traitement se poursuit9
personnage est converti enA
et le traitement s'arrêteA-E
et0-8
sont incrémentés de 1 et le traitement s'arrêtela source
==70
->>69
Powershell, 101 octets
Essayez-le en ligne!
Aucune bibliothèque externe ou conversion hexadécimale. N'importe quelle longueur de chaîne. Les minuscules et les majuscules sont autorisées. La chaîne d'entrée correspondant à
^[f-]*$
est également autorisée.Ce script analyse à l'arrière de la chaîne et incrémente chaque caractère par la valeur de la table de hachage:
-
: incrément = 1-19
: incrément = 1 + 7, résultat =A
F
: incrément = 1-23, résultat =0
f
: incrément = 1-55, résultat =0
Ensuite, le script utilise
$p
pour déterminer s'il faut incrémenter le caractère actuel.Script de test:
Sortie:
la source
Perl 6 , 65 octets
Essaye-le
la source
Gelée , 20 octets
-2 (et correction d'un bug) grâce à Dennis!
Essayez-le en ligne!
la source
PowerShell , 126 octets
Essayez-le en ligne!
Réponse assez banale. Je pensais juste que le bien-aimé PowerShell serait ajouté à la liste :)
la source
JavaScript (Node.js) , 78 octets
Essayez-le en ligne!
la source
Perl 5, 64 octets
Le nombre de parenthèses nécessaires ici me rend triste, mais
->
se lie très étroitement, comme->as_hex
c'est le moyen le plus rapide que je puisse trouver pour obtenir une sortie au format hexadécimal.Courez avec
perl -Mbigint -p
. Fondamentalement, il convertit simplement le nombre en hexadécimal bigint, en ajoute un, puis sous-titre les chiffres du résultat dans la valeur d'origine, en laissant les tirets intacts.la source
Rouille, 258 octets
oui c'est long .. mais techniquement c'est une seule ligne avec 1 expression? et pas de bibliothèques fantaisies? et il ne plantera pas sur une entrée fuzz? ungolf:
essayez-le sur le terrain de jeu de la rouille
la source
Code d'assemblage x86 16/32/64 bits, 28 octets
octets: 83C623FDAC3C2D74FB403C3A7502B0613C677502B03088460173E9C3
code:
Appelez avec ESI pointant vers GUID. Remplacez ESI par SI pour 16 bits ou RSI pour 64 bits (et +2 octets).
la source
C (clang) , 62 octets
Essayez-le en ligne!
la source
Lisp commun, 166 octets
Essayez-le en ligne!
la source