Все ваши базы 97 принадлежат нам


18

Многие языки программирования написаны с использованием исключительно 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)

счет

  1. Если ваша запись использует только печатный ASCII, символ новой строки и / или вкладку: Оценка вашей программы будет выводом вашей программы, когда в качестве входных данных будет указан ее собственный исходный код.

  2. Если ваша запись использует какие-либо символы, которые не могут быть напечатаны ASCII, символом новой строки или табуляции: Оценка вашей программы - это просто число байтов, как в .


3
Если у вас есть лучшее название, чем этот устаревший мем , не стесняйтесь размещать его в комментариях!
Санчиз

Понимаете ли вы, что этот вызов можно выиграть, ответ на языке, состоящий только из вкладок.
pppery

@ppperry Честно говоря, у меня очень мало терпения для таких ответов. Да, я осознал это, но пока кто-то не сможет сохранить программу в своей системе, я не получу поддержки.
Sanchises

Ответы:


7

Python 2 , оценка 73 72 71

Изменить: -1 благодаря @ Джонатан Аллан

def f(l,z=0):
	for i in map(ord,l):z+=i-[30,9][i<32];z*=97
	print(len(bin(z))-2)/8or 1

Попробуйте онлайн!


просто все /должно быть в порядке, я думаю
Джонатан Аллан

or 1может быть заменено на |1в этом случае.
Джонатан Аллан

1
@JonathanAllan Это дает разные (неправильные) результаты.
Sanchises

О, да, это будет>. <- думал, что только получит ноль там, но оно будет побитовым или с другими числами тоже.
Джонатан Аллан

@JonathanAllan Точно. Это будет работать для нечетных результатов, но это добавит один к четным результатам.
Санчиз

5

Japt , оценка 19 (23 байта)

nHo127 uA9 md)sG l /2 c

Проверьте это онлайн!

По совпадению, я не думаю, что это можно сыграть в гольф даже с не-ASCII-символами ...

объяснение

UnHo127 uA9 md)sG l /2 c   Implicit: U = input string, A = 10, G = 16, H = 32
  Ho127                    Create the range [32, 33, ..., 126].
        uA9                Insert 9 and 10 at the beginning of this range.
            md             Map each to a character, yielding ["\t", "\n", " ", "!", ... "~"].
Un            )            Convert U to a number via this alphabet ("\t" -> 0, "~" -> 96, etc.)
               sG          Convert this number to a base-16 (hexadecimal) string.
                  l        Take the length of this string.
                    /2 c   Divide by two and round up to get the length in base-256.
                           Implicit: output result of last expression

5

Желе ,  18  17 байт - оценка  18  17

-1 байт благодаря Эрику Аутгольферу (нет необходимости в списке списков для перевода)

O“µœ½þ‘y_30ḅ97b⁹L

Попробуйте онлайн!

Как?

O“µœ½þ‘y_30ḅ97b⁹L - Link: list of characters
O                 - convert from characters to ordinals
 “µœ½þ‘           - code-page indices = [9,30,10,31]
       y          - translate (9->30 and 10->31)
        _30       - subtract 30
           ḅ97    - convert from base 97
               ⁹  - literal 256
              b   - convert to base
                L - length of the result

- Лучшее, что у меня есть только с ASCII - это 29 баллов :

O10,31,9,30y_30Ux"J_1 97*$$$SSb256L

- это тоже крайне неэффективно. Он переводит порядковые числа, как указано выше, но преобразование из базы 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).


3

J , 36 байт, оценка = 30

256#@(#.inv)97x#.(u:9,10,32+i.95)&i.

Попробуйте онлайн!

J использует только 7-битные символы ASCII для своих примитивов.

объяснение

256#@(#.inv)97x#.(u:9,10,32+i.95)&i.  Input: string S
                 (              )     Form 7-bit ASCII alphabet
                            i.95        Range [0, 95)
                         32+            Add 32
                    9,10,               Prepend 9 and 10
                  u:                    Convert to characters
                                 &i.  Index of each char in S in that alphabet
            97x#.                     Convert from base 97 to decimal
256   #.inv                           Convert to base 256
   #@                                 Length

3

Gaia , 14 байт, оценка 14

9c₸c₵R]$;B₵rBl

Попробуйте онлайн!

объяснение

9c              Push a tab character. (done like this since tab isn't in the codepage)
  ₸c            Push a linefeed character.
    ₵R          Push all printable ASCII characters.
      ]$        Concatenate everything together.
        ;       Copy second-from-top, implicitly push input. Stack is now [ASCII input ASCII]
         B      Convert input from the base where the ASCII string is the digits.
          ₵rB   Convert that to the base where the code page is the digits (base 256).
             l  Get the length of the result.
                Implicitly output top of stack.

Только ASCII

Это лучшее, что я мог придумать, используя только ASCII, получив оценку 19:

9c10c8373c'R+e]$;B256Bl

Сложность заключается в преобразовании ввода. Единственный разумный способ преобразования из системы base-97 - использовать B, так как для отображения требуется не-ASCII ¦. Кроме того, в настоящее время нет способа создать диапазон символов без сопоставления cс диапазоном номеров, что приводит к той же проблеме. Лучшее решение, которое я мог видеть, было создание строки ₵Rи ее оценка.


Вы пытались сделать ASCII-версию только для этого? Он не может улучшить ваш счет (я полагаю , ₵Rи ₵rне так легко заменить, хотя , очевидно , есть), но это может быть интересно посмотреть , как он сравнивает.
Санчиз

@ Я получал исправления, но самое короткое, что я придумал, оказалось 19, так как это кодовая точка 8373, и я не могу использовать диапазоны символов только в ASCII, что немного расстраивает, так как большая часть этой программы - ASCII.
Деловая кошка

Да, это действительно близко к тому, чтобы быть только ASCII. Быстрый вопрос: я не знаю Гайю, но немного поигрался с ней сейчас, но есть ли способ преобразовать список чисел? (как, cно применяется к каждому персонажу, $просто показывает все цифры)
Sanchises

@Sanchises Вы должны были cбы составить карту по списку, который будет
Business Cat

На самом деле ₵rэто легко заменить, так как я мог бы использовать 256вместо этого, я использовал это только потому, что он на 1 байт короче, и программа все равно не была только ASCII.
Деловая кошка

3

Python 2 , оценка 60

lambda s:len(bin(reduce(lambda a,c:a*97+ord(c)-[30,9][c<' '],s,0)))+5>>3

Попробуйте онлайн!

Отображение на базу-97

Значение символа получается следующим образом ord(c)-[30,9][c<' ']: его ASCII-код, минус 9 для вкладок и новых строк (которые предшествуют ' 'лексикографически) или минус 30 для всего остального.

Преобразование в число

Мы используем reduceдля преобразования строки в число. Это эквивалентно вычислению

a = 0
for c in s: a = a*97+ord(c)-[30,9][c<' ']
return a

Вычислительная база-256 длина

Возвращаемое значение binпредставляет собой строку, которая выглядит примерно так:

"0b10101100111100001101"

Назовите его длину 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.



@HalvardHummel точно уверен, что должно быть, c>=' 'иначе вы сопоставите пространство с 23 вместо 2. В обычном коде гольф c>'\x1f'(необработанный байт) помог бы мне, но это не для печати ASCII…
Линн

Вы правы, мой плохой
Халвард Хаммель

2

APL, оценка 24 (байт *)

⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞

Принимает значение по умолчанию ⎕IO←1, в противном случае просто измените ¯31 на ¯30.

Объяснение:

                   ⎕AV⍳⍞  Read a string and convert it to ASCII codepoints + 1
               ¯31+       Subtract 31, so that space = 2, bang = 3, etc.
           118|           Modulo 118, so that tab = 97, newline = 98
        97|               Modulo 97, so that tab = 0, newline = 1
     97⊥                  Decode number from base 97
⌈256⍟                     Ceiling of log base 256, to count number of digits

Примеры:

      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
example@domain.com
15
      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
All your base are belong to us!
26
      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
       abcd
9
      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
~      abcd
10

________________
*: APL может быть записан в своем собственном устаревшем кодировке (определенном как ⎕AV) вместо Unicode; поэтому программа APL, которая использует только символы ASCII и символы APL, может быть оценена как 1 символ = 1 байт.


Не все символы APL находятся в ⎕AV(по крайней мере, для Dyalog), такие как . Все ваши символы считаются одним байтом. Так что не каждый символ APL = 1 байт, как вы указали в сноске. (Просто подумал, что дам вам знать.) Кроме того, какой диалект APL вы используете?
Захари

2

Perl 5 , 76 + 1 (-F) = 77 байт

}{$d+=97**(@F+--$i)*((ord)-(/	|
/?9:30))for@F;say!$d||1+int((log$d)/log 256)

Попробуйте онлайн!

Как?

Неявно, разделяйте символы input ( -F), сохраняя все это в @F. Закройте неявный whileцикл и начните новый блок ( }{) ( Спасибо, @Dom Hastings! ). Для каждого символа умножьте его значение на 97 до соответствующей степени. Вычислите количество символов, найдя размер суммы в базе 256, используя логарифмы.




1

MATL (19 байт), оценка 16

9=?1}G9tQ6Y2hh8WZan

Непечатаемые символы (табуляция, новая строка) во входной строке вводятся путем связывания их кодов ASCII ( 9, 10) с остальной частью строки.

Начальная часть 9=?1}Gнеобходима только из-за ошибки вZa (базовое преобразование), которая приводит к сбою, когда входные данные состоят только из «нулей» (вкладки здесь). Это будет исправлено в следующей версии языка.

объяснение

9=      % Implicitly input a string. Compare each entry with 9 (tab)
?       % If all entries were 9
  1     %   Push 1. this will be the ouput
}       % Else
  G     %   Push input string again
  9     %   Push 9 (tab)
  tQ    %   Duplicate, add 1: pushes 10 (newline)
  6Y2   %   Push string of all printable ASCII chars
  hh    %   Concatenate twice. This gives the input alphabet of 97 chars
  8W    %   Push 2 raised to 8, that is, 256. This represents the output
        %   alphabet, interpreted as a range, for base conversion
  Za    %   Base conversion. Gives a vector of byte numbers
  n     %   Length of that vector
        % End (implicit). Display (implicit)

1

Befunge-93, 83 79 байт, оценка 74 65

<v_v#-*52:_v#-9:_v#`0:~
 5v$
^6>>1>\"a"* +
 >*- ^   0$<
0_v#:/*4*88\+1\ $<
.@>$

Попробуй это здесь!

Программа сначала преобразует ввод в число base-97, а затем подсчитывает, сколько цифр требуется для числа base-256. Таким образом, число base-97 огромно, настолько велико, что TIO выдает максимальное значение 8 для больших значений; однако интерпретатор JS не заботится и выдаст правильное значение.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.