Советы для игры в гольф в пробелах


14

Какие общие советы у вас есть для игры в гольф в Whitespace? Я ищу идеи, которые могут быть применены к задачам кода-гольфа и которые, по крайней мере, несколько специфичны для пробелов (например, «удалить комментарии» - это не ответ).

Пожалуйста, оставьте один совет за ответ.


82
Удалите ненужные пробелы.
KSFT

1
s / [^ [: space:]] // g
Цифровая травма

Ответы:


11

Я не совсем уверен, является ли это вопросом шутки или нет, поэтому я надеюсь, что меня не высмеивают, если он воспринимает это всерьез, но ...

Совет 1: не заканчивайте свою программу

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


6

Совет 2: используйте кучу как можно меньше

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

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


5

Использовать произвольные адреса кучи

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


+1. Обратите внимание, что это относится только к неотрицательным адресам кучи. Поэтому, если вершина стека является отрицательным целым числом, вы не можете использовать его в качестве адреса кучи.
Кевин Круйссен

5

Пустая последовательность является допустимой меткой

[LF][Space][Space][LF](Flow Control - Пометьте меткой '') создает пустую метку, которая является допустимой целью для переходов или вызовов подпрограмм. Это сохраняет байт при объявлении метки и байт при каждом вызове.

( Наблюдаемый в пробеле ответ для реализации машины правды )


5

Уменьшите все символы на фиксированную величину и добавьте это прямо перед печатью в цикле

Кредит @LukStorms , который использует подобный подход в своем ответе на вызов Hello World .

( STNиспользуется для пробела, табуляции и новой строки соответственно.)

Нажатие значений для букв всегда составляет 11 байтов (то есть нажатие значения 65 для символа «A» означает SSSTSSSSSTN; нажатие значения 122 для символа «z» означаетSSSTTTTSTSN ). Если вы хотите вывести большое количество текста, это может быть дорого. Вместо этого вы можете уменьшить значения всех символов, которые вы хотите распечатать, на фиксированную величину, а затем в цикле их печати добавить эту фиксированную сумму.

Это можно сделать с помощью следующего кода (в данном случае предположим, что фиксированное значение равно 100):

  1. Нажмите все значения для символов (минус фиксированная сумма 100) в обратном порядке
  2. NSSN (Создайте Label_0; в основном, начиная цикл)
    1. SSSTTSSTSSN (Нажмите фиксированную сумму 100)
    2. TSSS (Добавьте два верхних значения стека вместе)
    3. TNSS (Вставьте и напечатайте правильное значение в виде символа)
    4. NSNN (Перейти к Label_0; перейти к следующей итерации цикла)

Это остановит программу с ошибкой ( которая разрешена в соответствии с мета ), как только она попытается выполнить Add ( TSSS), не имея ничего больше в стеке. Я использовал это, чтобы сыграть в гольф мой ответ (см. Пункты 5 и 6 того, что я сделал, чтобы уменьшить количество байтов ).

Является ли фиксированная сумма 100 кратчайшим подходом, зависит от того, что вы печатаете. Например, @LukStorm использовал 107 в своем ответе Hello World.

Обратите внимание, что копирование верхнего значения ( SNS) для двух одинаковых смежных символов (например, lin Hello) или копирование значений из другой позиции по- прежнему может использоваться в дополнение к этому для увеличения количества байтов.


4

Переход к неопределенным меткам завершает программу (в некоторых интерпретаторах)

Это начинает входить в специфическое поведение реализации, но я считаю, что это разрешено .

TIO (и, возможно, другие интерпретаторы? По крайней мере, не работают на ideone) остановит выполнение, когда будет предпринята попытка перейти к несуществующей метке. Если вам нужно сделать сравнение, чтобы выйти из цикла, это позволит вам сохранить байты, не объявляя метку прерывания. (См. Мой комментарий к Print Invisible Text для примера.)


4

Значение 0 может быть объявлено как число без двоичных цифр

В руководстве по пробельным символам упоминается, что числа могут быть любым количеством бит / двоичных цифр в ширину. Это означает, что число без битов (кроме необходимого знакового бита) является допустимым представлением значения 0. [Space][Space][Space][LF]и [Space][Space][Space][Space][LF]оба помещают значение 0 в стек, но первое из них на один байт короче.


0

Копирование предыдущих целых может быть короче, чем создание новых

( STNиспользуется для пробела, табуляции и новой строки соответственно.)

STS+ Числовой аргумент может быть использован для копирования n- го элемента в стеке (заданного аргументом) в верхнюю часть стека . В некоторых случаях это может быть использовано для сохранения байтов.

Например, в этом ответе я объяснил в 4-м пункте, что я сделал, чтобы уменьшить количество байтов, как копировать 1-е (0-индексированное) значение (STSSTN ) короче, чем нажатие 12 для создания символа 'p' ( SSSTTSSN) в части "pop"вывода. (ПРИМЕЧАНИЕ: я использую значение 12 вместо 112 для символа «p», потому что я применил этот другой совет снижения всех значений на фиксированную величину, который мы добавляем перед печатью символов в цикле .)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.