Python 3 - Đã thử chơi Golf Bài tập của tôi


9

Lưu ý: Đây không phải là một thử thách chơi gôn; đó là nhiều hơn để yêu cầu đề nghị chơi golf.

Gần đây tôi có một bài tập Python cho lớp phát triển web của mình, để kiểm tra xem chúng tôi có thể viết mã không. Vì tôi đã cảm thấy thoải mái với Python, tôi quyết định thử và chơi nó, và tôi tự hỏi liệu mọi người có thể chỉ ra những thứ mà tôi đã bỏ lỡ không.

Tôi đã biết rằng có một số không gian thêm ở một số nơi, nhưng tôi quan tâm nhiều hơn đến những thứ khái niệm, như sử dụng while r:khi r là một biến, và sau đó chờ nó "hết"!

Nhiệm vụ

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

Ngoài ra: Tôi xin lỗi nếu đây không phải là một câu hỏi thích hợp cho trang golf mã, vì nó không phải là một thách thức và sẽ xóa nó theo yêu cầu.


Đặt vấn đề về chủ đề sang một bên (vì tôi không chắc chắn), có lẽ hãy xem trang mẹo chơi gôn Python ? Ngoài ra, phiên bản Python nào? (Tôi giả sử 3 do các parens xung quanh print, nhưng chỉ để kiểm tra)
Sp3000 24/2/2015

5
Bạn đã thử chơi golf chưa?
frageum

2
Mã này có rất nhiều cải tiến golf đơn giản còn lại. Tôi nghĩ rằng bạn sẽ học tốt hơn nếu bạn xem lại các mẹo chơi gôn và xem các môn đánh gôn khác của Python và đã làm nhiều hơn để tự rút ngắn mã của mình. Sau đó, nếu bạn đăng những gì bạn nhận được, mọi người có thể đưa ra lời khuyên sâu sắc hơn.
xnor 24/2/2015

Câu trả lời:


20

Đây là một loạt các tối ưu hóa vi mô bạn có thể làm:

Sử dụng .split()để tạo một danh sách dài (-17 byte):

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

Xóa dấu ngoặc ngoài (-2 byte):

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

Sử dụng splat (-2 byte):

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

Sử dụng giải nén lặp lại mở rộng để biến một cái gì đó thành một danh sách (-4 byte):

l=list(l)
*l,=l

Nhập tất cả mọi thứ (-15 byte):

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

Sử dụng các hàm khác có thể thực hiện cùng một công việc ở đây (-5 * 2 = -10 byte):

j.capitalize()
j.title()

print phân tách theo không gian theo mặc định (-11 byte):

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

Giải nén nhiều hơn (-3 byte):

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

Lạm dụng tác dụng phụ (-1 byte, cộng với thụt lề):

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

Bất cứ điều gì được sử dụng lại và trên 5 ký tự có thể có giá trị lưu dưới dạng một biến (-1 byte):

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

Đơn giản hóa các phân số (-5 byte):

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

Lạm dụng đơn phương (-4 byte):

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

Hoặc là lớn nhất trong tất cả ...

Nhìn vào thuật toán của bạn và xem liệu nó có cần thay đổi hoàn toàn không

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

(Nếu bạn từng thấy mình nhập Countervào một môn đánh gôn, có lẽ bạn đã làm gì đó rất sai ...)


Chà !! Điều này thật đúng với gì mà tôi đã tìm kiếm. Cám ơn rất nhiều về sự giúp đỡ của bạn!
aks.

Bạn có thể có thể làm giảm nhu cầu .title()bằng cách kết tủa mọi thứ. Ngoài ra, gán s.countcho một biến.
isaacg

@isaacg Tôi nghĩ tôi sẽ cố gắng giữ chức năng của chương trình gốc. Nếu thông số kỹ thuật là tất cả những gì được tính, tôi sẽ bỏ một vài câu lệnh in dài vì về mặt kỹ thuật , bài tập không cần chúng;)
Sp3000

@ Sp3000 Trong trường hợp đó, tại sao không đặt .title () trên chuỗi ban đầu? Lưu một .title () sử dụng.
isaacg

@isaacg Ngoài ra, tôi đã làm điều đó bằng cách chọn ra một mảng của mỗi chữ cái bắt đầu và 'b' đại diện cho màu xanh và 'B' đại diện cho màu đen
aks.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.