Prática de golfe: Python [fechado]

31

Esse é um desafio de praticar a otimização do golfe em Python - truques e atalhos reutilizáveis ​​para cortar alguns caracteres. Muitos estarão familiarizados com os golfistas de Python e usarão idéias comuns das Dicas do Python . Alguns deles usam recursos específicos do Python que talvez você não saiba que existem, a menos que você os tenha visto, então dê uma olhada nas dicas se estiver preso.

Objetivo: Existem dez problemas, cada um um trecho de referência do código Python para você otimizar e uma descrição do código. Seu objetivo é reescrevê-lo para ser mais curto, mas ainda funcionalmente equivalente.

Sua pontuação, que você está tentando minimizar, é o comprimento total do seu código em todos os trechos. O comprimento dos trechos de referência é 150. O desempatador é a primeira publicação.

Publicando respostas: para cada problema, publique seu código e sua contagem de caracteres. Você pode postar o trecho de referência se não encontrar algo mais curto. Pretende-se que você não veja as respostas dos outros quando publicar as suas. Por favor, adicione spoilers a cada problema individual, incluindo a contagem de caracteres individuais. Você pode deixar a contagem total revelada. Sinta-se à vontade agora para descartar sua solução ou publicar novas soluções não descascadas.

Detalhes sobre legalidade: equivalência funcional significa que o código pode ser substituído em um programa sem afetar seu comportamento (ignorando itens como uso de memória e precedência do operador como parte de uma expressão). Expressões devem produzir valores equivalentes a ==. Note isso 1.0==1==True. Seu código não deve ter efeitos colaterais, a menos que indicado de outra forma. Não pretendo que os problemas sejam específicos da versão, mas, no caso, você pode especificar uma versão do Python para cada problema.

Problema 1: Continue iterando enquanto a lista Ltiver pelo menos 7 elementos

# 16 chars
while len(L)>=7:

Problema 2 : Verifique se dois flutuadores xe ysão positivos.

# 11 chars
x>0 and y>0

Problema 3 : Se Boolean bfor verdadeiro, remova o primeiro elemento de L. Caso contrário, deixe-o inalterado.

# 12 chars
if b:L=L[1:]

Problema 4 : Verifique se todos os elementos de uma lista Lde números não vazios são iguais. Para esse problema, não há problema em modificar a lista.

# 22 chars
all(x==L[0]for x in L)

Problema 5 : anexe um número nao final de uma lista Lapenas se Ljá tiver esse número.

# 16 chars
if n in L:L+=[n] 

Problema 6 : Expresse o sinal de um flutuador x: +1para positivo, 0para 0, -1para negativo.

# 20 chars
abs(x)/x if x else 0

Problema 7 Continue um loop enquanto o primeiro elemento de L, uma lista de booleanos, for True. Pare também se Lestiver vazio.

# 17 chars
while L and L[0]:

Problema 8 : Continue um loop contanto que nseja maior que 1. nÉ garantido que o número seja um número inteiro positivo.

# 10 chars
while n>1:

Problema 9 : Verifique se um número inteiro representado como uma sequência de caracteres sé negativo (ou seja, começa com '-').

# 9 chars
s[0]=='-'

Problema 10 : Converta um Booleano bem "Win"/ "Lose", com True-> "Win"e False-> "Lose".

# 17 chars
["Lose","Win"][b]

Aviso: Spoilers abaixo, não role para baixo se você quiser resolvê-los.

Se você quer apenas saber a pontuação ideal para um problema:

Problema 1:

12

Problema 2:

5

Problema 3:

7

Problema 4:

13

Problema 5:

13

Problema 6:

8

Problema 7:

12

Problema 8:

9

Problema 9:

5

Problema 10:

15

xnor
fonte
3
Votei em encerrar, pois esse desafio provoca respostas duplicadas e efetivamente há muitas perguntas em uma, uma vez que não há interação entre os desafios individuais. Eu acho que se tivermos essas perguntas, deve haver apenas uma resposta, que é um wiki da comunidade.
Wrzlprmft
2
@Wrzlprmft: De alguma forma, é um desafio interessante. Mas, depois de ter 7 ótimas contribuições, sugiro que relaxem as regras e permitam soluções não estragadas para problemas únicos, porque, caso contrário, envios perfeitos podem permanecer ocultos atrás das pontuações totais medíocres em geral.
Falko
2
Penso que é uma ideia interessante e que deveríamos praticar golfe para mais idiomas.
Robbie Wxyz
2
@Wrzlprmft agora há uma discussão sobre isso na meta . Por favor, exprima sua opinião lá, para uma discussão mais fácil, sem poluir os comentários desta pergunta.
FireFly
3
Estou votando para encerrar esta questão como fora de tópico, porque os desafios de várias partes sem interação entre as partes são proibidos. meta.codegolf.stackexchange.com/a/8464/45941
Mego

Respostas:

21

Total: 104 101 99 caracteres

Problema 1

12 caracteres
while L[6:]:

Problema 2

5 caracteres
x>0<y

Problema 3

7 caracteres
L=L[b:]

Problema 4

13 caracteres
len(set(L))<2
L[1:]==L[:-1]

Problema 5

13 caracteres
L+=set(L)&{n}

Problema 6

11 caracteres
(x>0)-(x<0)

8 caracteres (Python 2)
cmp(x,0)

Problema 7

12 caracteres
while[.5]<L:

Problema 8

9 caracteres
while~-n:

Problema 9

5 caracteres
s<'.'

Problema 10

15 caracteres
'LWoisne'[b::2]

grc
fonte
@FryAmTheEggman Você pode explicar o efeito colateral? Eu pretendia que fosse uma solução válida.
Xnor
@xnor Deixa pra lá, eu estava completamente errado. Eu aprendi alguma coisa hoje :)
FryAmTheEggman
Acredito que essas soluções sejam ótimas, dadas as múltiplas 99 soluções e o fato de não encontrar nada melhor. Eu ficaria feliz em ver uma melhoria embora. Como este foi o primeiro 99, estou aceitando.
Xnor
7

Tamanho total: 128 122 120 117 116 115 111 107 104

Problema 1

Continue iterando enquanto a lista Ltiver pelo menos 7 elementos.

15 caracteres
while len(L)>6:
(Sim, eu poderia economizar 3 bytes nisso, mas acidentalmente vi a resposta da solução Sp3000, por isso não reivindicarei esses três bytes.)

Problema 2

Verifique se dois carros alegóricos xe yambos são positivos.

5 caracteres
x>0<y

Problema 3

Se Boolean bfor true, remova o primeiro elemento de L. Caso contrário, deixe-o inalterado.

7 caracteres
L=L[b:]

Problema 4

Verifique se todos os elementos de uma lista não vazia Lde números são iguais. Para esse problema, não há problema em modificar a lista.

13 caracteres
L[1:]==L[:-1]

Problema 5

Anexe um número nao final de uma lista Lapenas se Ljá tiver esse número.

15 caracteres
L+=[n]*(n in L)
ou
L+=[n][:n in L]

Problema 6

Expresse o sinal de um ponto flutuante x: +1para positivo, 0para 0, -1para negativo.

8 caracteres, Python 2
cmp(x,0)
De acordo com a documentação, isso pode retornar qualquer valor positivo / negativo, mas o consenso é que sempre retorna -1, 0, 1.

Problema 7

Continue um loop enquanto o primeiro elemento de L, uma lista de booleanos, for True. Pare também se Lestiver vazio.

12 caracteres
while[1]<=L:

Problema 8

Continue um loop contanto que nseja maior que 1. nÉ garantido que o número seja um número inteiro positivo.

9 caracteres
while~-n:

Problema 9

Verifique se um número inteiro representado como uma sequência sé negativo (ou seja, começa com '-').

5 caracteres
s<'.'

Problema 10

Converta um booleano bem "Win"/ "Lose", com True-> "Win"e False-> "Lose".

15 caracteres
"LWoisne"[b::2]

Martin Ender
fonte
Poderia também estragar os comprimentos individuais?
Xnor
@ xnor Sem problemas, feito.
22815 Martin Ender19:
7

Total: 106 104 102 caracteres

Problema 1

12 caracteres
while L[6:]:

Problema 2

5 caracteres
x>0<y
Huzzah para encadeamento de comparação

Problema 3

7 caracteres
L=L[b:]
Boa conversão implícita antiga

Problema 4

13
len(set(L))<2

Como alternativa:
L[1:]==L[:-1]

maneira estúpida de obter a negação do que queremos no Python 2:
","in`set(L)`

não tenho certeza de qual é a relevância de "não há problema em modificar a lista", porque o melhor que consigo pensar é em 14 caracteres (e é realmente errado):
L==[L.pop()]+L

Problema 5

13 caracteres
L+={n}&set(L)
Fazendo coisas divertidas com conjuntos

Problema 6

11 caracteres
(x>0)-(x<0)

Problema 7

12 caracteres
while[1]<=L:
Usa ordem lexicográfica das listas

Problema 8

9 caracteres
while~-n:

Problema 9

5 caracteres
s<"."
Usa ordenação lexicográfica de strings

Problema 10

15 caracteres
"LWoisne"[b::2]

Alternativamente:
b*"Win"or"Lose"

Sp3000
fonte
1
Eu não tinha considerado sua alternativa ao # 10 antes. Isso significa que é possível obter a mesma economia de caracteres que o truque usual de intercalação, independentemente do comprimento das strings, exceto os problemas de precedência no bool. Vou adicionar isso às dicas.
Xnor
1
@xnor Ahaha sim, eu pensei que era muito bom. Não é tão bom quando você tem mais cordas, porém, que é desvantagem (por exemplo, bé 0, 1 ou 2, e tudo que você pode fazer é (b-1)*"Hello"or b*"Goodbye"or"Good Afternoon")
SP3000
Na verdade, isso não é ruim para três cordas. Você pode remover os parênteses com ~b*"Hello".
Xnor
@xnor Nesse ponto, ["Good Afternoon","Goodbye","Hello"][b]venceria: P
Sp3000 18/11/2014
6

Total: 99 bytes

Problema 1

12 bytes
while L[6:]:

Problema 2

5 bytes
x>0<y

Problema 3

7 bytes
L=L[b:]

Problema 4

13 bytes
len(set(L))<2

14 bytes alternativas
min(L)==max(L)
set(L)=={L[0]}

Problema 5

13 bytes
L+=set(L)&{n}

Problema 6

8 bytes
cmp(x,0)

Problema 7

12 bytes
while[1]<=L:

Problema 8

9 bytes
while~-n:

Problema 9

5 bytes
s<'.'

Problema 10

15 bytes
b*"Win"or"Lose"
- ou -
"LWoisne"[b::2]

primo
fonte
4

1: 12
while L[6:]:
2: 5
y>0<x
3: 7
L=L[b:]
4: 15
L==L[:1]*len(L)
5: 15
L+=[n]*(n in L)ou L+=[n][:n in L]
6: 11
Este é o único para o qual uma expressão idiomática não veio imediatamente à minha mente, mas acho que encontrei a resposta certa. Edit: Não, foi horrível.
(x>0)-(x<0)
7: 12
while[1]<=L:
Ou se o programa for concluído depois disso, while L[0]é legal.
8: 9
while~-n:
9: 5
Muitas strings funcionariam aqui, mas o "método ingênuo" é engraçado.
s<'0'
10: 15
'LWoisne'[b::2]

Total: 106

feersum
fonte
Seu nº 4 não precisaria usar [L[0]]?
FireFly
@FireFly Whoops. Não é tão ruim assim, mas custa um byte.
feersum
2
Seu # 9 é um trocadilho maravilhoso para o golfe!
Xnor
3

Tamanho total: 123 121 120 116

# 1

(12) while L[6:]:

# 2

(10) min(x,y)>0

# 3

(7) L=L[b:]

# 4

(13) len(set(L))<2ouL[1:]==L[:-1]

# 5

(15) L+=[n]*(n in L)

# 6

(14) x and abs(x)/xou (inspirado na solução de Claudiu depois de desistir)x and(x>0)*2-1

# 7

(15) while[0]<L[:1]:

# 8

(9) while~-n:

# 9

(5) s<'.'

# 10

(15) b*"Win"or"Lose"

FireFly
fonte
1

Total: 121

Primeiras tentativas:

Problema 1

15 caracteres
while len(L)>6:

Problema 2

5 caracteres
x>0<y

Problema 3

7 caracteres
L=L[b:]

Problema 4

13 caracteres
len(set(L))<2

Problema 5

16 caracteres
if n in L:L+=[n]

Problema 6

16 caracteres
x and(1,-1)[x<0]

Problema 7

16 caracteres
while(L+[0])[0]:

Problema 8

10 caracteres
while n>1:

Problema 9

8 caracteres
s[0]<'0'

Problema 10

15 caracteres
"LWoisne"[b::2]

Claudiu
fonte