Python 3-尝试打高尔夫球我的作业


9

注意:这并不是打高尔夫球的挑战;因此,更需要打高尔夫球的建议。

最近,我为我的Web开发类分配了Python作业,以检查是否可以编码。由于我已经对Python感到很自在,因此我决定尝试打高尔夫球,并且我想知道人们是否可以指出我错过的事情。

我已经知道某些地方有多余的空格,但是我对概念性的东西更感兴趣,例如使用while r:r为变量时,然后等待其“耗尽”!

那作业

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

另外:很抱歉,如果这不是适用于代码高尔夫页面的问题,因为这不是一个挑战,它将根据要求将其删除。


抛开话题性问题(由于不确定),也许看看Python高尔夫技巧页面?另外,哪个Python版本?(我假设3是由于周围的括号print,但只是为了检查)
Sp3000

5
您是否尝试过打高尔夫球?
feersum

2
该代码还保留了许多简单的高尔夫改进方法。我认为,如果您回顾了高尔夫球技巧并看了其他Python高尔夫球,就会学得更好,并且自己做得更多,可以缩短代码。然后,如果您发布所获得的内容,人们可以提供更多有见地的建议。
xnor

Answers:


20

您可以执行大量的微优化:

使用.split()创建一个长长的清单(-17字节):

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

删除多余的括号(-2个字节):

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

使用splat(-2个字节):

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

使用扩展的可迭代解压缩将内容转换为列表(-4字节):

l=list(l)
*l,=l

导入所有内容(-15个字节):

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

在这里使用其他可以完成相同工作的函数(-5 * 2 = -10字节):

j.capitalize()
j.title()

print 默认情况下以空格分隔(-11个字节):

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

更多解压缩(-3个字节):

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

滥用副作用(-1个字节,加上缩进):

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

任何重用且超过5个字符的值都可以保存为变量(-1字节):

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

简化分数(-5字节):

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

一元滥用(-4个字节):

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

或最大的一个...

查看您的算法,看看是否需要完全更改

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

(如果您发现自己Counter在代码高尔夫球中导入,则可能是在做非常错误的事情……)


哇!!这正是我想要的。非常感谢你的帮助!
阿克斯。

您可以.title()通过对所有内容进行预资本化来消除对这一需求的需求。另外,分配s.count给变量。
isaacg 2015年

@isaacg我以为我会尝试保留原始程序的功能。如果按规格计算,我将删除一些详细说明,因为从技术上讲,该工作不需要它们;)
Sp3000,2015年

@ Sp3000在这种情况下,为什么不将.title()放在初始字符串上呢?保存一个.title()使用。
isaacg 2015年

@isaacg另外,我通过从每个开头字母的数组中选取来做到这一点,“ b”代表蓝色,“ B”代表黑色
aks。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.