Python 3-시도한 내 골프 연습


9

참고 : 이것은 골프 도전만큼 크지 않습니다. 더 골프 제안을 요구하고 있습니다.

최근에 코딩 할 수 있는지 확인하기 위해 웹 개발 클래스에 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을 가정 print하고 있지만 확인
만한다

5
당신은 아직 골프를 시도 했습니까?
feersum

2
이 코드에는 간단한 골프 개선이 많이 남아 있습니다. 골프 팁을 검토하고 다른 Python 골프를 살펴보고 코드를 직접 줄이려면 더 많이 배우는 것이 좋습니다. 그런 다음 얻은 내용을 게시하면 사람들이 더 통찰력있는 조언을 줄 수 있습니다.
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])

스 플랫 (-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코드 골프에서 가져 오는 것을 발견 하면 아마도 매우 잘못된 일을하고있을 것입니다 ...)


와!! 이것이 바로 내가 찾던 것입니다. 도와 주셔서 감사합니다!
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.