Überprüfen Sie, ob eine UUID gültig ist, ohne reguläre Ausdrücke zu verwenden

44

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).

Quelle

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 dies n) und stimmen Sie dann überein nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnnoder n[8]-n[4]-n[4]-n[4]-n[12]sind nicht zulässig
  • Die Eingabe kann entweder STDINeiner 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 STDOUToder gleichwertig gedruckt werden, wenn die Eingabe eine gültige UUID ist
  • Ein falsey-Wert muss auf STDOUToder gleich gedruckt werden, wenn die Eingabe keine gültige uuid ist
  • Bei Verwendung einer Funktion STDOUTkann 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 , 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

Jojodmo
quelle
32
Arme Netzhaut . D:
BrainSteel
Related
FryAmTheEggman
8
Nur als Referenz kann ich eine 28-Byte-Retina-Lösung entwickeln. (Also kein verrückter Vorteil gegenüber den Golfsprachen, obwohl es derzeit führend sein würde.)
Martin Ender
5
Sind Luas Muster erlaubt? Sie sind sicherlich keine regulären Ausdrücke.
Manatwork
1
@JacobKrall Ich bin mir ziemlich sicher, dass all deine Fragen "falsch" sind. Ich denke, die Herausforderung ist ziemlich klar, dass nur Zeichenfolgen der Form \h{8}-\h{4}-\h{4}-\h{4}-\h{12}(wobei \hes sich um eine hexadezimale Ziffer handelt) gültig sind.
Martin Ender

Antworten:

15

CJam, 31 30 29 Bytes

8 4__C]Nf*'-*qA,s'G,_el^+Ner=

Fü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.

8 4__C] e# Push the array of segment lengths, [8 4 4 4 12].
Nf*     e# Turn that into strings of linefeeds of the given length.
'-*     e# Join them by hyphens, giving "NNNNNNNN-NNNN-NNNN-NNNN-NNNNNNNNNNNN".
q       e# Read the input.
A,s     e# Push the string "0123456789".
'G,_el^ e# Push the string "ABCDEFabcdef".
+       e# Concatenate the two strings.
N       e# Push a linefeed.
er      e# Replace all hexadecimal digits with linefeeds.
=       e# Check for equality with the pattern string.
Martin Ender
quelle
23

JavaScript ES6, 73 55 56 Zeichen

s=>s.split`-`.map(x=>x.length+`0x${x}0`*0)=="8,4,4,4,12"

In der vorherigen Version mit 55 Zeichen ist ein Problem mit nachgestellten Leerzeichen in der Gruppe aufgetreten:

s=>s.split`-`.map(x=>x.length+("0x"+x)*0)=="8,4,4,4,12"
// "00000000-0000-0000-000 -000000000000" true

Prüfung:

f=s=>s.split`-`.map(x=>x.length+`0x${x}0`*0)=="8,4,4,4,12"
;`0FCE98AC-1326-4C79-8EBC-94908DA8B034
0fce98ac-1326-4c79-8ebc-94908da8b034
0FCE98ac-1326-4c79-8EBC-94908da8B034
0GCE98AC-1326-4C79-8EBC-94908DA8B034
0FCE98AC-13264C79-8EBC-94908DA8B034
0FCE98AC-13264-C79-8EBC-94908DA8B034
0FCE98ACD-1326-4C79-8EBC-94908DA8B034
0FCE98AC-1326-4C79-8EBC-94908DA8B034-123
00000000-0000-0000-0000-000000000000
D293DBB2-0801-4E60-9141-78EAB0E298FF
0FCE98AC-1326-4C79-8EBC-94908DA8B034-
00000000-0000-0000-000 -000000000000`.split(/\n/g).every(s=>f(s)==/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i.test(s))
Qwertiy
quelle
Super (und für mich
welk
@ edc65, was meinst du mit "welken"?
Qwertiy
Ehrfürchtiger Missbrauch des impliziten Castings +1
Downgoat
4
verächtlich, verächtlich, vernichtend, stechend, verheerend, demütigend, beschämend - (vergleiche deine Antwort mit meiner)
edc65
11

PowerShell, 29 21 84 49 37 Bytes

param($g)@{36=$g-as[guid]}[$g.length]

Vielen 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 $gund erstellt dann eine neue Hash-Tabelle @{}mit einem Element. Der Index 36wird gleich gesetzt $g-as[guid]. Dies verwendet den eingebauten -asOperator , 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 $nullwird 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 $gLänge nicht genau 36 Zeichen beträgt, wird die Hash-Tabelle zurückgegeben $null, die als Falsey-Wert ausgegeben wird. Bei einer $gLänge von 36 Zeichen wird das Ergebnis des .NET-Aufrufs ausgegeben. Wenn $ges sich nicht um eine gültige .NET-GUID (in irgendeiner Form) handelt, wird sie $nullals 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.

PS C:\Tools\Scripts\golfing> [bool](.\check-if-a-uuid-is-valid.ps1 '0FCE98AC-1326-4C79-8EBC-94908DA8B034')
True

PS C:\Tools\Scripts\golfing> [bool](.\check-if-a-uuid-is-valid.ps1 '0FCE98AC-1326-4C79-8EBC-94908DA8B034D')
False

PS C:\Tools\Scripts\golfing> [bool](.\check-if-a-uuid-is-valid.ps1 '0FCE98AC13264C798EBC94908DA8B034')
False
AdmBorkBork
quelle
4
Ich werde !!($args[0]-as[guid])bei 21 Bytes einwerfen .
TessellatingHeckler
2
Könnten Sie nicht einfach 4 Bytes sparen, indem Sie das weglassen !!()? Da die Werte $NULLund [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!
iFreilicht
@iFreilicht das ist ein Punkt; Betrachtet man den verlinkten Post "Truthy / Falsey Interpretation" - ich bin damit einverstanden, dass er gültig aussieht.
TessellatingHeckler
1
Diese Lösung kehrt fälschlicherweise Truefür 0FCE98AC13264C798EBC94908DA8B034, die keine Bindestriche hat
Jacob Krall
1
@TessellatingHeckler Nein, zu schön um wahr zu sein. Das Anhängen einer Ziffer, wie z. B. 0FCE98AC-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.
AdmBorkBork
9

Emacs Lisp, 236 Bytes

(lambda(s)(and(eq(string-bytes s)36)(let((l(string-to-list s))(i 0)(h '(8 13 18 23))(v t))(dolist(c l v)(set'v(and v(if(member i h)(and v(eq c 45))(or(and(> c 47)(< c 58))(and(> c 64)(< c 91))(and(> c 96)(< c 123))))))(set'i(+ i 1))))))

Ungolfed:

(lambda (s)
  (and (eq (string-bytes s) 36) ; check length
       (let ((l (string-to-list s))
             (i 0)
             ; location of hyphens
             (h '(8 13 18 23))
             (v t))
         (dolist (c l v)
           (set 'v (and v (if (member i h)      ; check if at hyphen position
                              (and v (eq c 45)) ; check if hyphen
                            (or (and (> c 47) (< c 58))      ; check if number
                                (and (> c 64) (< c 91))      ; check if upper case letter
                                (and (> c 96) (< c 123)))))) ; check if lower case letter
           (set 'i (+ i 1)))))) ; increment
Lord Yuuma
quelle
8

Aufgrund von Änderungen der Regeln ist diese Antwort nicht mehr wettbewerbsfähig :(

C 98

main(a,n){printf("%d",scanf("%8x-%4hx-%4hx-%4hx-%4hx%8x%n%c",&a,&a,&a,&a,&a,&a,&n,&a)==6&&n==36);}

Meist ziemlich selbsterklärend. Der %nFormatbezeichner 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 %csollte mit nichts übereinstimmen. Wenn dies der Fall ist, wird nachgestellter Text angezeigt und scanf()7 zurückgegeben.

Kompilieren Sie mit -w, um die nervigen Warnungen zu unterdrücken (es gibt mehrere).

Digitales Trauma
quelle
6

JavaScript ES6, 70 83

HINWEIS 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)

u=>u.split`-`.every((h,l,u)=>u[4]&&-`0x${h}1`&&h.length-'40008'[l]==4)

Erklärt

u=>u.split`-` // make an array splitting at '-'
.every( // for every element the following must be true
 (h,l,u)=> // h is the element, l is the index, u is the whole array
 u[4] // element 4 must be present (at least 5 element in array)
 && -`0x${h}1` // element must be a valid hex string with no extraneous blanks (else NaN that is falsy)
 // get requested length from index (8,4,4,4,12 sub 4 to put in 1 char)
 // a 6th elements will be rejected as undefined != 4
 && h.length-'40008'[l]==4// then check element length
)

Testschnipsel

f=u=>u.split`-`.every((h,l,u)=>u[4]&&-`0x${h}1`&&h.length-'40008'[l]==4)

console.log=x=>O.innerHTML+=x+'\n'

;[
  ['0FCE98AC-1326-4C79-8EBC-94908DA8B034',true],
  ['0fce98ac-1326-4c79-8ebc-94908da8b034',true],
  ['0FCE98ac-1326-4c79-8EBC-94908da8B034',true],
  ['00000000-0000-0000-0000-000000000000', true],
  ['ffffffff-ffff-ffff-ffff-ffffffffffff', true],
  ['0GCE98AC-1326-4C79-8EBC-94908DA8B034',false],
  ['0FCE98AC-13264C79-8EBC-94908DA8B034',false],
  ['0FCE98AC-13264-C79-8EBC-94908DA8B034',false],
  ['0FCE98ACD-1326-4C79-8EBC-94908DA8B034',false],
  ['0FCE98AC-1326-4C79-8EBC',false],
  ['0FCE98AC-1326-4C79-8EBC-94908DA8B034-',false],
  ['00000000-0000-0000-000 -000000000000', false],
  ['0FCE98AC-1326-4C79-8EBC-94908DA8B034-123',false],
].forEach(x=>{
  var t=x[0], r=f(t), k=x[1]
  console.log('Test '+t+' result '+r+(r==k?' ok':' fail'))
})
<pre id=O></pre>

edc65
quelle
-1-('0x'+h)=>1/('0x'+h)
Qwertiy
Dasselbe Problem wie in meiner vorherigen Version: wahr für00000000-0000-0000-000 -000000000000
Qwertiy
Nein, aber Sie haben einen falschen Test hinzugefügt. Führende Leerzeichen sind kein Problem, nachstehende jedoch, da bei der Konvertierung in Zahlen eine Zeichenfolge abgeschnitten wird. Siehe meinen Kommentar oben mit einem Test.
Qwertiy
'00000000-0000-0000-000 -000000000000' jetzt sehe ich es @Qwertiy Ich habe die 3 Nullen verpasst anstelle von 4
edc65
1
@Stefnotch Ich bin nicht einverstanden. Außerhalb des everyAufrufs ubefindet sich ein String, kein Array
edc65
5

Aufgrund von Änderungen der Regeln ist diese Antwort nicht mehr wettbewerbsfähig :(

Pure Bash (keine externen Dienstprogramme), 78

printf -vv %8s-%4s-%4s-%4s-%12s
p=${v// /[[:xdigit:]]}
[ "$1" -a ! "${1/$p}" ]

Übernimmt Eingaben von der Kommandozeile.

  • Das erstellt printfdie folgende Zeichenfolge - - - -.
  • Die 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).
  • Die letzte Zeile prüft, ob
    • Die Eingabe ist nicht leer
    • Wenn Sie das Muster aus der Eingabezeichenfolge ziehen, wird eine leere Zeichenfolge erstellt

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 .

Digitales Trauma
quelle
1
Der Shell-Pattern-Matching folgt möglicherweise nicht der Syntax von Regex, aber die Zeichenklasse verwendet definitiv die Definition und Syntax von POSIX-Regex. Wie auch immer, es liegt an OP, zu entscheiden, ob es akzeptabel ist.
n̴̖̋h̷͉̃a̷̭̿h̷̭̿d̷̰̀ĥ̷̳
1
@ n̴̖̋h̴̖̋ã̷͉h̷̭̿d̷̰̀ĥ̷̳ Reguläre Ausdrücke können Posix-Zeichenklassen enthalten, aber ich glaube nicht, dass alles, was eine Posix-Zeichenklasse verwendet, ein regulärer Ausdruck ist. Als weiteres Beispiel werden trauch Posix-Zeichenklassen verwendet, es handelt sich jedoch nicht um einen Regex-Parser.
Digitales Trauma
Sie können einige Zeichen abschneiden, indem Sie unnötige Anführungszeichen vermeiden, z. B. im printf-Format.
Jens
Ich habe die Aufforderung zur Klärung aktualisiert - der Grund, warum Regexes nicht zugelassen wurden, war, dass sie so erstellt wurden, dass Hex-Muster nicht für die Zuordnung von
UUIDs
4

Jolf, 32 Bytes

Probieren Sie es hier aus!

 eGi'-DN&bH*28=lH.[8,4,4,4,12]S}
 e                               Property "e"very of next object
  Gi'-                           Split i at hyphen
      DN                       } every comparison function
        &                        logical conjugation of next two arguments
         bH*28                   base 16 of H (first arg); is NaN (falsey) if invalid
              =                  equality of next two items
               lH                the length of H (first arg)
                 .            S  the Sth (index) member of the object inbetween
                  [8,4,4,4,12]   array of lengths

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: P

Conor O'Brien
quelle
2
So ist es länger als es sein muss, weil Sie mehrdeutige Befehle in der Sprache haben, die Sie erstellt haben? : P
Rɪᴋᴇʀ
@RikerW Kleiner semantischer Fehler. Es ist jetzt behoben.
Conor O'Brien
4

MATL , 55 Bytes

jttn36=?[9,5,5,5]XsXK)45=?36:Km~)4Y2'A':'F'hm?}F]]]N~1$

Ich habe auf die Verwendung von Ybfunction ( strsplit) verzichtet, da es etwas ähnlich ist wie function ( ) regexp(..., 'split'). Dies verwendet nur Indexierung und Zeichenvergleiche.

Beispiel

>> matl
 > jttn36=?[9,5,5,5]XsXK)45=?36:Km~)4Y2'A':'F'hm?}F]]]N~1$
 > 
> This is a test
0

>> matl
 > jttn36=?[9,5,5,5]XsXK)45=?36:Km~)4Y2'A':'F'hm?}F]]]N~1$
 > 
> D293DBB2-0801-4E60-9141-78EAB0E298FF
1

Erläuterung

jt                     % input string, duplicate
tn36=?                 % if length is 36
  [9,5,5,5]XsXK        % build and copy indices of required '-' positions
  )45=?                % if those entries are indeed '-'
    36:Km~)            % logical index of remaining positions
    4Y2'A':'F'h        % allowed chars in those positions
    m?                 % if all those entries are legal: do nothing
    }                  % else
      F                % false value
    ]                  % end
  ]                    % end
]                      % end
N~                     % true if stack is empty
1$                     % display last result only
Luis Mendo
quelle
3

CJam, 52 42 Bytes

qeu__{A7*)<},\'-/83 3b{)4*}%.{\,=}[1]5*=*=

Probieren 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:

qeu__                                      e# Take input, make 2 copies
     {A7*)<},\                             e# Remove invalid characters from first copy
              '-/                          e# Split top of stack on '-
                 83 3b{)4*}%               e# Array of group lengths: [8 4 4 4 12]
                            .{\,=}[1]5*=   e# Compare two arrays, return true if group lengths are correct
                                        *= e# Multiply this value by original string (0 = empty string, 1 = same string)
GamrCorps
quelle
A7*)<entfernt nicht viele ungültige Zeichen, wie Leerzeichen +, ?...
Martin Ender
@ MartinBüttner oh schieß ... das habe ich nicht gemerkt, ich werde es in ein paar Minuten beheben.
GamrCorps
3

Julia, 86 Bytes

s->(t=split(s,"-");map(length,t)==[8,4,4,4,12]&&all(i->!isnull(tryparse(Int,i,16)),t))

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:

function f(s::AbstractString)
    # Split the input into an array on dashes
    t = split(s, "-")

    # Ensure the lengths are appropriate
    ok1 = map(length, t) == [8, 4, 4, 4, 12]

    # Ensure each element is a valid hexadecimal number
    ok2 = all(i -> !isnull(tryparse(Int, i, 16)), t)

    return ok1 && ok2
end
Alex A.
quelle
3

C # 196 Bytes

using System.Linq;class P{bool T(string v){var r=v.Length==36;for(var i=0;i<v.Length;i++)r&=new[]{8,13,18,23}.Any(t=>t==i)?v[i]=='-':v[i]>47&&v[i]<58|v[i]>64&&v[i]<71|v[i]>96&&v[i]<103;return r;}}

Ungolfed:

using System.Linq;
class P
{
    public bool T(string v)
    {
        var r = v.Length == 36;
        for (var i = 0; i < v.Length; i++)
            r &= new[] { 8, 13, 18, 23 }.Any(t => t == i) 
                ? v[i] == '-' 
                : v[i] > 47 && v[i] < 58 | v[i] > 64 && v[i] < 71 | v[i] > 96 && v[i] < 103;
        return r;
    }
}

Die Methode Tkann mit einer beliebigen Nicht-Null-Zeichenfolge aufgerufen werden und wird andernfalls truefür gültige GUIDs zurückgegeben false. Dies ist eine zeitlich konstante Validierung. Auf Kosten von drei Zeichen können Sie die Methode vorzeitig beenden (wechseln i < v.Lengthzu i < v.Length && r).

Ich werde später versuchen, den Bytecount weiter zu reduzieren.

Ich habe offensichtlich den Guid.ParseExactWeg ausgelassen , denn wo ist der Spaß dabei? Hier ist es, ohne viel zu versuchen, es in 86 Bytes weiter herunterzuspielen :

using System;class P{bool T(string v){Guid x;return Guid.TryParseExact(v,"D",out x);}}

Ungolfed:

using System;
class P
{
    bool T(string v)
    {
        Guid x;
        return Guid.TryParseExact(v, "D", out x);
    }
}
RobIII
quelle
2

Python 2, 99 112 Bytes

def f(u):
 try:u=u.split()[0];int(u.replace('-',''),16);print[8,4,4,4,12]==map(len,u.split('-'))
 except:print 0

Bei einer gültigen Eingabe wird gedruckt True. Bei einer ungültigen Eingabe wird gedruckt Falseoder 0, je nachdem, warum die Eingabe ungültig war. Falseund 0sind beide in Python falsch.

Die Funktion muss 3 Dinge überprüfen:

  • Jedes Zeichen, das kein Bindestrich ist, ist eine Ziffer oder steht in ABCDEF
  • Es gibt genau 4 Bindestriche
  • Es gibt 8 Zeichen vor dem ersten Bindestrich, 12 nach dem letzten und 4 zwischen den anderen beiden

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.

def f(u):
    try:
        int(u.replace('-',''),16) # Remove all hyphens from the string and parse what's
                                  # left as a base 16 number. Don't do anything with this
                                  # number, but throw an exception if it can't be done.

        return[8,4,4,4,12]==map(len,u.split('-')) # Split the string at each hyphen and
                                                  # get the length of each resulting
                                                  # string. If the lengths == [8,4,4,4,12],
                                                  # there are the right number of groups
                                                  # with the right lengths, so the string
                                                  # is valid.
    except:
        return 0 # The only way to get here is if the string (minus hyphens) couldn't be
                 # parsed as a base 16 int, so there are non-digit, non-ABCDEF characters
                 # and the string is invalid.
untergrundbahn
quelle
Ich denke, Sie können 2 Bytes sparen, wenn Sie beide Instanzen von returndurch ersetzen print. (In diesem Fall möchten Sie auf jeden Fall in Python 2 sein, da printdies in Python 3 anders funktioniert.)
mathmandan
1
Dies funktioniert in Python 3 nicht, da mapjetzt ein "Kartenobjekt" zurückgegeben wird, keine Liste.
Tim Pederick
Dies funktioniert in Python 2 (wahrscheinlich auch in 3) nicht, da die intFunktion Leerzeichen zulässt - 0FCE98ac-1326-4c79-8EBC-94908da8B03mit einem nachgestellten Leerzeichen. Siehe Kommentar in gelöschter Pyth-Antwort hier, falls möglich.
Blue
2

Python 2, 57 Bytes

Gott sei Dank für eingebaut! - Stellen Sie sicher, dass Sie die Zeichenfolgen in Anführungszeichen setzen.

import uuid
try:uuid.UUID(input());print 1
except:print 0
nimi
quelle
5
Entsprechend den Dokumenten, mit denen Sie verknüpft sind, wird dies 1zur Eingabe gedruckt 12345678123456781234567812345678.
Dennis
Wenn dies funktionieren würde, könnten Sie Bytes sparen, try:print uuid.UUID(input())da Sie lediglich einen wahrheitsgemäßen Wert ausgeben müssen
undergroundmonorail
2
Dieses Programm akzeptiert viele UUID-Formate, aber die Frage möchte nur das 36-stellige UUID-Format mit Bindestrichen.
Jacob Krall
2
Sie können dies unter Berücksichtigung der aktualisierten Regeln retten, indem Sie prüfen, ob die Eingabezeichenfolge der zurück in Zeichenfolge konvertierten UUID entspricht. Gibt Ihnen sofort einen wahrheitsgemäßen Wert.
16.
2

Pyth, 39 Bytes

&&!+1xzd.xi:zK\-k16ZqxKc+zK1mid36"8dinz

Probieren Sie es hier aus .

Blau
quelle
In Ihrem Link "Hier ausprobieren" fehlt das \Zeichen K\-k, sodass es nicht wie es ist ausgeführt werden kann.
Alex
Das wurde jetzt behoben
Blue
2

Perl 6 ,  83   67 Bytes

# 83 bytes
{
  (
    my@a=.uc.split('-')
  ).map(*.comb)⊆('0'..'9','A'..'F')
&&
  @a».chars~~(8,4,4,4,12)
}

# 67 bytes
{
  (
    $/=.split('-')
  ).map({:16($_)//|()})==5
&&
  $/».chars~~(8,4,4,4,12)
}

(Zeilenumbrüche oder Einrückungen sind nicht enthalten, da sie nicht benötigt werden.)

Verwendungszweck:

# give it a name
my &code = {...}

say map &code, «
  D293DBB2-0801-4E60-9141-78EAB0E298FF
  0FCE98AC-1326-4C79-8EBC-94908DA8B034
  0fce98ac-1326-4c79-8ebc-94908da8b034
  0FCE98ac-1326-4c79-8EBC-94908da8B034
  00000000-1326-4c79-8EBC-94908da8B034
»;
# (True True True True True)

say map &code, «
  0GCE98AC-1326-4C79-8EBC-94908DA8B034
 '0FCE98AC 1326-4C79-8EBC-94908DA8B034'
  0FCE98AC-13264C79-8EBC-94908DA8B034
  0FCE98AC-13264-C79-8EBC-94908DA8B034
  0FCE98ACD-1326-4C79-8EBC-94908DA8B034
  0FCE98AC-1326-4C79-8EBC-94908DA8B034-
  0FCE98AC-1326-4C79-8EBC-94908DA8B034-123
»;
# (False False False False False False False)
Brad Gilbert b2gills
quelle
2

Common Lisp - 161

(lambda(s &aux(u(remove #\- s)))(and(=(length s)36)(=(length u)32)(every(lambda(p)(char=(char s p)#\-))'(8 13 18 23))(ignore-errors(parse-integer u :radix 16))))

Der zurückgegebene Wert, wenn true, ist der Hash als Zahl, was ein nützliches Ergebnis ist.

Ungolfed

(defun uuid-p (string &aux (undashed (remove #\- string)))
  (and
   ;; length of input string must be 36
   (= (length string) 36)

   ;; there are exactly 4 dashes
   (= (length undashed) 32)

   ;; We check that we find dashes where expected
   (every (lambda (position)
            (char= (char string position) #\-))
          '(8 13 18 23))

   ;; Finally, we decode the undashed string as a number in base 16,
   ;; but do not throw an exception if this is not possible.
   (ignore-errors
    (parse-integer undashed :radix 16))))
Core-Dump
quelle
@Jojodmo Ja, auf jeden Fall! Vielen Dank
coredump
2

F # 44 Zeichen

fun s->System.Guid.TryParseExact(s,"D")|>fst

In F # können Funktionen mit outParametern 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 fstFunktion 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 truenur 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:

fun s->System.Guid.TryParse s|>fst&&s.Length=36

TryParse(string, Guid) akzeptiert Eingaben in folgenden Formaten:

00000000000000000000000000000000 
00000000-0000-0000-0000-000000000000 
{00000000-0000-0000-0000-000000000000} 
(00000000-0000-0000-0000-000000000000)
{0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}

Davon ist nur die zweite 36 Zeichen lang.

phoog
quelle
2

Python 2, 93 89 85 Bytes

lambda u:(set(u)<=set("-0123456789abcdefABCDEF"))*map(len,u.split("-"))==[8,4,4,4,12]

Der map()Aufruf garantiert, dass die Abschnitte die richtige Länge haben, und all()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:

>>> f=lambda u:(set(u)<=set("-0123456789abcdefABCDEF"))*map(len,u.split("-"))==[8,4,4,4,12]
>>> testcases = """\
... D293DBB2-0801-4E60-9141-78EAB0E298FF
... 0FCE98AC-1326-4C79-8EBC-94908DA8B034
... 0fce98ac-1326-4c79-8ebc-94908da8b034
... 0FCE98ac-1326-4c79-8EBC-94908da8B034
... 00000000-0000-0000-0000-000000000000""".splitlines()
>>> failcases = """\
... 0GCE98AC-1326-4C79-8EBC-94908DA8B034
... 0FCE98AC 1326-4C79-8EBC-94908DA8B034
... 0FCE98AC-13264C79-8EBC-94908DA8B034
... 0FCE98AC-13264-C79-8EBC-94908DA8B034
... 0FCE98ACD-1326-4C79-8EBC-94908DA8B034
... 0FCE98AC-1326-4C79-8EBC-94908DA8B034-
... 0FCE98AC-1326-4C79-8EBC-94908DA8B034-123
... 00000000-0000-0000-000 -000000000000
... 00000000-0000-0000- 000-000000000000""".splitlines()
>>> all(f(u) for u in testcases)
True
>>> any(f(u) for u in failcases)
False
>>> 
rsandwick3
quelle
Hat jemand eine Idee, warum die kürzeste richtige Python-Antwort abgelehnt wurde? Nicht genug Erklärung?
rsandwick3
Jojodmo - im Falle von Unklarheiten lehnte ich Ihre vorgeschlagene Änderung nicht ab - Ich hatte bereits eine Bearbeitung vorgenommen, weil ich die AF-Zeichen (die ich aus einem Fenster kopiert hatte, in dem ich negative Fälle testete) und Community Auto verpasst hatte -Ihr Vorschlag wurde abgelehnt, ohne dass ich wüsste, dass er überhaupt vorgebracht wurde. Als ich wusste, dass Sie es vorgeschlagen hatten, hatte @nimi die Korrektur der Überschrift bereits vorgenommen. Ich hoffe sehr, dass das nichts mit der Ablehnung zu tun hat, da sich das sehr schlecht auf diese Community auswirken würde. Wie auch immer, ich gehe davon aus, dass es das andere ist, und füge ein bisschen mehr Erklärung hinzu.
rsandwick3
2
Sie können die f=und die Leerzeichen um die Zeichenfolge im allBlock entfernen .
FryAmTheEggman
oh super, schöner Fang - bearbeitet
rsandwick3
1
Sie können sparen 8 (oder 6, Sie könnten Klammer hinzufügen müssen) Bytes durch die Umwandlung Ihrer all(..)Aufnahme - Tests einzustellen: set(u)<=set("-0123456789abcdefABCDEF").
409_Conflict
1

SAS, 171 144 141

data;infile stdin;file stdout;input a$9b$14c$19d$24;e=(a!!b!!c!!d='----')*length(_infile_)=36*(1-missing(put(input(compress(_infile_,,'adk'),$hex32.),$hex32.)));put e;run;

Verwendet 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:

data;infile stdin;file stdout;do i=1 to 37;input@i c$1.@;a+ifn(i in(9,14,19,24),c='-',n(input(c,hex.))-36*(i>36&c^=''));end;b=a=36;put b;run;

Golf weitere 6 Zeichen aus dem zentralen Ausdruck!

Ungolfed:

data;
infile stdin;
file stdout;
do i=1 to 37;
input@i c$1.@;
a+ifn(i in(9,14,19,24),c='-',n(input(c,hex.))-36*(i>36&c^=''));
end;
b=a=36;
put b;
run;

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.

user3490
quelle
1

C 391 Bytes

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define F printf("0")
#define T printf("1")
#define E return 0
main(){char s[99],*t;int k=1,l,i;scanf("%99[^\n]",s);if(s[strlen(s)-1]=='-'){F;E;}t=strtok(s,"-");while(t!=NULL){for(i=0,l=0;t[i]!=0;i++,l++){if(!isxdigit(t[i])){F;E;}}if((k==1&&l!=8)||((k>1&&k<5)&&l!=4)||(k==5&&l!=12)){F;E;}k++;t=strtok(NULL,"-");}if(k==6){T;E;};F;}
user2064000
quelle
1

MATLAB, 126 Bytes

function f(a)
b='-';if length(a)==36&&a(9)==b&&a(13)==b&&a(17)==b&&a(21)==b;a(a==b)=[];if any(isnan(hex2dec(a)));0;end;1;end;0
costrom
quelle
1

Python 3, 134 Bytes

def a(i):
 try:l=[1+int(k,16)and(len(k)==c)for k,c in zip(i.split("-"),[8,4,4,4,12])];return(len(l)==5)&(0 not in l)
 except:return 0

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.

Pjoelj
quelle
1

C-Funktion, 102

Eine Regeländerung hat meine vorherige c- scanf()basierte Antwort nicht zugelassen . Hier ist eine weitere c-Antwort, mit isxdigit()der ich antreten sollte :

i;f(char *s){for(i=8;i<24;i+=5)s[i]=s[i]-45?1:s[i]+3;for(i=0;isxdigit(s[i]);i++);return i==36&&!s[i];}

Probieren Sie es online aus.

  • Suchen Sie -an den entsprechenden Stellen nach Zeichen (ASCII 45). Wenn ja, ersetzen Sie diese durch 0s (ASCII 48 (= 45 + 3)).
  • Gehen Sie die Zeichenkette durch und überprüfen Sie jedes Zeichen mit isxdigit()
  • Gibt TRUE zurück, wenn die Zeichenfolge 36 ist und das letzte Zeichen NUL ist.
Digitales Trauma
quelle
1

Batch, 148 139 + 2 = 150 141 Bytes

@set/pu=
@for %%d in (1 2 3 4 5 6 7 8 9 A B C D E F)do @set u=!u:%%d=0!
@if -!u!==-00000000-0000-0000-0000-000000000000 exit/b0
@exit/b1

2 Bytes hinzugefügt, da Sie den /vSchalter zu verwenden müssen CMD.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.

Neil
quelle
1

Java, 345 Bytes

interface q{static void main(String[]a){int i=-1;char[]b=a[0].toCharArray();java.io.PrintStream u=System.out;if(b.length>36||b.length<36)u.print(1<0);if(b[8]!='-'||b[13]!='-'||b[18]!='-'||b[23]!='-')u.print(1<0);while(++i<b.length){if(i!=8&&i!=13&&i!=18&&i!=23){if(!((b[i]>='0'&&b[i]<='F')||(b[i]>='a'&&b[i]<='f')))u.print(1<0);}}u.print(1>0);}}

Die Eingabe ist das erste Befehlszeilenargument. Ausgabe ist Fehlercode (0 bedeutet gültige UUID, 1 bedeutet nicht gültig)

Ungolfed mit Kommentaren:

interface q {
    static void main(String[] a) {
        int i = -1;                                                             // Index
        char[] b = a[0].toCharArray();                                          // Characters from input
        java.io.PrintStream u = System.out;                                     // STDOUT
        if (b.length > 36||b.length < 36)                                       // If input length is not 36
            u.print(1<0);                                                       // Invalid
        if (b[8]!='-'||b[13]!='-'||b[18]!='-'||b[23]!='-')                      // If hasn't got separators at correct positions
            u.print(1<0);                                                       // Invalid
        while (++i<b.length) {                                                  // Iterate over all characters
            if (i!=8 && i!=13 & i!=18 && i!=23) {                               // If not at separator indexes
                if ( !( (b[i]>='0'&&b[i]<='F') || (b[i]>='a'&&b[i]<='f') ))     // If incorrect hexadecimal number
                    u.print(1<0);                                               // Invalid
            }
        }
        u.print(1>0);                                                           // Valid
    }
}

EDIT: Habe den STDOUT Teil nicht bemerkt. Ups, jetzt behoben.

Plätzchen
quelle
Nett! Sie können if(b.length>36||b.length<36)mit einfach ersetzen if(b.length!=36). Da Sie auch wahrheitsgemäße Werte drucken können , können Sie auch einfach 0anstelle von 1<0und 1anstelle von drucken 1>0.
Jojodmo
@Jojodmo Basierend auf den Stimmen ist ein Wahrheitswert in der Form von if(truthy_value){ doSomethingOnYes(); } else{ doSomethingOnFalse(); }Also in Java ist ein Boolescher Wert ein Wahrheitswert, aber 1oder 0nicht. 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 Tat 0und 1statt true/falseals wahr verwenden / falsey value.
Kevin Cruijssen
1
Golftipps für Kekse: @Jojodmo ist in der Tat richtig, wenn Sie es durch ein anderes ersetzen if(b.length!=36). ||kann |an mehreren Orten sein, sowie &&zu &; if(...!='-')kann sein if(...!=45); int i=-1; ... while(++i<b.length){kann ersetzt werden durch for(int i=-1;++i<b.length;){; 'F'kann sein 70( 'f'könnte 102 sein, aber das spielt keine Rolle, da es die gleiche Byteanzahl ist). Ich mag, wie Sie java.io.PrintStream u=System.out;übrigens verwendet haben, ich sollte mich daran erinnern! So danke.
Kevin Cruijssen
1

Schnelle 3, 50 Bytes

Geben Sie eine Zeichenfolge ein s

import Foundation
print(UUID(uuidString:s) != nil)
Matt
quelle
1

PHP, 109 Bytes

Gibt 1 für wahr und 0 für falsch aus

for($t=($l=strlen($a=$argn))==36;$i<$l;$i++)$t*=$i>7&$i<24&!($i%5-3)?$a[$i]=="-":ctype_xdigit($a[$i]);echo$t;

$i>7&$i<24&!($i%5-3) ist dann 5 Bytes kürzer in_array($i,[8,13,18,23])

112 Bytes

echo array_filter(str_split($argn),function($i){return!ctype_xdigit($i);})==[8=>"-",13=>"-",18=>"-",23=>"-"]?:0;

113 Bytes

echo array_diff(str_split(strtolower($argn)),array_map(dechex,range(0,15)))==[8=>"-",13=>"-",18=>"-",23=>"-"]?:0;
Jörg Hülsermann
quelle
0

Java, 172 Bytes 168 Bytes (Danke Weizen Assistent)

Irgendwie betrogen, seit ich java.util.UUID verwendet habe, aber hier ist:

import java.util.UUID;class ValidUUID{public static void main(String[] a){try{UUID.fromString(a[0]);System.out.println(1);}catch(Exception e){System.out.println(0);}}}

Ungolfed-Version:

import java.util.UUID;

class ValidUUID {

    public static void main(String[] a) {
        try {
            UUID.fromString(a[0]);
            System.out.println(1);
        } catch(Exception e) {System.out.println(0);}
    }
}
Ryxn
quelle
Willkommen auf der Seite! Ich denke, Sie können den Abstand zwischen tryund entfernen {.
Wheat Wizard
@ WheatWizard danke: D auch bemerkt, ich kann die "um 0 und 1
Ryxn
2
Sie sollten in der Lage sein, das Leerzeichen zwischen String[]und zu entfernen a. Außerdem sollten Sie in der Lage sein , zu ersetzen printlnmit print.
Clismique
1
Der Klassenname kann aus 1 Zeichen bestehen. Sie können java.util.UUID.fromStringanstelle des Imports verwenden.
Poke
0

AWK, 98 Bytes

BEGIN{FS=""}{for(j=4;k<NF;){h+=(j+=5)<25?$j=="-":0
s+=strtonum("0x"$++k 1)>0}$0=h+s==36&&NF==36}1

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. strtonumkonvertiert ungültige Zeichen nach 0. Der Vergleich zwischen 0und m(und einem willkürlich gewählten ungültigen Zeichen) erfordert zusätzliche Schritte. Zum Glück 01ist eine gültige Hex-Zahl, aber m1nicht.

Anfangs habe ich zwei forLoops geschrieben, aber ich habe 1 Byte gespart, indem ich sie zusammengedrückt habe. :)

HINWEIS: GAWKKann Eingaben als Hex-Zahlen lesen, erfordert jedoch eine sehr lange Befehlszeilenoption.

Robert Benson
quelle