Нужно сделать программу покороче. Как?

def invert(d):
    res = ""
    for i in d:
        if i == "1":
            res += "0"
        else:
            res += "1"
    return res
def dracon(n):
    if n == 1:
        return "1"
    s = dracon(n - 1)
    s1 = invert(s)
    s2 = s1[::-1]
    return s+"1"+s2
f = int(input())
dr = dracon(f)
print(dr)
import turtle as t
tt = t.Turtle()
tt.left(90)
tt.forward(4)
for i in dr:
    if i == "1":
        tt.right(90)
        tt.forward(4)
    else:
        tt.left(90)
        tt.forward(4)
input()

нужно в 24 строки уложиться
  • Вопрос задан
  • 259 просмотров
Решения вопроса 1
0xD34F
@0xD34F
нужно в 24 строки уложиться

Замените тело функции invert на

return ''.join('0' if n == '1' else '1' for n in d)

Получится ровно 24.

Тело второй функции тоже сократим до одной строки:

return '1' if n == 1 else ((s := dracon(n - 1)) + '1' + invert(s)[::-1])

Сами функции теперь ничего не мешает переписать в виде лямбд.

Наконец, заметим, что две строки перед циклом, который перебирает dr, идентичны одной из веток условного оператора внутри цикла - так что удалим их, а цикл пусть сделает ещё одну итерацию, для этого в начале dr должно оказаться что-то, отличное от '1'.

Достаточно коротко получилось?
invert = lambda d: ''.join('0' if n == '1' else '1' for n in d)
dracon = lambda n: '1' if n == 1 else ((s := dracon(n - 1)) + '1' + invert(s)[::-1])

dr = '0' + dracon(int(input()))
print(dr)

import turtle as t
tt = t.Turtle()

for n in dr:
  if n == '1':
    tt.right(90)
    tt.forward(4)
  else:
    tt.left(90)
    tt.forward(4)

input()

Тут конечно надо отметить, что на данный момент далеко не везде используется python версии 3.8+, так что приведённый код может у вас и не взлететь, по причине наличия в нём assignment expression (оператор :=).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
hottabxp
@hottabxp Куратор тега Python
Сначала мы жили бедно, а потом нас обокрали..
def invert(d):
    res = ""
    for i in d:
        if i == "1":res += "0"
        else:res += "1"
    return res
def dracon(n):
    if n == 1:return "1"
    s2 = invert(dracon(n - 1))[::-1]
    return dracon(n - 1)+"1"+s2
dr = dracon(int(input()))
print(dr)
import turtle as t
tt = t.Turtle()
tt.left(90)
tt.forward(4)
for i in dr:
    if i == "1":
        tt.right(90)
        tt.forward(4)
    else:
        tt.left(90)
        tt.forward(4)
input()

Если поднапрячь мозги, можно и ещё урезать, только главное не давать смотреть такой код слабонервным.
Ответ написан
saboteur_kiev
@saboteur_kiev Куратор тега Python
software engineer
22 строки - тернарный оператор и можно if в одну строку, если там только одна команда
def invert(d):
    res = ""
    for i in d: res+=("0" if i == "1" else "1")
    return res
def dracon(n):
    if n == 1: return "1"
    s2 = invert(dracon(n - 1))[::-1]
    return dracon(n - 1)+"1"+s2
dr = dracon(int(input()))
print(dr)
import turtle as t
tt = t.Turtle()
tt.left(90)
tt.forward(4)
for i in dr:
    if i == "1":
        tt.right(90)
        tt.forward(4)
    else:
        tt.left(90)
        tt.forward(4)
input()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы