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 ? Кроме того, какая версия Python? (Я предполагаю 3 из-за парней вокруг print, но только для проверки)
Sp3000

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код-гольф, вы, вероятно, делаете что-то очень неправильное ...)


Ух ты!! Это именно то, что я искал. Большое спасибо за Вашу помощь!
Акс.

Вы могли бы, вероятно, избавиться от необходимости .title()путем докапитализации всего. Также присвойте s.countпеременную.
Исаак

@isaacg Я думал, что постараюсь сохранить функциональность оригинальной программы. Если бы спецификация была всем, что учитывалось, я бы отбросил несколько длинных операторов печати, поскольку технически это назначение не нужно;)
Sp3000

@ Sp3000 В таком случае, почему бы не поместить .title () в исходную строку? Сохраняет одно использование .title ().
Исаак

@isaacg Кроме того, я сделал это, выбрав из массива каждой из начальных букв, и «b» представлял синий, а «B» представлял чёрный
aks.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.