Pyth es un lenguaje de programación procesal inspirado en Python, creado por el usuario PPCG isaacg .
¿Qué consejos generales tienes para jugar al golf en Pyth? Estoy buscando ideas que se puedan aplicar a los problemas de golf de código en general que sean al menos algo específicos de Pyth.
Un consejo por respuesta, por favor.
Conoce tus variables
Pyth tiene 3 categorías de variables: variables genéricas preinicializadas, variables preinicializadas basadas en la entrada del usuario y variables que generan implícitamente una asignación al primer uso.
Variables genéricas
Variables inicializadas de entrada:
Tenga en cuenta que estas inicializaciones solo se ejecutarán en un programa dado si la variable asociada se usa fuera de una cadena en el código. Además, el orden es
Q
, entoncesz
, si se usan ambos.Asignación de variables de primer uso:
J
yK
. Si desea inicializar ambos al mismo valor, puede hacerlo con una expresión comoKJ0
, que es equivalente a la más largaJ0K0
.fuente
Use el intérprete en línea aún más nuevo para evaluar sus respuestas.
Tenga en cuenta que este es un software nuevo, por lo que puede tener errores. Por favor repórteme cualquier problema.
fuente
Las cadenas al final de la línea no necesitan comillas finales. Por ejemplo:
es un programa Hello World completamente válido.
fuente
Usar
C
para compresión baseEsto es en realidad indocumentado, C en una cadena es en realidad no chr directa -> int pero en lugar de base 256 -> base 10 (que es el mismo en las cadenas de un carbón de leña). Esto es muy útil para comprimir un int, podemos usar este script para comprimir:
Toma
12345678910
, da como resultadoßÜ>
(algunos no imprimibles allí).También con una variedad de entradas, puede concatenarlas y con cadenas grandes convirtiéndolas en puntos de código y tratándolas como número base 128.
Otro uso de
C
, gracias @xnor por mostrarme esto, es hacer un gran número arbitrario. La forma ingenua es:Pero podemos mejorar un byte con:
Esta base 256 deconvierte todo el alfabeto. Resultados
156490583352162063278528710879425690470022892627113539022649722
= ~1.56e62
.fuente
Ahora hay un tutorial en línea para Pyth.
La documentación completa se agregará más adelante.
fuente
Utilice las funciones funcionales cortas ... err ...
Cuando el argumento lambda para
map
oreduce
simplemente aplica una operación a los argumentos ,, puede utilizar las formas cortas,M
yF
.fMx
es equivalente amfdx
, yfFx
es lo mismo que.UfbZx
. Por ejemplo, supongamos que tomamos una lista de números como entrada y salida cada uno incrementado. Un primer enfoque podría ser:Sin embargo, eso puede reescribirse como:
Algo similar se aplica a
reduce
conF
. Como ejemplo, digamos que hay un desafío para calcular el producto de una lista de enteros. Nuevamente, un primer intento puede ser:Sin embargo, con
F
eso se puede acortar a:Afeita tres bytes ... ¡no está mal!
fuente
Q
, ya que se complementa cuando la función no se encuentra una entrada, por lo que es*F
Mantenga su implementación de Pyth actualizada.
Estoy mejorando bastante regularmente Pyth, eliminando características menos útiles y agregando más útiles, así que esté atento a las novedades y actualice su copia de la implementación regularmente.
Algunas características agregadas recientemente: (a partir del 19/10/14)
y
: Actúa como*2
en números y como lista de todos los subconjuntos en cadenas y listas. Por ejemplo:f
:f
es normalmente el comando de filtro. Ahora, cuando se llama con un número como segundo argumento, se filtrará sobre la secuencia infinita comenzando con ese número y contando por unos, luego devolverá el primer elemento de la secuencia resultante.Por ejemplo, aquí está el código para encontrar el primo más pequeño de más de mil millones:
fuente
yz
?mvdczd
no puede ser el camino más corto ...y
porque no creo que Pyth necesite tener múltiples formatos de entrada analizados de manera muy fácil, solo uno, por ejemplo, el formato Python. Entonces, sí, creo quemvdczd
tendrá que hacerlo, desafortunadamente.r
la suite de procesamiento de cadenas.r
Se ve muy útil.@
en Fdr1 + 1 @ Q2Iq% Qd0d para hacer una calculadora de factores. Cuando intento usarlo, el valor predeterminado es elindex
significado. ¿Hay alguna forma de evitar este comportamiento?Argumentos nombrados en funciones (ya no se admiten)
A veces, los valores predeterminados en las funciones pueden ser útiles para jugar al golf. Pyth realmente apoya esto (para mi sorpresa). Por ejemplo:
Imprimirá:
También puede usar J y K para guardar caracteres al hacer esto:
huellas dactilares:
Esto suele ser útil para algoritmos recursivos.
Esto ya no funciona, pero lo he dejado aquí en caso de que alguien quiera jugar golf usando una versión antigua de Pyth.
fuente
Desempacando tuplas de 2 elementos con
F
Supongamos que tiene una tupla de 2 elementos
J = (a, b)
, y desear(a,b)
, para alguna función de aridad de 2 r.La forma ingenua de hacer esto es
rhJeJ
.La mejor manera de hacerlo es
r.*J
utilizando el operador de desempaquetado.La forma realmente elegante de hacer esto es
rFJ
usar el operador de plegado.fuente
.u
para eso?.u
Parece ser acumulativo reducir ahora.Usa las funciones aritméticas cortas
h
: Además de devolver el primer elemento de una lista, incrementa un número, por ejemplo,hT
evalúa a11
. Más corto que+1T
.t
: Esto disminuye un número (que no sea devolver la cola de una lista), por ejemplo,tT
evalúa a9
. Más corto que-T1
.y
: Esto duplica un número, por ejemplo,yT
evalúa a20
, más corto que*T2
o+TT
.fuente
Use
map
para generar listasBásicamente es un equivalente de la lista de fantasías de Python. Use una lista existente o un rango para iterar y mapear cada valor, incluso si el valor no importa.
Dos ejemplos:
Genere una lista de 8 ceros.
mZ8
en lugar de*8]Z
Genere una lista de 5 números aleatorios entre 0 y 9:
mOT5
en lugar deV5~Y]OT)
El segundo asigna automáticamente la lista a
Y
(bueno, en realidad se agrega a Y), pero incluso=YmOTU5
es más corta.fuente
Q implícito en EOF
Este es un nuevo cambio, a partir de hoy.
Q
es la variable que se inicializa automáticamente en la entrada evaluada. Se adjunta implícitamente al final del programa Pyth, tantas veces como sea necesario para que el arity funcione. Para ver un ejemplo de cómo usar esto para jugar al golf, digamos que queremos calcular la función Collatz de la entrada.La forma más corta de escribirlo es así:
Sin embargo, dado que los
Q
s están implícitos al final del archivo, simplemente podemos escribir:Ahorro de 2 bytes.
Tenga en cuenta que las funciones con argumentos no obligatorios no tendrán esos argumentos rellenados. Por ejemplo,
c"12 12"
no tendrán un implícitoQ
, ya quec
solo requiere 1 argumento.fuente
Use reducir para aplicar una función repetidamente.
Suponga que necesita establecer una variable para alguna función de sí misma y repetir un cierto número de veces. Tomemos, por ejemplo, el problema de encontrar el número 100 más tarde en la secuencia de Collatz a partir de la entrada. La forma más corta de encontrar el siguiente número en la secuencia, si el número inicial es
Q
, esLa forma más obvia de aplicar esto 100 veces e imprimir el resultado sería
Haga un bucle 100 veces, actualizando el valor de Q cada vez, luego finalice el bucle e imprima Q.
En cambio, podemos usar una función de reducción que ignora la variable de secuencia (
H
).Esto es 2 caracteres más corto. Tiene 3 caracteres más cortos si está intentando recorrer tantas veces como haya elementos en una secuencia.
fuente
Por lo general, hay alternativas más cortas a Cualquiera
Cuando desee encontrar si alguna secuencia satisface una condición, generalmente la usaría
.Em
. Por ejemplo, si desea averiguar si alguno en una lista es mayor o igual que 5:Pero, si solo necesita ser un verdadero / falso, no verdadero / falso,
sm
funcionaría ya que sum funciona en bools.Incluso podemos hacer uno más corto, con
f
ilter:Sin embargo, el último se ve realmente feo.
Para
.A
ll, lo único que se me ocurre es usar la condición opuesta y negarla para un ahorro de un carácter.Am
:fuente
Mira todas las opciones de flujo de control
Bucles:
F
: En bucle. Al igual que Python.V
: Para bucle en un rango. No se deben proporcionar variables ni rangos, por lo que 2 caracteres son más cortos.W
: Mientras bucle. Al igual que Python.#
: Bucle infinito mientras. Escape con error o ruptura explícita.Solotry ... except
aparece ahora en Pyth.Funciones:
D
: Definición general. Al igual que Python.L
: 1 argumento, sin función de asignación, como la lambda de Python, pero con nombre. El nombre de la función, el nombre de la variable y return (R
) no necesitan ser dados, entonces 3 caracteres más cortos.Programación funcional:
f
: Filtro: seleccione elementos de la secuencia de entrada que devuelven la verdad en la entrada lambda.f
: Primer entero mayor o igual a la entrada que da un resultado de filtro verdadero.m
: Mapa - transforma los elementos de la secuencia de entrada usando lambda de entrada.u
: Reduce - pliega la secuencia de entrada en la entrada lambda, inicializando el acumulador al tercer argumento.o
: Orden: elementos más antiguos de la secuencia de entrada utilizando la entrada lambda como clave.Por lo general, habrá múltiples posibilidades para cualquier problema dado, y solo escribiendo soluciones de prueba con cada una de ellas puede determinar cuál es la más corta.
fuente
.x
puede usarse más recientemente para bloques try-except..x{some_statments}{except_block - can this be empty}
.# ... B
se puede usar de esta manera si no está dentro de una expresiónCambiar dos elementos en una lista
Cambiar dos elementos puede ser una tarea bastante costosa. Así que aquí hay dos enfoques que quieres usar.
Enfoque variable-tmp
En preparación definimos una lista
Y
y la llenamos con algunos números. El objetivo es cambiar el segundo y tercer elemento.Simplemente asignamos la variable tmp
J = Q[G]
, hacemos la primera asignación de listaY[G] = Y[H]
y luego la segunda última asignaciónY[H] = J
. El truco aquí es anidar las dos asignaciones de la lista, para que no tenga que suprimir la impresión y no tenga que usar referir dos vecesY
.en lugar de
Enfoque de traducción
Si los elementos, que desea cambiar, son únicos en la lista, utilice este enfoque. Es muy corto Así que esta vez cambiamos el primer y tercer elemento (los valores
1
y5
son únicos).Esto utiliza la funcionalidad de traducción de la lista:
Esta traducción reemplaza cada elemento
Y[0]
conY[1]
y cadaY[1]
conY[0]
. Entonces, si los valores no son únicos, suceden cosas malas. Por ejemploK,1 2
resultados en[1, 5, 3, 5, 6, 7]
.Observe que los paréntesis de cierre son opcionales, si la declaración es la última en su código.
fuente
Depuración con
<newline>
Si su código está escrito en un estilo de programación imperativo, es bastante fácil de depurar, ya que puede imprimir fácilmente resultados intermedios. ( enlace permanente )
Pero una gran cantidad de programas Pyth utilizan elementos de programación funcional, como mapear, filtrar y reducir, que no permiten una impresión tan simple. Pero aún es posible, usando el
\n
comando.El mismo código que usa
u
(reducir) sería: ( enlace permanente )Si desea imprimir los valores intermedios, simplemente inserte
\n
: ( enlace permanente )\na
imprimea
en una nueva línea y regresaa
. Para que pueda insertarlo en cualquier lugar sin preocuparse de cambiar la funcionalidad del programa.fuente
Encontrar el máximo de dos enteros
Por ejemplo, suponga que tiene
J=5
yK=12
. Entoncesg#JK
= 12, yg#KJ
= 12 también.Esto fue descubierto por @ Pietu1998, quien lo expresó de esta manera:
No estoy seguro de si alguien ya lo ha encontrado, pero hay una manera genial de hacer max (A, B) en 2 bytes, no es necesario usar 3 para
eS,AB
.g#AB
hace lo mismo (Sin embargo, es muy ineficiente, ya que realiza un bucle máximo (1, A-B + 1) veces. Una optimización es poner el número que probablemente sea mayor como B).fuente
Pyth del
join
métodoEl
join
método en Python a menudo puede ser un poco molesto, ya que solo une cadenas. Pyth'sjoin
es más generoso. Transforma todos los objetos en cadenas de forma predeterminada.Ej.
jkUT
Da0123456789
ojb["abc"4,5\f]7
dafuente
j2\a\b
->"a2b"
Decir si un número es un número entero
Un buen truco es usar
I
nvariante para saber si un número es un número entero como tal:Esto verifica si el número no cambia cuando lo trunca, lo que no cambiará si es un número entero.
Por ejemplo, puede usar esto como un cheque cuadrado perfecto:
fuente
Use Pyth empaquetado
Packed Pyth es un nuevo "lenguaje de programación" que es exactamente el mismo que Pyth, excepto que utiliza 7 bits por carácter en lugar de 8 bits por carácter.
Para usarlo, clone el repositorio pyth . El archivo
packed-pyth.py
es el intérprete.Digamos que tu código es
"Hello, world!
.Primero, póngalo en un archivo:
echo -n '"Hello, world!' > code.pyth
A continuación, empaquete el código Pyth en el archivo Pyth empaquetado:
python3 packed-pyth.py -p code.pyth code.ppyth
Finalmente, ejecute el código Pyth empaquetado:
python3 packed-pyth.py code.ppyth
Al ejecutar el código, puede proporcionar el
-d
indicador para ver cuál es el código Pyth que realmente se está ejecutando, y puede proporcionar información como un segundo argumento de línea de comando después del archivo que contiene el código.Al revés:
Abajo:
Solo ASCII.
No hay entrada interactiva.
Las opciones completas de depuración no están disponibles.
Peor informe de errores.
fuente
Pruebas de divisibilidad usando
I
y GCDDescargo de responsabilidad: esto solo funciona para enteros no negativos.
Para verificar si dos enteros no negativos son divisibles, puede hacer lo siguiente:
Si a es divisible por b y a ≥ b ≥ 0 , entonces mcd (a, b) = b .
No necesariamente guarda los bytes
!%<dividend><divisor>
, pero puede generar un ahorro, porque:Q
), cuando trabaje con el dividendo.<pfn>
, ya que es una función en sí misma.0
.¡Intentalo!
fuente
iI
es una función en sí misma, mientras!%
que no lo es, por lo que puede usarla como una función de prefijo.Asignación de una variable a una función aplicada a sí misma
Si tiene una función de arity 1 y desea aplicarla a una variable y aplicarla a sí misma, puede usar la siguiente sintaxis:
En lugar de:
Por ejemplo, si desea incrementar la variable
Z
, puede hacer:Lo que ahorra un byte
=ZhZ
.fuente