Усі ваші бази 97 належать нам


18

Багато мов програмування написані за допомогою виключно друкованих ASCII, вкладок та нових рядків. Ці 97 символів потім зберігаються у 8-бітових байтах (які насправді здатні вмістити 256 різних символів!), Що просто жахливо неефективно - особливо в коді-гольфінгу, де кожен байт рахується! У цьому виклику ви зможете знизити свій рахунок, використовуючи базову конверсію.

Виклик

Ваша програма / функція приймає вхідний рядок або масив символів, який потім інтерпретується як число базової 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{|}~

Зауважте, що порядок цього алфавіту важливий: наприклад, основа-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 Чесно кажучи, у мене дуже мало терпіння до таких відповідей. Так, я усвідомлював це, але поки хтось не зможе фактично зберігати програму у своїй системі, це не отримає моїх результатів.
Санчіз

Відповіді:


7

Пітон 2 , оцінка 73 72 71

Редагувати: -1 завдяки @Jonathan Allan

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 Це дає різні (неправильні) результати.
Санчіз

О, так, це буде>. <- думав тільки, що я отримаю нуль там, але це буде побіжно або з іншими числами теж.
Джонатан Аллан

@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

Гая , 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

Складність полягає в перетворенні вхідних даних. Єдиний розумний спосіб перетворення з бази-97 - це використання B, оскільки для картографування потрібен не-ASCII ¦. Крім того, наразі не існує способу створити діапазон символів без відображення cдіапазону чисел, що страждає від тієї ж проблеми. Найкращим рішенням, що я міг бачити, було побудова струни ₵Rта її огладження.


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

@Sanchises, що я зробив, але найкоротший, який я придумав, закінчився 19, оскільки це кодова точка 8373, і я не можу робити діапазони символів лише у ASCII, що трохи засмучує, оскільки більшість цієї програми є ASCII.
Ділова кішка

Так, це дійсно близько до того, щоб бути лише ASCII. Швидке запитання: я не знаю Гайя, але трохи зараз пограв з нею, але чи є спосіб перетворити список номерів? (як, cале застосовано до кожного символу, $просто показує всі цифри)
Санчіз

@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)-бітове представлення бази-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…
Lynn

Ви маєте рацію, моя погана
Халвард Гуммель

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 char = 1 байт.


Не всі символи APL містяться ⎕AV(принаймні, для Dyalog), наприклад . Хоча всі ваші символи рахуються як один байт кожен. Тому не кожен символ APL = 1 байт, як ви заявляєте у виносці. (Я просто подумав, що я дам вам це знати.) Також, який діалект APL ви використовуєте?
Zacharý

2

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

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

Спробуйте в Інтернеті!

Як?

Неодмінно відокремте символи введення ( -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\ $<
.@>$

Спробуйте тут!

Програма спочатку перетворює вхід на базове число-97, а потім підраховує, скільки цифр потрібно для базової кількості 256. Таким чином, число базової 97 є величезним, настільки великим, що TIO виведе максимальне значення 8 для великих значень; однак перекладач JS не хвилює і видасть правильне значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.