Python 3 - Tentei jogar golfe na minha tarefa

9

Nota: Este não é um desafio para o golfe; é mais ainda pedir sugestões de golfe.

Recentemente, tive uma atribuição Python para minha classe de desenvolvimento web, a fim de verificar se poderíamos codificar. Como já me sinto confortável em Python, decidi tentar jogar golfe e fiquei pensando se as pessoas poderiam apontar as coisas que eu sentia falta.

Eu já sei que existem espaços extras em alguns lugares, mas estou mais interessado em coisas conceituais, como usar while r:quando r é uma variável e esperar que "acabe"!

A atribuição

import random
from collections import Counter
s=l=''
c=['yellow','blue','white','green','Black', 'purple', 'silver', 'cyan', 'magenta', 'red']
n=[10,15,1,10,6,15,10,25,1,12,5,10,4,6,5,12,0,10,1,1]
o=i=0
for y in c:l+=y[0]*(random.randint(n[o],n[o+1]));o+=2
l=list(l)              
print("Welcome to the CIMS Gumball Machine Simulator\nYou are starting with the following gumballs:")
for b in c:print(str(l.count(b[0])) + " "+b);random.shuffle(l)
print("Here are your random purchases:")
while 'r' in l:
    random.shuffle(l); r=l.pop(); s+=r
    for j in c:
        if j[0] == r:print(j.capitalize())
print("You purchased %i gumballs, for a total of $%.2f \nMost common gumball(s):" % (len(s),len(s)*25/100))
a=Counter(s).most_common()
m=[x[1] for x in a]
while m[0] == m[i]:
    for j in c:
        if j[0] == a[i][0]:print(j.capitalize(), end=" ")
if(i<(len(m)-1)):i+=1
else:break

Além disso: desculpe se esta não é uma pergunta apropriada para a página de código de golfe, pois não é um desafio e a removerá mediante solicitação.

aks.
fonte
Deixando de lado a questão da on-topic-ness (como não tenho certeza), talvez dê uma olhada na página de dicas de golfe em Python ? Além disso, qual versão do Python? (Estou assumindo 3 devido às diferenças print, mas apenas para verificar) #
Sp3000 Sp3000 24/02/15
5
Você já tentou jogar golfe ainda?
feersum
2
Este código tem muitas melhorias simples no golfe restantes. Eu acho que você aprenderia melhor se revisasse as dicas de golfe e olhasse para outros campos de golfe em Python e fizesse mais para encurtar seu código por conta própria. Então, se você publicar o que recebe, as pessoas podem dar conselhos mais perspicazes.
xnor 24/02

Respostas:

20

Aqui está um monte de micro otimizações que você pode fazer:

Use .split()para criar uma lista longa (-17 bytes):

c=['yellow','blue','white','green','Black', 'purple', 'silver', 'cyan', 'magenta', 'red']
c='yellow blue white green Black purple silver cyan magenta red'.split()

Remova colchetes estranhos (-2 bytes):

l+=y[0]*(random.randint(n[o],n[o+1]))
l+=y[0]*random.randint(n[o],n[o+1])

Use splat (-2 bytes):

random.randint(n[o],n[o+1])
random.randint(*n[o:o+2])

Use a descompactação iterável estendida para transformar algo em uma lista (-4 bytes):

l=list(l)
*l,=l

Importe todas as coisas (-15 bytes):

import random;random.randint;random.shuffle;random.shuffle
from random import*;randint;shuffle;shuffle

Use outras funções que podem fazer o mesmo trabalho aqui (-5 * 2 = -10 bytes):

j.capitalize()
j.title()

print separa por espaço por padrão (-11 bytes):

print(str(l.count(b[0])) + " "+b)
print(l.count(b[0]),b)

Mais descompactação (-3 bytes):

r=l.pop()
*l,r=l

Efeitos colaterais do abuso (-1 byte, mais recuos):

if j[0]==r:print(j.capitalize())
r!=j[0]or print(j.capitalize())

Vale a pena salvar qualquer coisa reutilizada e com mais de 5 caracteres como variável (-1 byte):

len(s);len(s)
L=len(s);L;L

Simplifique frações (-5 bytes):

len(s)*25/100
len(s)/4

Abuso unário (-4 bytes):

if(i<(len(m)-1)):i+=1
if~-len(m)>i:i+=1

Ou o maior de todos ...

Olhe para o seu algoritmo e veja se ele precisa mudar completamente

from random import*
*s,P,S=print,shuffle
P("Welcome to the CIMS Gumball Machine Simulator\nYou are starting with the following gumballs:")
*l,c,C='yellow blue white green Black purple silver cyan magenta red'.split(),s.count
for x,y,z in zip(c,[10,1,6,10,1,5,4,5,0,1],[15,10,15,25,12,10,6,12,10,1]):n=randint(y,z);l+=[x]*n;P(n,x)
S(l)
P("Here are your random purchases:")
while'red'in l:S(l);*l,r=l;s+=r,;P(r.title())
L=len(s)
P("You purchased %i gumballs, for a total of $%.2f\nMost common gumball(s):"%(L,L/4))
for x in c:C(x)!=max(map(C,c))or P(x.title())

(Se você se importar Counterem um código-golfe, provavelmente está fazendo algo muito errado ...)

Sp3000
fonte
Uau!! Era exatamente isso que eu estava procurando. Muito obrigado pela sua ajuda!
aks.
Você provavelmente poderia evitar a necessidade de .title()pré-capitalizar tudo. Além disso, atribua s.counta uma variável.
Isaacg
@isaacg Pensei em tentar manter a funcionalidade do programa original. Se a especificação contasse tudo, eu
soltaria
@ Sp3000 Nesse caso, por que não colocar o .title () na string inicial? Salva um uso de .title ().
Isaacg
@isaacg Além disso, eu fiz isso, escolhendo de uma matriz de cada uma das letras de partida, e 'b' representada azul e 'B' representado preto
aks.