Многие языки программирования написаны с использованием исключительно ASCII для печати, вкладок и новых строк. Эти 97 символов затем сохраняются в 8-битных байтах (которые на самом деле способны содержать 256 различных символов!), Что просто ужасно неэффективно - особенно в игре в код, где каждый байт имеет значение! В этом задании вы сможете уменьшить свой счет, используя базовую конверсию.
Вызов
Ваша программа / функция принимает строку или символьный массив в качестве входных данных, которые затем интерпретируются как число base-97 . Затем он преобразует это число в число 256 и подсчитывает количество символов (т. Е. Байтов), необходимое для представления этого числа. Этот счет будет выходным / возвращаемым значением вашей программы / функции.
Простой пример с использованием base-2 и base-10 (двоичное и десятичное): если входное значение равно 10110
, выходное значение будет равно 2, поскольку 10110 2 = 22 10 (две цифры, необходимые для представления выходного сигнала). Аналогично, 1101 2 становится 13 10 , что также дает выход 2, а 110 2 становится 6 10 , поэтому выход будет 1.
Входная строка может содержать все 95 печатных символов ASCII, а также \n
вкладку новой строки и литерала \t
, которая создает исходный алфавит из 97 символов для базового преобразования. Таким образом, точный алфавит будет (с заменой на \t
и \n
фактической литеральной табуляции и новой строки; обратите внимание на литеральное пространство после новой строки) :
\t\n !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Обратите внимание, что порядок этого алфавита важен: например, base-97 \t
соответствует десятичному 0
и !
соответствует десятичному 3
.
Некоторые тестовые случаи: (вам не нужно обрабатывать пустую строку)
Input Output
'example@domain.com' 15
'All your base are belong to us!' 26
' abcd' 9
'~ abcd' 10
'ABCDEFGHIJK' 9
'zyxwvutsrpq' 10
'{".~"}.~' 7
'\t\t\t\t\t\t\t\t' 1 (with \t a literal tab; the result is 0, which can be represented with 1 byte)
'!\t\t\t\t\t\t\t\t' 7 (with \t a literal tab)
счет
Если ваша запись использует только печатный ASCII, символ новой строки и / или вкладку: Оценка вашей программы будет выводом вашей программы, когда в качестве входных данных будет указан ее собственный исходный код.
Если ваша запись использует какие-либо символы, которые не могут быть напечатаны ASCII, символом новой строки или табуляции: Оценка вашей программы - это просто число байтов, как в code-golf .
источник
Ответы:
Python 2 , оценка
737271Изменить: -1 благодаря @ Джонатан Аллан
Попробуйте онлайн!
источник
/
должно быть в порядке, я думаюor 1
может быть заменено на|1
в этом случае.Japt , оценка 19 (23 байта)
Проверьте это онлайн!
По совпадению, я не думаю, что это можно сыграть в гольф даже с не-ASCII-символами ...
объяснение
источник
Желе ,
1817 байт - оценка1817-1 байт благодаря Эрику Аутгольферу (нет необходимости в списке списков для перевода)
Попробуйте онлайн!
Как?
- Лучшее, что у меня есть только с ASCII - это 29 баллов :
- это тоже крайне неэффективно. Он переводит порядковые числа, как указано выше, но преобразование из базы 97 достигается путем повторения значений и суммирования, а не с использованием прямого умножения - то есть для преобразования
{".~"}.~
он получает скорректированные индексы,[93,4,16,96,4,95,16,96]
затем переворачивает (U
) и повторяет их для создания,[[96,96,..., 97⁷ times ...,96],[16,16,... 97⁶ times ...16],[95,95,... 97⁵ times ...95],[4,4,... 97⁴ times ...4],[96,96,... 97³ times ...96],,[16,16,... 97² times ...,16],[4,4,... 97 times ...4],[93]]
а затем суммирует, преобразует в базу 256 и получает длину (если у нее не осталось свободного места: p).источник
J , 36 байт, оценка = 30
Попробуйте онлайн!
J использует только 7-битные символы ASCII для своих примитивов.
объяснение
источник
Gaia , 14 байт, оценка 14
Попробуйте онлайн!
объяснение
Только ASCII
Это лучшее, что я мог придумать, используя только ASCII, получив оценку 19:
Сложность заключается в преобразовании ввода. Единственный разумный способ преобразования из системы base-97 - использовать
B
, так как для отображения требуется не-ASCII¦
. Кроме того, в настоящее время нет способа создать диапазон символов без сопоставленияc
с диапазоном номеров, что приводит к той же проблеме. Лучшее решение, которое я мог видеть, было создание строки₵R
и ее оценка.источник
₵R
и₵r
не так легко заменить, хотя ,₸
очевидно , есть), но это может быть интересно посмотреть , как он сравнивает.₵
это кодовая точка 8373, и я не могу использовать диапазоны символов только в ASCII, что немного расстраивает, так как большая часть этой программы - ASCII.c
но применяется к каждому персонажу,$
просто показывает все цифры)c
бы составить карту по списку, который будетc¦
₵r
это легко заменить, так как я мог бы использовать256
вместо этого, я использовал это только потому, что он на 1 байт короче, и программа все равно не была только ASCII.Python 2 , оценка 60
Попробуйте онлайн!
Отображение на базу-97
Значение символа получается следующим образом
ord(c)-[30,9][c<' ']
: его ASCII-код, минус 9 для вкладок и новых строк (которые предшествуют' '
лексикографически) или минус 30 для всего остального.Преобразование в число
Мы используем
reduce
для преобразования строки в число. Это эквивалентно вычислениюВычислительная база-256 длина
Возвращаемое значение
bin
представляет собой строку, которая выглядит примерно так:Назовите его длину
L
. Значение сn
двоичным представлениемceil(n/8)
-bit имеет представление -bit base-256. Мы можем вычислитьn
какL-2
; такжеceil(n/8)
можно записать какfloor((n+7)/8)
=n+7>>3
, поэтому наш ответL-2+7>>3
=L+5>>3
.Случай, когда входная строка имеет значение 0, обрабатывается правильно, так как
bin
возвращает"0b0"
, поэтому мы возвращаем3+5>>3
= 1.источник
c>=' '
иначе вы сопоставите пространство с 23 вместо 2. В обычном коде гольфc>'\x1f'
(необработанный байт) помог бы мне, но это не для печати ASCII…APL, оценка 24 (байт *)
Принимает значение по умолчанию
⎕IO←1
, в противном случае просто измените ¯31 на ¯30.Объяснение:
Примеры:
________________
*: APL может быть записан в своем собственном устаревшем кодировке (определенном как
⎕AV
) вместо Unicode; поэтому программа APL, которая использует только символы ASCII и символы APL, может быть оценена как 1 символ = 1 байт.источник
⎕AV
(по крайней мере, для Dyalog), такие как⍸
. Все ваши символы считаются одним байтом. Так что не каждый символ APL = 1 байт, как вы указали в сноске. (Просто подумал, что дам вам знать.) Кроме того, какой диалект APL вы используете?Perl 5 , 76 + 1 (-F) = 77 байт
Попробуйте онлайн!
Как?
Неявно, разделяйте символы input (
-F
), сохраняя все это в @F. Закройте неявныйwhile
цикл и начните новый блок (}{
) ( Спасибо, @Dom Hastings! ). Для каждого символа умножьте его значение на 97 до соответствующей степени. Вычислите количество символов, найдя размер суммы в базе 256, используя логарифмы.источник
Желе , оценка: 18 (байт)
Попробуйте онлайн!
источник
Ruby , 70 байт, оценка 58
Попробуйте онлайн!
источник
MATL (19 байт), оценка 16
Непечатаемые символы (табуляция, новая строка) во входной строке вводятся путем связывания их кодов ASCII (
9
,10
) с остальной частью строки.Начальная часть
9=?1}G
необходима только из-за ошибки вZa
(базовое преобразование), которая приводит к сбою, когда входные данные состоят только из «нулей» (вкладки здесь). Это будет исправлено в следующей версии языка.объяснение
источник
Befunge-93,
8379 байт, оценка7465Попробуй это здесь!
Программа сначала преобразует ввод в число base-97, а затем подсчитывает, сколько цифр требуется для числа base-256. Таким образом, число base-97 огромно, настолько велико, что TIO выдает максимальное значение 8 для больших значений; однако интерпретатор JS не заботится и выдаст правильное значение.
источник