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.


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


Ł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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.