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

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

@ Sp3000 Чому б тоді не поставити .title () на початковий рядок? Зберігає одне використання .title ().
isaacg

@isaacg Крім того , я зробив це, вибираючи з масиву кожного з вихідних букв, і «б» представлено синій і «B» представлені чорно
АКС.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.