Соревнование
Напишите программу, которая может принимать ввод однострочной строки, содержащей любые печатные символы ASCII, и выводить ту же строку, закодированную в Base85 (с использованием соглашения с прямым порядком байтов). Вы можете предположить, что ввод всегда будет ≤ 100 символов.
Руководство по Base85
Четыре октета кодируются (обычно) пятью символами Base85.
Base85 символы в диапазоне от
!
доu
(ASCII 33 - 117) иz
(122) ASCII.Для кодирования вы непрерывно выполняете деление на 85 для четырех октетов (32-разрядное число) и добавляете 33 к остатку (после каждого деления), чтобы получить символ ASCII для закодированного значения. Например, первое применение этого процесса производит самый правый символ в кодированном блоке.
Если набор из четырех октетов содержит только нулевые байты, они кодируются
z
вместо!!!!!
.Если последний блок короче четырех октетов, он дополняется нулевыми байтами. После кодирования то же количество символов, которое было добавлено в качестве отступа, удаляется из конца вывода.
Кодированное значение должно предшествовать
<~
и сопровождаться~>
.Кодированное значение не должно содержать пробелов (для этой задачи).
Примеры
In: easy
Out: <~ARTY*~>
In: test
Out: <~FCfN8~>
In: code golf
Out: <~@rGmh+D5V/Ac~>
In: Programming Puzzles
Out: <~:i^JeEa`g%Bl7Q+:j%)1Ch7Y~>
Следующий фрагмент закодирует данный вход в Base85.
источник
Ответы:
CJam,
433935 байтПопробуйте онлайн в интерпретаторе CJam .
Как это работает
Если ввод был пустым,
N,)
будет применяться к строке"<~"
. ПосколькуN
изначально содержит один символ, вывод будет правильным.Нам не нужно иметь дело с z или дополнением закодированных фрагментов длиной до 5, поскольку входные данные будут содержать только печатаемые символы ASCII.
источник
a program that can take an input of a single-line string containing any ASCII printable characters,...
Python 3, 71 байт
Я никогда не играл в гольф на Python, так что это, вероятно, неоптимально.
Спасибо @ZachGates за 3 байта в гольфе!
источник
input().encode()
вместо того,str.encode(input())
чтобы сохранить 3 байта.Python 2,
193162 байтаЭто мой первый гольф-код, поэтому я уверен, что с моим подходом что-то не так. Я также хотел на самом деле реализовать base85, а не просто вызывать библиотечную функцию. :)
источник
[:4+len(s)/4*4]
и никакие символы не удаляются из конца вывода.while
цикл в один , как например:while b:d=chr(b%85+33)+d;b/=85
. Вы также можете удалить пробел между вашимprint
утверждением и строкой. Кроме того, удалите пробел между аргументами, передаваемыми вs.unpack
.Октава,
133131 байтСпасибо @ojdo за предложение использовать входные данные из argv, а не из stdin, сэкономив мне 2 байта.
Ungolfed:
Я разместил код на Ideone . Автономная функция не требует и
end
оператора, но поскольку ideone имеет функцию и вызывающий скрипт в одном файле, для нее требуется разделитель.Я до сих пор не смог понять, как заставить
stdin
работать идеон. Если кто-нибудь знает, я все еще заинтересован, поэтому, пожалуйста, оставьте мне комментарий.Пример вывода из ideone :
источник
argv()
? Кажется, описание задачи не требует чтения ввода отstdin
.dec2base
в Октаве разрешено базирование выше 36?BASE
должен быть числом от 2 до 36 или строкой символов . Здесь выражение'i':'u'
расширяет строку из 85 символов,!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu
которая служит основой.Matlab, 175 байт
Пример:
источник
PHP, 181 байт
Онлайн версия
расширенный
источник
Чистая Баш, ~ 738
Сначала кодировщик (что-то в гольфе):
тесты:
и декодер сейчас:
Скопируйте это
enc85.sh
иdec85.sh
,chmod +x {enc,dec}85.sh
, то:Но вы могли бы сделать более сильный тест:
Сокращено до 724 символов:
источник