Поради для гольфу в 05AB1E


28

Чи є які-небудь поради щодо в 05AB1E , мові для гольфу, створеній Аднаном ?

Ваші поради повинні бути принаймні дещо конкретними для 05AB1E.

Будь ласка, опублікуйте одну пораду за кожну відповідь.


2
З огляду: Підказки щодо питань на тему.
mbomb007

Відповіді:


20

Оскільки він не був частиною Вікі на сторінках 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#] '“,

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

Ця програма:

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

Таким чином, із введенням good bye worldбуде вихід “‚¿Þ¡‚ï“. Спробуйте в Інтернеті.

ПРИМІТКА. Ви все ще повинні побачити, чи існує слово у словнику для того, щоб цей генератор працював, і він буде ігнорувати будь-які спеціальні символи чи множинні слова. У словнику знайдуться лише ті самі слова, які є абсолютно однаковими.

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

Як стискати рядки, що не входять до словника?

Хоча файл словника word.ex досить великий (10 000 слів, якщо бути точним), може статися, що вам потрібне слово, яке не є його частиною, або рядок, який є просто простим. То чи існує спосіб їх також стиснути?
Звичайно, за допомогою використання .•є стислий рядок на основі алфавіту base-255. ПРИМІТКА. Цей метод можна використовувати лише для символів з рядкового алфавіту та пробілів.

Ось корисна програма для перетворення слова / рядка в стислий рядок на основі алфавіту base-255:

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

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

Що робить ця програма вище:

  • vAyk})>: Візьміть 1-проіндексовані алфавітні індекси окремих літер введення, пробіли стають індексом 0
  • 27β: Перетворіть ці індекси з бази 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 байт (стислий цілий список, а не двійковий, а не , який неявно приєднується)

[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']


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.
Емінья

7
Повернувшись, я ¾мав на увазі .75, і я одного разу переміг Піта тим фактом . Ці новомодні мови для гольфу не мають поняття про мнемоніку ...
ETHproductions

31
Поняття не маю, про що ви всі говорите: с. print(3 / 4)в Python 2 дає мені 0.
Аднан

2
Якщо на початку, Mштовхає -Inf.
mbomb007

7

Використання полотна ( Λабо )

Оскільки він не входив у документи, а @Adnan наразі трохи зайнятий, щоб написати його, я попросив дозволу додати його як підказку наразі.

Функцію Canvas ( Λабо ) можна використовувати для малювання ASCII-рядків на екрані. Він має три необхідні параметри:

  • a Довжина: розмір рядків. Це може бути одне ціле число або список цілих чисел
  • b Рядок: символи, які ми хочемо відобразити. Це може бути один символ, рядок, список символів або список рядків (в останніх трьох випадках він буде використовувати їх усі окремо, включаючи обертання)
  • c Напрямок: напрямок, в якому слід малювати лінії символів. Загалом у нас є цифри[0,7]для напрямків, для яких ми можемо використовувати один або кілька. Існують також деякі спеціальні параметри, які потребують певного символу (докладніше про це пізніше).

Цифри напрямків [0,7]відображаються до таких напрямків:

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

Деякі приклади 05AB1E відповідають, де використовується полотно:

Давайте зробимо щось подібне до останнього, тож припустимо, що ми використовуємо функцію Canvas Λіз такими трьома параметрами:

  • a :[3,3,5,5,7,7,9,9]
  • б :!@#
  • c :[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ˆ¼]¯¥


3

Невеликі підказки для гольфу 05AB1E

Буду розширювати це невеликими порадами щодо гольфу, які я навчився на цьому шляху. (Тільки що розпочався особисто 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неявно розбивається на нові рядки. Це було корисно у моїй відповіді, коли ми шукали альтернативу для ¡(розділення), зберігаючи порожні елементи (ПРИМІТКА. Рішення у пов'язаній відповіді не працює, коли елементи містять пробіли після розщеплення.) - Сподіваємось, вбудований додавати для розбиття, але залишати порожні рядки в майбутньому.
  • (яка з цифр вхідного цілого числа може рівномірно розділити вхід-ціле число) буде містити саме число для цифр 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ζ€{. Це може бути виправлено шляхом додавання явного приведення до Int ( ï) після того , як блискавка, і тільки потім на кшталт: 0ζï€{. Однак, використовуючи ¾як константу 0з zip-заповнювачем, це призведе до того, що воно залишиться цілим числом, а не рядком під час zip. Так ¾ζ€{ви збережете тут байт. Цю пораду надав @ Mr.Xcoder, щоб зберегти байт у цій моїй відповіді .
  • Якщо ви хочете підсумовувати цифри декількох чисел у списку, ви можете використовувати €SO. Однак коротше використання , яке автоматично векторизується. Цю пораду надав @Grimy, щоб зберегти тут байт2 байти тут ).
  • Якщо ви маєте справу лише з негативними цілими числами і хочете перевірити у фільтрі, чи це 0, чи 1, ви, звичайно, можете використовувати очевидні 2‹. Однак використання !(факториалу) також призведе до лише 1 (truthy) для 0і 1, і будь-яке інше значення призведе до чогось вищого (і, таким чином, фальси, оскільки тільки 1є truthy в 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 Це можливо, єдина проблема полягає в тому, що ви не можете змінити масив після цього, оскільки команда merge бере лише рядки як аргументи (і перетворює список у рядок).
Аднан

2

Впорядкування входів

Порядок, який ви вводите, може драматично вплинути на ваш код, і часто, якщо ви використовуєте sдля того, щоб поміняти верхню частину стека наступною найвищою справою на стеку, ви не думаєте про проблему правильно. Спробуйте змінити порядок введення даних і дізнайтеся, чи зможете ви позбутися від необхідності заміни, або заміняючи входи заздалегідь, додаючи її до стеку раніше або дублюючи її десь. Найбільш очевидний I&O може бути найменш вдалою відповіддю 05AB1E.


2

05AB1E ASCII-Art Golfing

Нижче наведений код допомагає перетворити ASCII-art у 05AB1E за допомогою перетворення на базі користувача.

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

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

Це здійснюється шляхом:

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

Дозволяє також компрес рядкові лапки "; the Åвбуде використовувати цю рядок для базової конвертації згенерованого цілого числа, використовуючи рядок як власну базу; і Jприєднає всі ці символи разом до однієї строки, яка виводиться неявно.

Приймає візерунки, що містять до 62 унікальних символів, добре для ASCII-art.
Чим менше кількість унікальних символів, тим краще стиснення.


Приклад виводу для малювання цифрової діаграми часу 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. Я написав це довгий час тому!
Magic Octopus Urn

@MagicOctopusUrn Не впевнений, чи працює він у перезаписі Elixir, але він, безумовно, все ще працює у застарілій версії. Я вже відредагував Базу-214 до Бази-255 приблизно вдвічі рік тому, як згадувалося в коментарі Аднана вище. Крім того, він працює чудово, і я користувався ним кілька разів (хоча гольфував це кожен раз далі.;)). Покоління і рядків, і номерів чудово працює!
Кевін Кройсейсен

Ось покращена версія. (Дуже потворно і швидко написано, але це працює). Це зробить ваш приклад 108 байтів замість 113. Я вдосконалив: сортуйте спочатку окремі символи за найвищим рівнем зустрічі (якщо найвищий показник не є першим символом; в такому випадку він поміняє місцями два найбільші символи), щоб стиснути ціле число якомога менше; використання <str><compr_int><int>вèJзамість вашого <compr_int><int>BžLR<str>‡; і використовуючи замість "строкових лапок, вони "можуть бути частиною вхідних даних.
Кевін Круїссен

1

Рядки та вставки є рівними типами

Не те, з чим всі згодні, але це працює.

Розглянемо наступні дві програми:

4 5+
"4""5"+

Вони обоє призводять до 9 . Це тому, що кожне значення спочатку оцінюється (з ast.literal_eval). Через це ми можемо виконувати всі оператори маніпулювання рядками на ints та всі оператори int маніпуляції на рядках.

Наприклад, 12345ûпаліндромізує число 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зараз можна отримати посилання на деякі з них.
Чарівна урва восьминога
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.