Поради щодо гольфу на вугіллі


15

Деревне вугілля - це мова, створена лише для ASCII та DLosc, яка спеціалізується на мистецьких викликах ASCII.

Які поради ви маєте щодо гольфу на вугіллі? Очевидно, я шукаю поради, пов’язані саме з вугільним вугіллям, а не з тих, які можна застосувати до більшості - якщо не всіх - мов.


Накрутите, я спробую зробити відповідь на вугілля на щось, брб. Можливо, я можу дати незначні покажчики на цю нитку.
Magic Octopus Urn

Відповіді:


5

Скористайтеся девербосифікатором

Використання deverbosifier означає, що ви можете писати в ASCII ( --dvабо --deverbosifyдевербосифікувати, -vабо --verboseвиконувати як багатослівний код). Крім того, він стискає рядки для вас, що може бути корисним у деяких викликах ASCII-art, коли рядок для стискання занадто довгий.

@Neil рекомендує використовувати -vlабо -v --sl. Це короткий термін --verbose --showlength, тобто він буде інтерпретуватися як багатослівний вугілля, і буде показана довжина звичайного коду деревного вугілля. Крім того, при девербосифікації перевірте вихід, щоб переконатися, що вхід був фактично проаналізований, оскільки вугілля зазвичай ігнорує помилки розбору. Якщо є синтаксична помилка, використовуйте -a( --astify) або --oa( --onlyastify), щоб допомогти з'ясувати проблему.


Надалі до цього я рекомендую використовувати -v -sl. Також при девербосифікації перевірте вихід, щоб переконатися, що вхід насправді проаналізовано правильно, оскільки ви не завжди отримуєте помилку розбору.
Ніл

3

Використовуйте перевантаження

Наприклад, для багатьох команд потрібен лише один аргумент:

  • Rectangle, Oblongі Boxскладіть квадрат, якщо наведено лише один аргумент
  • Reflect команди за замовчуванням для відображення права
  • Rotate команди за замовчуванням до 90 градусів проти годинникової стрілки
  • Polygonі PolygonHollowможе приймати багатонаправлену і бічну довжину. Це можна використовувати, якщо всі сторони однакової довжини.

Я дізнався цей факт PolygonHollowвипадково. Ви навіть можете мати декілька багатонаправлених, але вони повинні бути перед звичайними стрілками (я не знаю, чи є це обмеження навмисним). Я це використав у своїй відповіді на виклик "Намалюй кубик".
Ніл

Гм, обмеження якесь навмисне, але, мабуть, я мусив би його змінити, бо це все одно не зашкодить
лише ASCII

Я бачу, ви виправили багатокутник приймати стрілки та багатонаправлення в будь-якому порядку, дякую! Поки я тут, я очікував ReflectButterfly dlsзателефонувати ReflectButterflyв кожному напрямку, але (як вікі правильно документує) він насправді дзвонить ReflectOverlap.
Ніл

@Neil lol ой, я спробую виправити це якнайшвидше (я думаю, що це збіг теж ха-ха)
лише ASCII

3

Уникайте послідовних констант одного типу

Наприклад, Plus(Times(i, 2), 1)перекладається як ⁺×鲦¹, але байт можна зберегти, перемикаючи параметри: Plus(1, Times(i, 2))перекладає як ⁺¹×ι²і Plus(Times(2, i), 1)як ⁺ײι¹обидва, які зберігають байт. Plus(1, Times(2, i))(що перекладається як ⁺¹×²ι) було б ще краще, якби за ним була інша числова константа.


3

Використовуйте заздалегідь задані змінні

Ось перелік усіх змінних, які можна використовувати, даючи короткий грецький лист та багатослівне письмо, яке його представляє.

α/a: The uppercase alphabet
β/b: The lowercase alphabet
γ/g: A string of all the ASCII characters from space to ~
δ/d: The fifth input
ε/e: The fourth input
ζ/z: The third input
η/h: The second input
θ/q: The first input
υ/u: An empty array
φ/f: 1000
χ/c: 10
ψ/y: The null character
ω/w: The empty string

Змінні, що представляють вхідні дані, будуть порожніми, якщо існує недостатньо вводу, але всі інші змінні, не показані тут, повинні бути призначені перед використанням.


Це слід виправити на TIO зараз, було б добре, якщо ви могли б переконатися, що воно працює
лише ASCII

@ ASCII-тільки Ви можете це підтвердити, yі fчи навпаки від того, що я вставив? (Я, можливо, неправильно прочитав грецькі букви, коли писав це спочатку.)
Ніл

Так, вони навпаки
лише ASCII

3

Вивчіть свої роздуми та обертання

Існує безліч варіацій основного відбиття та обертання, тому варто знати, які тонкі відмінності. Ключ до таблиць:

  • Команда: Назва команди в режимі багатослівної.
  • Перетворити: чи повинен вугільний вугілля намагатися перевертати або обертати персонажів у міру їх дзеркального відображення чи обертання. Наприклад, /може ставати \після обертання або перевертання.
  • Зберігайте оригінал: чи повинен Деревне вугілля об'єднати результат з оригінальним полотном.
  • Перекриття: (застосовується лише тоді, коли Keep Original є Так.) Визначає положення осі відбиття / обертання, наполовину символів від межі. У випадку роздумів, що еквівалентно кількості рядків / стовпців, які не впливають, і закінчуються в середині результату. У разі обертання повернутою копією дозволяється перезаписати чіткі ділянки (але не пробіли) в оригіналі.

Роздуми

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Reflect                 | No        | No            | n/a     |
| ReflectCopy             | No        | Yes           | 0       |
| ReflectOverlap          | No        | Yes           | 1       |
| ReflectOverlapOverlap   | No        | Yes           | n       |
| ReflectTransform        | Yes       | No            | n/a     |
| ReflectMirror           | Yes       | Yes           | 0       |
| ReflectButterfly        | Yes       | Yes           | 1       |
| ReflectButterflyOverlap | Yes       | Yes           | n       |

Напрямок відображення необов’язковий. За замовчуванням - відобразити один раз праворуч. Для тих роздумів, які зберігають оригінал, дозволено кілька напрямків, які просто повторюють команду для кожного напрямку. (Це означає, що, наприклад ReflectMirror(:¬), фактично буде створено чотири копії.)

Курсор переміщується разом із відображенням (навіть коли зберігається оригінал).

Обертання

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Rotate                  | No        | No            | n/a     |
| RotateCopy              | No        | Yes           | 0       |
| RotateOverlap           | No        | Yes           | 1       |
| RotateOverlapOverlap    | No        | Yes           | n       |
| RotateTransform         | Yes       | No            | n/a     |
| RotatePrism             | Yes       | Yes           | 0       |
| RotateShutter           | Yes       | Yes           | 1       |
| RotateShutterOverlap    | Yes       | Yes           | n       |

Для тих обертів, які зберігають оригінал, є необов'язкове походження обертання. За замовчуванням - справа внизу полотна. Допустимі значення мають будь-який діагональний напрямок.

Кількість обертання (з кроком 45 °) необов’язково. За замовчуванням - 2, тобто 90 ° проти годинникової стрілки (проти годинникової стрілки). Для тих обертів, які зберігають оригінал, є два альтернативних варіанти: багатозначне ціле число задає поворот полотна один раз для кожної цифри, а потім об'єднання результатів, тоді як цілий список просто повторює команду для кожного обертання з змінними результатами залежно від того, як полотно змінюється між ними.


Питання: Що Transformозначає?
CalculatorFeline

@CalculatorFeline Добре запитання. Випадки, коли Transform is no - це просто копія символу. Наприклад, стандартне відображення "4> 2" - це лише символи у зворотному порядку, тобто "2> 4". Це не завжди бажано, тому Transform намагається переключити символи найбільш підходящим чином, таким чином, відображення "4> 2" перетвориться на "2 <4". Перетворення може бути не найкращим описом цього, тому сміливо пропонуйте щось краще.
Ніл

Не можете придумати нічого кращого, тому вам слід просто пояснити, як Transformпрацює десь у відповіді.
CalculatorFeline

@CalculatorFeline Я додав ключ до таблиці, на випадок, якщо й інші стовпці не були зрозумілі.
Ніл

Помилки слід виправити зараз. Також дуже дякую, що знайшли час, щоб написати це пояснення!
Лише ASCII

2

Використовуйте команди без символу команди

Виводиться вираз, який не є частиною команди.
Якщо йому передує напрямок, вираз друкується у вказаному напрямку.
Числа друкуються у вигляді рядка із заданою довжиною, використовуючи символ, вибраний із \/-|.

Якщо за виразом не слідує вираз, він рахується як переміщення на один пробіл у вказаному напрямку.

Примітка. Іноді це може зараховуватися як частина попередньої команди, тому символ команди може бути фактично необхідним. (дякую Нілу, що нагадав мені)


1
Ви повинні стежити за неясностями, оскільки попередня команда може приймати необов'язковий параметр.
Ніл

2

Використовуйте багатонаправлені

Деякі команди можуть приймати multidirectionals: +X*|-\/<>^KLTVY7¬⌊⌈. Те, що вони розширюють, є тут . Взагалі список напрямків починається від вгору і продовжується за годинниковою стрілкою.


Якась конкретна причина, чому деякі команди приймають багатонаправлені, а інші потребують списку напрямків? (Можливо, для цього є вагома причина, яку я оглядаю, але я намагався це зробити ReflectButtterflyOverlap(:¬, Modulo(g, 2));.)
Ніл,

@Neil Я не думаю, що зміниться якнайшвидше
лише ASCII

0

Повноцінно використовувати Sum

Sum має багато зручних перевантажень:

  • У списку рядків об'єднайте їх разом. Однак, якщо можливо, що список може бути порожнім, це дасть None, тому в цьому випадку використовуйте Join(..., "")замість цього.
  • У не порожньому списку чисел просто бере їх суму.
  • У не порожньому списку списуйте їх разом (згладжується на глибину 1).
  • За цілим числом приймає суму його цифр. (Значення з плаваючою комою обрізаються цілим числом. Якщо ви хочете суму десяткових знаків, спочатку переведіть на рядок.)
  • На рядок, що містить лише цифри і необов'язково один .символ, приймається сума цифр.
  • На рядок, що містить числа та роздільники, приймає суму відлічених чисел до int або float (але зауважте, що - вважається роздільником).

Зручним побічним ефектом останніх двох правил є те, що якщо ви використовуєте Sumсимвол, то цифри 1-9отримують значення, а все інше повертає нуль, на відміну від Cast, що не вдається для нецифрових значень.


0

Використовуйте split для рядкового масиву, split та cast для масиву чисел

Спліт для рядкового масиву - це лише три символи накладних даних, а розділення та передача - лише чотири символи накладних. Порівняйте це з написанням масиву буквально, що вимагатиме початку та кінця масиву та роздільника між кожним елементом масиву.

Якщо у вашому масиві чисел є лише числа менше 95, використовуйте клавішу (якщо всі числа менше 10) або індекс в одній із заздалегідь визначених змінних.


0

Використовуйте Filter, щоб вирізати перший символ з масиву чи рядка

Навіть якщо вам пощастить, використовуючи Sliceскибочку першого символу з рядка займає 2 байта: Slice(..., 1). Триватиме більше часу, якщо вираз, який буде нарізаний, закінчується числом, вимагаючи роздільника, або якщо наступний код можна інтерпретувати як вираз, як у цьому випадкуSlice потрібно буде використовувати його як додатковий параметр.

Натомість просто використовуйте Filter(..., k), що скидає перший елемент, тим самим досягаючи бажаного результату. (Очевидно, використовуйте відповідну змінну індексу циклу, якщо вираз вкладено в інший цикл.) Це завжди 2 байти і на нього не може впливати навколишній код.

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