2014-11-03 73 views
-9

我可以在python中单行写入以下代码吗?
在单行中写入python代码

t=int(input()) 
while t: 
    t-=1 
    n=int(input()) 
    a=i=0 
    while not(n&1<<i): 
     i+=1 
    while n&1<<i: 
     n^=1<<i 
     a=a*2+1 
     i+=1 
    print(n^1<<i)+a/2 

如果没有,我怎么能写这段代码在尽可能小的线?
(PS:我可以减少这6条线,它可以是任何更好)
我的解决方案
t=int(input()) while t: t-=1;n=int(input());a=i=0 while not(n&1<<i):i+=1 while n&1<<i:n^=1<<i;a=a*2+1;i+=1 print(n^1<<i)+a/2
感谢

+3

第一个问题 - 's1','s2','s7'会影响'expr1'的真实性吗? 's3'影响'expr2'吗? 's4','s5'或's6'会影响'expr3'吗?如果没有真正的代码,我们甚至无法告诉你是否有一些'while'循环会执行,更不用说执行是否会停止。 – furkle 2014-11-03 19:58:59

+0

我认为's'代表'语句' – Beginner 2014-11-03 19:59:46

+2

@Beginner是的,我知道,但这并不能帮助我们真正理解代码中会发生什么。如果我们甚至不知道'expr2'是否会首先是'真',或者如果它'真',那么它是否会被假'假',我们怎么能压缩它呢?如果它是前者,我们可以通过扔掉'expr2'来压缩它。如果是后者,我们可以扔掉'expr3'。无论如何,代码将是相当无用的。 – furkle 2014-11-03 20:01:09

回答

1

由于蟒蛇list comprehensions是图灵完备,不需要换行,任何程序都可以写成python oneliner。

如果执行任意限制(???像“陈述的顺序” - 这是什么,即使是在源代码意味着执行顺序首先apperarance),那么答案是:可以消除一些换行符,但不是全部。

,而不是

if x: 
    do_stuff() 

你可以这样做:

if x: do_stuff() 

,而不是

x = 23 
y = 42 

你可以这样做:

x,y = 23, 42 

和替代

do_stuff() 
do_more_stuff() 

你可以做

do_stuff; do_more_stuff() 

如果你真的,真的要,可以exec某行的多行Python程序,使你的程序变得例如:

exec('''t=int(input())\nwhile t:\n t-=1;n=int(input());a=i=0\n while not(n&1<<i):i+=1\n while n&1<<i:n^=1<<i;a=a*2+1;i+=1\n print(n^1<<i)+a/2\n''') 

但是,如果你在“真实”代码中这样做,例如不只是为了好玩,小猫死了。

0

它不建议经常崩溃在Python行,因为你失去的Python著名的简单性和清晰度的方式。而且你经常不能折叠线条,因为缩进级别用于定义块结构/嵌套。

但是,如果你真的想要一个浓缩版:

print "s0" 
while True: 
    print "s1"; print "s2" 
    while True: print "s3" 
    while True: print "s4"; print "s5"; print "s6" 
    print "s7" 

(如果你的表情已被替换为True simplicity`)