Wenn Sie eine Zeichenfolge eingeben , schreiben Sie ein Programm, das einen Wahrheitswert an STDOUT oder einen entsprechenden Wert ausgibt, wenn die Eingabe eine gültige UUID ist, ohne reguläre Ausdrücke zu verwenden.
Eine gültige UUID ist
32 hexadezimale Ziffern, angezeigt in fünf durch Bindestriche getrennten Gruppen, in der Form 8-4-4-4-12 für insgesamt 36 Zeichen (32 alphanumerische Zeichen und vier Bindestriche).
Testfälle
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)
Regeln
- Reguläre Ausdrücke sind nicht erlaubt
- Literaler Mustervergleich, der einem regulären Ausdruck gleicht, ist nicht zulässig. Verwenden Sie beispielsweise
[0-9a-fA-F]
oder andere hexadezimale Bezeichner (wir nennen diesn
) und stimmen Sie dann übereinnnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn
odern[8]-n[4]-n[4]-n[4]-n[12]
sind nicht zulässig - Die Eingabe kann entweder
STDIN
einer Funktion entnommen oder als Argument für eine Funktion verwendet werden - Die Eingabe unterscheidet nicht zwischen Groß- und Kleinschreibung
- Es ist davon auszugehen, dass die Eingabe keine Zeilenvorschübe oder Zeilenumbrüche enthält.
- Die Eingabe kann beliebige druckbare ASCII-Zeichen enthalten (einschließlich Leerzeichen)
- Ein wahrer Wert muss auf
STDOUT
oder gleichwertig gedruckt werden, wenn die Eingabe eine gültige UUID ist - Ein falsey-Wert muss auf
STDOUT
oder gleich gedruckt werden, wenn die Eingabe keine gültige uuid ist - Bei Verwendung einer Funktion
STDOUT
kann die Ausgabe anstelle der Funktion der Rückgabewert der Funktion sein - Der Wert für Wahr / Falsch kann nicht gedruckt werden
STDERR
. - Es gelten Standardlücken
- Das ist Code-Golf , also gewinnt das kürzeste Programm in Bytes. Viel Glück!
Bestenliste
Dies ist ein Stack-Snippet, das sowohl eine Rangliste als auch eine Übersicht der Gewinner nach Sprache generiert.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift unter Verwendung der folgenden Markdown-Vorlage
## Language Name, N bytes
Wobei N die Größe Ihrer Übermittlung in Byte ist
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. alte Punkte durchstreichen oder Flags in die Byteanzahl aufnehmen möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in Ihrer Kopfzeile ist
## Language Name, <s>K</s> X + 2 = N bytes
quelle
\h{8}-\h{4}-\h{4}-\h{4}-\h{12}
(wobei\h
es sich um eine hexadezimale Ziffer handelt) gültig sind.Antworten:
CJam,
313029 BytesFühren Sie hier alle Testfälle aus.
Erläuterung
Anstatt die Eingabe direkt mit einem Muster abzugleichen, wandeln wir sie zunächst in eine einfachere Form um, die leicht mit einer einzelnen Musterzeichenfolge verglichen werden kann.
quelle
JavaScript ES6,
735556 ZeichenIn der vorherigen Version mit 55 Zeichen ist ein Problem mit nachgestellten Leerzeichen in der Gruppe aufgetreten:
Prüfung:
quelle
PowerShell,
2921844937 BytesVielen Dank an die Leute in den Kommentaren, die beim Golfen geholfen haben , mit den sich ändernden Regeln Schritt zu halten - TessellatingHeckler , iFreilicht , Jacob Krall und Joey . Informationen zu Überarbeitungen und älteren Versionen finden Sie im Bearbeitungsverlauf.
Diese Revision nimmt Eingaben als
$g
und erstellt dann eine neue Hash-Tabelle@{}
mit einem Element. Der Index36
wird gleich gesetzt$g-as[guid]
. Dies verwendet den eingebauten-as
Operator , um die Konvertierung zwischen zwei .NET-Datentypen zu versuchen - von[string]
nach[guid]
. Wenn die Konvertierung erfolgreich ist, wird ein[guid]
Objekt zurückgegeben, andernfalls$null
wird zurückgegeben. Dieser Teil stellt sicher, dass die Eingabezeichenfolge eine gültige .NET-GUID ist.Der nächste Schritt ist die Indizierung in die Hash-Tabelle mit
[$g.length]
. Wenn die$g
Länge nicht genau 36 Zeichen beträgt, wird die Hash-Tabelle zurückgegeben$null
, die als Falsey-Wert ausgegeben wird. Bei einer$g
Länge von 36 Zeichen wird das Ergebnis des .NET-Aufrufs ausgegeben. Wenn$g
es sich nicht um eine gültige .NET-GUID (in irgendeiner Form) handelt, wird sie$null
als Falsey-Wert ausgegeben. Andernfalls wird ein .NET-GUID-Objekt als Wahrheitswert ausgegeben. Die einzige Möglichkeit, die ausgegeben werden kann, besteht darin, dass es dem angeforderten Format der Abfrage entspricht.Beispiele
Hier kapsele ich den Skriptaufruf in Parens und verwende ihn aus Gründen der Klarheit explizit als Booleschen Wert.
quelle
!!($args[0]-as[guid])
bei 21 Bytes einwerfen .!!()
? Da die Werte$NULL
und[guid]
sich gegenseitig aus, qualifizieren sie truthey und Falsey Werte zu repräsentieren, nicht wahr? Wie auch immer, eine großartige Möglichkeit, nach Boolean zu konvertieren, ich liebe die Lösung!True
für0FCE98AC13264C798EBC94908DA8B034
, die keine Bindestriche hat0FCE98AC-1326-4C79-8EBC-94908DA8B034D
(zusätzliches D am Ende), gibt "Falsey" zurück$TRUE
, da nur die betreffende Ziffer entfernt wird und die ersten 36 Zeichen gültig sind.Emacs Lisp, 236 Bytes
Ungolfed:
quelle
Aufgrund von Änderungen der Regeln ist diese Antwort nicht mehr wettbewerbsfähig :(
C 98
Meist ziemlich selbsterklärend. Der
%n
Formatbezeichner gibt die Anzahl der bisher gelesenen Bytes an, die 36 sein sollte.scanf()
Gibt die Anzahl der übereinstimmenden Elemente zurück, die 6 sein sollte. Das Finale%c
sollte mit nichts übereinstimmen. Wenn dies der Fall ist, wird nachgestellter Text angezeigt undscanf()
7 zurückgegeben.Kompilieren Sie mit
-w
, um die nervigen Warnungen zu unterdrücken (es gibt mehrere).quelle
JavaScript ES6, 70
83HINWEIS thx an @Qwertiy für die Suche nach einem Fehler (und was darauf hindeutet , einige Verbesserungen und Korrekturen)
Thx @ CᴏɴᴏʀO'Bʀɪᴇɴ 2 Bytes gespeichert
Weitere 9 Bytes gespart, um die Längenprüfung zu vereinfachen (der komplexe Weg war im ersten Entwurf kürzer, aber nicht jetzt)
Erklärt
Testschnipsel
quelle
-1-('0x'+h)
=>1/('0x'+h)
00000000-0000-0000-000 -000000000000
every
Aufrufsu
befindet sich ein String, kein ArrayAufgrund von Änderungen der Regeln ist diese Antwort nicht mehr wettbewerbsfähig :(
Pure Bash (keine externen Dienstprogramme), 78
Übernimmt Eingaben von der Kommandozeile.
printf
die folgende Zeichenfolge- - - -
.p=
Linie wandelt diese das folgende Muster:[[: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:]]
. Beachten Sie, dass dies sehr nach einem regulären Ausdruck aussieht. Dies ist jedoch nicht der Fall. Es ist ein Muster für den Shell-Pattern-Matching . Dies ähnelt im Konzept einem regulären Ausdruck, ist jedoch ein anderes Konstrukt (und eine andere Syntax).Ein Rückkehrcode von 0 gibt Erfolg / WAHR und 1 Fehler / FALSCH an. Der Rückkehrcode kann
echo $?
nach dem Ausführen des Skripts überprüft werden .quelle
tr
auch Posix-Zeichenklassen verwendet, es handelt sich jedoch nicht um einen Regex-Parser.Jolf, 32 Bytes
Probieren Sie es hier aus!
Aufgrund eines Fehlers in meinem Code ist dieser länger als es sein sollte. :(
[8,4,4,4,12]
sollte dasselbe sein wie{8444*26}
, ist aber}
auch das Schließen einer Funktion: Pquelle
MATL , 55 Bytes
Ich habe auf die Verwendung von
Yb
function (strsplit
) verzichtet, da es etwas ähnlich ist wie function ( )regexp(..., 'split')
. Dies verwendet nur Indexierung und Zeichenvergleiche.Beispiel
Erläuterung
quelle
CJam,
5242 BytesProbieren Sie es online aus . Gibt die ursprüngliche Zeichenfolge aus, wenn sie wahr ist, und gibt eine leere Zeichenfolge aus, wenn sie falsch ist ( dies ist zulässig ).
Erläuterung:
quelle
A7*)<
entfernt nicht viele ungültige Zeichen, wie Leerzeichen+
,?
...Julia, 86 Bytes
Dies ist eine anonyme Funktion, die eine Zeichenfolge akzeptiert und einen Booleschen Wert zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=s->...
.Ungolfed:
quelle
C # 196 Bytes
Ungolfed:
Die Methode
T
kann mit einer beliebigen Nicht-Null-Zeichenfolge aufgerufen werden und wird andernfallstrue
für gültige GUIDs zurückgegebenfalse
. Dies ist eine zeitlich konstante Validierung. Auf Kosten von drei Zeichen können Sie die Methode vorzeitig beenden (wechselni < v.Length
zui < v.Length && r
).Ich werde später versuchen, den Bytecount weiter zu reduzieren.
Ich habe offensichtlich den
Guid.ParseExact
Weg ausgelassen , denn wo ist der Spaß dabei? Hier ist es, ohne viel zu versuchen, es in 86 Bytes weiter herunterzuspielen :Ungolfed:
quelle
Python 2,
99112 BytesBei einer gültigen Eingabe wird gedruckt
True
. Bei einer ungültigen Eingabe wird gedrucktFalse
oder0
, je nachdem, warum die Eingabe ungültig war.False
und0
sind beide in Python falsch.Die Funktion muss 3 Dinge überprüfen:
ABCDEF
Hier ist eine Aufschlüsselung, um zu zeigen, wie nach ihnen gesucht wird. Es ist etwas veraltet, aber ich habe Hunger und werde es später aktualisieren.
quelle
return
durch ersetzenprint
. (In diesem Fall möchten Sie auf jeden Fall in Python 2 sein, daprint
dies in Python 3 anders funktioniert.)map
jetzt ein "Kartenobjekt" zurückgegeben wird, keine Liste.int
Funktion Leerzeichen zulässt -0FCE98ac-1326-4c79-8EBC-94908da8B03
mit einem nachgestellten Leerzeichen. Siehe Kommentar in gelöschter Pyth-Antwort hier, falls möglich.Python 2, 57 Bytes
Gott sei Dank für eingebaut! - Stellen Sie sicher, dass Sie die Zeichenfolgen in Anführungszeichen setzen.
quelle
1
zur Eingabe gedruckt12345678123456781234567812345678
.try:print uuid.UUID(input())
da Sie lediglich einen wahrheitsgemäßen Wert ausgeben müssenPyth, 39 Bytes
Probieren Sie es hier aus .
quelle
\
ZeichenK\-k
, sodass es nicht wie es ist ausgeführt werden kann.Perl 6 ,
8367 Bytes(Zeilenumbrüche oder Einrückungen sind nicht enthalten, da sie nicht benötigt werden.)
Verwendungszweck:
quelle
Common Lisp - 161
Der zurückgegebene Wert, wenn true, ist der Hash als Zahl, was ein nützliches Ergebnis ist.
Ungolfed
quelle
F # 44 Zeichen
In F # können Funktionen mit
out
Parametern aufgerufen werden, indem der out-Parameter weggelassen wird. Sein Rückgabewert wird mit dem tatsächlichen Rückgabewert der Funktion zu einem Tupel kombiniert.Hier wird das Tupel an die
fst
Funktion weitergeleitet, die ihr erstes Element zurückgibt, in diesem Fall den booleschen Rückgabewert von TryParseExact, der den Erfolg oder Misserfolg des Aufrufs anzeigt.Zur Überprüfung des richtigen Formats geben wir
true
nur zurück, wenn die Zeichenfolge 36 Zeichen lang ist.Bevor ich RobIIIs C # -Antwort sah, hatte ich nicht daran gedacht, TryParseExact zu verwenden. Meine Antwort sollte also drei Zeichen länger sein:
TryParse(string, Guid)
akzeptiert Eingaben in folgenden Formaten:Davon ist nur die zweite 36 Zeichen lang.
quelle
Python 2,
938985 BytesDer
map()
Aufruf garantiert, dass die Abschnitte die richtige Länge haben, undall()
testet jedes Zeichen als Bindestrich oder Hex-Ziffer in willkürlicher Schreibweise. Der Generator-Ausdruck testet jedes Zeichen, indem er die gesamte Zeichenfolge durchläuft. Dies ist leider nicht die performanteste Methode, sollte aber die folgenden Testfälle erfüllen:quelle
f=
und die Leerzeichen um die Zeichenfolge imall
Block entfernen .all(..)
Aufnahme - Tests einzustellen:set(u)<=set("-0123456789abcdefABCDEF")
.SAS,
171144141Verwendet eigentlich stdin und stdout - eine der weniger bekannten Funktionen dieser bestimmten Sprache. Funktioniert für die bisher angegebenen Beispiele, aber möglicherweise nicht in allen Fällen. Kann wahrscheinlich verbessert werden.
Besserer Ansatz - ein Charakter nach dem anderen:
Golf weitere 6 Zeichen aus dem zentralen Ausdruck!
Ungolfed:
Dies erzeugt einige Warnungen und Notizen im Protokoll, aber es druckt sie nicht auf stdout oder stderr aus, daher halte ich dies für ein faires Spiel.
quelle
C 391 Bytes
quelle
MATLAB, 126 Bytes
quelle
Python 3, 134 Bytes
int (k, 16) versucht, k auf eine Basis von 16 int zu werfen. Bei einem anderen Zeichen als 0-9a-fA-F- schlägt dies fehl. In diesem Fall geben wir 0 zurück, was falsch ist. Wenn Sie diesem int 1 hinzufügen, erhalten Sie einen garantierten Wahrheitswert - wir haben alle Bindestriche mit str.split () entfernt, sodass wir den Wert -1 nicht erhalten können und alle Nicht-0-Ints wahr sind.
quelle
C-Funktion, 102
Eine Regeländerung hat meine vorherige c-
scanf()
basierte Antwort nicht zugelassen . Hier ist eine weitere c-Antwort, mitisxdigit()
der ich antreten sollte :Probieren Sie es online aus.
-
an den entsprechenden Stellen nach Zeichen (ASCII 45). Wenn ja, ersetzen Sie diese durch0
s (ASCII 48 (= 45 + 3)).isxdigit()
quelle
Batch,
148139 + 2 =150141 Bytes2 Bytes hinzugefügt, da Sie den
/v
Schalter zu verwenden müssenCMD.EXE
.Beendet mit ERRORLEVEL 0 bei Erfolg, 1 bei Misserfolg.
Bearbeiten: Einige Bytes wurden gespeichert, hauptsächlich, weil
:=
die Groß- und Kleinschreibung nicht berücksichtigt wird, aber es gab auch andere Verbesserungen.quelle
Java, 345 Bytes
Die Eingabe ist das erste Befehlszeilenargument. Ausgabe ist Fehlercode (0 bedeutet gültige UUID, 1 bedeutet nicht gültig)
Ungolfed mit Kommentaren:
EDIT: Habe den STDOUT Teil nicht bemerkt. Ups, jetzt behoben.
quelle
if(b.length>36||b.length<36)
mit einfach ersetzenif(b.length!=36)
. Da Sie auch wahrheitsgemäße Werte drucken können , können Sie auch einfach0
anstelle von1<0
und1
anstelle von drucken1>0
.if(truthy_value){ doSomethingOnYes(); } else{ doSomethingOnFalse(); }
Also in Java ist ein Boolescher Wert ein Wahrheitswert, aber1
oder0
nicht. Nur wenn das OP einer Challenge so etwas wie sagt: " Ihre Ausgabe kann wahr / falsch, 0/1, leer / nicht leer sein; solange Sie angeben, was Sie verwenden. " Dann können Sie in der Tat0
und1
statttrue/false
als wahr verwenden / falsey value.if(b.length!=36)
.||
kann|
an mehreren Orten sein, sowie&&
zu&
;if(...!='-')
kann seinif(...!=45)
;int i=-1; ... while(++i<b.length){
kann ersetzt werden durchfor(int i=-1;++i<b.length;){
;'F'
kann sein70
('f'
könnte 102 sein, aber das spielt keine Rolle, da es die gleiche Byteanzahl ist). Ich mag, wie Siejava.io.PrintStream u=System.out;
übrigens verwendet haben, ich sollte mich daran erinnern! So danke.Schnelle 3, 50 Bytes
Geben Sie eine Zeichenfolge ein
s
quelle
PHP, 109 Bytes
Gibt 1 für wahr und 0 für falsch aus
$i>7&$i<24&!($i%5-3)
ist dann 5 Bytes kürzerin_array($i,[8,13,18,23])
112 Bytes
113 Bytes
quelle
Java,
172 Bytes168 Bytes (Danke Weizen Assistent)Irgendwie betrogen, seit ich java.util.UUID verwendet habe, aber hier ist:
Ungolfed-Version:
quelle
try
und entfernen{
.String[]
und zu entfernena
. Außerdem sollten Sie in der Lage sein , zu ersetzenprintln
mitprint
.java.util.UUID.fromString
anstelle des Imports verwenden.AWK, 98 Bytes
Teilen Sie einfach die Zeile bei jedem Zeichen auf und überprüfen Sie, ob jedes Zeichen eine hexadezimale Ziffer ist und ob an den entsprechenden Stellen Bindestriche vorhanden sind.
strtonum
konvertiert ungültige Zeichen nach0
. Der Vergleich zwischen0
undm
(und einem willkürlich gewählten ungültigen Zeichen) erfordert zusätzliche Schritte. Zum Glück01
ist eine gültige Hex-Zahl, aberm1
nicht.Anfangs habe ich zwei
for
Loops geschrieben, aber ich habe 1 Byte gespart, indem ich sie zusammengedrückt habe. :)HINWEIS:
GAWK
Kann Eingaben als Hex-Zahlen lesen, erfordert jedoch eine sehr lange Befehlszeilenoption.quelle