高尔夫练习:Python [关闭]


31

这是在Python中练习高尔夫优化的挑战-可重复使用的技巧和捷径以剃除一些角色。许多人会熟悉Python高尔夫球手,并使用Python技巧中的常见想法。其中一些使用了Python特有的功能,除非您已经看过它们,否则可能不知道它们存在,因此,如果遇到问题,请仔细阅读提示。

目标: 有十个问题,每个问题都是供您优化的Python代码参考片段,并提供了代码描述。您的目标是将其重写为更短,但仍在功能上等效。

您试图最小化的分数是所有代码段的总代码长度。参考片段的长度为150。抢先注是最早的帖子。

发布答案:对于每个问题,请发布您的代码及其字符数。如果找不到更短的内容,则可以发布参考代码段。目的是在发布您的答案时不要看别人的答案。请扰乱标记每个单独的问题,包括单独的字符数。您可以显示总数。现在就可以随意破坏您的解决方案或发布新的,没有伪造的解决方案。

有关合法性的详细信息:功能对等意味着可以在不影响其行为的情况下将其替换为程序中的代码(忽略内存使用和运算符优先级之类的表达式)。表达式应产生与等效的值==。注意1.0==1==True。除非另有说明,否则您的代码不应有任何副作用。我不希望这些问题是特定于版本的,但以防万一,您可以为每个问题指定一个Python版本。

问题1:只要列表L中至少包含7个元素,就可以进行迭代

# 16 chars
while len(L)>=7:

问题2:检查两个浮点xy两者是否均为正。

# 11 chars
x>0 and y>0

问题3:如果布尔b值为true,则删除的第一个元素L。否则,请保持不变。

# 12 chars
if b:L=L[1:]

问题4:检查非空L数字列表中的所有元素是否相等。对于此问题,可以修改列表。

# 22 chars
all(x==L[0]for x in L)

问题5:仅当一个数字已经包含该数字时,才将其添加n到列表末尾。LL

# 16 chars
if n in L:L+=[n] 

问题6:表示浮点数的符号x+1为正,0为0,-1为负。

# 20 chars
abs(x)/x if x else 0

问题7只要LBoolean列表的第一个元素是,就继续循环True。如果L为空,也停止。

# 17 chars
while L and L[0]:

问题8:只要n大于1 ,就继续循环。该数字n保证为正整数。

# 10 chars
while n>1:

问题9:检查以字符串表示的整数s是否为负(即以“-”开头)。

# 9 chars
s[0]=='-'

问题10:使用-> 和-> 将布尔值转换b"Win"/ 。"Lose"True"Win"False"Lose"

# 17 chars
["Lose","Win"][b]

警告:下面的扰流板,如果您想自己解决这些问题,请不要向下滚动。

如果您只想知道问题的最佳分数:

问题一:

12

问题2:

5

问题三:

7

问题4:

13

问题5:

13

问题6:

8

问题7:

12

问题8:

9

问题9:

5

问题10:

15


3
我投票结束,因为这一挑战会引起重复的答案,并且有效地将许多问题合而为一,因为各个挑战之间没有任何相互作用。我认为,如果我们有这样的问题,那么应该只有一个答案,这就是社区Wiki。
Wrzlprmft

2
@Wrzlprmft:不知何故,这是一个有趣的挑战。但是,在获得7项出色的贡献之后,我建议放宽规则,并允许对单个问题的解决方案毫不含糊,因为否则,理想的提交方式可能仍然隐藏在总体平庸的总成绩之后。
Falko 2014年

2
我认为这是一个很不错的主意,我们应该采用高尔夫练习练习更多的语言。
Robbie Wxyz 2014年

2
@Wrzlprmft现在在meta上对此进行了讨论。请在此发表您的意见,以便进行更轻松的讨论,而不会污染该问题的评论。
FireFly

3
我投票结束这个问题是离题的,因为不允许多部分挑战,而各部分之间没有交互。meta.codegolf.stackexchange.com/a/8464/45941
Mego

Answers:


21

总计:104 101 99个字符

问题1

12个字符
while L[6:]:

问题2

5个字符
x>0<y

问题3

7个字符
L=L[b:]

问题4

13个字符
len(set(L))<2
L[1:]==L[:-1]

问题5

13个字符
L+=set(L)&{n}

问题6

11个字符
(x>0)-(x<0)

8个字符(Python 2)
cmp(x,0)

问题7

12个字符
while[.5]<L:

问题8

9个字符
while~-n:

问题9

5个字符
s<'.'

问题10

15个字符
'LWoisne'[b::2]


@FryAmTheEggman你能解释一下副作用吗?我打算将其作为有效的解决方案。
xnor

@xnor没关系,我完全错了。我今天学到了一些东西:)
FryAmTheEggman 2014年

鉴于有99多个解决方案,而且我找不到更好的解决方案,因此我认为这些解决方案是最佳的。我很高兴看到有所改善。因为这是第一个99,所以我接受。
xnor

7

总尺寸:128 122 120 117 116 115 111 107 104

问题1

只要列表L中至少包含7个元素,就可以进行迭代。

15个字符
while len(L)>6:
(是的,我可以为此节省3个字节,但是我不小心看到了解决方案Sp3000的答案,所以我不会要求这三个字节。)

问题2

检查是否两个浮体xy都为正。

5个字符
x>0<y

问题3

如果Boolean b为true,则删除的第一个元素L。否则,请保持不变。

7个字符
L=L[b:]

问题4

检查非空L数字列表中的所有元素是否相等。对于此问题,可以修改列表。

13个字符
L[1:]==L[:-1]

问题5

仅当一个数字已经包含该数字时,才将其添加n到列表末尾。LL

15个字符
L+=[n]*(n in L)

L+=[n][:n in L]

问题6

表示浮点数的符号x+1为正,0为0,-1为负。

8个字符,Python 2
cmp(x,0)
根据文档,这可能返回任何正/负值,但是共识是它总是返回-1、0、1。

问题7

只要L布尔值列表的第一个元素为,就继续循环True。如果L为空,也停止。

12个字符
while[1]<=L:

问题8

只要n大于1 ,就继续循环。该数字n保证为正整数。

9个字符
while~-n:

问题9

检查表示为字符串的整数s是否为负(即以“-”开头)。

5个字符
s<'.'

问题10

使用-> 和-> 将布尔值转换b"Win"/ 。"Lose"True"Win"False"Lose"

15个字符
"LWoisne"[b::2]


您能也破坏个别长度吗?
xnor 2014年

@xnor没问题,完成。
Martin Ender 2014年

7

总计:106104102 字符

问题1

12个字符
while L[6:]:

问题2

5个字符的
x>0<y
Huzzah用于比较链接

问题3

7个字符
L=L[b:]
好旧的隐式转换

问题4

13
len(set(L))<2


L[1:]==L[:-1]

一种选择:在Python 2中获得否定的愚蠢方法2:
","in`set(L)`

我不确定“可以修改列表”的意义是什么,因为我能想到的最好的是14个字符(并且是实际上是错误的):
L==[L.pop()]+L

问题5

13个字符
L+={n}&set(L)
与套一起做时髦的事情

问题6

11个字符
(x>0)-(x<0)

问题7

12个字符
while[1]<=L:
使用列表的字典顺序

问题8

9个字符
while~-n:

问题9

5个字符
s<"."
使用字符串的字典顺序

问题10

15个字符
"LWoisne"[b::2]

或者:
b*"Win"or"Lose"


1
之前我没有考虑过使用#10作为替代方案。这意味着无论字符串的长度如何,都可以获得与通常的交织技巧相同的字符节省,除非布尔中有优先级问题。我将其添加到提示中。
xnor 2014年

1
@xnor Ahaha是的,我认为这非常不错。但是,当您有更多字符串时,效果不好(例如b0、1或2,而您只能做的是(b-1)*"Hello"or b*"Goodbye"or"Good Afternoon"
Sp3000


对于三个字符串来说,这实际上还不错。您可以使用删除括号~b*"Hello"
xnor 2014年

@xnor届时,["Good Afternoon","Goodbye","Hello"][b]将赢得:P
Sp3000

6

总计:99个字节

问题1

12字节
while L[6:]:

问题2

5字节
x>0<y

问题3

7字节
L=L[b:]

问题4

13字节
len(set(L))<2

14字节替代
min(L)==max(L)
set(L)=={L[0]}

问题5

13字节
L+=set(L)&{n}

问题6

8字节
cmp(x,0)

问题7

12字节
while[1]<=L:

问题8

9字节
while~-n:

问题9

5字节
s<'.'

问题10

15个字节
b*"Win"or"Lose"
-或-
"LWoisne"[b::2]


4

1:12
while L[6:]:
2:5
y>0<x
3:7
L=L[b:]
4:15
L==L[:1]*len(L)
5:15
L+=[n]*(n in L)L+=[n][:n in L]
6:11
这是唯一一个针对一个习惯表达没有立即跨越到我的主意,但是我想我找到正确的答案。编辑:不,这太可怕了。
(x>0)-(x<0)
7:12
while[1]<=L:
或者如果程序在那之后完成,那就while L[0]很好了。
8:9
while~-n:
9:5
许多字符串都可以在这里工作,但是“天真的方法”很有趣。
s<'0'
10:15
'LWoisne'[b::2]

合计:106


您的#4不必使用[L[0]]吗?
萤火虫

@FireFly哎呀。并没有那么糟糕,但是花费了一个字节。
feersum 2014年

2
您的#9是一个很棒的高尔夫双关语!
xnor

3

总尺寸:123 121 120 116

#1

(12) while L[6:]:

#2

(10) min(x,y)>0

#3

(7) L=L[b:]

#4

(13)len(set(L))<2L[1:]==L[:-1]

#5

(15) L+=[n]*(n in L)

#6

(14) x and abs(x)/x或(受Claudiu的解决方案启发而放弃)x and(x>0)*2-1

#7

(15) while[0]<L[:1]:

#8

(9) while~-n:

#9

(5) s<'.'

#10

(15) b*"Win"or"Lose"


1

合计:121

首次尝试:

问题1

15个字符
while len(L)>6:

问题2

5个字符
x>0<y

问题3

7个字符
L=L[b:]

问题4

13个字符
len(set(L))<2

问题5

16个字符
if n in L:L+=[n]

问题6

16个字符
x and(1,-1)[x<0]

问题7

16个字符
while(L+[0])[0]:

问题8

10个字符
while n>1:

问题9

8个字符
s[0]<'0'

问题10

15个字符
"LWoisne"[b::2]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.