Python 3 - Intenté jugar al golf Mi tarea

9

Nota: Esto no es tanto un desafío de golf; es más que pedir sugerencias de golf.

Recientemente tuve una asignación de Python para mi clase de desarrollo web, para verificar si podíamos codificar. Como ya me siento cómodo en Python, decidí intentar jugar al golf y me preguntaba si la gente podría señalar cosas que me perdí.

Ya sé que hay espacios adicionales en algunos lugares, pero estoy más interesado en cosas conceptuales, como usar while r:cuando r es una variable, ¡y luego esperar a que se agote!

La asignación

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

Además: lo siento si esta no es una pregunta adecuada para la página de golf de código, ya que no es un desafío y la eliminará a pedido.

aks.
fuente
Dejando a un lado el tema del tema (ya que no estoy seguro), ¿quizás eche un vistazo a la página de consejos de golf de Python ? Además, ¿qué versión de Python? (Supongo que 3 debido a los padres alrededor print, pero solo para verificar)
Sp3000
55
¿Ya has intentado jugar al golf?
feersum
2
Este código tiene muchas mejoras simples de golf restantes. Creo que aprendería mejor si revisara los consejos de golf y mirara otros campos de Python, e hiciera más para acortar su código por su cuenta. Luego, si publica lo que obtiene, la gente puede darle consejos más perspicaces.
xnor

Respuestas:

20

Aquí hay un montón de micro optimizaciones que puede hacer:

Use .split()para crear una lista larga (-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()

Eliminar paréntesis extraños (-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 el desempaquetado iterable extendido para convertir algo en una lista (-4 bytes):

l=list(l)
*l,=l

Importar todas las cosas (-15 bytes):

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

Utilice otras funciones que pueden hacer el mismo trabajo aquí (-5 * 2 = -10 bytes):

j.capitalize()
j.title()

print se separa por espacio por defecto (-11 bytes):

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

Más desempaquetado (-3 bytes):

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

Efectos secundarios de abuso (-1 byte, más sangrías):

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

Cualquier cosa reutilizada y más de 5 caracteres podría valer la pena guardarla como una variable (-1 byte):

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

Simplifica fracciones (-5 bytes):

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

Abuso unario (-4 bytes):

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

O el más grande de todos ...

Mire su algoritmo y vea si necesita cambiar por completo

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())

(Si alguna vez te encuentras importando Counteren un código de golf, probablemente estés haciendo algo muy mal ...)

Sp3000
fuente
¡¡Guau!! Esto es exactamente lo que estaba buscando. ¡Muchas gracias por su ayuda!
aks.
Probablemente podría obviar la necesidad de .title()precapitalizar todo. Además, asigne s.counta una variable.
isaacg
@isaacg Pensé que trataría de mantener la funcionalidad del programa original. Si la especificación fuera lo único que contaba, dejaría caer algunas de las declaraciones de letra larga ya que técnicamente la tarea no las necesita;)
Sp3000
@ Sp3000 En ese caso, ¿por qué no poner el .title () en la cadena inicial? Guarda un uso .title ().
isaacg
@isaacg Además, lo hice seleccionando una matriz de cada una de las letras iniciales, y 'b' representaba el azul y 'B' representaba el negro
aks.