2014-11-03 3 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

+0

Я думаю '' 'означает' statement' – Beginner

+2

@Beginner Да, я знаю, но это не помогает нам понять, что произойдет в коде. Как мы можем конденсировать это, если мы даже не можем знать, будет ли 'expr2' когда-либо« истинным »в первую очередь, или, если оно« True »к тому времени, будет ли оно« ложным »?Если это первый, мы можем сконденсировать его, просто выбросив «expr2». Если это последнее, мы можем выбросить 'while expr3'. И в любом случае код будет бесполезным. – furkle

ответ

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 многострочный питон программа в одной строке, так что ваша программа становится что-то вроде:

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`)

Смежные вопросы