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


14

Які загальні поради щодо гольфу в Whitespace? Я шукаю ідеї, які можна застосувати до проблем із кодом-гольфу і які також принаймні дещо специфічні для Whitespace (наприклад, "видалити коментарі" - це не відповідь).

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


82
Видаліть зайвий пробіл.
KSFT

1
s / [^ [: space:]] // g
Digital Trauma

Відповіді:


11

Я не зовсім впевнений, це питання жарту чи ні, тож сподіваюся, що мене не знущаються сприймати це серйозно, але ...

Порада 1: Не припиняйте програму

Специфікація говорить, що програма повинна закінчуватися трьома стрічками, [LF][LF][LF]де перший - IMP управління потоком, а наступні два - команда quit, але багато інтерпретаторів просто запускають ваш код без належного закінчення. Економить 3 символи в будь-якій програмі.


6

Порада 2: Використовуйте купу якомога менше

Я часто використовував Кучку для підрахунку петель і так, але зрозумів, що це насправді вкрай неефективно; спочатку натискання адреси, отримання поточного рахунку, прийняття / додавання однієї, повторне натискання адреси тощо.

Тепер я просто натискаю значення на стек, щоб діяти як лічильник циклу, а потім використовую команду [Space][LF][Tab]swap, щоб повернутися до нього, коли мені це потрібно. Потрібно багато працювати в / навколо, але коли ви це отримаєте, це дійсно може зменшити кількість ваших знаків.


5

Використовуйте довільні купи купи

Багато перекладачів дозволяють вам читати / записувати на довільні купі адреси, а не починати з 0 або 1 і рахувати. Ви можете дублювати існуюче значення стека (3 байти), щоб використовувати як адресу, а не натискати нове значення (мінімум 4 байти)


+1. Зауважте, що це стосується лише негативних купових адрес. Отже, якщо верхня частина стека - це від'ємне ціле число, ви не можете використовувати його як heap-адресу.
Кевін Круїссен

5

Порожня послідовність є дійсною міткою

[LF][Space][Space][LF](Контроль потоку - Позначте міткою '') створює порожню мітку, яка є дійсною ціллю для стрибків або викликів підпрограми. Це економить байт при оголошенні мітки та байта кожного разу, коли він викликається.

( Спостерігається у відповіді пробілу для впровадження машини істини )


5

Опустіть усі символи на фіксовану кількість і додайте це право перед друком у циклі

Кредит @LukStorms , який використовує подібний підхід в своїй відповіді на виклик Hello World .

( STNвикористовується для Space, Tab та New-line відповідно.)

Натискання значень для літер завжди становить 11 байт (тобто натискання значення 65 для символу "A" є SSSTSSSSSTN; натискання значення 122 для символу "z" є SSSTTTTSTSN). Коли ви хочете вивести велику кількість тексту, це може бути дорогим. Натомість ви можете знизити значення всіх символів, які ви хочете надрукувати на фіксовану кількість, а потім у циклі для їх друку додати цю фіксовану суму.

Це можна зробити за допомогою наступного коду (припустимо, фіксоване значення 100 у цьому випадку):

  1. Натисніть всі значення символів (мінус фіксовану суму 100) у зворотному порядку
  2. NSSN (Створіть мітку_0; початок циклу)
    1. SSSTTSSTSSN (Натисніть на фіксовану суму 100)
    2. TSSS (Додайте два перших значення стека разом)
    3. TNSS (Розмістіть і надрукуйте тепер правильне значення як символ)
    4. NSNN (Перейти до мітки_0; перейти до наступної ітерації циклу)

Це зупинить програму з помилкою ( яка дозволена відповідно до мета ), як тільки вона спробує зробити Add ( TSSS) більше нічого на стеку. Я використовував це для гольфу в цій моїй відповіді (див. Пункти 5 і 6 речей, які я зробив, щоб зменшити кількість байтів ).

Чи фіксований розмір 100 - це найкоротший підхід залежить від того, що ви друкуєте. Наприклад, @LukStorm використав 107 у своїй відповіді Hello World.

Зауважте, що копіювання найвищого значення ( SNS) для двох однакових суміжних символів (наприклад, lв Hello) або копіювання значень з іншої позиції все ще може бути використане додатково до гольфу більше байтів.


4

Перехід до невизначених міток закінчує програму (у деяких перекладачах)

Це починає входити в особливості поведінки, але я вважаю, що це дозволено .

TIO (і, можливо, інші інтерпретатори? Не працює на ideone принаймні) зупинить виконання, коли буде зроблена спроба перейти до мітки, яка не існує. Якщо вам потрібно зробити порівняння для виходу з циклу, це дозволяє зберегти байти, не оголошуючи мітку розриву. (Для прикладу див. Мій коментар до друку невидимого тексту .)


4

Значення 0 можна оголосити числом без двійкових цифр

У підручнику пробілів згадується, що цифри можуть бути будь-якою кількістю біт / двійкових розрядів. Це означає, що число без бітів (понад необхідний біт знака) є дійсним поданням значення 0. [Space][Space][Space][LF]І [Space][Space][Space][Space][LF]обидва натискають значення 0 на стек, але перший на один байт коротший.


0

Копіювання попередніх цілих чисел може бути коротшим, ніж створення нових

( STNвикористовується для Space, Tab та New-line відповідно.)

STS+ Аргумент числа може бути використаний для копіювання n- го елемента в стеку (заданого аргументом) у верхню частину стека . Це в деяких випадках може бути використане для збереження байтів.

Наприклад, у цій моїй відповіді я пояснив, що у 4-му пункті « Що я зробив», щоб знизити кількість байтів, як копіювання 1-го (0-індексованого) значення ( STSSTN) коротше, ніж натискання 12 для створення символу 'p' ( SSSTTSSN) в частині "pop"виводу. (ПРИМІТКА. Я використовую значення 12 замість 112 для символу 'p', тому що я застосував цю іншу пораду зниження всіх значень на фіксовану суму, яку ми додаємо перед друком символів у циклі .)

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