Inspiriert von einem aktuellen Daily WTF-Artikel ...
Schreiben Sie ein Programm oder eine Funktion, die eine GUID (Zeichenfolge im Format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
, wobei jedes X eine hexadezimale Ziffer darstellt) und die um eins erhöhte GUID ausgibt.
Beispiele
>>> 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'
Anmerkungen
- Anders als im verlinkten Artikel muss das Inkrementieren einer GUID, die mit F endet, auf die vorherige Hex-Ziffer übertragen werden. Siehe obige Beispiele.
- Sie können davon ausgehen, dass die Eingabe nicht sein wird
ffffffff-ffff-ffff-ffff-ffffffffffff
. - Bei Hexadezimalzahlen über 9 können Sie entweder Groß- (AF) oder Kleinbuchstaben (af) eingeben.
- Ja, GUIDs können mit einem beginnen
0
. - Ihre Ausgabe muss aus genau 32 Hexadezimalstellen und 4 Bindestrichen im erwarteten Format bestehen, einschließlich aller erforderlichen vorangestellten
0
s. - Sie müssen die Versionsnummer oder andere feste Bits der GUID nicht beibehalten. Angenommen, es ist nur eine 128-Bit-Ganzzahl, bei der keines der Bits eine besondere Bedeutung hat. In ähnlicher Weise wird angenommen, dass GUIDs in einer einfachen lexikografischen Reihenfolge und nicht in der binären Reihenfolge einer Windows-
GUID
Struktur sortiert werden . - Wenn eine Funktion schreiben, kann die Eingabe eines beliebigen Sequenz-of- seinen
char
Datentypen:string
,char[]
,List<char>
usw.
GUID
Struktur sortiert werden .89f25f2f-2f7b-4aa6-b9d7-46a98e3cb29f
um sicherzustellen, dass Antworten den Übergang schaffen können9 -> a
.foreach (char ch in theInput)
gültig ist.Antworten:
05AB1E ,
171518 Bytes2 Bytes dank Kevin Cruijssen gespeichert
Probieren Sie es online! oder als Test Suite
Erläuterung
quelle
žKÃ
statt'-K
. Btw, können Sie durch Ändern 2 Bytes speichern•É]•S3+
zuŽ¦˜S·
.Ž
habe ...Python 2 , 50
Probieren Sie es online!
quelle
JavaScript (ES6), 85 Byte
Die Ausgabezeichenfolge ist in Kleinbuchstaben.
Probieren Sie es online!
Kommentiert
quelle
Python 2 , 82 Bytes
Probieren Sie es online!
Keine Importe oder Hex-Konvertierung.
Dies tastet von der Rückseite der Zeichenkette ab und bewegt jedes Zeichen entlang des Zyklus
0123456789abcdef
, wobei-
es zu sich selbst geht. Nachdem es ein anderes Symbol alsf
oder getroffen hat-
, stoppt es den Scanvorgang nach links und gibt den Rest unverändert zurück. Diese Lösung ist nicht spezifisch für das UUID-Format - eine beliebige Anzahl von Blöcken mit einer beliebigen Anzahl von Hex-Buchstaben würde funktionieren.Der Grundfall von
[str,f][s[-1]in'f-'](s[:-1])
ist ein Trick, den ich noch nie beim Golfspielen gesehen habe. Es beendet die Rekursion ohneif
,and
,or
oder anderen expliziten Steuerfluss.Basierend auf der Bedingung
[s[-1]in'f-']
des letzten Zeichens wird der Code entweder zurückgegebenf(s[:-1])
oder nurs[:-1]
unverändert. Dastr
es sich bei den Zeichenfolgen um die Identität handelt, können wir eine der Funktionen auswählen[str,f]
und auf sie anwendens[:-1]
. Beachten Sie, dass der rekursive Aufruf mitf
nicht ausgeführt wird, wenn er nicht ausgewählt ist, wodurch das häufig auftretende Problem umgangen wird, dass Python ungenutzte Optionen eifrig auswertet, was zu einer unendlichen Regression bei Rekursionen führt.quelle
APL (Dyalog Unicode) , 46 Byte SBCS
Anonyme implizite Präfixfunktion.
Probieren Sie es online!
⎕CY'dfns'
c op y die "DFNS" Bibliothek (zu erhaltenhex
unddec
)(
...)
⊢
das Argument≠
unterscheidet sich von'-'
einem Bindestrich(
...)@
in der Teilmenge, die aus den Stellen besteht, an denen das obige Kriterium zutrifft:dec¨
Jedes Hexadezimalzeichen in eine Dezimalzahl umwandeln...
@32
an Position 32 (die letzte Ziffer) anwenden:1+
Inkrementieren16(
...)⍣≡
wiederholt anwenden mit linkes Argument 16 bis stabilen:=
vergleichen (gibt maskieren , wo die Hexadezimalziffern 16)1⌽
zyklisch Drehen einen Schritt nach links (das ist das Übertragsbit)|+
zu , dass der Divisionsrest hinzuzufügen , wenn unterteilt (durch sechzehn, also all 16 in 0 zu machen) wiederum Ziffern in hexadezimale Zeichendarstellungen der Länge 1 ϵ nlist (Abflachen)1hex
∊
quelle
Java 11,
152149111108 Bytes-38 Bytes danke an @ OlivierGrégoire .
-3 Bytes dank nur @ ASCII .
Probieren Sie es online aus.
Erläuterung:
Alte 149-Byte-Antwort:
Probieren Sie es online aus.
Erläuterung:
quelle
Ruby
-pl
,625755 BytesProbieren Sie es online!
quelle
Python 3 , 50 Bytes
Probieren Sie es online!
quelle
Python 2 ,
113112 BytesProbieren Sie es online!
Ohne Importe
quelle
Retina 0.8.2 , 21 Bytes
Probieren Sie es online! Link enthält Testfälle.
9
wirda
. Erläuterung: Der reguläre Ausdruck entspricht allen nachfolgenden Zeichenf
s und-
s sowie einem vorangestellten Zeichen. Die Transliteration erhöht diese Zeichen dann zyklisch, als wären sie Hexadezimalziffern. Alternativer Ansatz, auch 21 Bytes:Probieren Sie es online! Link enthält Testfälle. Verringert die Eingabe, um die Transliteration zu vereinfachen. Wäre also 15 Bytes, wenn es nur Kleinbuchstaben unterstützen müsste. Probieren Sie es online! Link enthält Testfälle.
quelle
MATLAB, 138 Bytes
Ein Fehler wurde behoben, der dazu führte, dass ein Chunk nur aus Nullen bestand. Ich habe auch viel Golf gespielt, indem ich try / catch missbraucht habe. Nettoergebnis: 0 Bytes gespeichert.
Ein Versuch, mit 'cheat' zu arbeiten, ist
java.util.UUID
fehlgeschlagen, da der von zurückgegebenelong
Wert injava.util.UUID.get[Most/Least]SignificantBits
einen konvertiert wird, der zu einemdouble
Genauigkeitsverlust führt. Ich lade Sie ein, einen Blick auf diesen Tisch zu werfen und lautlos "... aber warum? "Erläuterung
Die
hex2dec
Funktion spuckt a ausdouble
und kann daher nicht die gesamte GUID auf einmal verarbeiten, um ein Überschreiten zu vermeidenflintmax
. Stattdessen müssen wir den GUID-Block chunckweise mit verarbeitensplit
. Die Variablea
prüft, ob wir eine Eins tragen müssen, und betrügerischerweise ist dies auch das anfängliche Inkrement, das wir hinzufügen. Die Bedingung für das Übertragen ist, ob die Längen der ursprünglichen und der inkrementierten Zeichenfolge nicht mehr gleich sind.Die ursprüngliche Version war knapp 160 Byte groß, daher würde ich gerne glauben, dass dies nicht leicht zu übertreffen sein sollte.
quelle
Python 2 , 99 Bytes
Probieren Sie es online!
Keine
uuid.UUID
Verwendung.quelle
C # (Visual C # Interactive Compiler) , 77 Byte
Probieren Sie es online!
-1 Byte danke an @ASCIIOnly!
Anonyme Funktion, die eine
char[]
als Eingabe und Ausgabe durch Ändern eines Arguments annimmt .Die Eingabe wird von rechts nach links gescannt und nach den folgenden Regeln ersetzt.
-
Zeichen wird ignoriert und die Verarbeitung fortgesetztF
Zeichen wird konvertiert0
und die Verarbeitung fortgesetzt9
Charakter wird konvertiertA
und die Verarbeitung wird gestopptA-E
und0-8
werden um 1 erhöht, und die Verarbeitung wird gestopptquelle
==70
->>69
Powershell, 101 Bytes
Probieren Sie es online!
Keine externe Bibliothek oder Hex-Konvertierung. Beliebige Stringlänge. Kleinbuchstaben und Großbuchstaben sind zulässig. Die Eingabe von Zeichenfolgen, die mit übereinstimmen,
^[f-]*$
ist ebenfalls zulässig.Dieses Skript scannt von der Rückseite des Strings und erhöht jedes Zeichen um den Wert aus der Hash-Tabelle:
-
: Inkrement = 1-19
: Inkrement = 1 + 7, Ergebnis =A
F
: Inkrement = 1-23, Ergebnis =0
f
: Inkrement = 1-55, Ergebnis =0
Anschließend ermittelt das Skript
$p
, ob das aktuelle Zeichen erhöht werden soll.Testskript:
Ausgabe:
quelle
Perl 6 , 65 Bytes
Probier es aus
quelle
Gelee , 20 Bytes
-2 (und ein Bugfix) danke an Dennis!
Probieren Sie es online!
quelle
PowerShell , 126 Byte
Probieren Sie es online!
Ziemlich triviale Antwort. Ich dachte nur, ich würde die geliebte PowerShell zur Liste hinzufügen lassen :)
quelle
JavaScript (Node.js) , 78 Byte
Probieren Sie es online!
quelle
Perl 5, 64 Bytes
Die Anzahl der Klammern, die hier erforderlich sind, macht mich traurig,
->
bindet aber sehr eng, da dies->as_hex
der schnellste Weg ist, eine hexadezimal formatierte Ausgabe zu erhalten.Laufen Sie mit
perl -Mbigint -p
. Im Grunde konvertiert es die Zahl einfach in ein ganzes Hexadezimal, addiert eins und setzt dann die Ziffern des Ergebnisses wieder auf den ursprünglichen Wert zurück, wobei die Striche unangetastet bleiben.quelle
Rust, 258 Bytes
ja es ist lang .. aber technisch ist es nur eine Zeile mit 1 Ausdruck? und keine schicken Bibliotheken? und es wird nicht auf eine Fuzz-Eingabe abstürzen? ungolf:
Probieren Sie es auf Rost Spielplatz
quelle
16/32/64-Bit-x86-Assemblycode, 28 Byte
Bytes: 83C623FDAC3C2D74FB403C3A7502B0613C677502B03088460173E9C3
Code:
Rufen Sie mit ESI auf, das auf GUID zeigt. Ersetzen Sie ESI durch SI für 16-Bit oder RSI für 64-Bit (und +2 Byte).
quelle
C (clang) , 62 Bytes
Probieren Sie es online!
quelle
Common Lisp, 166 Bytes
Probieren Sie es online!
quelle