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


15

Уголь - это язык, созданный только для ASCII и DLosc, который специализируется на художественных задачах ASCII.

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


Винт это, я пойду попробую ответить на уголь что-нибудь, брб. Может быть, я могу дать незначительные указатели на эту тему.
Волшебная Урна Осьминога

Ответы:


5

Воспользуйтесь преимуществом дербозсификатора

Использование deverbosifier означает, что вы можете писать в ASCII ( --dvили--deverbosify для deverbosify, -vили --verboseдля выполнения в виде подробного кода). Кроме того, он сжимает строки для вас, что может быть полезно в некоторых задачах ASCII-искусства, когда строка для сжатия слишком длинная.

@Neil рекомендует использовать -vlили -v --sl. Это сокращение --verbose --showlength, означающее, что оно будет интерпретировано как подробный Уголь, и будет показана длина обычного кода Уголь. Кроме того, при дербозификации проверьте выходные данные, чтобы убедиться, что входные данные действительно были проанализированы правильно, поскольку Charcoal обычно игнорирует ошибки синтаксического анализа. Если есть ошибка синтаксиса, использование -a( --astify) или --oa( --onlyastify) , чтобы помочь выяснить проблему.


В дополнение к этому, я рекомендую использовать -v -sl. Кроме того, при дербозификации проверьте выходные данные, чтобы убедиться, что входные данные действительно были проанализированы правильно, поскольку вы не всегда получаете ошибку синтаксического анализа.
Нил

3

Используйте перегрузки

Например, многим командам нужен только один аргумент:

  • Rectangle, OblongИ Boxсделать квадрат , если только один аргумент
  • Reflect команды по умолчанию отражают право
  • Rotate команды по умолчанию до 90 градусов против часовой стрелки
  • Polygonи PolygonHollowможет принять разнонаправленную и длину стороны. Это можно использовать, если все стороны имеют одинаковую длину.

Я обнаружил этот факт PolygonHollowслучайно. Вы можете даже иметь несколько разнонаправленных каналов, но они должны идти перед обычными стрелками (я не знаю, является ли это ограничение преднамеренным). Я использовал это в своем ответе на вызов «Нарисуй куб».
Нил

Хм, ограничение вроде бы намеренное, но, думаю, мне следует его изменить, потому что оно все равно не повредит
только для ASCII

Я вижу, вы исправили Polygon, чтобы принимать стрелки и разнонаправленные в любом порядке, спасибо! Пока я здесь, я ожидал 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

Узнайте свои размышления и вращения

Существует множество вариаций основного отражения и поворота, поэтому стоит знать, каковы тонкие различия. Ключ к таблицам:

  • Команда: Имя команды в режиме подробного ввода.
  • Трансформация: должен ли уголь попытаться перевернуть или повернуть символы, когда они отражают или поворачивают их. Например, /может стать \после поворота или щелчка.
  • Сохранить оригинал: должен ли древесный уголь объединить результат с оригинальным холстом.
  • Наложение: (Применяется только в том случае, если для параметра «Сохранить оригинал» установлено значение «Да».) Определяет положение оси отражения / поворота в половине символов от границы. В случае отражений эквивалентно количеству строк / столбцов, которые не затронуты и оказываются в середине результата. В случае поворота повернутой копии разрешается перезаписывать чистые области (но не пробелы) в оригинале.

Размышления

|         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

Используйте фильтр, чтобы вырезать первый символ из массива или строки

Даже если вам повезет, используя Sliceломтик первого символа из строки занимает 2 байта: Slice(..., 1). Это займет больше времени, если выражение для нарезки заканчивается числом, требующим разделителя, или если следующий код может быть интерпретирован как выражение, так как в этом случае Sliceон захочет использовать его в качестве дополнительного параметра.

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

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