Pyth é uma linguagem de programação procedural inspirada em Python, criada pelo usuário do PPCG isaacg .
Que dicas gerais você tem para jogar golfe em Pyth? Estou procurando idéias que possam ser aplicadas para codificar problemas de golfe em geral que sejam pelo menos um pouco específicos para Pyth.
Uma dica por resposta, por favor.
Conheça suas variáveis
Pyth possui 3 categorias de variáveis: variáveis pré-inicializadas genéricas, variáveis pré-inicializadas com base na entrada do usuário e variáveis que geram implicitamente uma atribuição no primeiro uso.
Variáveis genéricas:
Variáveis inicializadas por entrada:
Observe que essas inicializações serão executadas apenas em um determinado programa se a variável associada for usada fora de uma sequência no código. Além disso, a ordem é
Q
, entãoz
, se os dois forem usados.Atribuição nas variáveis de primeiro uso:
J
eK
. Se você deseja inicializar os dois com o mesmo valor, pode fazê-lo com uma expressão comoKJ0
, que é equivalente à mais longaJ0K0
.fonte
Use o intérprete online ainda mais recente para testar suas respostas.
Observe que este é um novo software, portanto pode ser um bug. Por favor, relate quaisquer problemas para mim.
fonte
As strings no final da linha não precisam de aspas finais. Por exemplo:
é um programa Hello World completamente válido.
fonte
Use
C
para compactação básicaNa verdade, isso não é documentado, C em uma string não é realmente chr -> int, mas sim base 256 -> base 10 (que é a mesma em uma string). Isso é extremamente útil na compactação de um int. Podemos usar este script para compactar:
Tome
12345678910
, resulta emßÜ>
(alguns imprimíveis lá).Também com uma matriz de entradas, você pode concatená-las e com seqüências grandes convertendo em pontos de código e tratando como número 128 base.
Outro uso de
C
, obrigado @xnor por me mostrar isso, está criando um número grande e arbitrário. A maneira ingênua é:Mas podemos fazer um byte melhor com:
essa base 256 desconverte o alfabeto inteiro. Resultados
156490583352162063278528710879425690470022892627113539022649722
= ~1.56e62
.fonte
Agora existe um tutorial on - line para Pyth.
A documentação completa será adicionada mais tarde.
fonte
Use as funções funcionais curtas ... err ...
Quando o argumento lambda
map
oureduce
apenas aplica uma operação aos argumentos, você pode usar os formulários abreviados,M
eF
.fMx
é equivalente amfdx
efFx
é a mesma coisa que.UfbZx
. Por exemplo, digamos que tomemos uma lista de números como entrada e saída cada um incrementado. Uma primeira abordagem pode ser:No entanto, isso pode ser reescrito como:
Uma coisa semelhante se aplica a
reduce
comF
. Como exemplo, digamos que haja um desafio para calcular o produto de uma lista de números inteiros. Novamente, uma primeira tentativa pode ser:No entanto, com
F
, isso pode ser reduzido para:Raspa três bytes ... nada mal!
fonte
Q
, como é complementado quando a função está faltando uma entrada, tornando-se*F
Mantenha sua implementação do Pyth atualizada.
Estou melhorando regularmente o Pyth, removendo recursos menos úteis e adicionando outros mais úteis. Fique de olho nas novidades e atualize sua cópia da implementação regularmente.
Alguns recursos adicionados recentemente: (a partir de 19/10/14)
y
: Atua como*2
em números e como lista de todos os subconjuntos em cadeias e listas. Por exemplo:f
:f
normalmente é o comando de filtro. Agora, quando chamado com um número como seu segundo argumento, ele filtrará a sequência infinita começando com esse número e contando um por um e, em seguida, retornará o primeiro elemento da sequência resultante.Por exemplo, aqui está o código para encontrar o menor primo de mais de um bilhão:
fonte
yz
?mvdczd
não pode ser o caminho mais curto ...y
Joguei fora o antigo porque não acho que o Pyth precise ter vários formatos de entrada analisados com facilidade, apenas um, por exemplo, o formato Python. Então, sim, achomvdczd
que terá que fazer, infelizmente.r
conjunto de processamento de strings.r
parece bastante útil.@
em Fdr1 + 1 @ Q2Iq% Qd0d para criar uma calculadora de fatores. Quando tento usá-lo, o padrão é oindex
significado. Existe alguma maneira de contornar esse comportamento?Argumentos nomeados em funções (não são mais suportados)
Às vezes, valores padrão em funções podem ser úteis para jogar golfe. Pyth realmente suporta isso (para minha surpresa). Por exemplo:
Irá imprimir:
Você também pode usar J e K para salvar caracteres ao fazer isso:
impressões:
Isso geralmente é útil para algoritmos recursivos.
Isso não funciona mais, mas deixei aqui caso alguém queira jogar golfe usando uma versão antiga do Pyth.
fonte
Descompactar tuplas de 2 elementos com
F
Digamos que você tenha uma tupla de 2 elementos
J = (a, b)
, e desejer(a,b)
, para alguma função de 2 áreas r.A maneira ingênua de fazer isso é
rhJeJ
.A maneira mais sofisticada de fazer isso é
r.*J
usando o operador desempacotar.A maneira mais sofisticada de fazer isso é
rFJ
usando o operador fold.fonte
.u
para isso?.u
parece ser cumulativo reduzir agora.Use as funções aritméticas curtas
h
: Além de retornar o primeiro elemento de uma lista, ele incrementa um número, por exemplo,hT
avalia como11
. Mais curto que+1T
.t
: Isso diminui um número (exceto o retorno da cauda de uma lista), por exemplo,tT
avalia como9
. Mais curto que-T1
.y
: Isso dobra um número, por exemplo,yT
avalia para20
, menor que*T2
ou+TT
.fonte
Use
map
para gerar listasÉ basicamente o equivalente à compreensão sofisticada de listas de python. Use uma lista ou um intervalo existente para iterar e mapear cada valor, mesmo que o valor não importe.
Dois exemplos:
Gere uma lista de 8 zeros.
mZ8
ao invés de*8]Z
Gere uma lista de 5 números aleatórios entre 0 e 9:
mOT5
ao invés deV5~Y]OT)
O segundo atribui automaticamente a lista
Y
(bem, na verdade, anexa a Y), mas ainda=YmOTU5
é mais curto.fonte
Q implícito na EOF
Esta é uma nova mudança, a partir de hoje.
Q
é a variável que é inicializada automaticamente na entrada avaliada. É implicitamente anexado ao final do programa Pyth, quantas vezes for necessário para que a aridade funcione. Para ver um exemplo de como usar isso no golfe, digamos que queremos calcular a função Collatz da entrada.A maneira mais curta de escrever é assim:
No entanto, como os
Q
s estão implícitos no final do arquivo, podemos simplesmente escrever:Salvando 2 bytes.
Observe que funções com argumentos não obrigatórios não terão esses argumentos preenchidos. Por exemplo,
c"12 12"
não terão implícitoQ
, poisc
requer apenas 1 argumento.fonte
Use reduzir para aplicar uma função repetidamente.
Suponha que você precise definir uma variável para alguma função em si e repita um certo número de vezes. Pegue, por exemplo, o problema de encontrar o número 100 posteriormente na Sequência Collatz a partir da entrada. A maneira mais curta de encontrar o próximo número na sequência, se o número inicial for
Q
, éA maneira mais óbvia de aplicar isso 100 vezes e imprimir o resultado seria
Faça um loop 100 vezes, atualizando o valor de Q toda vez, depois termine o loop e imprima Q.
Em vez disso, podemos usar uma função de redução que ignora a variável de sequência (
H
).Este é 2 caracteres mais curtos. São 3 caracteres mais curtos se você estiver tentando fazer um loop quantas vezes houver elementos em uma sequência.
fonte
Geralmente existem alternativas mais curtas para Qualquer
Quando você deseja descobrir se alguma sequência satisfaz uma condição, você usaria normalmente
.Em
. Por exemplo, se você deseja descobrir se algum em uma lista é maior que ou igual a 5:Mas, se ele precisa ser apenas uma verdade / falsey, não verdadeiro / falso,
sm
funcionaria, já que soma funciona em bools.Podemos até fazer um menor, com o
f
filtro:O último parece realmente feio.
Para
.A
ll, a única coisa em que consigo pensar é usar a condição oposta e negá-la para uma economia de um caractere.Am
:fonte
Veja todas as opções de fluxo de controle
Rotações:
F
: Para loop. Assim como o Python.V
: Para loop acima de um intervalo. Nem a variável nem o intervalo devem ser fornecidos, portanto, 2 caracteres mais curtos.W
: Enquanto loop. Assim como o Python.#
: Loop infinito enquanto. Escape com erro ou quebra explícita.Recursoexclusivotry ... except
agora em Pyth.Funções:
D
: Definição geral. Assim como Python.L
: 1 argumento, sem função de atribuição, como o lambda do Python, mas nomeado. O nome da função, o nome da variável e return (R
) não precisam ser fornecidos, portanto, são 3 caracteres mais curtos.Programação funcional:
f
: Filtro - selecione elementos da sequência de entrada que retornam verdade na entrada lambda.f
: Primeiro número inteiro maior ou igual à entrada que fornece o resultado verdadeiro do filtro.m
: Mapa - transforme elementos da sequência de entrada usando a entrada lambda.u
: Reduza a seqüência de entrada dobrada na entrada lambda, inicializando o acumulador para o terceiro argumento.o
: Order - elementos mais antigos da sequência de entrada usando a entrada lambda como chave.Normalmente, haverá várias possibilidades para qualquer problema, e somente escrevendo soluções de teste com cada uma delas é possível descobrir qual é o mais curto.
fonte
.x
pode ser usado mais recentemente para blocos try-except..x{some_statments}{except_block - can this be empty}
.# ... B
pode ser usado desta forma, se você não está dentro de uma expressãoAlternando dois elementos em uma lista
Mudar dois elementos pode ser uma tarefa bastante cara. Então, aqui estão duas abordagens que você deseja usar.
Abordagem TMP-variável
Na preparação, definimos uma lista
Y
e a preenchemos com alguns números. O objetivo é mudar o segundo e o terceiro elemento.Simplesmente atribuímos a variável tmp
J = Q[G]
, fazemos a primeira atribuição da listaY[G] = Y[H]
e, em seguida, a segunda última atribuiçãoY[H] = J
. O truque aqui é aninhar as duas atribuições da lista, para que você não precise suprimir a impressão e não precise usar a referência duas vezesY
.ao invés de
Abordagem de tradução
Se os elementos que você deseja alternar forem exclusivos na lista, use esta abordagem. É muito curto. Portanto, desta vez, alternamos o primeiro e o terceiro elemento (os valores
1
e5
são únicos).Isso usa a funcionalidade de tradução da lista:
Essa tradução substitui todos os elementos
Y[0]
porY[1]
e todosY[1]
comY[0]
. Portanto, se os valores não são únicos, coisas ruins acontecem. Por exemplo,K,1 2
resulta em[1, 5, 3, 5, 6, 7]
.Observe que os parênteses de fechamento são opcionais, se a instrução for a última no seu código.
fonte
Depurando com
<newline>
Se seu código for escrito em um estilo de programação imperativo, é muito fácil depurar, pois você pode imprimir facilmente resultados intermediários. ( link permanente )
Mas uma grande quantidade de programas Pyth usa elementos de programação funcional, como mapear, filtrar e reduzir, o que não permite uma impressão tão simples. Mas ainda é possível, usando o
\n
comandoO mesmo código usando
u
(reduzir) seria: ( link permanente )Se você deseja imprimir os valores intermediários, basta inserir
\n
: ( link permanente )\na
imprimea
em uma nova linha e retornaa
. Assim, você pode inseri-lo em qualquer lugar sem se preocupar em alterar a funcionalidade do programa.fonte
Encontrando o máximo de dois números inteiros
Por exemplo, suponha que você tenha
J=5
eK=12
. Entãog#JK
= 12 eg#KJ
= 12 também.Isso foi descoberto por @ Pietu1998, que colocou desta maneira:
Não tenho certeza se alguém já o encontrou, mas há uma maneira legal de fazer o máximo (A, B) em 2 bytes, sem a necessidade de usar 3 para
eS,AB
.g#AB
faz a mesma coisa. (É muito ineficiente, no entanto, uma vez que executa um loop no máximo (1, A-B + 1) vezes. Uma otimização é colocar o número que provavelmente será maior como B.)fonte
De Pyth
join
métodoO
join
método em Python geralmente pode ser um pouco chato, pois une apenas as strings. Pyth'sjoin
é mais generoso. Ele transforma todos os objetos em seqüências de caracteres por padrão.Por exemplo,
jkUT
dá0123456789
oujb["abc"4,5\f]7
dáfonte
j2\a\b
->"a2b"
Dizer se um número é um número inteiro
Um truque interessante é usar
I
nvariant para dizer se um número é um número inteiro, como tal:Isso verifica se o número não muda quando você o trunca, o que não acontece se for um número inteiro.
Por exemplo, você pode usar isso como uma verificação quadrada perfeita:
fonte
Usar Pyth embalado
O Pyth empacotado é uma nova "linguagem de programação" que é exatamente a mesma do Pyth, exceto que ele usa 7 bits por caractere em vez de 8 bits por caractere.
Para usá-lo, clone o repositório pyth . O arquivo
packed-pyth.py
é o intérprete.Diga que seu código é
"Hello, world!
.Primeiro, coloque-o em um arquivo:
echo -n '"Hello, world!' > code.pyth
Em seguida, empacote o código Pyth no arquivo Packed Pyth:
python3 packed-pyth.py -p code.pyth code.ppyth
Por fim, execute o código do Packed Pyth:
python3 packed-pyth.py code.ppyth
Ao executar o código, você pode fornecer o
-d
sinalizador para ver qual é o código Pyth que está sendo executado e fornecer uma entrada como um segundo argumento de linha de comando após o arquivo que contém o código.Parte de cima:
Desvantagem:
Somente ASCII.
Nenhuma entrada interativa.
Opções de depuração completas não estão disponíveis.
Pior relatório de erros.
fonte
Teste de divisibilidade usando
I
e GCDIsenção de responsabilidade: isso funciona apenas para números inteiros não negativos.
Para verificar se dois números inteiros não negativos são divisíveis, você pode fazer o seguinte:
Se a é divisível por b e a ≥ b ≥ 0 , então mcd (a, b) = b .
Ele não salva necessariamente bytes
!%<dividend><divisor>
, mas pode trazer uma economia, porque:Q
), ao trabalhar com o dividendo.<pfn>
, uma vez que é uma função por si só.0
.Tente!
fonte
iI
é uma função por si só, enquanto!%
não é, então você pode usá-la como uma função de prefixo.Atribuindo uma variável a uma função aplicada a si mesma
Se você tem uma função da arity 1 e deseja aplicá-la a uma variável e aplicar a si mesma, pode usar a seguinte sintaxe:
Ao invés de:
Por exemplo, se você deseja incrementar a variável
Z
, pode:O que economiza um byte
=ZhZ
.fonte