Чи є які-небудь поради щодо кодового гольфу в 05AB1E , мові для гольфу, створеній Аднаном ?
Ваші поради повинні бути принаймні дещо конкретними для 05AB1E.
Будь ласка, опублікуйте одну пораду за кожну відповідь.
Чи є які-небудь поради щодо кодового гольфу в 05AB1E , мові для гольфу, створеній Аднаном ?
Ваші поради повинні бути принаймні дещо конкретними для 05AB1E.
Будь ласка, опублікуйте одну пораду за кожну відповідь.
Відповіді:
Оскільки він не був частиною Вікі на сторінках GitHub 05AB1E (я думаю, що це повинно бути), я просто додам його сюди зараз, коли я краще сам це зрозумію.
05AB1E має такий словниковий файл words.ex, що містить усі відомі йому слова. Але як ми отримуємо доступ до слів у цьому словнику? Візьмемо слово "testing"
як приклад:
"testing"
можна знайти в рядку 1453 файлу словника. Оскільки перші два рядки - це не слова, і нам потрібне слово-індексування 0, віднімаємо 3.
Отже, тепер у нас є індекс ( 1450
), але як ним користуватися?
Відкриваємо і запускаємо стиснуту рядок з “
† . Потім ми дивимось на другий стовпчик файлу info.txt . (Так €
є 00; ‚
є 01; і т.д.)
У випадку із "testing"
цим засобом î
(14) та »
(50).
Отже, стислий рядок "testing"
: “
спробуйте в Інтернеті. Як і майже у всіх кодах 05AB1E, трейлінг “
є необов'язковим, якщо ви не маєте доступу до рядка, тому без роботи також добре .
Деякі речі, які слід зазначити:
Усі символи, які не мають індексу у файлі info.txt, можуть використовуватися як є. Це може бути корисно для додавання s
до виводу множини замість однини слова або використання розділових знаків, як, ,.?!
наприклад,.
ÿ
(string-interpolation) також можна використовувати, коли ви хочете вставити значення з стека всередині рядка.
ПРИМІТКА. Кожен вільний символ, який не має індексу у файлі info.txt, вважається словом для типів стиснення, наведених нижче.
† Можна використовувати різні типи стислих рядків:
'
: Візьміть одне стиснене слово, як є (не '
потрібно тривати третій) - 'î»
: "тестування"„
: Бере два стислих слова з роздільником пробілу (не „
потрібно тривалість ) - „î»î»
: "тестування тестування"…
: Бере три стислих слова з роздільником пробілу (не …
потрібно тривати ) - …î»î»î»
: "тестування тестування тестування"“
: Візьміть стиснуту рядок з роздільником пробілу - “î»î»“
: "тестування тестування"’
: Візьміть стиснуту рядок так само, як без неявних пробілів - ’î»î»’
: "testingtesting"”
: Візьміть стислий рядок у великому регістрі з роздільником пробілу - ”î»î»”
: "Тестування тестування"‘
: Візьміть стиснуту рядок у верхньому регістрі з роздільником пробілу - ‘î»î»‘
: "TESTING TESTING"Ось корисна програма для отримання стислого рядка на основі введеного пробілом слів:
'“? lAð«Ã#¸˜ vyU "€‚ƒ„…†‡ˆ‰Š‹ŒŽ•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîï" Dâ vy"“ÿ“".V XlQi y?1#] '“,
Ця програма:
lAð«Ã#
) або загортаєте слова в список, якщо було введено лише одне слово ( ¸˜
)vyU
)"€...ï"Dâvy
), який він буде намагатися запустити як програма 05AB1E ( "“ÿ“".V
)XlQiy?1#
Таким чином, із введенням good bye world
буде вихід “‚¿Þ¡‚ï“
. Спробуйте в Інтернеті.
ПРИМІТКА. Ви все ще повинні побачити, чи існує слово у словнику для того, щоб цей генератор працював, і він буде ігнорувати будь-які спеціальні символи чи множинні слова. У словнику знайдуться лише ті самі слова, які є абсолютно однаковими.
Ось приклад, де я використовую …Ÿ™‚ï!
для рядка "привіт світ!" а ’‚¿Þ¡ ÿ ‚ï!’
для рядка "до побачення ÿ світі!". Зверніть увагу, як пробіли та знаки оклику використовуються, оскільки вони не мають індексів у файлі info.txt. Крім того, він використовує ÿ
для вставки "жорстокого", який знаходився у верхній частині стека, який, на жаль, не був частиною словника (але все ще стискався за допомогою методу в розділі нижче).
Хоча файл словника word.ex досить великий (10 000 слів, якщо бути точним), може статися, що вам потрібне слово, яке не є його частиною, або рядок, який є просто простим. То чи існує спосіб їх також стиснути?
Звичайно, за допомогою використання .•
є стислий рядок на основі алфавіту base-255. ПРИМІТКА. Цей метод можна використовувати лише для символів з рядкового алфавіту та пробілів.
Ось корисна програма для перетворення слова / рядка в стислий рядок на основі алфавіту base-255:
vAyk})> 27β 255B ".•ÿ•"
Що робить ця програма вище:
vAyk})>
: Візьміть 1-проіндексовані алфавітні індекси окремих літер введення, пробіли стають індексом 027β
: Перетворіть ці індекси з бази 27 в єдине число255B
: Перетворіть цей номер у Base-255, використовуючи власну кодову сторінку 05AB1E".•ÿ•"
: Розташовує ведучий .•
і кінцевий •
перед цим стислим рядкомОсь приклад відповіді, де @Kaldo використовує .•zíΘ•
для стиснення слова "гуска".
Скажімо, ми хочемо використати дуже велику кількість для чогось, але це не може бути реально отримано пороховими розрахунками. Наприклад, скажімо, що ми хочемо отримати доступ до великого цілого числа 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"•ÿ•ÿв"
: Повертає результат у форматі: провідне •
, стиснене число •
,, max + 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 Λ
із такими трьома параметрами:
[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]
, є кілька певних варіантів, які в основному перекладаються на певну послідовність напрямку.
+
( '+
вбудований) перекладається на візерунок 04402662
, який створює +
-крест зі зброєю заданої довжини. Побачити це в дії.×
( '×
вбудований) перекладається на візерунок 15513773
, який створює X
-крест зі зброєю заданої довжини. Побачити це в дії.8
повертається до початку, з якого ми почали малювати. Дивіться це в дії та бачите різницю без значень8
.Λ
Вихід відразу, і .Λ
призводить рядок , яка виштовхується в стек, який ми все ще можемо повторно використовувати, модифікувати і зробити що - небудь з цим ми б хотіли. Деякі приклади:
+×8
я справді заглянув у вихідний код.
Як і в інших мовах, що базуються на стеках, функції 05AB1E зазвичай поп (споживають) свої входи зі стека і виштовхують свої виходи на стек.
Однак деякі функції отримують свої входи зі стеку, не витрачаючи їх. Прикладом є head
функція, ¬
яка виробляє перший елемент зі списку вхідних даних. Дивіться приклад програми тут: ¬+
. Це додає перше число списку вводу до кожного номера цього списку.
Щоб знати, які функції з'являються та які отримуються, див. Відповідний стовпець у файлі інформації про функції .
Цикли і умовні умови автоматично отримують дужки, що закриваються, наприкінці програми, тому вам потрібно додати їх у код лише тоді, коли вам потрібно щось, що знаходиться поза циклом / умовно.
Наприклад, цій програмі, що не працює, створюючи список перших n
простих чисел, не потрібно закривати дужки.
[¹¾Q#NpiNˆ¼
Але якби ми хотіли виконати якусь операцію з отриманого списку, наприклад, взявши дельту, нам потрібно було б спочатку закрити цикл.
[¹¾Q#NpiNˆ¼]¯¥
Буду розширювати це невеликими порадами щодо гольфу, які я навчився на цьому шляху. (Тільки що розпочався особисто 05AB1E.)
D
(дублікат) та Ð
(триразовий) у поєднанні із s
(swap) та Š
(потрійний swap a,b,c
на c,a,b
) зазвичай коротші, ніж використання ©
(збереження у global_variable ) та ®
(push global_variable ) всередині циклів. Це зберегло байт у цій моїй відповіді , а також два у цій моїй відповіді .½
(якщо 1, то збільшити counter_variable на 1) не потрібно в кінці µ
(хоча counter_variable ! = a, do ...), оскільки це робиться неявно ( збережений байт у цій моїй відповіді )..B
неявно розбивається на нові рядки. Це було корисно у моїй відповіді, коли ми шукали альтернативу для ¡
(розділення), зберігаючи порожні елементи (ПРИМІТКА. Рішення у пов'язаній відповіді не працює, коли елементи містять пробіли після розщеплення.) - Сподіваємось, вбудований додавати для розбиття, але залишати порожні рядки в майбутньому.SÖ
(яка з цифр вхідного цілого числа може рівномірно розділити вхід-ціле число) буде містити саме число для цифр 0
(замість помилок поділки на нуль). Наприклад, у 1053
результаті вийде[1,1053,0,1]
(1053 ділиться на 1 і 3; не ділиться на 5; дає помилку поділу на нуль на 0). Це було досить корисно у цій моїй відповіді, взявши силу списку, оскільки тільки 1
є правдою в 05AB1E, а все інше - фальси. SÖP
в результаті чого truthy ( 1
) означає, що вхідне ціле число рівномірно поділяється кожною з його цифр.û
(паліндромізуючи заданий рядок), я здивувався, що немає вбудованого is_palindrome . Але згодом я зрозумів, що для досягнення цього потрібні лише 2 байти, які є ÂQ
(де Â
є роздвоєне, що скорочено DR
: Копіювати та обернути копію; і 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ζï€{
. Однак, використовуючи ¾
як константу 0
з zip-заповнювачем, це призведе до того, що воно залишиться цілим числом, а не рядком під час zip. Так ¾ζ€{
ви збережете тут байт. Цю пораду надав @ Mr.Xcoder, щоб зберегти байт у цій моїй відповіді .€SO
. Однак коротше використання 1ö
, яке автоматично векторизується. Цю пораду надав @Grimy, щоб зберегти тут байт (і 2 байти тут ).2‹
. Однак використання !
(факториалу) також призведе до лише 1 (truthy) для 0
і 1
, і будь-яке інше значення призведе до чогось вищого (і, таким чином, фальси, оскільки тільки 1
є truthy в 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
для того, щоб поміняти верхню частину стека наступною найвищою справою на стеку, ви не думаєте про проблему правильно. Спробуйте змінити порядок введення даних і дізнайтеся, чи зможете ви позбутися від необхідності заміни, або заміняючи входи заздалегідь, додаючи її до стеку раніше або дублюючи її десь. Найбільш очевидний I&O може бути найменш вдалою відповіддю 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
.“
Дозволяє також компрес рядкові лапки "
; the Åв
буде використовувати цю рядок для базової конвертації згенерованого цілого числа, використовуючи рядок як власну базу; і J
приєднає всі ці символи разом до однієї строки, яка виводиться неявно.
Приймає візерунки, що містять до 62 унікальних символів, добре для ASCII-art.
Чим менше кількість унікальних символів, тим краще стиснення.
Приклад виводу для малювання цифрової діаграми часу 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
). Через це ми можемо виконувати всі оператори маніпулювання рядками на ints та всі оператори int маніпуляції на рядках.
Наприклад, 12345û
паліндромізує число 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
зараз можна отримати посилання на деякі з них.