Уголь - это язык, созданный только для ASCII и DLosc, который специализируется на художественных задачах ASCII.
Какие у вас есть советы по игре в гольф на углях? Очевидно, я ищу советы, относящиеся конкретно к древесному углю, а не те, которые могут быть применены к большинству - если не ко всем - языкам.
Ответы:
Воспользуйтесь преимуществом дербозсификатора
Использование deverbosifier означает, что вы можете писать в ASCII (
--dv
или--deverbosify
для deverbosify,-v
или--verbose
для выполнения в виде подробного кода). Кроме того, он сжимает строки для вас, что может быть полезно в некоторых задачах ASCII-искусства, когда строка для сжатия слишком длинная.@Neil рекомендует использовать
-vl
или-v --sl
. Это сокращение--verbose --showlength
, означающее, что оно будет интерпретировано как подробный Уголь, и будет показана длина обычного кода Уголь. Кроме того, при дербозификации проверьте выходные данные, чтобы убедиться, что входные данные действительно были проанализированы правильно, поскольку Charcoal обычно игнорирует ошибки синтаксического анализа. Если есть ошибка синтаксиса, использование-a
(--astify
) или--oa
(--onlyastify
) , чтобы помочь выяснить проблему.источник
-v -sl
. Кроме того, при дербозификации проверьте выходные данные, чтобы убедиться, что входные данные действительно были проанализированы правильно, поскольку вы не всегда получаете ошибку синтаксического анализа.Используйте перегрузки
Например, многим командам нужен только один аргумент:
Rectangle
,Oblong
ИBox
сделать квадрат , если только один аргументReflect
команды по умолчанию отражают правоRotate
команды по умолчанию до 90 градусов против часовой стрелкиPolygon
иPolygonHollow
может принять разнонаправленную и длину стороны. Это можно использовать, если все стороны имеют одинаковую длину.источник
PolygonHollow
случайно. Вы можете даже иметь несколько разнонаправленных каналов, но они должны идти перед обычными стрелками (я не знаю, является ли это ограничение преднамеренным). Я использовал это в своем ответе на вызов «Нарисуй куб».ReflectButterfly dls
звонитьReflectButterfly
по каждому направлению, но (как правильно вики документирует) это действительно вызываетReflectOverlap
.Избегайте последовательных констант одного типа
Например,
Plus(Times(i, 2), 1)
переводится как⁺×鲦¹
, но вы можете сохранить байт, переключив параметры:Plus(1, Times(i, 2))
переводит как⁺¹×ι²
иPlus(Times(2, i), 1)
как⁺ײι¹
оба из которых сохраняют байт.Plus(1, Times(2, i))
(что переводится как⁺¹×²ι
) было бы еще лучше, если бы после него была еще одна числовая константа.источник
Используйте предопределенные переменные
Вот список всех переменных, которые могут быть использованы, с краткой греческой буквой и подробной буквой, которая ее представляет.
Переменные, представляющие входные данные, будут пустыми, если существует недостаточно входных данных, но все остальные переменные, не показанные здесь, должны быть назначены перед использованием.
источник
y
иf
наоборот? (Возможно, я неправильно прочитал греческие буквы, когда первоначально написал это.)Узнайте свои размышления и вращения
Существует множество вариаций основного отражения и поворота, поэтому стоит знать, каковы тонкие различия. Ключ к таблицам:
/
может стать\
после поворота или щелчка.Размышления
Направление отражения не является обязательным. По умолчанию отражается один раз вправо. Для тех отражений, которые сохраняют оригинал, допускается множественное направление, которое просто повторяет команду для каждого направления. (Это означает, что, например
ReflectMirror(:¬)
, на самом деле будет создано всего четыре копии.)Курсор перемещается вместе с отражением (даже если оригинал сохранен).
Повороты
Для тех вращений, которые сохраняют оригинал, есть необязательное начало вращения. По умолчанию это нижний правый холст. Допустимые значения - любые диагональные направления.
Количество вращения (с шагом 45 °) не является обязательным. По умолчанию 2, то есть 90 ° против часовой стрелки (против часовой стрелки). Для тех поворотов, которые сохраняют оригинал, есть две альтернативные опции: многозначное целое число указывает на то, что необходимо повернуть холст один раз для каждой цифры, а затем объединить результаты, в то время как список целых чисел просто повторяет команду для каждого поворота, причем переменные результаты зависят от того, как холст меняется между.
источник
Transform
значит?Transform
работает где-то в ответе.Используйте команды без командного символа
Выражение, которое не является частью команды, печатается.
Если ему предшествует направление, выражение печатается в указанном направлении.
Числа печатаются в виде строки с указанной длиной, используя символ, выбранный из
\/-|
.Если направление не сопровождается выражением, оно считается перемещением на один пробел в указанном направлении.
Примечание: иногда это может учитываться как часть предыдущей команды, поэтому фактически может требоваться символ команды. (спасибо Нейлу за напоминание)
источник
Используйте разнонаправленные
Некоторые команды могут принимать multidirectionals:
+X*|-\/<>^KLTVY7¬⌊⌈
. То, к чему они расширяются, здесь . В общем, список направлений начинается сверху и продолжается по часовой стрелке.источник
ReflectButtterflyOverlap(:¬, Modulo(g, 2));
.)В полной мере использовать
Sum
Sum
имеет много удобных перегрузок:Join(..., "")
вместо этого..
символ, берется сумма цифр.-
считается разделителем).Удобный побочный эффект двух последних правил состоит в том, что если вы используете
Sum
символ, то цифры1-9
приводятся к его значению, а все остальное возвращает ноль, в отличие от тогоCast
, что не для нецифровых значений.источник
Используйте split для строкового массива, split и cast для числового массива
Разделение для строкового массива - только три символа служебных данных, а разделение и приведение - только четыре символа служебных данных. Сравните это с записью массива буквально, что потребовало бы начала и конца массива и разделителя между каждым элементом массива.
Если ваш числовой массив имеет только числа меньше 95, используйте приведение (если все числа меньше 10) или индекс в одну из предопределенных переменных.
источник
Используйте фильтр, чтобы вырезать первый символ из массива или строки
Даже если вам повезет, используя
Slice
ломтик первого символа из строки занимает 2 байта:Slice(..., 1)
. Это займет больше времени, если выражение для нарезки заканчивается числом, требующим разделителя, или если следующий код может быть интерпретирован как выражение, так как в этом случаеSlice
он захочет использовать его в качестве дополнительного параметра.Вместо этого просто используйте
Filter(..., k)
, который удаляет первый элемент, тем самым достигая желаемого результата. (Очевидно, используйте соответствующую переменную индекса цикла, если ваше выражение вложено в другой цикл.) Это всегда 2 байта и не может зависеть от окружающего кода.источник