Для заданного строкового ввода напишите программу, которая печатает истинное значение в STDOUT или эквивалентное, если вход является допустимым UUID, без использования регулярных выражений.
Действительный UUID
32 шестнадцатеричные цифры, отображаемые в пяти группах, разделенных дефисами, в форме 8-4-4-4-12, всего 36 символов (32 буквенно-цифровых символа и четыре дефиса).
Тестовые случаи
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)
правила
- Регулярные выражения не допускаются
- Не допускается буквальное сопоставление с образцом, похожим на регулярное выражение. Например, использование
[0-9a-fA-F]
или других шестнадцатеричных идентификаторов (мы назовем этоn
), а затем сопоставлениеnnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn
илиn[8]-n[4]-n[4]-n[4]-n[12]
недопустимо - Входные данные могут быть взяты из функции
STDIN
или в качестве аргумента функции - Ввод нечувствителен к регистру
- Можно с уверенностью предположить, что ввод не будет содержать перевод строки или перевод строки.
- Входные данные могут содержать любые печатные символы ASCII (включая пробелы)
- Значение truthy должно быть напечатано на
STDOUT
или эквивалент , если вход является действительным UUID - Значение Falsey должно быть напечатано
STDOUT
или эквивалентно, если ввод не является допустимым UUID - Если вместо функции используется функция,
STDOUT
то результатом может быть возвращаемое значение функции - Значение truey / falsey не может быть напечатано
STDERR
. - Применяются стандартные лазейки
- Это код-гольф , поэтому выигрывает самая короткая программа в байтах. Удачи!
Leaderboard
Это фрагмент стека, который генерирует как таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ появляется, пожалуйста, начните свой ответ с заголовка, используя следующий шаблон уценки
## Language Name, N bytes
Где N - размер вашего сообщения в байтах
Если вы хотите включить в заголовок несколько чисел (например, пролистать старые оценки или включить флаги в счетчик байтов), просто убедитесь, что фактическая оценка является последней цифрой в заголовке.
## Language Name, <s>K</s> X + 2 = N bytes
источник
\h{8}-\h{4}-\h{4}-\h{4}-\h{12}
(где\h
шестнадцатеричная цифра).Ответы:
CJam,
313029 байтЗапустите все тесты здесь.
объяснение
Вместо того, чтобы напрямую сопоставлять шаблон с входом, мы сначала преобразуем его в более простую форму, которую можно легко сравнить с одной строкой шаблона.
источник
JavaScript ES6,
735556 символовВ предыдущей версии с 55 символами была проблема с конечными пробелами в группе:
Тест:
источник
PowerShell,
2921844937 байтБольшое спасибо тем людям в комментариях, которые помогали в этом гольфе не отставать от меняющихся правил - TessellatingHeckler , iFreilicht , Jacob Krall и Joey . Пожалуйста, смотрите историю изменений для ревизий и более старых версий.
Эта ревизия принимает входные данные как
$g
, а затем создает новую хеш-таблицу@{}
с одним элементом, индекс36
устанавливается равным$g-as[guid]
. При этом используется встроенный-as
оператор для попытки преобразования между двумя типами данных .NET - из[string]
в[guid]
. Если преобразование прошло успешно,[guid]
объект возвращается, в противном случае$null
возвращается. Эта часть гарантирует, что входная строка является допустимым .NET GUID.Следующим шагом является индексирование в хеш-таблицу с помощью
[$g.length]
. Если$g
длина не совсем 36 символов, вернется хеш-таблица$null
, которая будет выведена в виде значения фальси. Если$g
длина составляет 36 символов, то результат вызова .NET будет выведен. Если$g
недопустимый GUID .NET (в любой форме), он будет$null
выведен в виде фальшивого значения. В противном случае он выведет объект .NET GUID в качестве истинного значения - единственный способ вывести его, если он соответствует запрошенному формату запроса.Примеры
Здесь я инкапсулирую вызов скрипта в скобках и явно приведу его к логическому значению для ясности.
источник
!!($args[0]-as[guid])
21 байт.!!()
? Поскольку ценности$NULL
и[guid]
являются взаимоисключающими, они могут представлять ценности truthey и falsey, не так ли? Во всяком случае, отличный способ преобразовать в логическое значение, любите решение!True
для0FCE98AC13264C798EBC94908DA8B034
, у которого нет дефисов0FCE98AC-1326-4C79-8EBC-94908DA8B034D
(дополнительная буква D в конце), возвращает значение «ложь»$TRUE
, поскольку оно просто удаляет оскорбительную цифру, и первые 36 символов действительны.Emacs Lisp, 236 байт
Ungolfed:
источник
Из-за изменений в правилах этот ответ больше не является конкурентным :(
С, 98
В основном достаточно понятны. Спецификатор
%n
формата дает количество прочитанных байтов, которое должно быть 36.scanf()
Возвращает количество совпадающих элементов, которое должно быть 6. Финал%c
не должен ничего совпадать. Если это так, то есть завершающий текст,scanf()
который вернет 7.Скомпилируйте с,
-w
чтобы подавить надоедливые предупреждения (их несколько).источник
JavaScript ES6, 70
83ПРИМЕЧАНИЕ. Спасибо @Qwertiy за нахождение ошибки (и предложение некоторых улучшений и исправлений).
Thx @ CᴏɴᴏʀO'Bʀɪᴇɴ 2 байта сохранено
Остальные 9 байтов сэкономили, упрощая проверку длины (сложный способ был короче в первом наброске, но не сейчас)
Разъяснения
Тестовый фрагмент
источник
-1-('0x'+h)
=>1/('0x'+h)
00000000-0000-0000-000 -000000000000
every
вызоваu
это строка, а не массивИз-за изменений в правилах этот ответ больше не является конкурентным :(
Pure Bash (без внешних утилит), 78
Принимает ввод из командной строки.
printf
следующей строки- - - -
.p=
Линия преобразует это в следующей схеме:[[: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:]]
. Обратите внимание, это выглядит очень похоже на регулярное выражение. Однако это не в этом контексте. Это шаблон для сопоставления с шаблоном оболочки . По концепции это похоже на регулярное выражение, но это другая конструкция (и синтаксис).Идентично оболочке, код возврата 0 указывает на успех / TRUE, а 1 указывает на сбой / FALSE. Код возврата может быть проверен
echo $?
после запуска скрипта.источник
tr
также используются классы символов Posix, но это не синтаксический анализатор регулярных выражений.Джольф, 32 байта
Попробуй это здесь!
Из-за ошибки в моем коде это больше, чем должно быть. :(
[8,4,4,4,12]
должно быть так же, как{8444*26}
, но}
также закрытие функции: Pисточник
MATL , 55 байт
Я воздержался от использования
Yb
функции (strsplit
), потому что она чем-то похожа наregexp(..., 'split')
. Это использует только индексирование и сравнение символов.пример
объяснение
источник
CJam,
5242 байтаПопробуйте онлайн . Выводит исходную строку, если истина, выводит пустую строку, если ложь ( это разрешено ).
Объяснение:
источник
A7*)<
не удалит много недопустимых символов, таких как пробелы+
,?
...Юлия, 86 байт
Это анонимная функция, которая принимает строку и возвращает логическое значение. Чтобы назвать его, дайте ему имя, например
f=s->...
.Ungolfed:
источник
C # 196 байт
Ungolfed:
Метод
T
может быть вызван с любой ненулевой строкой, иtrue
вfalse
противном случае будет возвращен действительный идентификатор GUID . Это проверка в постоянном времени; по стоимости трех символов вы можете досрочно выйти из метода (сменитьi < v.Length
наi < v.Length && r
).Попробую отключить бай-счет позже.
Я, очевидно, оставил
Guid.ParseExact
путь, потому что где в этом веселье? Вот оно, без особых попыток упростить его до 86 байтов :Ungolfed:
источник
Python 2,
99112 байтНа допустимом вводе он печатает
True
. На неверном вводе он печатаетFalse
или0
, в зависимости от того, почему он был неверным.False
и0
оба ложные в Python.Функция должна проверить 3 вещи:
ABCDEF
Вот разбивка, чтобы показать, как он проверяет их. Это немного устарело, но я голоден, поэтому я обновлю это позже.
источник
return
сprint
. (В этом случае вы определенно захотите быть в Python 2, потому чтоprint
в Python 3 работает иначе).map
теперь возвращает «объект карты», а не список.int
функция допускает пробелы -0FCE98ac-1326-4c79-8EBC-94908da8B03
с завершающим пробелом. Смотрите комментарий в удаленном ответе Pyth здесь, если можете.Python 2, 57 байт
Слава Богу за встроенный! - не забудьте заключить строки в кавычки.
источник
1
для ввода12345678123456781234567812345678
.try:print uuid.UUID(input())
сработает, вы сможете сэкономить байты, потому что все, что вам нужно, это напечатать истинное значениеPyth, 39 байт
Попробуй это здесь .
источник
\
символK\-k
, поэтому он не может работать как есть.Perl 6 ,
8367 байт(в число не входят переводы строк и отступы, поскольку они не нужны)
использование:
источник
Common Lisp - 161
Возвращаемое значение, если true - это хеш, как число, которое является полезным результатом.
Ungolfed
источник
Символы F # 44
В F # функции с
out
параметрами можно вызывать, опуская параметр out; его значение при возврате будет объединено с истинным возвращаемым значением функции в кортеж.Здесь кортеж передается в
fst
функцию, которая возвращает свой первый член, который в данном случае является логическим возвращаемым значением TryParseExact, указывающим на успех или неудачу вызова.В качестве проверки правильности формата мы возвращаем
true
только если строка длиной 36 символов.До того, как я увидел ответ RobIII's C #, я не думал об использовании TryParseExact, поэтому мой ответ должен был быть на три символа длиннее:
TryParse(string, Guid)
принимает входные данные в следующих форматах:Из них только второй имеет длину 36 символов.
источник
Python 2,
938985 байтВ
map()
гарантии вызова , что секции имеют правильные длины иall()
испытания каждого персонажа за то , либо дефис или произвольной случае шестнадцатеричное число. Выражение генератора проверяет каждый символ путем итерации всей этой строки, так что, боюсь, это не самый эффективный метод, но он должен удовлетворять тестам:источник
f=
и пробелы вокруг строки вall
блоке.all(..)
установить тестирование включения:set(u)<=set("-0123456789abcdefABCDEF")
.SAS,
171144141На самом деле использует stdin и stdout - одну из малоизвестных функций этого конкретного языка. Работает для приведенных примеров, но, возможно, не во всех случаях. Возможно, может быть улучшено.
Лучший подход - по одному персонажу за раз:
Гольф еще 6 символов от центрального выражения!
Ungolfed:
Это генерирует довольно много предупреждений и заметок в журнале, но не выводит их на stdout или stderr, поэтому я считаю, что это честная игра.
источник
C 391 байт
источник
MATLAB, 126 байт
источник
Python 3, 134 байта
int (k, 16) пытается привести k к основанию-16 int. На символе, отличном от 0-9a-fA-F-, он не работает, и в этом случае мы возвращаем 0, что ложно. Добавьте 1 к этому int, и мы получим гарантированное истинное значение - мы удалили все дефисы с помощью str.split (), поэтому мы не можем получить значение -1, и все не-0 целые числа являются правдивыми.
источник
Функция С, 102
Изменение правила отклонило мой предыдущекло
scanf()
-ответ , так вот еще с ответом , используяisxdigit()
который я думаю , должно быть разрешено конкурировать :Попробуйте онлайн.
-
символов (ASCII 45) в соответствующих позициях - если это так, замените их на0
s (ASCII 48 (= 45 + 3))isxdigit()
источник
Пакет,
148139 + 2 =150141 байтДобавлены 2 байта, потому что вам нужно использовать
/v
переключатель вCMD.EXE
.Выход с ERRORLEVEL 0 при успехе, 1 при ошибке.
Редактировать: Сохранение некоторых байтов в основном потому, что
:=
регистр не учитывается, но были и другие настройки.источник
Java, 345 байт
Ввод - это первый аргумент командной строки. Вывод - код ошибки (0 означает действительный UUID, 1 означает недействительный)
Разоблаченный с комментариями:
РЕДАКТИРОВАТЬ: не заметил часть STDOUT. Ой, исправлено.
источник
if(b.length>36||b.length<36)
простоif(b.length!=36)
. Кроме того, поскольку вы можете печатать истинные значения , вы можете просто напечатать0
вместо1<0
и1
вместо1>0
.if(truthy_value){ doSomethingOnYes(); } else{ doSomethingOnFalse(); }
Так что в Java логическое значение является истинным значением, но оно1
или0
нет. Только когда ОП задачи говорит что-то вроде: « Ваш вывод может быть истинным / ложным, 0/1, пустым / непустым; до тех пор, пока вы указываете, что вы используете. », Тогда вы действительно можете использовать,0
а1
неtrue/false
как правдивый / значение фальси.if(b.length!=36)
;||
может быть|
на нескольких местах, а также&&
к&
;if(...!='-')
может бытьif(...!=45)
;int i=-1; ... while(++i<b.length){
можно заменить наfor(int i=-1;++i<b.length;){
;'F'
может быть70
('f'
может быть 102, но это не имеет значения, так как это тот же счетчик байтов). Мне нравится, как вы использовалиjava.io.PrintStream u=System.out;
кстати, я должен помнить это! Так что спасибо.Swift 3, 50 байт
Пройти в строку
s
источник
PHP, 109 байт
печатает 1 для истинного и 0 для ложного
$i>7&$i<24&!($i%5-3)
на 5 байт корочеin_array($i,[8,13,18,23])
112 байт
113 байт
источник
Java,
172 байта,168 байтов (спасибо Wheat Wizard)В некотором роде обмануть, так как я использовал java.util.UUID, но здесь идет:
Безголовая версия:
источник
try
и{
.String[]
иa
. Кроме того, вы должны быть в состоянии заменитьprintln
наprint
.java.util.UUID.fromString
вместо импорта.AWK, 98 байт
Просто разбивает строку на каждый символ и проверяет, является ли каждый символ шестнадцатеричной цифрой и есть ли дефисы в соответствующих местах.
strtonum
преобразует недопустимые символы в0
. Выполнение сравнения между0
иm
(и произвольно выбранным недопустимым символом) требует дополнительных шагов. К счастью01
, это действительное шестнадцатеричное число, ноm1
это не так.Первоначально я написал два
for
цикла, но я сохранил 1 байт, сжав их вместе. :)ПРИМЕЧАНИЕ:
GAWK
может читать ввод как шестнадцатеричные числа, но это требует очень длинной опции командной строки.источник