Python 3 - Tried Golfing My Assignment

9

Uwaga: To nie jest tak duże wyzwanie w golfa; tym bardziej jest prośba o sugestie dotyczące gry w golfa.

Ostatnio miałem zadanie w Pythonie dla mojej klasy programowania WWW, aby sprawdzić, czy możemy kodować. Ponieważ czuję się już dobrze w Pythonie, postanowiłem spróbować zagrać w golfa i zastanawiałem się, czy ludzie mogą wskazać rzeczy, które mi umknęły.

Wiem już, że w niektórych miejscach są dodatkowe spacje, ale bardziej interesują mnie rzeczy koncepcyjne, takie jak używanie, while r:gdy r jest zmienną, a następnie czekanie na jej „wyczerpanie”!

Przydzial

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

Ponadto: Przykro mi, jeśli nie jest to właściwe pytanie dotyczące strony golfa, ponieważ nie stanowi wyzwania i usunie ją na żądanie.

aks.
źródło
Odkładając na bok kwestię tematów (bo nie jestem pewien), może zajrzyj na stronę ze wskazówkami golfowymi Python ? Ponadto, która wersja Pythona? (Zakładam, że 3 z powodu parens wokół print, ale tylko po to sprawdzić)
Sp3000
5
Czy próbowałeś już w golfa?
feersum
2
W kodzie tym pozostało wiele prostych ulepszeń golfa. Myślę, że nauczyłbyś się lepiej, gdybyś przejrzał wskazówki dotyczące golfa i spojrzał na inne golfy Python i zrobił więcej, aby skrócić swój kod na własną rękę. Następnie, jeśli opublikujesz to, co dostajesz, ludzie mogą udzielić bardziej wnikliwych porad.
xnor

Odpowiedzi:

20

Oto cała masa mikrooptymalizacji, które możesz wykonać:

Użyj, .split()aby utworzyć długą listę (-17 bajtów):

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

Usuń obce nawiasy (-2 bajty):

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

Użyj ikony (-2 bajty):

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

Użyj rozszerzonego iterowalnego rozpakowywania, aby zamienić coś w listę (-4 bajty):

l=list(l)
*l,=l

Zaimportuj wszystkie rzeczy (-15 bajtów):

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

Użyj innych funkcji, które mogą wykonywać tę samą pracę tutaj (-5 * 2 = -10 bajtów):

j.capitalize()
j.title()

print domyślnie oddziela spacje (-11 bajtów):

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

Więcej rozpakowywania (-3 bajty):

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

Efekty uboczne nadużywania (-1 bajt plus wcięcia):

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

Cokolwiek ponownie użyte i ponad 5 znaków może być warte zapisania jako zmienna (-1 bajt):

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

Uprość ułamki (-5 bajtów):

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

Jednoargumentowe nadużycie (-4 bajty):

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

Lub największy ze wszystkich ...

Spójrz na swój algorytm i sprawdź, czy wymaga on całkowitej zmiany

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

(Jeśli kiedykolwiek importujesz grę Counterw golfa kodowego, prawdopodobnie robisz coś bardzo złego ...)

Sp3000
źródło
Łał!! Właśnie tego szukałem. Dziękuję bardzo za Twoją pomoc!
aks.
Prawdopodobnie można by tego uniknąć, .title()dokonując wstępnej kapitalizacji wszystkiego. Przypisz również s.countdo zmiennej.
isaacg
@isaacg Myślałem, że postaram się zachować funkcjonalność oryginalnego programu. Gdyby liczyła się specyfikacja,
upuściłbym
@ Sp3000 W takim przypadku, dlaczego nie wstawić .title () na początkowy ciąg? Zapisuje jedno użycie .title ().
isaacg
@isaacg Również zrobiłem to, wybierając tablicę z każdej z początkowych liter, a „b” reprezentował niebieski, a „B” reprezentował czarny
aks.