Python 3 พยายามเล่นกอล์ฟที่ได้รับมอบหมาย


9

หมายเหตุ:นี่ไม่ใช่ความท้าทายในการเล่นกอล์ฟมากนัก มันมากขึ้นดังนั้นขอคำแนะนำการเล่นกอล์ฟ

เมื่อเร็ว ๆ นี้ฉันมีการกำหนด 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 เวอร์ชันใด? (ฉันสมมติว่า 3 เนื่องจาก parens รอบ ๆprintแต่เพื่อตรวจสอบ)
Sp3000

5
คุณเคยลองเล่นกอล์ฟหรือยัง?
feersum

2
รหัสนี้มีการปรับปรุงสนามกอล์ฟที่ง่าย ฉันคิดว่าคุณจะเรียนรู้ได้ดีขึ้นถ้าคุณอ่านเคล็ดลับการเล่นกอล์ฟและดู Python Golfs อื่น ๆ และทำอีกมากเพื่อย่อรหัสของคุณเอง จากนั้นหากคุณโพสต์สิ่งที่คุณได้รับผู้คนสามารถให้คำแนะนำที่ลึกซึ้งยิ่งขึ้น
xnor

คำตอบ:


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 bytes):

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สนามกอล์ฟคุณอาจจะทำอะไรผิดไปมาก ... )


ว้าว!! นี่คือสิ่งที่ฉันกำลังมองหา ขอบคุณมากสำหรับความช่วยเหลือของคุณ!
aks

คุณอาจหลีกเลี่ยงความต้องการ.title()โดยการทำทุกอย่างให้ถูกต้อง นอกจากนี้ยังกำหนดให้s.countกับตัวแปร
isaacg

@isaacg ฉันคิดว่าฉันพยายามคงฟังก์ชั่นการทำงานของโปรแกรมดั้งเดิมไว้ หากสเป็คคือทั้งหมดที่นับฉันจะวางงบการพิมพ์ไม่กี่เพราะเทคนิคการกำหนดไม่ต้องการพวกเขา;)
Sp3000

@ Sp3000 ในกรณีนั้นทำไมไม่ใส่. title () ลงในสตริงเริ่มต้น บันทึก. title () หนึ่งรายการใช้
isaacg

@isaacg ฉันก็ทำได้โดยเลือกจากตัวอักษรเริ่มต้นแต่ละตัวและ 'b' แทนสีน้ำเงินและ 'B' แทนสีดำ
aks
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.