Советы по игре в гольф в 05AB1E

28

Есть ли у вас какие-либо советы по в 05AB1E , языке игры в гольф, созданном Аднаном ?

Ваши советы должны быть хотя бы несколько специфичны для 05AB1E.

Пожалуйста, оставьте один совет за ответ.

Оливер Ни
источник
2
Из обзора: Советы вопросы по теме.
mbomb007

Ответы:

20

Так как это не было частью Wiki на страницах GABH 05B1E (я думаю, что это должно), я просто добавлю это здесь сейчас, чтобы я лучше поняла это сама.

Как пользоваться словарем?

05AB1E имеет следующий словарный файл words.ex, содержащий все слова, которые он знает. Но как нам получить доступ к словам в этом словаре? Давайте возьмем слово в "testing"качестве примера:

"testing"можно найти в строке 1453 файла словаря. Поскольку первые две строки не являются словами, и нам нужно слово с 0 индексами, мы вычитаем 3.
Итак, теперь у нас есть index ( 1450), но как его использовать?

Мы открываем и запускаем сжатую строку с . Затем мы смотрим на второй столбец файла info.txt . (То есть, 00; это 01; и т. Д.)
В случае "testing"этого означает î(14) и »(50).

Следовательно, сжатая строка для "testing": “ Попробуйте онлайн. Как и для почти всех фрагментов кода 05AB1E, трейлинг необязателен, если у вас нет доступа к строке, поэтому в этом случае без работы .

Некоторые вещи, на которые стоит обратить внимание:

Все символы, которые не имеют индекса в файле info.txt, могут использоваться как есть. Это может быть полезно для добавления sмножественного числа вместо единственного слова или использования знаков препинания, ,.?!например.
ÿ(строка-интерполяция) также может использоваться, когда вы хотите вставить значения из стека в строке.
ПРИМЕЧАНИЕ. Каждый свободный символ, не имеющий индекса в файле info.txt, считается словом для типов сжатия, указанных ниже.

Существуют различные типы сжатых строк, которые вы можете использовать:

  • ': Возьмите одно сжатое слово как есть (трейлинг не 'требуется) - 'î»: "тестирование"
  • : Принимает два сжатых слова с пробелом (трейлинг не требуется) - „î»î»: «тестирование»
  • : Принимает три сжатых слова с разделителем пробела (без трейлинга ) - …î»î»î»: "тестирование тестирование тестирование"
  • : Взять сжатую строку с пробелом - “î»î»“: "тестирование"
  • : Взять сжатую строку как есть без неявных пробелов - ’î»î»’: "testtesting"
  • : Взять сжатую строку в заглавном регистре с пробелом - ”î»î»”: «Тестирование Тестирование»
  • : Взять сжатую строку в верхнем регистре с пробелом - ‘î»î»‘: "TESTING TESTING"

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

'“? lAð«Ã#¸˜ vyU "€‚ƒ„…†‡ˆ‰Š‹ŒŽ•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîï" Dâ vy"“ÿ“".V XlQi y?1#] '“,

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

Эта программа будет:

  1. Возьмите ввод в качестве строчных букв, удаляет все не алфавитные символы (кроме пробелов), а затем разделяет слова на пробелы ( lAð«Ã#), или переносит слова в списке, если было введено только одно слово ( ¸˜)
  2. Зацикливается на каждом слове ( vyU)
  3. Затем имеет внутренний цикл для каждого сжатого слова из словаря ( "€...ï"Dâvy), который он пытается запустить как 05AB1E program ( "“ÿ“".V)
  4. И если оно равно текущему слову, оно напечатает его и разорвет внутренний цикл XlQiy?1#

good bye worldТаким образом, с входом, выход будет “‚¿Þ¡‚ï“. Попробуйте онлайн.

ПРИМЕЧАНИЕ. Вам все равно придется посмотреть, существует ли слово в словаре, чтобы этот генератор работал, и он будет игнорировать любые специальные символы или множественные слова. Будут найдены только слова, которые точно совпадают в словаре.

Вот пример, где я использую …Ÿ™‚ï!для строки "Привет мир!" и ’‚¿Þ¡ ÿ ‚ï!’для строки "до свидания, мир!" Обратите внимание, как пробелы и восклицательный знак используются как есть, потому что у них нет индексов в файле info.txt. Кроме того, он использует ÿдля вставки «жестокий», который был на вершине стека, который, к сожалению, не был частью словаря (но все еще был сжат с использованием метода в разделе ниже).

Как сжать строки, не являющиеся частью словаря?

Хотя файл словаря words.ex довольно большой (10 000 слов, если быть точным), может случиться так, что вам понадобится слово, которое не является его частью, или строка, которая является просто бредом. Так есть ли способ их сжать?
Конечно, с помощью .•сжатой строки из 255 алфавитов. ПРИМЕЧАНИЕ. Этот метод можно использовать только для символов в нижнем регистре алфавита и пробелов.

Вот полезная программа для преобразования слова / строки в сжатую строку на основе алфавита base-255:

vAyk})> 27β 255B ".•ÿ•"

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

Что делает эта программа выше:

  • vAyk})>: Возьмите индексы алфавита с 1 индексом отдельных букв ввода, с пробелами, становящимися индексом 0
  • 27β: Преобразовать эти индексы из базы 27 в одно число
  • 255B: Преобразовать этот номер в Base-255, используя собственную кодовую страницу 05AB1E
  • ".•ÿ•": Помещает перед .•и после этого сжатую строку

Вот пример ответа, где @Kaldo использует .•zíΘ•для сжатия слова «гусь».

Как сжать большие целые числа?

Допустим, мы хотим использовать очень большое число для чего-то, но это не может быть получено с помощью вычислений pow. Например, допустим, мы хотим получить доступ к большому целому числу 18238098189071058293по любой причине.

В этом случае мы можем использовать как начальное, так и конечное значение для сжатия числа в формате [1-9][0-9]+.
Номер примера выше станет •15Y₁Ò'Θpc•. Попробуйте онлайн. Опять же, так же, как со сжатой строкой словаря, конечный элемент может быть дополнительно удален .

Необязательно, когда целое число достаточно мало, так что нужно использовать только 2 сжатых символа, мы можем использовать Žвместо этого, в этом случае нам не понадобится завершающий байт, чтобы закрыть его, и целое число будет сжато в 3 байта вместо 4. Для Например, целое число 13562может привести к •rl•, но поскольку он использует только два символа, он может быть Žrlвместо.

Кроме того, числа в диапазоне [101, 355]могут быть сжаты в 2 байта, используя Ƶплюс дополнительный символ из кодовой страницы 05AB1E. Так, например, Ƶ–может быть использовано целое число 250. Здесь обзор всех доступных номеров. Эти символы преобразуются из Base-255 в Base-10, а затем добавляется 101 (поскольку числа в диапазоне [0,100]уже составляют 1 или 2 байта).

Как они 15Y₁Ò'Θpcи rlсозданы? Очень просто, число конвертируется в Base-255 с использованием собственной кодовой страницы 05AB1E. Таким образом , вы можете использовать следующую программу , чтобы получить сжатый номер, для которого он будет использовать Ƶ., Ž..или в •...•зависимости от размера сжатого целого:

101 355Ÿså i 101-255B"Ƶÿ" ë 255B Dg2Qi "Žÿ" ë "•ÿ•"

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

Вот пример ответа, где @Emigna использует •3Èñ•целое число 246060.

Как сжать целочисленные списки?

Иногда вы хотите сжать весь список целых чисел вместо одного числа. Например, допустим, мы хотим получить список [5,93,17,83,4,44,32,19,4,45,83,90,0,14,3,17,17,81]по любой причине. В этом случае мы можем использовать следующее: •4βŸ{©£MG]q‡dZΘp•94в Попробуйте онлайн.

Вот полезная программа для генерации этого сжатого числа и базы, в которую мы хотим преобразовать:

Z>© β 255B ®s"•ÿ•ÿв"

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

Что делает эта программа выше:

  • Z>: Получить максимальное число + 1 из списка ввода ( ©: и сохранить его в регистре)
  • β: Преобразовать список ввода из базы max+1в одно число
  • 255B: Сжать это единственное число (как мы делали в разделе выше)
  • ®s"•ÿ•ÿв": Возвращает результат в формате: начальный , сжатый номер , макс + 1, трейлингв

Вот пример ответа, где я использую, •4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91вчтобы сжать список [85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84].
PS: В этом ответе •6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø`JδŠ₂+Öηôî®À8†6/ðÎ6ùøΓ°ÓĆ;ˆ©Ā•2ôесть альтернатива равными байтами (57), поскольку все числа имеют ровно две цифры. В некоторых случаях (особенно в небольших списках) это может быть более короткой альтернативой.

Целочисленное сжатие против сжатия целочисленного списка:

С этими двумя это может пойти в любую сторону. Иногда сжатый список короче, иногда сжатое целое число, иногда совсем другая альтернатива короче. Поэтому всегда используйте свои собственные суждения и навыки игры в гольф, чтобы по возможности играть в гольф дальше, вместо того чтобы полностью полагаться на вышеупомянутые генераторы. Вот несколько примеров:

[44, 59]( используется в этом ответе @Emigna ):

  • •A–•60в 7 байтов (генерируется генератором сжатого списка целых чисел)
  • •H|•2ôили •H|•2äили жестко запрограммированы 44 59‚все 6 байтов
  • ŽH|2ôили ŽH|2äоба 5 байтов
  • Но в этом случае „,;Çнаилучшим вариантом будет 4 байта (кодовые точки символов ',' и ';')

[2,4,6,0]( используется в этом ответе @Emigna ):

  • •3ā•7в 6 байтов (генерируется генератором сжатого списка целых чисел)
  • Ž3ā7в 5 байт
  • Но в этом случае Ž9¦Sнаилучшим вариантом будет 4 байта (сжатое целое число 2460 в список цифр).

10101001100101001( используется в этом моем ответе ):

  • •a½₄Ƶ6®í• 9 байтов (генерируется сжатым генератором целых чисел)
  • •1∊}•2вJ 8 байтов (генерируется генератором сжатого целого списка с добавленным соединением)
  • Но в этом случае •1∊}•bнаилучшим вариантом будет 6 байтов (сжатый список целых чисел, вместо двоичного , который неявно включается)

[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]( используется в этом моем ответе ):

Кевин Круйссен
источник
12

Неявный ввод

В те времена, когда был выпущен 05AB1E, неявный ввод был довольно новым и интересным. В настоящее время, кажется, необходимо отслеживать другие конкурирующие языки (такие как Jelly, MATL, Pyth и т. Д.).

Например, когда вы хотите добавить два числа, вы можете сделать II+:

I    # Input_1.
 I   # Input_2.
  +  # Add them up.

Проверьте это здесь


Однако, используя неявный ввод , мы можем сократить до 1 байта, а именно +:

+    # Take two numbers implicitly and add them up.

Проверьте это здесь


Это происходит только тогда, когда длина стека меньше арности оператора. Последний пример 3+. Арность +оператора равна 2, тогда как в стеке есть только 1 элемент:

3    # Push the number 3 on top of the stack.
 +   # Request implicit input and add to the 3.

Проверьте это здесь

Аднан
источник
8

Подстроки

£это команда для получения первых bсимволов строки a.
например: "hello_world"5£ -> "hello"

Но если bэто список индексов, он вместо этого разбивает строку на части (до) этих размеров.
например: "hello_world"5L£ -> ['h', 'el', 'lo_', 'worl', 'd']

Emigna
источник
8

Предопределенные переменные

Они немного спрятаны в 05AB1E. Вот список всех предопределенных переменных:

  • ¾, толкает, 0если counter_variable не был изменен перед этой командой.
  • X, толкает, 1если переменная X не была изменена перед этой командой с U.
  • Y, толкает, 2если переменная Y не была изменена перед этой командой с V.
  • ®, нажимает, -1если регистр не был изменен перед этой командой, с помощью ©.
  • ¯, толкает [](пустой массив), если ничего не добавлено в global_array перед этой командой.
  • ¸, выдвигает [""]пустой стек, если нет ввода. (Спасибо @Emigna за то, что нашли это.)
Аднан
источник
25
¾толкает 0 => это почти не мнемоническое, как это получается
Fatalize
6
@Fatalize: 0 также толкает 0. ¾толкает переменную счетчика, которая инициализируется как 0. Если вы хотите только нажать 0, 0, конечно, более естественно, но если вы хотите нажать 5,0,7, 5¾7это на 2 байта меньше, чем 5 0 7.
Emigna
7
В свое время это ¾означало .75, и я однажды победил Пифта с этим фактом . Эти новомодные языки игры в гольф не имеют ни малейшего представления о мнемонике ...
ETHproductions
31
Понятия не имею, о чем вы все говорите: с. print(3 / 4)в Python 2 дает мне 0.
Аднан
2
Если в начале Mтолкает -Inf.
mbomb007
7

Использование холста ( Λили )

Поскольку он не был частью документации, и @Adnan в настоящее время слишком занят, чтобы писать его, я попросил разрешения добавить его в качестве подсказки здесь.

Функция Canvas ( Λили ) может использоваться для рисования ASCII-линий на экране. У него есть три обязательных параметра:

  • Длина: Размер линии (S). Это может быть одно целое число или список целых чисел
  • b String: символы, которые мы хотим отобразить. Это может быть один символ, строка, список символов или список строк (в последних трех случаях он будет использовать их все по одному, включая обход)
  • c Направление: Направление, в котором должны быть нарисованы символьные линии. Как правило, у нас есть цифры[0,7]для направлений, для которых мы можем использовать одно или несколькосимволов. Есть также некоторые специальные опции, которые требуют определенного символа (подробнее об этом позже).

Цифры направления [0,7]отображают следующие направления:

7   0   1
  ↖ ↑ ↗
6 ← X → 2
  ↙ ↓ ↘
5   4   3

Пример 05AB1E отвечает, где используется Canvas:

Давайте сделаем нечто похожее на предыдущее, поэтому предположим, что мы используем Λфункцию Canvas со следующими тремя параметрами:

  • а :[3,3,5,5,7,7,9,9]
  • б :!@#
  • с :[0,2,4,6]

Это даст следующий вывод:

  !@#!@#!
  #     @
  @ #!@ #
  ! @ # !
  # ! ! @
  @   @ #
  !#@!# !
        @
@!#@!#@!#

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

Итак, как это работает? Ну, вот шаги с этими входами выше:

  1. Нарисуйте 3символы ( !@#) вверх (направление 0)
  2. Нарисуйте 3-1символы ( !@) вправо (направление 2)
  3. Нарисуйте 5-1символы ( #!@#) вниз (направление 4)
  4. Нарисуйте 5-1символы ( !@#!) влево (направление 6)
  5. Нарисуйте 7-1символы ( @#!@#!) вверх (направление 0)
  6. Нарисуйте 7-1символы ( @#!@#!) вправо (направление 2)
  7. Нарисуйте 9-1символы ( @#!@#!@#) вниз (направление 4)
  8. Нарисуйте 9-1символы ( !@#!@#!@) влево (направление 6)

-1Есть , так как линии пересекаются. Итак, первые два шага:

#
@
!

А также

 !@

Что в сочетании это:

#!@
@
!

Некоторые небольшие заметки:

Кевин Круйссен
источник
1
Я даже не знал, что у 05AB1E был холст!
MilkyWay90
Как ... как ты это понял? Исходный код?
Волшебная Урна Осьминога
1
@MagicOctopusUrn Большинство из этого ответа @Adnan (PS: его последний ответ также довольно хорошо объяснен ). Для +×8я действительно смотрел в исходном коде.
Кевин Круйссен
5

Поп или получить

Как и в других языках стека на основе функции 05AB1E обычно поп (потребляет) их входы из стека и проталкивают свои выходы на стек.

Однако некоторые функции получают свои входные данные из стека, не потребляя их. Примером является headфункция, ¬которая создает первый элемент из списка ввода. Смотрите пример программы здесь: ¬+. Это добавляет первый номер списка ввода к каждому номеру этого списка.

Чтобы узнать, какие функции всплывают, а какие получают, смотрите соответствующий столбец в файле информации о функциях .

Луис Мендо
источник
@NeilA. Благодарность! Ссылка обновлена
Луис Мендо
3

Условные и петли

Циклы и условные выражения автоматически получают закрывающие скобки в конце программы, поэтому вам нужно только добавлять их в код, если вам нужно что-то вне цикла / условного выражения.

Например, эта (не зачищенная) программа, создающая список первых nпростых чисел, не нуждается в закрывающих скобках. [¹¾Q#NpiNˆ¼

Но если мы хотим выполнить какую-то операцию с результирующим списком, например, с использованием дельты, нам нужно сначала закрыть цикл. [¹¾Q#NpiNˆ¼]¯¥

Emigna
источник
3

Маленькие подсказки для игры в гольф 05AB1E

Расширим это с маленькими подсказками гольфа, которые я изучил по пути. (Только что начал 05AB1E лично.)

  • D(duplicate) и Ð(triplicate) в сочетании с s(swap) и Š(triple-swap a,b,cto c,a,b) обычно короче, чем использование ©(save in global_variable ) и ®(push global_variable ) внутри циклов. Это спасло байт в этом моем ответе , а также два в этом моем ответе .
  • ½(если 1, то увеличить counter_variable на 1) нет необходимости в конце a µ(тогда как counter_variable ! = a, do ...), так как это сделано неявно ( в этом моем ответе был сохранен байт ).
  • .Bнеявно расщепляется на новые строки. Это было полезно в моем ответе, когда мы искали альтернативу¡ (разделить), сохраняя при этом пустые элементы (ПРИМЕЧАНИЕ. Решение в связанном ответе не работает, когда элементы содержат завершающие пробелы после разделения.) - Надеюсь, встроенная функция быть добавленным, чтобы разделить, но оставить пустые строки в будущем.
  • (какая из цифр входного целого числа может равномерно делить входное целое число) будет содержать само число для цифр 0(вместо ошибок деления на ноль). Например, 1053приведет к[1,1053,0,1] (1053 делится на 1 и 3; не делится на 5; и дает ошибку деления на ноль для 0). Это было очень полезно в моем ответе , взяв всю мощь списка, так как только 1в 05AB1E это правда, а все остальное - ложь. поэтому SÖPв результате работы truey ( 1) означает, что входное целое число равномерно делится на каждую из его цифр.
  • После просмотра û(палиндромизировать заданную строку) я был удивлен, что встроенного is_palindrome нет . Но позже я понял, что для выполнения этого требуется всего 2 байта ÂQ(где Âесть бифуркация, что сокращенно DR: Duplicate & Reverse copy; и Qэто проверка того, равны ли два верхних значения в стеке).
  • Если вы хотите отфильтровать список по нескольким вещам, обычно дешевле иметь несколько свободных фильтров, а не все объединенные в одном. Потому что, когда у вас есть два фильтра, вам нужно что-то вроде Ds*(дублировать, поменять местами, умножить, чтобы действовать как логическое И) против (закрыть первый фильтр, снова отфильтровать), когда вы используете два фильтра. Например: в этом задании мы должны перечислить все числа из четырех цифр длиной, содержащие как минимум один 0, и с суммой цифр, равной 9. Использование диапазона [1000,10000]охватывает число из четырех цифр, но затем у вас остается еще два фильтра. Изначально я использовал ₄4°ŸʒD0åsSO9Q*(14 байт), но с помощью двух фильтров можно сохранить ₄4°Ÿʒ0å}ʒSO9Qбайт : (13 байт). (Который позже получил в гольф ₄4°ŸεW°ö9Q(10 байт) @Grimy.)
  • Если вы хотите сжать с целым числом в 0качестве наполнителя, вы можете использовать . Однако одна проблема, связанная с этим, заключается в том, что заполнитель 0станет строкой "0", поэтому, если позже вы попытаетесь выполнить сортировку со смешанными строками и целыми числами, это, скорее всего, не даст желаемого результата. Вот пример того , как он будет сортировать заархивированные внутренние списки: 0ζ€{. Это может быть исправлено путем добавления явного приведения к Int ( ï) после того , как молния, и только потом вроде: 0ζï€{. Однако использование ¾константы as 0с zip-наполнителем приведет к тому, что оно будет оставаться целым числом вместо строки во время zip-заполнения. Так ¾ζ€{что сохранит байт здесь. Этот совет был предоставлен @ Mr.Xcoder для сохранения байта в этом моем ответе .
  • Если вы хотите суммировать цифры нескольких чисел в списке, вы можете использовать €SO. Короче, однако, используется , который автоматически векторизуется. Этот совет был предоставлен @Grimy для сохранения байта здесь2 байта здесь ).
  • Если вы имеете дело только с неотрицательными целыми числами и хотите проверить внутри фильтра, является ли он 0 или 1, вы, конечно, можете использовать очевидное 2‹. Однако использование !(факториала) также приведет только к 1 (истинно) для 0и 1, а любое другое значение приведет к чему-то более высокому (и, следовательно, к ошибкам, поскольку только 1верно в 05AB1E). Этот совет был предоставлен @Grimy для сохранения байта здесь .
Кевин Круйссен
источник
2

Автоматическая векторизация

Обратите внимание, что некоторые операторы в 05AB1E автоматически векторизуются для массивов. Например, код 5L3+, который разбирается на следующий псевдокод:

[1, 2, 3, 4, 5] + 3

станет:

[4, 5, 6, 7, 8]

Если он не векторизуется автоматически, вы также можете использовать оператор. Он принимает односимвольную команду и выполняет этот (монадический) оператор для каждого элемента. Примером разделения каждого элемента является следующий код ( попробуйте здесь ):

€S

В то время как нормальный Sоператор разделит каждый элемент в массиве и сведет его в один массив ( попробуйте здесь ).

Аднан
источник
Как вы назначаете n-й элемент в массиве?
Андрей Савиных
@AndrewSavinykh Прямо сейчас, нет встроенного для этого, но это то, что я хочу реализовать.
Аднан
@ Adnan Я нашел способ сделать это. Создайте другой список, который имеет значение, назначаемое также по n-му индексу. Затем объедините списки, используя ñпредшествующее значение n(индекс). tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
mbomb007
@ mbomb007 Это возможно, единственная проблема заключается в том, что впоследствии вы не можете изменить массив, поскольку команда слияния принимает в качестве аргументов только строки (и преобразует список в строку).
Аднан
2

Упорядочение входов

Порядок ввода данных может сильно повлиять на ваш код, и, часто, если вы используете, sчтобы поменять вершину стека на следующую самую высокую в стеке, вы не будете правильно думать о проблеме. Попробуйте переупорядочить входы и посмотрите, сможете ли вы избавиться от необходимости подмены, либо поменяв местами входные данные заранее, добавив их в стек ранее или дублируя их где-нибудь. Наиболее очевидный ввод-вывод может быть наименее успешным ответом 05AB1E.

Урна волшебного осьминога
источник
2

05AB1E ASCII-Art Гольф

Приведенный ниже код помогает превратить ASCII-art в 05AB1E с помощью пользовательского базового преобразования.

|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"

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

Это достигается путем:

  1. Перечисление уникальных символов в чертеже ASCII.
  2. Упорядочите их по тому, сколько раз они встречаются в строке в порядке убывания (чаще всего встречаются наименее встречающиеся символы).
  3. Поменяйте местами первые два элемента, если чертеж ASCII начинается с наиболее часто встречающегося символа (чтобы предотвратить начальные 0 в сжатом целом числе).
  4. Сопоставьте символы ввода 0-9A-Za-zв этом порядке, каждый отдельный символ получает свой собственный символ отображения, пока каждый из них не будет заменен.
  5. База сжимает его, используя самую высокую базу, которую нужно заменить (в зависимости от количества уникальных символов).
  6. База преобразовать его снова в базу-255 (для сжатия 05AB1E).
  7. Формат все в формате: •<compressed_integer>•“<sorted_distinct_characters>“ÅвJ.

Позволяет также компресс строковые кавычки "; Åвбудет использовать эту строку в базу-преобразования , используя сгенерированный целое число в строку в качестве пользовательской базы; и Jобъединит все эти символы в одну строку, которая выводится неявно.

Принимает шаблоны до 62 уникальных символов включительно, хорошо подходит для ASCII-искусства.
Чем меньше уникальных символов, тем лучше сжатие.


Пример вывода для рисования цифровой временной диаграммы XNOR (214 байтов, 9 уникальных символов):

    ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐  
A ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
  ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐
B ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
    ┌─────┐   ┌─┐   ┌─┐   ┌───┐   
X ──┘     └───┘ └───┘ └───┘   └────

Было бы:

05AB1E , 106 байт

•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ

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

(106/214) * 100 = 49,53% размера исходной строки ASCII-art.

Это то же количество байтов, что и в моей реальной заявке на этот вызов в 05AB1E (устаревшее).


Объяснение кода:

ПРИМЕЧАНИЕ: Код абсолютно не в гольфе. Это быстро написано, чтобы преобразовать искусство ASCII в наиболее эффективное сжатие, так что это довольно уродливо и долго.

               # Take multi-line input
  ©              # Store it in the register to reuse later                         
ÐÙS              # Only leave unique characters (as list)
   DŠ¢ø          # Map it with the count for each of those characters
       Σθ}R      # Sort it based on that count (highest to lowest)
           €н    # Remove the count again, so the sorted characters remain
¬®sÅ?i           # If the input starts with the most occurring character:
      D2£RDŠKsì} #  Swap the first two characters in the list
J©               # Join everything together, and store it in the register to reuse later
  žLR           # Map each character to [0-9A-Za-z]
      ®gö        # Get the amount of unique characters, and convert it to that Base
         B      # And then convert that to Base-255
®s               # Push the string and swap so the compressed integer is at the top again
  "•ÿ•“ÿ“ÅвJ"    # Insert it in the correct output format
                 #  `•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ`
"•ÿ•"            # (after which the result is output implicitly with trailing newline)
Урна волшебного осьминога
источник
1
Кстати, поскольку 05AB1E изменил кодовую страницу, максимальная база изменилась с 214 до 255 .
Аднан
1
Возможно, что-то добавить к вашему ответу (или изменить генератор с помощью), но если в искусстве ASCII используется менее 10 различных символов, вы можете сыграть в гольф двумя байтами. Т.е. ваш генератор выдает это 22 байта , но вместо этого он может быть и этим 20 байтами .
Кевин Круйссен,
@KevinCruijssen Идея заключалась в том, что я пытался донести, не особо утверждая, что генератор - это что-то хорошее: P. Я искренне сомневаюсь, что это все еще работает на osabie. Я написал это давно!
Волшебная Осьминог Урна
@MagicOctopusUrn Не уверен, работает ли он в перезаписи Elixir, но он все еще работает в прежней версии. Я уже отредактировал Base-214 для Base-255 примерно наполовину год назад, как было упомянуто в комментарии Аднана выше. Кроме того, он прекрасно работает, и я использовал его несколько раз (хотя игра в гольф каждый раз дальше.;)). Генерация как строки, так и числа отлично работает!
Кевин Круйссен
Вот улучшенная версия. (Очень некрасиво и быстро написано, но работает). Это сделало бы ваш пример 108 байтами вместо 113. Я сделал следующие улучшения: сначала отсортировал отдельные символы по наивысшему вхождению (если только наибольшее вхождение не является первым символом, в этом случае он поменяет местами два верхних символа), чтобы сжать сжатые символы. целое число как можно меньше; используя <str><compr_int><int>вèJвместо вашего <compr_int><int>BžLR<str>‡; и использование вместо "строковых кавычек, так что "может быть частью ввода.
Кевин Круйссен
1

Строки и целые равны

Не то, с чем все согласны, но это работает.

Рассмотрим следующие две программы:

4 5+
"4""5"+

Они оба приводят к 9 . Это потому, что каждое значение сначала оценивается (сast.literal_eval ). Из-за этого мы можем выполнять все операторы манипуляции со строками в строках и все операторы манипуляции со строками в строках.

Например, 12345ûpalindromizes числа 12345, в результате чего 123454321. После этого мы можем сделать обычную математику по этому номеру.

12345û50000-

Это приведет к: 123404321 .

Аднан
источник
0

Скрытые циклы и итераторы

05AB1E имеет следующие нормальные циклы и итераторы:

  • F, который перебирает 0 .. n-1 .
  • G, который перебирает 1 .. n-1 .
  • ƒ, который перебирает 0 .. n .
  • v, который перебирает каждый элемент s [0], s [1], .., s [n] .
  • ʒ, который является не просто циклом, а командой filter-by . Мы злоупотребляем этой командой из-за непреднамеренного поведения циклического прохождения каждого элемента.

Используя эти циклы, мы можем получить следующие скрытые циклы :

  • Вместо gFвы можете использовать vкоторый также имеетN -index, который можно использовать.
  • vy -> ʒЗамена немного сложнее:
    • Вам необходимо немедленно распечатать результаты. Это превосходит автоматическую печать от печати верхней части стопки.
    • Фрагмент кода запускается в новом временном стеке . Это означает, что зависящие от стека фрагменты не могут быть использованы.
    • yВ таких циклах вызов невозможен.
Аднан
источник
Я знаю, что это было опубликовано год назад, но нет [, µа εтакже является частью обычных циклов / итераций?
Кевин Круйссен,
Кроме того, yтеперь можно вызывать некоторые из них.
Волшебная Урна Осьминога