Задача
Напишите программу или функцию, которая проверяет, является ли имя переменной допустимым, и выводит 1 или, True
если она действительна, 0,5, если она действительна, но начинается с подчеркивания (_), и 0, или False
если она недействительна.
правила
- Имя переменной в большинстве языков допустимо, если оно начинается с подчеркивания или буквы (az, AZ, _), а остальные символы являются либо подчеркиванием, буквами или цифрами. (az, AZ, 0-9, _)
- Выведите 1 или,
True
если имя переменной допустимо, и 0 или,False
если не допустимо. - Однако не рекомендуется начинать переменную со знака подчеркивания, поэтому возвращайте значение 0,5, если оно начинается со знака подчеркивания и имя является допустимым.
Тестовые случаи
вход
abcdefghijklmnop
Выход
1
вход
_test_
Выход
0.5
(начинается с подчеркивания)
вход
123abc
Выход
0
(начинается с номера)
вход
A_b1C_23
Выход
1
вход
_!
Выход
0
(не 0.5, потому что это не верно)
вход
magical pony1
Выход
0
(без пробелов)
Применяются стандартные лазейки .
Это код-гольф , поэтому выигрывает самый короткий код.
Бонус: -10%, если ваша программа / функция выдает 0
пустую строку ( ""
).
__init__
; Кроме того, нет, классы не нужны ,__init__
но, как правило, естьОтветы:
JavaScript (ES6), 37 - 10% = 33,3 байта
Сохранено 4 байта благодаря @ edc65
Сохранено 5,6 байта благодаря @Mateon
источник
05AB1E ,
25242019 байтовКод:
Объяснение:
Короче говоря, формула для строки
s
в псевдокоде:Попробуйте онлайн!
Использует кодировку CP-1252 .
источник
PHP (50 - 10% = 45)
Спасибо Schism за -2 :)
Не конкурировать с ответами на гольф-поле, но я все равно решил попробовать.
Следует отметить, что в PHP без
/u
модификатора\w
выбираются только буквы ASCII. В некоторых других языках / вариантах Regex этот шаблон не будет работать.Изменить : я вижу много людей, использующих \ w и \ d в своих ответах, когда они используют язык, который также включает не-ASCII буквы и цифры. Это НЕ загадка. Они ошибаются. (Невозможно понизить / прокомментировать, извините за необходимость сказать это таким образом.)
источник
[a-z].../i
.\d
это точно так же, как[0-9]
.\w
является exactlly же , как[A-Za-z0-9_]
developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/...Сетчатка,
30 - 10% = 2728 - 10% = 25,229 - 10% = 26,1 байтаОбе версии имеют право на бонус, так как они правильно обрабатывают пустой ввод (выходные данные
0
)Мне пришлось исправить ошибку, вызванную одной из функций регулярных выражений .NET, которая рассматривает некоторые (прочитайте столько же) символов Юникода как символы «слова». К счастью, это стоило мне только одного байта в обеих версиях. Все сводилось только к добавлению модификатора, чтобы поведение соответствия регулярных выражений соответствовало стандартам ECMAScript. Подробнее об этом здесь .
Новый
2829 байт версия, сделанная @ MartinBüttner. Благодарность!объяснение
Сначала мы проверяем, начинается ли ввод с подчеркивания. Если это так, ввод дублируется, с новой строкой между ними. Например:
_test_
->_test_\n_test_
, где\n
находится новая строка. Тогда мы пытаемся соответствовать что - нибудь, что не начинается с числа, но следует любое количество «слов» символов (a-z
,A-Z
цифры и символ подчеркивания) в каждой строке . Обратите внимание, что если ввод начинался с подчеркивания и был заменен на две строки, это будет соответствовать обеим строкам. Затем мы проверяем, было ли у нас 2 совпадения, и заменяем их на0.5
. Пустая или неверная строка всегда будет давать 0 совпадений, а допустимые имена переменных всегда будут давать 1 совпадение.Моя собственная
30-байтовая версияобъяснение
Прежде всего, мы проверяем , если вход начинается с цифры или содержит не слово символ (ничего, кроме
a-z
,A-Z
, цифры и подчеркивание). Если это так, он отбрасывается, потому что он недействителен. Затем мы проверяем, начинается ли это с подчеркивания. Если это так, он заменяется на0.5
. Затем мы проверяем , если она начинается с нецифры характера (в этот момент первый символ является либо0
,a-z
илиA-Z
. Толькоa-z
иA-Z
не имели цифры, очевидно). Если это так, он заменяется на1
. Затем мы проверяем пустую строку и заменяем ее на0
.Попробуйте онлайн!
Попробуйте онлайн! Старая версия
источник
^\D.*
этапе это может начинаться с 0? Это странно._
и был заменен на0.5
. Затем начинается с 0.Ψ
.\w
это совпадает с не-ASCII символами, что не должно делать (я пытался дать этоƜƝƞƟƠ
и вᎳᎴᎵᎶᎷᎸᎹ
качестве ввода). Я посмотрю на это позже. Возможное решение кажется заменой\w
на[a-zA-Z\d_]
.MATL , 27 байт
Это работает в текущей версии (15.0.0) языка.
Ввод - это строка с одинарными кавычками.
Попробуйте онлайн!
объяснение
источник
Пайк , 21 байт
(неконкуренция, добавленное вычитание строки, различные строковые константы)
Объяснение:
источник
Python 3, 36 байт
Код длиной 40 байт соответствует бонусу -10% .
Обратите внимание, что это будет работать правильно только для кодовых страниц, которые не имеют букв / цифр, отличных от ASCII.
источник
Pyth, 27 байт
Тестирование
источник
Гог , 29 байт
Запустите с помощью:
объяснение
источник
Perl, 21 байт
Оценка включает +1 байт для
-p
переключения. Попробуйте это на Ideone .источник
-$_||$_=...
за пустой ответ? (использование-
потому+
, что в Perl noop)Pyth, 19 байт
Попробуйте это с Pyth Compiler .
Обратите внимание, что это будет работать правильно только для кодовых страниц, которые не имеют букв / цифр, отличных от ASCII.
Как это работает
источник
Коэффициент , 84 * 0,9 = 76,5
Запускает прослушиватель (repl), определяет цитату (анонимная функция), которая принимает строку и выводит {0 | 1/2 | 1}
Определяя это как слово, это 97 символов:
Как это работает:
R/ [_a-zA-Z]\w*/ R/ _.*/
определяет два регулярных выражения.bi-curry@
частично применяет цитату[ matches? 1 0 ? ]
к каждому регулярному выражению, оставляя две каррированные цитаты в стеке.bi
применяет каждую цитату к строке аргумента.Каждая из этих (каррированных цитат) оставляет либо 1, либо 0, в зависимости от того, соответствуют ли они. Первое соответствует хорошо сформированным именам, второе - именам, начинающимся с подчеркивания.
0 = 1 2 ? /
Последнее значение заменяется на 1, если оно было 0, или на 2, если оно было 1. Тогда первое (1 или 0, действительное или нет) делится на второе (2 или 1, начинается с подчеркивания или нет) ,Это очень долго! Любые указатели на сокращение немного более ценится ...
И я ненавижу регулярные выражения!
PS.
все испытания проходят;)
источник
Dyalog APL , 19 байт - 10% = 17,1
{
...⍵
...}
анонимную функцию , где право аргумент , представленный⍵
⊃⍵
первым символом (дает пространство , если пусто)'_'=
1 , если значение «подчеркивания, 0 в противном случае имеет1+
значение 2 , если начальное подчеркивание, 1 в противном случае⎕NC⍵
имя класса ; -1 если недопустимое имя, 0 если не определено (но действительное имя), 2-9, если определено (и, следовательно, допустимо)источник
Mathematica, 93 байта
Я, честно говоря, не уверен, что это может быть дальше в гольфе.
источник
Perl, 34 + 1 = 35 байт
Использует
-p
флаг.объяснение
источник
[_a-zA-Z]
->[^\W\d]
Если Perl работает так же, как JavaScript, я думаю, вам также придется это делать\w*
\w+
.a
Python, 84 -10% = 76 байт
источник
JavaScript ES7, 37 байт
Попробуйте онлайн
Как это работает:
Порт @ Денниса Perl ответ
источник
Рубин, 44 байта
источник
/^([a-z_]).../i
вместо/^(_|\d)?.../
Рубин, 57 - 10% = 51,3 байта
Довольно наивный подход
источник
->(s){s=~/^$|^\d|\W/?0:s=~/^_/?0.5:1}
Луа, 82 - 10% = 73,8
Тестовые случаи:
источник
Lua, 68 * .9 = 61,2 байта
Принимает аргументы в командной строке
источник