Python 3 - Ho provato a giocare a golf


9

Nota: questa non è una vera sfida al golf; è più che altro chiedere suggerimenti per il golf.

Recentemente ho avuto un incarico Python per la mia classe di sviluppo web, al fine di verificare se potessimo programmare. Dato che mi sento già a mio agio in Python, ho deciso di provare a giocare a golf e mi chiedevo se le persone potessero segnalare cose che mi mancavano.

So già che ci sono spazi extra in alcuni punti, ma sono più interessato alle cose concettuali, come usare while r:quando r è una variabile, e quindi aspettare che si esaurisca!

L'incarico

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

Inoltre: mi dispiace se questa non è una domanda appropriata per la pagina del codice golf, poiché non è una sfida e la rimuoverà su richiesta.


Mettendo da parte il problema dell'argomento (dal momento che non ne sono sicuro), forse dai un'occhiata alla pagina dei suggerimenti sul golf di Python ? Inoltre, quale versione di Python? (Sto assumendo 3 a causa delle parentesi in giro print, ma solo per controllare)
Sp3000

5
Hai già provato a giocare a golf?
feersum

2
Questo codice contiene molti semplici miglioramenti del golf. Penso che impareresti meglio se avessi esaminato i suggerimenti per il golf e avessi guardato altri golf Python e avessi fatto di più per abbreviarlo da solo. Quindi, se pubblichi ciò che ottieni, le persone possono dare consigli più approfonditi.
xnor

Risposte:


20

Ecco un sacco di micro-ottimizzazioni che puoi fare:

Utilizzare .split()per creare un lungo elenco (-17 byte):

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

Rimuovi parentesi estranee (-2 byte):

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

Usa splat (-2 byte):

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

Usa il decompressione iterabile estesa per trasformare qualcosa in un elenco (-4 byte):

l=list(l)
*l,=l

Importa tutto (-15 byte):

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

Utilizzare qui altre funzioni che possono fare lo stesso lavoro (-5 * 2 = -10 byte):

j.capitalize()
j.title()

print separa per spazio per impostazione predefinita (-11 byte):

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

Più disimballaggio (-3 byte):

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

Abuso di effetti collaterali (-1 byte, più rientri):

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

Qualsiasi cosa riutilizzata e oltre 5 caratteri potrebbe valere la pena salvarla come variabile (-1 byte):

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

Semplifica le frazioni (-5 byte):

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

Abuso unario (-4 byte):

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

O il più grande di tutti ...

Guarda il tuo algoritmo e vedi se deve essere cambiato del tutto

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 mai ti ritrovi a importare Counterin un code-golf, probabilmente stai facendo qualcosa di molto sbagliato ...)


Wow!! Questo e 'esattamente quello che stavo cercando. Grazie mille per il vostro aiuto!
aks.

Probabilmente potresti ovviare alla necessità .title()precapitalizzando tutto. Inoltre, assegnare s.counta una variabile.
isaacg,

@isaacg Ho pensato di provare a mantenere la funzionalità del programma originale. Se la specifica fosse tutto ciò che contava, lascerei cadere alcune delle lunghe dichiarazioni di stampa poiché tecnicamente l'assegnazione non ne ha bisogno;)
Sp3000,

@ Sp3000 In tal caso, perché non inserire .title () sulla stringa iniziale? Salva un utilizzo .title ().
isaacg,

@isaacg Inoltre, l'ho fatto selezionando da una matrice di ciascuna delle lettere iniziali, e 'b' rappresentava il blu e 'B' rappresentava il nero
aks.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.