Python 3 - Versucht, meine Aufgabe zu spielen

9

Hinweis: Dies ist weniger eine Golfherausforderung. Es ist eher so, nach Golfvorschlägen zu fragen.

Kürzlich hatte ich eine Python-Aufgabe für meine Webentwicklungsklasse, um zu überprüfen, ob wir codieren können. Da ich mich in Python bereits wohl fühle, habe ich mich entschlossen, Golf zu spielen, und ich habe mich gefragt, ob die Leute auf Dinge hinweisen können, die ich verpasst habe.

Ich weiß bereits, dass es an einigen Stellen zusätzliche Leerzeichen gibt, aber ich interessiere mich mehr für konzeptionelle Dinge, wie die Verwendung, while r:wenn r eine Variable ist, und das Warten darauf, dass sie "ausgeht"!

Die Zuordnung

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

Außerdem: Es tut mir leid, wenn dies keine angemessene Frage für die Code-Golfseite ist, da dies keine Herausforderung darstellt und auf Anfrage entfernt wird.

aks.
quelle
Wenn Sie das Thema der Thematik beiseite lassen (da ich mir nicht sicher bin), werfen Sie vielleicht einen Blick auf die Seite mit den Python-Golftipps . Auch welche Python-Version? (Ich gehe von 3 wegen der Parens um print, aber nur um zu überprüfen)
Sp3000
5
Haben Sie schon versucht, Golf zu spielen?
Feersum
2
Dieser Code enthält noch viele einfache Golfverbesserungen. Ich denke, Sie würden besser lernen, wenn Sie die Golftipps lesen und sich andere Python-Golfplätze ansehen und mehr tun würden, um Ihren Code selbst zu verkürzen. Wenn Sie dann veröffentlichen, was Sie erhalten, können die Leute aufschlussreichere Ratschläge geben.
xnor

Antworten:

20

Hier ist eine ganze Reihe von Mikrooptimierungen, die Sie durchführen können:

Verwenden Sie .split()diese Option , um eine lange Liste (-17 Byte) zu erstellen:

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

Entfernen Sie überflüssige Klammern (-2 Byte):

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

Verwenden Sie splat (-2 Bytes):

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

Verwenden Sie das erweiterte iterierbare Entpacken, um etwas in eine Liste (-4 Byte) umzuwandeln:

l=list(l)
*l,=l

Importieren Sie alle Dinge (-15 Bytes):

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

Verwenden Sie andere Funktionen, die hier denselben Job ausführen können (-5 * 2 = -10 Byte):

j.capitalize()
j.title()

print wird standardmäßig durch Leerzeichen getrennt (-11 Byte):

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

Mehr Auspacken (-3 Bytes):

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

Missbrauchsnebenwirkungen (-1 Byte plus Einrückungen):

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

Alles, was wiederverwendet wird und mehr als 5 Zeichen enthält, kann als Variable (-1 Byte) gespeichert werden:

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

Vereinfachen Sie Brüche (-5 Bytes):

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

Unärer Missbrauch (-4 Bytes):

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

Oder der größte von allen ...

Sehen Sie sich Ihren Algorithmus an und prüfen Sie, ob er insgesamt geändert werden muss

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

(Wenn Sie jemals Counterin einen Code-Golf importieren , machen Sie wahrscheinlich etwas sehr Falsches ...)

Sp3000
quelle
Wow!! Genau das habe ich gesucht. Vielen Dank für deine Hilfe!
aks.
Sie könnten wahrscheinlich die Notwendigkeit vermeiden, .title()indem Sie alles vorkapitalisieren. Weisen Sie s.countauch einer Variablen zu.
isaacg
@isaacg Ich dachte, ich würde versuchen, die Funktionalität des ursprünglichen Programms beizubehalten. Wenn die Spezifikation alles wäre, was zählt, würde ich einige der langen
Druckanweisungen fallen lassen,
@ Sp3000 In diesem Fall setzen Sie die .title () in die ursprüngliche Zeichenfolge. Speichert eine .title () - Verwendung.
isaacg
@isaacg Auch ich habe es durch Herausgreifen einer Anordnung von jedem der Anfangsbuchstabe, und ‚b‘ dargestellt Blau und ‚B‘ schwarz dargestellt
aks.