Python 3 - Mencoba Golfing Tugas Saya

9

Catatan: Ini bukan tantangan golf; lebih dari itu meminta saran golf.

Baru-baru ini saya memiliki tugas Python untuk kelas pengembangan web saya, untuk memeriksa apakah kami bisa membuat kode. Karena saya sudah merasa nyaman dengan Python, saya memutuskan untuk mencoba dan bermain golf, dan saya bertanya-tanya apakah orang bisa menunjukkan hal-hal yang saya lewatkan.

Saya sudah tahu bahwa ada ruang tambahan di beberapa tempat, tapi saya lebih tertarik pada hal-hal konseptual, seperti menggunakan while r:ketika r adalah variabel, dan kemudian menunggu itu "habis"!

Tugas

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

Juga: Saya minta maaf jika ini bukan pertanyaan yang sesuai untuk halaman kode golf, karena ini bukan tantangan dan akan menghapusnya berdasarkan permintaan.

aks.
sumber
Mengesampingkan masalah pada topik (karena saya tidak yakin), mungkin lihat halaman tips golf Python ? Juga, versi Python yang mana? (Saya mengasumsikan 3 karena parens sekitar print, tetapi hanya untuk memeriksa)
Sp3000
5
Sudahkah Anda mencoba golf?
feersum
2
Kode ini memiliki banyak perbaikan golf sederhana yang tersisa. Saya pikir Anda akan belajar lebih baik jika Anda meninjau tips golf dan melihat golf Python lainnya, dan melakukan lebih banyak untuk mempersingkat kode Anda sendiri. Kemudian, jika Anda memposting apa yang Anda dapatkan, orang dapat memberikan saran yang lebih mendalam.
xnor

Jawaban:

20

Inilah sejumlah optimasi mikro yang dapat Anda lakukan:

Gunakan .split()untuk membuat daftar panjang (-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()

Hapus kurung asing (-2 byte):

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

Gunakan splat (-2 bytes):

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

Gunakan pembongkaran yang dapat diperpanjang untuk mengubah sesuatu menjadi daftar (-4 byte):

l=list(l)
*l,=l

Impor semua hal (-15 byte):

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

Gunakan fungsi lain yang dapat melakukan pekerjaan yang sama di sini (-5 * 2 = -10 byte):

j.capitalize()
j.title()

print memisahkan menurut ruang secara default (-11 byte):

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

Lebih banyak membongkar (-3 byte):

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

Efek samping penyalahgunaan (-1 byte, plus indentasi):

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

Apa pun yang digunakan kembali dan lebih dari 5 karakter mungkin layak disimpan sebagai variabel (-1 byte):

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

Sederhanakan fraksi (-5 byte):

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

Penyalahgunaan yang tidak umum (-4 byte):

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

Atau yang terbesar ...

Lihatlah algoritme Anda, dan lihat apakah perlu diubah sama sekali

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

(Jika Anda menemukan diri Anda mengimpor Counterkode-golf, Anda mungkin melakukan sesuatu yang sangat salah ...)

Sp3000
sumber
Wow!! Inilah yang saya cari. Terima kasih banyak atas bantuan Anda!
aks.
Anda mungkin dapat meniadakan kebutuhan akan hal tersebut .title()dengan melakukan prapembuatan segalanya. Juga, tetapkan s.countke variabel.
isaacg
@isaacg Saya pikir saya akan mencoba untuk menjaga fungsi dari program aslinya Jika semua spek itu diperhitungkan, saya akan menjatuhkan beberapa pernyataan cetak yang panjang karena secara teknis penugasan tidak membutuhkannya;)
Sp3000
@ Sp3000 Dalam hal ini, mengapa tidak meletakkan .title () pada string awal? Menghemat satu .title () digunakan.
isaacg
@isaacg Juga, saya melakukannya dengan memilih dari array masing-masing huruf awal, dan 'b' mewakili biru dan 'B' mewakili hitam
aks.