Есть ли у вас какие-либо советы по коду-гольфу в 05AB1E , языке игры в гольф, созданном Аднаном ?
Ваши советы должны быть хотя бы несколько специфичны для 05AB1E.
Пожалуйста, оставьте один совет за ответ.
Есть ли у вас какие-либо советы по коду-гольфу в 05AB1E , языке игры в гольф, созданном Аднаном ?
Ваши советы должны быть хотя бы несколько специфичны для 05AB1E.
Пожалуйста, оставьте один совет за ответ.
Ответы:
Так как это не было частью 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#] '“,
Эта программа будет:
lAð«Ã#
), или переносит слова в списке, если было введено только одно слово ( ¸˜
)vyU
)"€...ï"Dâvy
), который он пытается запустить как 05AB1E program ( "“ÿ“".V
)XlQiy?1#
good bye world
Таким образом, с входом, выход будет “‚¿Þ¡‚ï“
. Попробуйте онлайн.
ПРИМЕЧАНИЕ. Вам все равно придется посмотреть, существует ли слово в словаре, чтобы этот генератор работал, и он будет игнорировать любые специальные символы или множественные слова. Будут найдены только слова, которые точно совпадают в словаре.
Вот пример, где я использую …Ÿ™‚ï!
для строки "Привет мир!" и ’‚¿Þ¡ ÿ ‚ï!’
для строки "до свидания, мир!" Обратите внимание, как пробелы и восклицательный знак используются как есть, потому что у них нет индексов в файле info.txt. Кроме того, он использует ÿ
для вставки «жестокий», который был на вершине стека, который, к сожалению, не был частью словаря (но все еще был сжат с использованием метода в разделе ниже).
Хотя файл словаря words.ex довольно большой (10 000 слов, если быть точным), может случиться так, что вам понадобится слово, которое не является его частью, или строка, которая является просто бредом. Так есть ли способ их сжать?
Конечно, с помощью .•
сжатой строки из 255 алфавитов. ПРИМЕЧАНИЕ. Этот метод можно использовать только для символов в нижнем регистре алфавита и пробелов.
Вот полезная программа для преобразования слова / строки в сжатую строку на основе алфавита base-255:
vAyk})> 27β 255B ".•ÿ•"
Что делает эта программа выше:
vAyk})>
: Возьмите индексы алфавита с 1 индексом отдельных букв ввода, с пробелами, становящимися индексом 027β
: Преобразовать эти индексы из базы 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 байтов (сжатый список целых чисел, вместо двоичного2в
, который неявно включается)[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]
( используется в этом моем ответе ):
•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
составляет 57 байт (генерируется генератором сжатого целого списка)•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø
JδŠ₂ + Öηôî®À8 † 6 / ÎÎ6ùøΓ ° ÓĆ; ˆ © Ā • 2ô` также составляет 57 байтов (сжатое целое число, разбитое на части размера 2)•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ
,λ₂ϦP(Ì•65в₂+
однако на 2 байта короче, сжимая список с каждым значением на 26 ниже, а затем добавляя его потом с помощью `₂ + ` . Этот трюк добавления однобайтового значения позже можно использовать довольно часто для сохранения байтов в сжатых списках.В те времена, когда был выпущен 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.
£
это команда для получения первых b
символов строки a
.
например: "hello_world"5£
->
"hello"
Но если b
это список индексов, он вместо этого разбивает строку на части (до) этих размеров.
например: "hello_world"5L£
->
['h', 'el', 'lo_', 'worl', 'd']
Они немного спрятаны в 05AB1E. Вот список всех предопределенных переменных:
¾
, толкает, 0
если counter_variable не был изменен перед этой командой.X
, толкает, 1
если переменная X не была изменена перед этой командой с U
.Y
, толкает, 2
если переменная Y не была изменена перед этой командой с V
.®
, нажимает, -1
если регистр не был изменен перед этой командой, с помощью ©
.¯
, толкает []
(пустой массив), если ничего не добавлено в global_array перед этой командой.¸
, выдвигает [""]
пустой стек, если нет ввода. (Спасибо @Emigna за то, что нашли это.)¾
толкает 0 => это почти не мнемоническое, как это получается
¾
толкает переменную счетчика, которая инициализируется как 0. Если вы хотите только нажать 0, 0, конечно, более естественно, но если вы хотите нажать 5,0,7
, 5¾7
это на 2 байта меньше, чем 5 0 7
.
¾
означало .75
, и я однажды победил Пифта с этим фактом . Эти новомодные языки игры в гольф не имеют ни малейшего представления о мнемонике ...
print(3 / 4)
в Python 2 дает мне 0
.
M
толкает -Inf
.
Λ
или .Λ
)Поскольку он не был частью документации, и @Adnan в настоящее время слишком занят, чтобы писать его, я попросил разрешения добавить его в качестве подсказки здесь.
Функция Canvas ( Λ
или .Λ
) может использоваться для рисования ASCII-линий на экране. У него есть три обязательных параметра:
[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]
Это даст следующий вывод:
!@#!@#!
# @
@ #!@ #
! @ # !
# ! ! @
@ @ #
!#@!# !
@
@!#@!#@!#
Итак, как это работает? Ну, вот шаги с этими входами выше:
3
символы ( !@#
) вверх (направление 0
)3-1
символы ( !@
) вправо (направление 2
)5-1
символы ( #!@#
) вниз (направление 4
)5-1
символы ( !@#!
) влево (направление 6
)7-1
символы ( @#!@#!
) вверх (направление 0
)7-1
символы ( @#!@#!
) вправо (направление 2
)9-1
символы ( @#!@#!@#
) вниз (направление 4
)9-1
символы ( !@#!@#!@
) влево (направление 6
)-1
Есть , так как линии пересекаются. Итак, первые два шага:
#
@
!
А также
!@
Что в сочетании это:
#!@
@
!
Некоторые небольшие заметки:
[0,7]
есть несколько конкретных опций, которые в основном переводят в определенную последовательность направлений.
+
( '+
inline) переводится в шаблон 04402662
, который создает +
крест на плечах заданной длины.Смотрите это в действии.×
( '×
inline) переводится в шаблон 15513773
, который создает X
крест на плечах заданной длины.Смотрите это в действии.8
возвращает к началу координат, откуда мы начали рисовать. Увидеть его в действии и увидеть разницу без8
.Λ
Выход немедленно, и.Λ
результате строка, которая будет помещена в стек, которую мы все еще сможем использовать, модифицировать и делать с ней все, что захотим. Некоторые примеры:
+×8
я действительно смотрел в исходном коде.
Как и в других языках стека на основе функции 05AB1E обычно поп (потребляет) их входы из стека и проталкивают свои выходы на стек.
Однако некоторые функции получают свои входные данные из стека, не потребляя их. Примером является head
функция, ¬
которая создает первый элемент из списка ввода. Смотрите пример программы здесь: ¬+
. Это добавляет первый номер списка ввода к каждому номеру этого списка.
Чтобы узнать, какие функции всплывают, а какие получают, смотрите соответствующий столбец в файле информации о функциях .
Циклы и условные выражения автоматически получают закрывающие скобки в конце программы, поэтому вам нужно только добавлять их в код, если вам нужно что-то вне цикла / условного выражения.
Например, эта (не зачищенная) программа, создающая список первых n
простых чисел, не нуждается в закрывающих скобках.
[¹¾Q#NpiNˆ¼
Но если мы хотим выполнить какую-то операцию с результирующим списком, например, с использованием дельты, нам нужно сначала закрыть цикл.
[¹¾Q#NpiNˆ¼]¯¥
Расширим это с маленькими подсказками гольфа, которые я изучил по пути. (Только что начал 05AB1E лично.)
D
(duplicate) и Ð
(triplicate) в сочетании с s
(swap) и Š
(triple-swap a,b,c
to c,a,b
) обычно короче, чем использование ©
(save in global_variable ) и ®
(push global_variable ) внутри циклов. Это спасло байт в этом моем ответе , а также два в этом моем ответе .½
(если 1, то увеличить counter_variable на 1) нет необходимости в конце a µ
(тогда как counter_variable ! = a, do ...), так как это сделано неявно ( в этом моем ответе был сохранен байт )..B
неявно расщепляется на новые строки. Это было полезно в моем ответе, когда мы искали альтернативу¡
(разделить), сохраняя при этом пустые элементы (ПРИМЕЧАНИЕ. Решение в связанном ответе не работает, когда элементы содержат завершающие пробелы после разделения.) - Надеюсь, встроенная функция быть добавленным, чтобы разделить, но оставить пустые строки в будущем.SÖ
(какая из цифр входного целого числа может равномерно делить входное целое число) будет содержать само число для цифр 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"
, поэтому, если позже вы попытаетесь выполнить сортировку со смешанными строками и целыми числами, это, скорее всего, не даст желаемого результата. Вот пример того , как он будет сортировать заархивированные внутренние списки: 0ζ€{
. Это может быть исправлено путем добавления явного приведения к Int ( ï
) после того , как молния, и только потом вроде: 0ζï€{
. Однако использование ¾
константы as 0
с zip-наполнителем приведет к тому, что оно будет оставаться целым числом вместо строки во время zip-заполнения. Так ¾ζ€{
что сохранит байт здесь. Этот совет был предоставлен @ Mr.Xcoder для сохранения байта в этом моем ответе .€SO
. Короче, однако, используется 1ö
, который автоматически векторизуется. Этот совет был предоставлен @Grimy для сохранения байта здесь (и 2 байта здесь ).2‹
. Однако использование !
(факториала) также приведет только к 1 (истинно) для 0
и 1
, а любое другое значение приведет к чему-то более высокому (и, следовательно, к ошибкам, поскольку только 1
верно в 05AB1E). Этот совет был предоставлен @Grimy для сохранения байта здесь .Обратите внимание, что некоторые операторы в 05AB1E автоматически векторизуются для массивов. Например, код 5L3+
, который разбирается на следующий псевдокод:
[1, 2, 3, 4, 5] + 3
станет:
[4, 5, 6, 7, 8]
Если он не векторизуется автоматически, вы также можете использовать €
оператор. Он принимает односимвольную команду и выполняет этот (монадический) оператор для каждого элемента. Примером разделения каждого элемента является следующий код ( попробуйте здесь ):
€S
В то время как нормальный S
оператор разделит каждый элемент в массиве и сведет его в один массив ( попробуйте здесь ).
ñ
предшествующее значение n
(индекс). tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
Порядок ввода данных может сильно повлиять на ваш код, и, часто, если вы используете, s
чтобы поменять вершину стека на следующую самую высокую в стеке, вы не будете правильно думать о проблеме. Попробуйте переупорядочить входы и посмотрите, сможете ли вы избавиться от необходимости подмены, либо поменяв местами входные данные заранее, добавив их в стек ранее или дублируя их где-нибудь. Наиболее очевидный ввод-вывод может быть наименее успешным ответом 05AB1E.
Приведенный ниже код помогает превратить ASCII-art в 05AB1E с помощью пользовательского базового преобразования.
|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"
Это достигается путем:
0-9A-Za-z
в этом порядке, каждый отдельный символ получает свой собственный символ отображения, пока каждый из них не будет заменен.•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ
.“
Позволяет также компресс строковые кавычки "
; Åв
будет использовать эту строку в базу-преобразования , используя сгенерированный целое число в строку в качестве пользовательской базы; и J
объединит все эти символы в одну строку, которая выводится неявно.
Принимает шаблоны до 62 уникальных символов включительно, хорошо подходит для ASCII-искусства.
Чем меньше уникальных символов, тем лучше сжатие.
Пример вывода для рисования цифровой временной диаграммы XNOR (214 байтов, 9 уникальных символов):
┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐
A ──┘ └─┘ └─┘ └─┘ └─┘ └─┘ └──
┌───┐ ┌───┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐
B ┘ └─┘ └─┘ └─┘ └───┘ └─┘ └
┌─────┐ ┌─┐ ┌─┐ ┌───┐
X ──┘ └───┘ └───┘ └───┘ └────
Было бы:
•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)
<str><compr_int><int>вèJ
вместо вашего <compr_int><int>BžLR<str>‡
; и использование “
вместо "
строковых кавычек, так что "
может быть частью ввода.
Не то, с чем все согласны, но это работает.
Рассмотрим следующие две программы:
4 5+
"4""5"+
Они оба приводят к 9 . Это потому, что каждое значение сначала оценивается (сast.literal_eval
). Из-за этого мы можем выполнять все операторы манипуляции со строками в строках и все операторы манипуляции со строками в строках.
Например, 12345û
palindromizes числа 12345
, в результате чего 123454321
. После этого мы можем сделать обычную математику по этому номеру.
12345û50000-
Это приведет к: 123404321 .
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
теперь можно вызывать некоторые из них.