Biorąc pod uwagę ciąg wejściowy, napisz program, który wypisuje prawdziwą wartość do STDOUT lub równoważnego, jeśli dane wejściowe są poprawnym UUID, bez użycia wyrażeń regularnych .
Prawidłowy identyfikator UUID to
32 cyfry szesnastkowe, wyświetlane w pięciu grupach oddzielonych łącznikami, w postaci 8-4-4-4-12 dla łącznie 36 znaków (32 znaki alfanumeryczne i cztery łączniki).
Przypadki testowe
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)
Zasady
- Wyrażenia regularne są niedozwolone
- Dosłowne dopasowanie wzorca, które jest jak wyrażenie regularne, jest niedozwolone. Na przykład używanie
[0-9a-fA-F]
lub inne identyfikatory szesnastkowe (nazywamy ton
), a następnie dopasowaniennnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn
lubn[8]-n[4]-n[4]-n[4]-n[12]
niedozwolone - Dane wejściowe mogą być pobierane z funkcji
STDIN
lub jako argument funkcji - Dane wejściowe nie uwzględniają wielkości liter
- Można bezpiecznie założyć, że dane wejściowe nie będą zawierały linii ani nowych linii.
- Dane wejściowe mogą zawierać dowolne znaki ASCII do wydruku (ze spacjami)
- Wartość truthy muszą być wydrukowane na
STDOUT
lub równoważne, jeśli wejście jest prawidłowy UUID - Wartość falsey muszą być wydrukowane na
STDOUT
lub równoważne, jeśli wejście jest nie poprawny UUID - Jeśli używasz funkcji, zamiast używać
STDOUT
, wyjściem może być zwracana wartość funkcji - Nie można wydrukować wartości true / falsey
STDERR
. - Standardowe luki zastosowanie
- To jest golf golfowy , więc wygrywa najkrótszy program w bajtach. Powodzenia!
Tabela liderów
To jest fragment kodu, który generuje zarówno tabelę wyników, jak i przegląd zwycięzców według języka.
Aby mieć pewność, że Twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown
## Language Name, N bytes
Gdzie N jest rozmiarem twojego przesłania w bajtach
Jeśli chcesz dołączyć wiele liczb do nagłówka (na przykład przekreślając stare wyniki lub włączając flagi w liczbie bajtów), po prostu upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku
## Language Name, <s>K</s> X + 2 = N bytes
źródło
\h{8}-\h{4}-\h{4}-\h{4}-\h{12}
(gdzie\h
jest cyfrą szesnastkową).Odpowiedzi:
CJam,
313029 bajtówTutaj uruchom wszystkie przypadki testowe.
Wyjaśnienie
Zamiast wzorca dopasowującego bezpośrednio dane wejściowe, najpierw przekształcamy go w prostszą formę, którą można łatwo porównać z pojedynczym ciągiem wzorca.
źródło
JavaScript ES6,
735556 znakówPoprzednia wersja 55 znaków miała problem z końcowymi spacjami w grupie:
Test:
źródło
PowerShell,
2921844937 bajtówOgromne podziękowania dla ludzi w komentarzach pomagających w grze w golfa, aby nadążyć za zmieniającymi się zasadami - TessellatingHeckler , iFreilicht , Jacob Krall i Joey . Zobacz historię edycji poprawek i starszych wersji.
Ta wersja pobiera dane wejściowe jako
$g
, a następnie tworzy nową tabelę skrótów@{}
z jednym elementem, indeks36
jest ustawiony na wartość równą$g-as[guid]
. To używa wbudowanego-as
operatora do próby konwersji między dwoma typami danych .NET - od[string]
do[guid]
. Jeśli konwersja zakończy się powodzeniem,[guid]
obiekt jest zwracany, w przeciwnym razie$null
zwracany. Ta część zapewnia, że ciąg wejściowy jest prawidłowym identyfikatorem GUID .NET.Następnym krokiem jest zindeksowanie do tabeli skrótów za pomocą
[$g.length]
. Jeśli$g
długość nie jest dokładnie 36 znaków, zostanie zwrócona tabela skrótów$null
, która zostanie wyprowadzona jako wartość falsey. Jeśli$g
ma 36 znaków, wynik połączenia .NET zostanie wyprowadzony. Jeśli$g
nie jest prawidłowym identyfikatorem GUID .NET (w dowolnej formie), zostanie$null
wygenerowany jako wartość falsey. W przeciwnym razie wygeneruje obiekt .NET GUID jako prawdziwą wartość - jedynym sposobem, który można wygenerować, jest dopasowanie go do żądanego formatu wyzwania.Przykłady
Tutaj podsumowuję wywołanie skryptu w parens i jawnie rzucam jako logiczny dla jasności.
źródło
!!($args[0]-as[guid])
przy 21 bajtach.!!()
? Ponieważ wartości$NULL
i[guid]
wzajemnie się wykluczają, kwalifikują się do reprezentowania wartości prawdy i falseya, prawda? W każdym razie świetny sposób na konwersję na wartość logiczną, pokochaj to rozwiązanie!True
dla0FCE98AC13264C798EBC94908DA8B034
której nie ma łączników0FCE98AC-1326-4C79-8EBC-94908DA8B034D
(dodatkowe D na końcu), zwraca falsey$TRUE
, ponieważ po prostu usuwa obcą cyfrę, a pierwsze 36 znaków jest poprawnych.Emacs Lisp, 236 bajtów
Nie golfowany:
źródło
Ze względu na zmiany zasad ta odpowiedź nie jest już konkurencyjna :(
C, 98
W większości dość oczywiste. Specyfikator
%n
formatu podaje do tej pory liczbę odczytanych bajtów, która powinna wynosić 36.scanf()
zwraca liczbę dopasowanych elementów, która powinna wynosić 6. Ostateczna wartość%c
nie powinna być zgodna. Jeśli tak, to pojawia się tekst końcowy iscanf()
zwraca 7.Skompiluj z,
-w
aby ukryć nieznośne ostrzeżenia (jest ich kilka).źródło
JavaScript ES6, 70
83UWAGA, dziękuję @Qwertiy za znalezienie błędu (i sugerowanie ulepszeń i poprawek)
Thx @ CᴏɴᴏʀO'Bʀɪᴇɴ Zapisano 2 bajty
Pozostałe 9 bajtów zaoszczędzonych upraszczając kontrolę długości (skomplikowany sposób był krótszy w pierwszym szkicu, ale nie teraz)
Wyjaśniono
Testowy fragment kodu
źródło
-1-('0x'+h)
=>1/('0x'+h)
00000000-0000-0000-000 -000000000000
every
wywołaniemu
jest ciąg znaków, a nie tablicaZe względu na zmiany zasad ta odpowiedź nie jest już konkurencyjna :(
Pure Bash (bez narzędzi zewnętrznych), 78
Pobiera dane z wiersza poleceń.
printf
Buduje następujący ciąg- - - -
.p=
Linia przemienia ten z następującym wzorem:[[: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:]]
. Zauważ, że to wygląda okropnie podobnie jak wyrażenie regularne. Nie ma to jednak miejsca w tym kontekście. Jest to wzorzec do dopasowywania wzorca powłoki . Jest to podobne pojęcie do wyrażenia regularnego, ale jest inną konstrukcją (i składnią).Idiomatyczny dla powłoki, kod powrotu 0 oznacza sukces / PRAWDA, a 1 oznacza błąd / FAŁSZ. Kod powrotu można sprawdzić
echo $?
po uruchomieniu skryptu.źródło
tr
wykorzystuje także klasy znaków Posix, ale nie jest parserem wyrażeń regularnych.Jolf, 32 bajty
Wypróbuj tutaj!
Z powodu błędu w moim kodzie jest on dłuższy niż powinien. :(
[8,4,4,4,12]
powinno być takie samo jak{8444*26}
, ale}
jest także zamknięciem funkcji: Pźródło
MATL , 55 bajtów
Powstrzymałem się od używania
Yb
funkcji (strsplit
), ponieważ jest ona nieco podobna doregexp(..., 'split')
. Używa tylko indeksowania i porównań znaków.Przykład
Wyjaśnienie
źródło
CJam,
5242 bajtyWypróbuj online . Wysyła oryginalny ciąg, jeśli ma wartość true, zwraca pusty ciąg, jeśli ma wartość false ( jest to dozwolone ).
Wyjaśnienie:
źródło
A7*)<
nie usunie wielu nieprawidłowych znaków, takich jak spacje+
,?
...Julia, 86 bajtów
Jest to anonimowa funkcja, która przyjmuje ciąg znaków i zwraca wartość logiczną. Aby to nazwać, nadaj mu nazwę, np
f=s->...
.Nie golfowany:
źródło
C # 196 bajtów
Nie golfowany:
Metodę
T
można wywołać za pomocą dowolnego niepustego łańcucha itrue
wfalse
przeciwnym razie zwróci prawidłowe identyfikatory GUID . Jest to walidacja w czasie stałym; kosztem trzech znaków możesz wcześniej wyjść z metody (zmienići < v.Length
nai < v.Length && r
).Spróbuję później obniżyć liczbę bajtów.
Oczywiście pominąłem
Guid.ParseExact
drogę, bo gdzie jest w tym zabawa? Oto, bez większych prób gry w golfa dalej w 86 bajtów :Nie golfowany:
źródło
Python 2,
99112 bajtówPo prawidłowym wejściu zostanie wydrukowane
True
. W przypadku nieprawidłowego wejścia drukowane jestFalse
lub0
, w zależności od tego, dlaczego było nieprawidłowe.False
i0
oba są falsey w Pythonie.Funkcja musi sprawdzić 3 rzeczy:
ABCDEF
Oto podział pokazujący, jak je sprawdza. Jest trochę nieaktualny, ale jestem głodny, więc zaktualizuję go później.
źródło
return
zprint
. (W takim przypadku na pewno będziesz chciał być w Pythonie 2, ponieważprint
działa inaczej w Pythonie 3)map
teraz zwraca „obiekt mapy”, a nie listę.int
funkcja dopuszcza spacje -0FCE98ac-1326-4c79-8EBC-94908da8B03
z końcową spacją. Zobacz komentarz w usuniętej odpowiedzi Pyth tutaj, jeśli to możliwe.Python 2, 57 bajtów
Dzięki Bogu za wbudowane! - pamiętaj, aby zawrzeć ciągi w cudzysłowie.
źródło
1
celu wprowadzenia12345678123456781234567812345678
.try:print uuid.UUID(input())
ponieważ wystarczy, że wydrukujesz prawdziwą wartośćPyth, 39 bajtów
Wypróbuj tutaj .
źródło
\
znakuK\-k
, więc nie działa tak, jak jest.Perl 6 ,
8367 bajtów(liczby nie uwzględniają nowego wiersza ani wcięcia, ponieważ nie są potrzebne)
stosowanie:
źródło
Common Lisp - 161
Zwrócona wartość, jeśli true, to liczba mieszająca, która jest przydatnym wynikiem.
Nie golfił
źródło
F # 44 znaków
W języku F # funkcje z
out
parametrami można wywoływać, pomijając parametr out; jego wartość po powrocie zostanie połączona z rzeczywistą wartością zwracaną przez funkcję w krotkę.W tym przypadku krotka jest przekazywana do
fst
funkcji, która zwraca swój pierwszy element członkowski, który w tym przypadku jest logiczną wartością zwracaną TryParseExact, wskazującą powodzenie lub niepowodzenie wywołania.W celu sprawdzenia poprawności formatu zwracamy
true
tylko wtedy, gdy łańcuch ma 36 znaków.Zanim zobaczyłem odpowiedź C # RobIII, nie myślałem o użyciu TryParseExact, więc moja odpowiedź miała być o trzy znaki dłuższa:
TryParse(string, Guid)
akceptuje dane wejściowe w następujących formatach:Spośród nich tylko drugi ma 36 znaków.
źródło
Python 2,
938985 bajtówTe
map()
gwarancje połączeń, które odcinki są z odpowiednich długościach, aall()
testy na każdy znak jest albo myślnik lub cyfra hex arbitralne-case. Wyrażenie generatora testuje każdy znak przez iterację całego łańcucha, więc obawiam się, że nie jest to najbardziej wydajna metoda, ale powinna spełniać przypadki testowe:źródło
f=
i spacje wokół ciągu wall
bloku.all(..)
ustawić testowanie integracji:set(u)<=set("-0123456789abcdefABCDEF")
.SAS,
171144141Właściwie używa stdin i stdout - jednej z mniej znanych cech tego konkretnego języka. Działa z podanymi przykładami, ale prawdopodobnie nie we wszystkich przypadkach. Prawdopodobnie można to poprawić.
Lepsze podejście - jedna postać na raz:
Grał w golfa o kolejne 6 znaków poza głównym wyrażeniem!
Nie golfowany:
Generuje to całkiem sporo ostrzeżeń i notatek w dzienniku, ale nie drukuje ich na standardowe lub standardowe, więc myślę, że to uczciwa gra.
źródło
C, 391 bajtów
źródło
MATLAB, 126 bajtów
źródło
Python 3, 134 bajty
int (k, 16) próbuje rzutować k na int-16 base. W przypadku znaku innego niż 0-9a-fA-F- kończy się niepowodzeniem, w którym to przypadku zwracamy 0, co jest fałszem. Dodaj 1 do tej wartości int, a otrzymamy gwarantowaną prawdziwą wartość - usunęliśmy wszystkie łączniki za pomocą str.split (), więc nie możemy uzyskać wartości -1, a wszystkie wartości nie będące 0 są prawdziwe.
źródło
Funkcja C, 102
Zmiana reguły uniemożliwiła moją poprzednią
scanf()
odpowiedź opartą na c , więc oto kolejna odpowiedź c, za pomocąisxdigit()
której moim zdaniem powinno się konkurować :Wypróbuj online.
-
znaki (ASCII 45) w odpowiednich pozycjach - jeśli tak, zamień je na0
s (ASCII 48 (= 45 + 3))isxdigit()
źródło
Partia,
148139 + 2 =150141 bajtówDodano 2 bajty, ponieważ musisz użyć
/v
przełącznika doCMD.EXE
.Wyjście z ERRORLEVEL 0 w przypadku powodzenia, 1 w przypadku niepowodzenia.
Edycja: Zapisano niektóre bajty głównie dlatego, że
:=
nie uwzględnia wielkości liter, ale były też inne poprawki.źródło
Java, 345 bajtów
Dane wejściowe to argument pierwszego wiersza poleceń. Dane wyjściowe to kod błędu (0 oznacza prawidłowy UUID, 1 oznacza nieprawidłowy)
Niegolfowany z komentarzami:
EDYCJA: Nie zauważyłem części STDOUT. Ups, naprawione teraz.
źródło
if(b.length>36||b.length<36)
po prostu zastąpićif(b.length!=36)
. Ponadto, ponieważ możesz drukować prawdziwe wartości , możesz po prostu drukować0
zamiast1<0
, a1
zamiast1>0
.if(truthy_value){ doSomethingOnYes(); } else{ doSomethingOnFalse(); }
to w Javie boolean ma wartość truthy, ale1
czy0
nie jest. Dopiero gdy OP wyzwaniem mówi coś takiego: „ Twoje wyjście może być prawda / fałsz, 0/1, pusty / niepusty, tak długo, jak określić to, czego używasz. ”, A następnie można rzeczywiście wykorzystać0
i1
zamiasttrue/false
jak truthy / wartość falsey.if(b.length!=36)
;||
może być|
w wielu miejscach, a także&&
w celu&
;if(...!='-')
może byćif(...!=45)
;int i=-1; ... while(++i<b.length){
można zastąpićfor(int i=-1;++i<b.length;){
;'F'
może być70
('f'
może wynosić 102, ale to nie ma znaczenia, ponieważ jest to ta sama liczba bajtów). Podoba mi się to, jak wykorzystałeśjava.io.PrintStream u=System.out;
btw, powinienem pamiętać o tym! Więc dziękuję.Swift 3, 50 bajtów
Podaj ciąg
s
źródło
PHP, 109 bajtów
wypisuje 1 dla true i 0 dla false
$i>7&$i<24&!($i%5-3)
jest o 5 bajtów krótszy niżin_array($i,[8,13,18,23])
112 bajtów
113 bajtów
źródło
Java,
172 bajty168 bajtów (Thanks Wheat Wizard)Trochę oszustwo, odkąd użyłem java.util.UUID, ale oto:
Wersja bez golfa:
źródło
try
i{
.String[]
ia
. Ponadto, należy być w stanie wymienićprintln
zprint
.java.util.UUID.fromString
zamiast importować.AWK, 98 bajtów
Po prostu dzieli linię na każdy znak i sprawdza, czy każdy znak jest cyfrą szesnastkową i czy w odpowiednich miejscach są łączniki.
strtonum
konwertuje nieprawidłowe znaki na0
. Dokonanie porównania między0
im
(i dowolnie wybrany nieprawidłowy znak) wymagać dodatkowych czynności. Na szczęście01
jest to poprawny numer szesnastkowy, alem1
nie jest.Początkowo napisałem dwie
for
pętle, ale zaoszczędziłem 1 bajt, ściskając je razem. :)UWAGA:
GAWK
można odczytać dane wejściowe jako liczby szesnastkowe, ale wymaga to bardzo długiej opcji wiersza poleceń.źródło