0xUsernames
Есть так много людей, использующих службу обмена сообщениями, что им не хватает места для хранения всех имен пользователей! Чтобы исправить это, они начнут хранить имена пользователей как шестнадцатеричные, где это возможно.
Если имя пользователя состоит только из символов 0123456789ABCDEF
(без учета регистра), оно может быть преобразовано в шестнадцатеричное и сохранено как целое число. Например, имя пользователя ba5eba11
может быть интерпретировано как 0xBA5EBA11
шестнадцатеричное целое число.
Но как насчет 05AB1E
? Это ведущий ноль, который будет потерян. Таким образом, всякий раз, когда мы конвертируем имя пользователя, мы обязательно ставим перед ним 1
перед чтением его как целое число.
Соревнование
Ваша задача - написать программу или функцию, которая, учитывая непустое имя пользователя в виде строки, «гекса-сжимает» имя пользователя:
- Если его можно интерпретировать как шестнадцатеричное целое число, добавьте 1, интерпретируйте как шестнадцатеричное и затем выведите результат как основание 10.
- В противном случае просто верните строку без изменений.
Это код-гольф , поэтому выигрывает самое короткое решение (в байтах)! Встроенные функции преобразования базы разрешены.
Тестовые случаи
Вы можете предположить, что любые результирующие целые числа находятся в пределах стандартного целочисленного диапазона вашего языка.
Как и имена пользователей в большинстве систем обмена сообщениями, входные строки будут содержать только буквенно-цифровые символы и подчеркивания.
Помните, что вам всегда нужно добавить ведущий 1
перед преобразованием!
"ba5eba11" -> 7421737489
"05AB1E" -> 17148702
"dec0de" -> 31375582
"Beef" -> 114415
"da7aba5e" -> 7960443486
"500" -> 5376
"DENNIS" -> "DENNIS"
"Garth" -> "Garth"
"A_B_C" -> "A_B_C"
"0x000" -> "0x000"
Для справки, вот реализация Python 3, которую я использовал для тестовых случаев (ungolfed):
import re
def convert_name(name):
if re.fullmatch('^[0-9A-Fa-f]+$', name):
return int('1' + name.upper(), base = 16)
else:
return name
Ответы:
05AB1E , 4 байта
объяснение
Если на входе есть недопустимые шестнадцатеричные символы,
H
ничего не вставляется, поэтому последним значением в стеке будет дублированный ввод, поэтому программа печатает свой ввод в случае неверного ввода.Попробуйте онлайн!
источник
05AB1E
является действительным именем пользователя.JavaScript (ES6), 15 байт
Как это работает
'0x1'+s
преобразует входные данные в буквальную шестнадцатеричной строку с префиксом1
, например0x105ab1e
. Затем-0
приводит результат к числу. JavaScript видит0x
в начале и неявно пытается конвертировать из шестнадцатеричной; еслиs
содержит какие-либо не шестнадцатеричные символы, это возвращаетNaN
. Так как это неверно (и вывод0
никогда не может быть дан из-за предварительно добавленного1
), мы можем использовать||s
для возврата,s
если преобразование в шестнадцатеричный код не удалось.Тестовый фрагмент
источник
Python 2 , 44 байта
Принимает ввод в виде строки в кавычках. -2 байта благодаря Роду!
Поскольку мы гарантируем, что входные данные будут содержать только буквенно-цифровые символы и символы подчеркивания, нет никакого способа создать допустимый Python после того,
0x1
как иметь шестнадцатеричную строку. Если на входе есть что-то еще, ошибка игнорируется и печатается так, как было изначально.Казалось, я не могу сделать регулярное выражение более коротким, чем
try/except
. На самом деле, регулярное выражение оказалось ужасно многословным:источник
a=int('1'+a,16)
наexec'a=0x1'+a
(вероятно, необходимо проверить)"+input()"
.()
вinput()
Perl 6 , 19 байт
Попробуй это
Expanded:
источник
Perl, 27 байт
-1 байт благодаря @ardnew .
26 байт кода +
-p
флаг.Предоставить ввод без окончательного перевода строки. С
echo -n
, например:Пояснение
Это довольно просто:
/[^0-9a-f]/i
верно, если ввод содержит символ, отличный от тех, которые разрешены внутри шестнадцатеричных чисел. Если$_
значение равно false (содержит входные данные), оно устанавливается на преобразованное значение (преобразование выполняется встроеннымhex
).И
$_
неявно печатается благодаря-p
флажку.источник
$_=hex"1$_"if!/[^0-9a-f]/i
Pyth - 9 байт
Та же идея, что и в ответ на флиптак . Попробуйте шестнадцатеричное-десятичное преобразование, иначе выведите вход.
Попробуй это здесь!
источник
Пакет, 33 байта
Как это работает
В качестве аргумента передается строка, к ней добавляется 1, а строка неявно преобразуется в десятичную и печатается. Если строка не является допустимой шестнадцатеричной, она просто отображается.
Следует отметить, что, поскольку пакетная математика использует 32-разрядные целые числа со знаком, наибольшее допустимое имя пользователя
FFFFFFF
.cmd /c
принимает следующую команду, запускает ее в новом терминале и завершает работу.set /a
выполняет математику и неявно отображает результат в десятичном виде, если он не сохранен в переменной.0x1%1
указывает set на добавление 1 к первому аргументу (это легко, поскольку все пакетные переменные являются строками) и указывает, что строка должна рассматриваться как шестнадцатеричная.2>nul
заставляет замолчать любые ошибки, возникающие из-за неправильного шестнадцатеричного числа||
является логическим ИЛИ и выполняет команду справа, если команда слева не удалась. Скобки делают все до этой точки одной командой.echo %1
просто отображает первый аргумент.источник
Common Lisp, 71
тесты
Определить функцию
Укажите список ожидаемых входных данных, как указано в вопросе:
Разбор и сбор результатов
Убедитесь, что ожидаемые результаты соответствуют фактическим:
источник
C 108 байтов
Это функция, которая принимает строку в качестве аргумента и печатает результат в STDOUT.
источник
int
:)JavaScript:
4641 байтисточник
/[^0-9a-f]/i
0-9
на\d
3 байта, добавив флаг без учета регистра (спасибо @GilZ) и еще 2 байта, удаливF=
, что не нужно. Спасибо за предложение.PHP, 42 байта
hex2bin () возвращает false, если ввод не является допустимой шестнадцатеричной строкой. Это короче, чем использование регулярных выражений для поиска не шестнадцатеричных цифр, но нам нужен оператор @, потому что он не молчит, когда он терпит неудачу.
источник
hex2bin
не подходит для строк с неравной длиной. Тем не менее на два байта короче, чем при использованииpreg_match
:<?=@hex2bin($s=$argv[1])|@hex2bin($s.a)?hexdec("1$s"):$s;
для 57 байтов.bash,
463531 байтСохраните как скрипт и передайте имя пользователя в качестве аргумента.
источник
Python 2 -
63,52,5046 байтПри этом используется Python,
int()
который преобразует любую строку с соответствующим основанием в базу 10. В этом случае строка является номером 1, присоединенным к входу. Если ввод недопустим (содержит символы, отличные от0123456789ABCDEF
(без учета регистра), он возвращаетValueError
:Попробуй это здесь!
Спасибо @FlipTack за сохранение 15 байт!
источник
Рубин,
4744 байтаЯ мог бы удалить 3 байта, изменивputs
наp
, но я чувствую, что вывод будет считаться неправильным, так как в конце он имеет новую строку.Редактировать: изменено,
puts
посколькуp
в конце обычно принимаются завершающие символы новой строки, спасибо @Mego.источник
Japt , 11 байт
Попробуйте онлайн!
Большое спасибо ETHproductions!
источник
Дьялог АПЛ , 37 байт
Не использует встроенную проверку или преобразование hex-dec. Требуется
⎕IO←0
по умолчанию во многих системах.Ungolfed:
d ← ⎕D , 6 ↑ ⎕A
d получает D igits следуют первые 6 элементов A lphabetu ← 1 (819⌶) ⍵
вы получаете заглавные (819 ≈ "большой") аргумент∧/ u ∊ d:
если все элементы u являются членами d , то:16 ⊥ 1 , d ⍳ u
найдите индексы u в d , добавьте 1 и оцените как основание 16⍵
else: вернуть (неизмененный) аргументTryAPL онлайн:
Установите
⎕IO
в ноль, определите замену для⌶
(запрещено в TryAPL по соображениям безопасности) и установите⎕PP
( P rint P recision) значение 10 для больших результатов.Попробуйте все тестовые случаи
источник
REXX,
4948 байтовsignal on syntax
Говорит переводчику , чтобы перейти к меткеsyntax
всякий раз , когда возникает ошибка синтаксиса. Программа пытается переназначитьa
преобразованную версию с шестнадцатеричным в десятичное с начальным 1, но переходит наsyntax
метку, если это не удается. Если преобразование проходит, оно просто игнорирует метку и выводит переназначенную переменную.источник
PowerShell , 35 байт
Попробуйте онлайн! или Запустите все тестовые случаи!
объяснение
$v
)0
) является результатом строки, содержащей0x1$v
piped intoInvoke-Expression
(iex
), при этом одновременно присваивая это значение$h
. Если преобразование не удастся,$h
останется$null
.-not
значением$h
. Все, что$h
есть, будет неявно преобразовано в[bool]
($null
в случае неправильного преобразования станет$false
, положительное целое число в случае успешного преобразования станет$true
) перед отрицанием, которое затем неявно преобразуется[int]
в индексатор массива[]
($true
будет1
,$false
будет0
), в результате чего первый элемент массива (результат преобразования) был выбран, если преобразование было успешным, и второй элемент, выбранный, если преобразование было неудачным.источник
Скала, 40 байт
Использование:
Объяснение:
источник
C #, 58 байт
Разоблачен тестовыми примерами:
Попробуй онлайн
источник
Дротик, 51 байт
Попробуй здесь
Большая часть накладных расходов связана с именованными параметрами ... О, хорошо!
По крайней мере, Dart позволяет вам динамически печататься, если вы хотите: D
источник