В этом задании вы получите ввод, преобразуете его в шестнадцатеричное, внесете пару изменений и выведете результат.
Поскольку они состоят всего из 16 символов в шестнадцатеричном формате, ваш код должен быть максимально коротким.
Примеры
Примеры разделены пустой строкой. Первая строка ввода, вторая строка показывает шаги, третья показывает вывод
234589
234589 -> 3945D -> 39454 -> 9A1E -> 9115 -> 239B -> 2392 -> 958
958
435234
435234 -> 6A422 -> 61422 -> EFEE -> 5655 -> 1617
1617
153
153 -> 99 -> 99 -> 63
1617
меры
На входе всегда будет положительное целое число
Чтобы сгенерировать вывод, вы выполните следующие шаги:
- Преобразовать ввод в шестнадцатеричный
- Замените любые буквы их индексами в алфавите (например
a -> 1, b -> 2
) - Преобразовать результат обратно в шестнадцатеричное
- Если результат содержит какие-либо буквы, перейдите к шагу 2. Если нет, выведите результат
Это код-гольф, поэтому выигрывает самый короткий код в байтах!
code-golf
math
number
base-conversion
hexadecimal
Downgoat
источник
источник
749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Ответы:
Желе , 18 байт
Попробуйте онлайн!
Бинарная 18-байтовая версия исходного кода имеет дамп xxd
и работает с этой версией переводчика Jelly .
Как это работает
Ḍ
(decimal-to-integer) должен был работать как сокращениеḅ⁵
, но последняя версия Jelly на момент написания этого поста содержала ошибку, которая мешала мне его использовать.источник
JavaScript ES6,
98926764 байтаСохранено 3 байта благодаря @Downgoat, еще 3 благодаря @ user81655
Нашел намного, намного более короткую версию, исключив цикл для рекурсии:
Вероятно, наиболее интересной частью этой программы является
replace
функция:Тестовый фрагмент
(взято отсюда )
источник
.toString(16)
:x=>eval("for(x=(j=n=>n.toString(16))(x);/\\D/.test(x);)x=j(+x.replace(/\\D/g,z=>+('0x'+z)-9))")
. Это также может сэкономить несколько байтов с помощью рекурсии.replace
на строке перед оценкой, но это оказалось дольше.h=
CJam,
2119 байтовПроверьте это здесь.
объяснение
Очень редкий случай отрицательных результатов по модулю быть полезным. :)
источник
Рубин, 35 + 1 = 36
С флагом командной строки
p
запуститеОбъяснение:
Флаг -p создает цикл, хранящий ввод и возможный вывод в переменной
$_
.'%x'
выполняет шестнадцатеричное преобразование, аtr!
также подстановку цифр и возвращает значение Фолси, если не нужно ничего менять. повтор начинается с нового$_
.источник
Юлия,
7874 байтаЭто рекурсивная функция, которая принимает целое число и возвращает строку.
Ungolfed:
источник
MATL , 23
25байтотказ
Во время написания этого ответа я заметил ошибку в
dec2base
функции MATL , исправил ее и выпустил новую версию с исправлением (а также пару других накопленных, не связанных изменений) .Поскольку я использую версию, более позднюю, чем этот вызов, согласно консенсусу по Meta, этот ответ не имеет права на победу .
Код
пример
объяснение
источник
Dyalog APL,
373633 байтаСпасибо Adám и ngn за предложения. Я сохраняю
16⊥⍣¯1⊢⍵
вместо этого⍵⊤⍨⍴⍨16
- это дополнительный байт, но он позволяет нам работать с числами произвольного размера, а не с 64-битными.источник
{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
10⊥10|X+10≤X
->10(⊣⊥|+≤)X
(технически не эквивалентно, но работает для шестнадцатеричных цифр)16⊥⍣¯1⊢⍵
->⍵⊤⍨⍴⍨16
Python,
118105 байтисточник
PHP,
14012612211411287 или 84 байта (включая-r
)Не совсем уверен, как правила вокруг этого, так как это моя первая попытка Codegolf, но код может быть запущен
php -r
без необходимости<?
и?>
Код
отформатирован
Альтернативный код (использование argv вместо stdin)
отформатирован
Заметки
Редактировать 1: я отключил вызов, чтобы
intval()
сохранить 14 символов, так как PHP с радостью будет рассматривать числовые строки как числа.Изменить 2: я удалил
\n
из вывода, который я забыл удалить после тестирования, и удалил кавычки из окончательного эха, чтобы сохранить в общей сложности 4 символа.Edit 3: удален последний вызов для
intval()
Edit 4: сохранены 2 байта путем удаления кавычек из строки регулярного выражения.
Edit 5: изменен
[a-f]
на,\D
чтобы сохранить 3 символа, удаленstrval
вызовpreg_replace
для еще 8; добавили версию, которая используетargv[]
вместо STDIN, переместили терминатор цикла в оператор while (упс!), сохранив еще 11 символов, и переместили вызов dechex вsubject
частьpreg_replace
в течение еще 3, в общей сложности 25; также добавлена не стандартная версия в качестве альтернативной версии, которая использует на 3 символа меньше. Спасибо за помощь, @Blackholeисточник
-r
опции). Но ведущий;
всегда короче ведущего?>
, поэтому не забывайте об этом. Кстати, вот более короткий код:for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;
(-29 байт).153
должен дать63
, а не99
. Но-r
это бесплатно. (см. codegolf.meta.stackexchange.com/a/2428/55735 )R ,
106103102 байта-3 байта, используя
if
вместоwhile
-1 байт благодаря использованию Джузеппе
as.double
вместоas.integer
Попробуйте онлайн!
Просто добавьте
a(your_integer_here)
в TIO, чтобы увидеть результат.Я использовал рекурсию, чтобы повторно применить функцию к каждой последующей итерации, при условии, что она не находит ни одной буквы «abcdef» в строке, когда это условие имеет значение False, она выводит результат в виде строки. Лучшей частью было мое открытие
chartr
функции, которая позволяет мне менять элементы на соответствующие элементы в строке. Эта строка происходит от функции, приводящей шестнадцатеричное значение в формат строки.Изменить: я пытался использовать
sprint("%x",y)
вместоas.hexmode(as.double(y))
, но мне все еще требуется использоватьas.double
где-то в коде, который был на21 байт длиннее.источник
as.double
корочеas.integer
05AB1E , 12 байтов
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
ÐþQ
альтернативно может бытьD.ï
(D
: Duplicate.ï
;: is_int?) для того же количества байтов.источник
[hÐþQ#Au₂L‡
не всегда работает, к сожалению. Задача состоит в том, чтобы сначала преобразовать в гекс, а затем в каждую итерацию. Если я вставлю ваш код в мой набор тестов, первые три контрольных примера верны, но последние два не пройдены.C # (интерактивный компилятор Visual C #) , 92 байта
Попробуйте онлайн!
Меньше гольф-кода:
источник
Mathematica, 107 байт
Не могу больше думать о способах игры в гольф ...
источник
Mathematica, 80 байт
Это использует аккуратный трюк для петель, пока я учился у алефальфа. Это
//.
«применять это правило замещения как можно чаще». Затем мы используем шаблон,l_/;Max@l>9
который соответствует, только если список шестнадцатеричных цифр все еще содержит цифры больше 9.источник
Japt,
4540 байтОсновываясь на моем ответе JS:
Довольно жалко для языка игры в гольф, а? Похоже, многие люди понимают, что у их переводчиков есть ошибки, и я теперь в их числе. Это должно быть в состоянии сделать в 30 байтах или меньше, но ошибка делает это невозможным.
Это создает функцию,
H
которую можно вызывать так:В качестве альтернативы, здесь представлена полная программа, получающая информацию от STDIN:
Попробуйте онлайн!
источник
GNU Sed (с расширением eval), 44
Я хотел
sed
бы позволитьy/A-F/1-6/
. Но это не так.источник
Python 3,
10189 байтВ целом, это очень похоже на решение Бумеранга , но требует нескольких разных подходов к различным аспектам.
Это расширенная версия моего исходного кода:
11 байт были сброшены благодаря @pacholik (замена внутренней части
join
одной операции, которая работала как для цифр, так и для букв). Еще один байт был обрезан путем заменыjoin
трюка нарезки строк, который ударил меня в момент лампочки (но который уже существует в советах по игре в гольф на Python , хотя и под заголовком, в котором указан Python 2).источник
join
Может быть сокращен доstr(ord(c)%12)for c in n
.Java, 201 байт
источник
Japt , 21 байт
Попробуйте онлайн!
Значительное улучшение по сравнению с существующим ответом Japt. Он не обрабатывает
153 -> 63
случай, предложенный в комментарии, но ни один из других ответов, похоже, тоже не подходит, поэтому я оставлю его, пока ОП не прояснит.Вывод в виде списка десятичных цифр, может быть изменен на вывод десятичного числа для 1 байта
Объяснение:
источник
APL (NARS) 104 символа, 208 байтов
тест:
Я не знаю, все ли в порядке ... Возможно, этого недостаточно для стандартного качественного ответа ...
источник
Серьезно, 42 байта
Шестнадцатеричный дамп:
Попробуйте онлайн
Должен быть более короткий путь, чем этот, но это то, что я получил ... (Это то, где я на самом
W
деле желаю всплыть, так как короче, чтобы поставить;
право перед последним, когда вы НЕ хотите этого, чем ставитьX
после КАЖДОГОW
. Здесь,W
вместо pop, вместо pop вы сэкономите три байта.)источник
Japt, 18 байт
Попытайся
источник
PHP, 71 байт
Запустите как трубу с
-nR
или попробуйте онлайн .Выдает предупреждение для некоторых входных данных в PHP 7.1 и более поздних версиях; заменить
-
с ,!=
чтобы исправить.Выдает еще одно предупреждение в PHP 7.2; положить
abcdef
в кавычки, чтобы исправить.источник