Python 3 - Görevimi Golf Denedim


9

Not: Bu bir golf zorluğu değil; daha çok golf önerileri istiyor.

Son zamanlarda kod yazıp yazamayacağımızı kontrol etmek için web geliştirme sınıfım için bir Python ödevi yaptım. Python'da zaten rahat hissettiğim için, denemeye ve golf oynamaya karar verdim ve insanların kaçırdığım şeyleri işaret edip edemeyeceğini merak ediyordum.

Zaten bazı yerlerde fazladan boşluklar olduğunu biliyorum, ama ben while r:r değişkeni olduğunda kullanmak ve sonra "tükenmesini" beklemek gibi kavramsal şeylerle daha fazla ilgileniyorum !

Proje, görev

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

Ayrıca: Bu bir sorun değil ve istek üzerine kaldıracak, çünkü bu kod golf sayfası için uygun bir soru değilse üzgünüm.


Konu başlıkları konusunu bir kenara bırakmak (emin olmadığımdan beri), belki de Python golf ipuçları sayfasına bir göz atın ? Ayrıca, hangi Python sürümü? ( print
Parens

5
Henüz golf oynamaya çalıştınız mı?
feersum

2
Bu kodda basit golf geliştirmeleri kaldı. Golf ipuçlarını gözden geçirip diğer Python golflerini incelerseniz ve kodunuzu kısaltmak için daha fazlasını yaparsanız daha iyi öğreneceğinizi düşünüyorum. Sonra, aldığınız şeyi gönderirseniz, insanlar daha anlayışlı tavsiyeler verebilir.
xnor

Yanıtlar:


20

İşte yapabileceğiniz bir dizi mikro optimizasyon:

.split()Uzun bir liste oluşturmak için kullanın (-17 bayt):

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

Yabancı braketleri çıkarın (-2 bayt):

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

Uyarıyı kullan (-2 bayt):

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

Bir şeyi listeye dönüştürmek için genişletilmiş yinelenebilir ambalajı açma (-4 bayt) kullanın:

l=list(l)
*l,=l

Her şeyi içe aktar (-15 bayt):

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

Burada aynı işi yapabilecek diğer işlevleri kullanın (-5 * 2 = -10 bayt):

j.capitalize()
j.title()

print varsayılan olarak boşluğa göre ayrılır (-11 bayt):

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

Daha fazla paketleme (-3 bayt):

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

Kötüye kullanım yan etkileri (-1 bayt, artı girintiler):

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

Yeniden kullanılan ve 5'ten fazla karakter bir değişken olarak (-1 bayt) kaydedilmeye değer olabilir:

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

Kesirleri basitleştirin (-5 bayt):

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

Tekli kötüye kullanım (-4 bayt):

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

Ya da en büyüğü ...

Algoritmanıza bakın ve tamamen değişmesi gerekip gerekmediğine bakın

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

(Kendinizi Counterbir kod golfüne aktarırken bulursanız , muhtemelen çok yanlış bir şey yapıyorsunuzdur ...)


Vay!! Tam da aradığım şey buydu. Yardımın için çok teşekkürler!
aks.

Muhtemelen .title()her şeyi önceden sermayelendirerek ihtiyacı ortadan kaldırabilirsiniz . Ayrıca, s.countbir değişkene atayın .
isaacg

@isaacg Orijinal programın işlevselliğini korumaya çalışacağımı düşündüm. Özelliklerin hepsi sayılırsa, teknik olarak atama onlara ihtiyaç duymadığı için uzun basılı ifadelerden
birkaçını bırakardım

@ Sp3000 Bu durumda, neden .title () öğesini ilk dizeye koymuyorsunuz? Bir .title () kullanımını kaydeder.
isaacg

@isaacg Ayrıca, başlangıç harflerin her birinin bir dizi dışarı çekme ile yaptığını, ve 'b' mavi ve 'B' siyah temsil temsil
aks.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.