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 2015

2
このコードには、多くの単純なゴルフの改善が残っています。ゴルフのヒントを確認し、他のPythonゴルフを見て、自分でコードを短くするためにさらに多くのことをした方がよいと思います。そして、あなたが得たものを投稿すれば、人々はより洞察に富んだアドバイスを与えることができます。
xnor 2015

回答:


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

スプラットを使用(-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その場合、なぜ最初の文字列に.title()を付けないのですか?.title()の使用を1回節約します。
isaacg 2015

@isaacgまた、Iは、開始文字の各々の配列から選択することでそれをやった、そして「b」は青色と「B」は黒表さ表さ
AKSを。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.