Pyth - это язык процедурного программирования, вдохновленный Python, созданный пользователем PPCG isaacg .
Какие общие советы у вас есть для игры в гольф в Pyth? Я ищу идеи, которые могут быть применены к кодовым проблемам гольфа в целом, которые, по крайней мере, несколько специфичны для Pyth.
Один совет за ответ, пожалуйста.
Знай свои переменные
Pyth имеет 3 категории переменных: общие предварительно инициализированные переменные, переменные, предварительно инициализированные на основе пользовательского ввода, и переменные, которые неявно генерируют назначение при первом использовании.
Общие переменные:
Инициализированные вводом переменные:
Обратите внимание, что эти инициализации будут выполняться только в данной программе, если связанная переменная используется вне строки в коде. Кроме того, порядок
Q
,z
если оба используются.Назначение на переменные первого использования:
J
иK
. Если вы хотите инициализировать их оба одинаковыми значениями, вы можете сделать это с помощью выражения, такого какKJ0
, что эквивалентно длиннееJ0K0
.источник
Используйте еще более новый онлайн-переводчик, чтобы проверить свои ответы.
Обратите внимание, что это новое программное обеспечение, поэтому оно может содержать ошибки. Пожалуйста, сообщите мне о любых проблемах.
источник
Строки в конце строки не нуждаются в конечных кавычках. Например:
это полностью действующая программа Hello World.
источник
Использовать
C
для базового сжатияЭто на самом деле недокументировано, C в строке на самом деле не является прямым chr -> int, а вместо этого base 256 -> base 10 (то же самое для строк с одним символом). Это очень полезно при сжатии int, мы можем использовать этот скрипт для сжатия:
Возьми
12345678910
, это приводит кßÜ>
(некоторые непечатные там).Также с массивом целых чисел вы можете объединить их и с большими строками, преобразовав их в кодовые точки и рассматривая как базовое число 128.
Еще одно использование
C
, спасибо @xnor за то, что показали это, - создание произвольного большого числа. Наивный способ это:Но мы можем сделать один байт лучше с:
эта база 256 деконвертирует весь алфавит. Результаты
156490583352162063278528710879425690470022892627113539022649722
= ~1.56e62
.источник
Теперь для Pyth есть онлайн-учебник .
Полная документация будет добавлена позже.
источник
Используйте короткие функциональные ... err ... функции
Когда лямбда-аргумент
map
илиreduce
просто применяет одну операцию к аргументам, вы можете использовать короткие формы,M
иF
.fMx
эквивалентноmfdx
, иfFx
то же самое, что и.UfbZx
. Например, скажем, мы берем список чисел в качестве входных и выходных данных, каждое из которых увеличивается. Первый подход может быть:Однако это можно переписать так:
Аналогичная вещь относится к
reduce
сF
. В качестве примера, скажем, есть задача вычислить произведение списка целых чисел. Опять же, первая попытка может быть:Тем не менее, с
F
, что может быть сокращено до:Сбривает три байта ... неплохо!
источник
Q
, так как оно дополняется, когда функция пропускает вход, делая это*F
Держите вашу реализацию Pyth в актуальном состоянии.
Я довольно регулярно совершенствую Pyth, удаляя менее полезные функции и добавляя более полезные, поэтому следите за новостями и регулярно обновляйте вашу копию реализации.
Некоторые недавно добавленные функции: (по состоянию на 19.10.14)
y
: Действует как*2
для чисел, так и как список всех подмножеств в строках и списках. Например:f
:f
обычно это команда фильтра. Теперь, когда вызывается с числом в качестве второго аргумента, он фильтрует бесконечную последовательность, начиная с этого числа и считая по единицам, а затем возвращает первый элемент полученной последовательности.Например, вот код для поиска наименьшего простого числа из миллиарда:
источник
yz
?mvdczd
не может быть кратчайшим путем ...y
потому что я не думаю, что Pyth должен иметь несколько супер-легко анализируемых форматов ввода, только один, например, формат Python. Так что, да, я думаюmvdczd
, придется сделать, к сожалению.r
пакет обработки строк в России.r
выглядит довольно полезно.@
в Fdr1 + 1 @ Q2Iq% Qd0d для создания факторного калькулятора. Когда я пытаюсь использовать его,index
вместо этого по умолчанию используется значение. Есть ли способ обойти это поведение?Именованные аргументы в функциях (больше не поддерживаются)
Иногда значения по умолчанию в функциях могут быть полезны для игры в гольф. Pyth фактически поддерживает это (к моему большому удивлению). Например:
Распечатает:
Вы также можете использовать J и K для сохранения символов при этом:
печатает:
Это обычно полезно для рекурсивных алгоритмов.
Это больше не работает, но я оставил это здесь на случай, если кто-то захочет поиграть в гольф, используя старую версию Pyth.
источник
Распаковка двухэлементных кортежей с
F
Скажем, у вас есть кортеж из 2 элементов
J = (a, b)
, и вы хотитеr(a,b)
, для некоторой функции 2 арности r.Наивный способ сделать это
rhJeJ
.Необычный способ сделать это
r.*J
с помощью оператора распаковки.Действительно причудливый способ сделать это
rFJ
, используя оператор сгиба.источник
.u
для этого?.u
кажется, кумулятивное снижение сейчас.Используйте короткие арифметические функции
h
: Кроме возврата первого элемента списка, он увеличивает число, например,hT
оценивает до11
. Короче чем+1T
.t
: Это уменьшает число (кроме возврата конца списка), например,tT
оценивает в9
. Короче чем-T1
.y
: Это удваивает число, например,yT
оценивает20
, короче*T2
или+TT
.источник
Используйте
map
для создания списковЭто в основном эквивалентно необычному пониманию Python. Используйте существующий список или диапазон для перебора и сопоставления каждого значения, даже если значение не имеет значения.
Два примера:
Создайте список из 8 нулей.
mZ8
вместо*8]Z
Создайте список из 5 случайных чисел от 0 до 9:
mOT5
вместоV5~Y]OT)
Второй автоматически назначает список
Y
(ну, фактически он добавляет к Y), но даже=YmOTU5
короче.источник
Неявный Q в EOF
Это новое изменение, на сегодняшний день.
Q
переменная, которая автоматически инициализируется для оцениваемого ввода. Он неявно добавляется в конец программы Pyth столько раз, сколько необходимо, чтобы заставить arity работать. Чтобы увидеть пример того, как использовать это для игры в гольф, скажем, мы хотим вычислить функцию Collatz для ввода.Кратчайший способ написать это так:
Однако, так как
Q
s неявны в конце файла, мы можем просто написать:Экономия 2 байта.
Обратите внимание, что функции с необязательными аргументами не будут заполнены этими аргументами. Например,
c"12 12"
не будет иметь неявногоQ
, посколькуc
требуется только 1 аргумент.источник
Используйте уменьшение, чтобы применить функцию повторно.
Предположим, вам нужно установить переменную для какой-либо функции и повторить ее определенное количество раз. Возьмем, к примеру, проблему поиска числа 100 позже в последовательности Коллатца из входных данных. Самый короткий способ найти следующее число в последовательности, если это начальное число
Q
, этоСамый очевидный способ применить это 100 раз и напечатать результат будет
Выполните 100 циклов, обновляя значение Q каждый раз, затем завершите цикл и напечатайте Q.
Вместо этого мы можем использовать функцию Reduce, которая игнорирует переменную sequence (
H
).Это на 2 символа короче. Это на 3 символа короче, если вы пытаетесь выполнить цикл столько раз, сколько элементов в последовательности.
источник
Есть обычно более короткие альтернативы любому
Когда вы хотите узнать, удовлетворяет ли какая-либо последовательность из условия, вы обычно используете
.Em
. Например, если вы хотите узнать, есть ли в списке больше или равно 5:Но, если это будет только правда / ложь, а не правда / ложь,
sm
это сработает, так как сумма работает на bools.Мы можем даже сделать один короче, с помощью
f
ilter:Последний выглядит действительно ужасно.
Для
.A
ll единственное, о чем я могу думать, это использовать противоположное условие и отменить его для сохранения одного символа.Am
:источник
Посмотрите на все параметры потока управления
петли:
F
: Для цикла. Так же, как у Питона.V
: Для цикла в диапазоне. Ни переменная, ни диапазон не должны указываться, поэтому на 2 символа короче.W
: Пока цикл. Так же, как у Питона.#
: Бесконечный цикл while. Побег с ошибкой или явным разрывом.Толькоtry ... except
функция теперь в Pyth.Функции:
D
Общее определение. Так же, как Python.L
: 1 аргумент, без функции присваивания, как лямбда в Python, но с именем.R
Не обязательно указывать имя функции, имя переменной и return ( ), поэтому на 3 символа короче.Функциональное программирование:
f
: Filter - выбрать элементы входной последовательности, которые возвращают truey на входную лямбду.f
: Первое целое число, большее или равное входному значению, которое дает истинный результат фильтра.m
: Карта - преобразовать элементы входной последовательности, используя входную лямбду.u
: Уменьшить - сложить входную последовательность на входной лямбде, инициализируя аккумулятор в третий аргумент.o
: Порядок - старые элементы входной последовательности, использующие в качестве ключа лямбда-ввод.Как правило, для каждой конкретной проблемы будет несколько возможностей, и только написав тестовые решения с каждым из них, вы сможете определить, какая из них самая короткая.
источник
.x
в последнее время может использоваться для блоков try-кроме..x{some_statments}{except_block - can this be empty}
.# ... B
можно использовать таким образом, если вы не в выраженииПереключение двух элементов в списке
Переключение двух элементов может быть довольно дорогой задачей. Итак, вот два подхода, которые вы хотите использовать.
TMP-переменный подход
При подготовке мы определяем список
Y
и заполняем его некоторыми числами. Цель состоит в том, чтобы переключить второй и третий элемент.Мы просто присваиваем переменную tmp
J = Q[G]
, делаем первое назначение списка,Y[G] = Y[H]
а затем второе последнее назначениеY[H] = J
. Хитрость заключается в том, чтобы вкладывать два списка назначений, поэтому вам не нужно подавлять печать и не использовать дважды ссылку наY
.вместо
Переводящий подход
Если элементы, которые вы хотите переключить, являются уникальными в списке, используйте этот подход. Это действительно коротко. Поэтому на этот раз мы переключаем первый и третий элемент (значения
1
и5
являются уникальными).Это использует функциональность перевода списка:
Этот перевод заменяет каждый элемент
Y[0]
наY[1]
и каждыйY[1]
наY[0]
. Так что, если значения не уникальны, случаются плохие вещи. Например,K,1 2
приводит к[1, 5, 3, 5, 6, 7]
.Обратите внимание, что закрывающие скобки являются необязательными, если оператор является последним в вашем коде.
источник
Отладка с помощью
<newline>
Если ваш код написан в стиле императивного программирования, его довольно легко отладить, так как вы можете легко напечатать промежуточные результаты. ( постоянная ссылка )
Но большое количество программ Pyth использует элементы функционального программирования, такие как map, filter и Reduce, которые не позволяют такую простую печать. Но это все еще возможно, используя
\n
команду.Тот же код с использованием
u
(уменьшить) будет: ( постоянная ссылка )Если вы хотите напечатать промежуточные значения, просто вставьте
\n
: ( постоянная ссылка )\na
печатаетa
на новую строку и возвращаетa
. Таким образом, вы можете вставить его куда угодно, не беспокоясь об изменении функциональности программы.источник
Нахождение максимум двух целых
Например, предположим, у вас есть
J=5
иK=12
. Тогдаg#JK
= 12 иg#KJ
= 12.Это было обнаружено @ Pietu1998, который выразил это так:
Не уверен, что кто-то уже нашел его, но есть классный способ сделать max (A, B) за 2 байта, нет необходимости использовать 3 для
eS,AB
.g#AB
делает то же самое. (Тем не менее, это очень неэффективно, так как он повторяет макс. (1, A-B + 1) раз. Оптимизация заключается в том, чтобы число, вероятно, было больше как B.)источник
join
Метод Питаjoin
Метод в Python может быть часто немного раздражает, так как он включается только строки. Пифсjoin
более щедрый. По умолчанию все объекты преобразуются в строки.Например,
jkUT
дает0123456789
илиjb["abc"4,5\f]7
даетисточник
j2\a\b
->"a2b"
Говорить, является ли номер целым числом
Аккуратный трюк использует
I
nvariant, чтобы определить, является ли число целым числом как таковым:Это проверяет, не меняется ли число, когда вы его усекаете, что не будет, если это целое число.
Например, вы можете использовать это как идеальный квадратный чек:
источник
Используйте упакованный Pyth
Packed Pyth - это новый «язык программирования», который точно такой же, как Pyth, за исключением того, что он использует 7 бит на символ вместо 8 бит на символ.
Чтобы использовать его, клонируйте хранилище pyth . Файл
packed-pyth.py
переводчик.Скажи твой код
"Hello, world!
.Сначала поместите это в файл:
echo -n '"Hello, world!' > code.pyth
Затем упакуйте код Pyth в упакованный файл Pyth:
python3 packed-pyth.py -p code.pyth code.ppyth
Наконец, запустите упакованный код Pyth:
python3 packed-pyth.py code.ppyth
При запуске кода вы можете указать
-d
флаг, чтобы увидеть, какой код Pyth на самом деле выполняется, и вы можете предоставить ввод в качестве второго аргумента командной строки после файла, содержащего код.Потенциал роста:
Даунсайд:
Только ASCII.
Нет интерактивного ввода.
Полные параметры отладки недоступны.
Хуже сообщения об ошибках.
источник
Тестирование делимости с использованием
I
и GCDОтказ от ответственности: это работает только для неотрицательных целых чисел.
Чтобы проверить, делятся ли два неотрицательных целых числа, вы можете сделать следующее:
Если a делится на b и a ≥ b ≥ 0 , то gcd (a, b) = b .
Это не обязательно экономит байты
!%<dividend><divisor>
, но может принести вам экономию, потому что:Q
) при работе с дивидендом.<pfn>
, так как это отдельная функция.0
.Попробуй!
источник
iI
это функция сама по себе, а!%
нет, так что вы можете использовать ее в качестве функции префикса.Присвоение переменной функции, применяемой к ней
Если у вас есть функция arity 1, и вы хотите применить ее к переменной и применить к себе, вы можете использовать следующий синтаксис:
Вместо:
Например, если вы хотите увеличить переменную
Z
, вы можете сделать:Который сохраняет один байт
=ZhZ
.источник