phaggi
@phaggi
лужу, паяю, ЭВМы починяю

Как сократить однострочник?

Сыну задали по программированию задачку: на вход строка из 4 цифр ("4-значное число"), на выходе печатается через пробел два двузначных числа из цифр входного числа: наименьшее, не начинающееся с нуля, и наибольшее.

Причем пацанам кроме if ничего еще не преподали, поэтому они писали от 40 строк последовательных и вложенных if и более (до сотни).

Я ради интереса накарябал однострочник:
print((lambda x: (bool(int(x[0])) * 1 and '{0}{1} {3}{2}'.format(*x) or '{1}{0} {3}{2}'.format(*x)))(sorted(list(input()))))

для проверки - если на входе
6509

то на выходе
50 96


но мне оно кажется чудовищным, а как улучшить - мозгов не хватает. Можно это сделать изящнее?
  • Вопрос задан
  • 572 просмотра
Решения вопроса 1
@dodo512
print((lambda x: (('{0}{1}', '{1}{0}')[x[0]=='0'] + ' {3}{2}').format(*x))(sorted(input())))
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
kshnkvn
@kshnkvn Куратор тега Python
yay ✌️ t.me/kshnkvn
Я конечно сам любитель писать в одну строку функции но ровно до тех пор, пока без вдумчивого взгляда можно понять че вообще происходит. Помимо того, что код должен выполнять возложенные на него задачи он должен быть читаемым.

def convert(str_nums):
    str_list = list(map(int, list(str_nums)))
    min_num =  min(filter(lambda x: x > 0, str_list))
    max_num = max(str_list)
    list(map(str_list.remove, (min_num, max_num)))
    return '{0}{2} {1}{3}'.format(min_num, max_num, *str_list)
Ответ написан
0xD34F
@0xD34F
Думаю, первоочередная проблема здесь не "сократить", а "исправить". То, что есть сейчас, не всегда работает корректно. Например, для '1000' результатом будет '00 10'. Что, спросите, какого чёрта три нуля? Ну так в условии задачи не сказано, сколько нулей может быть. А значит - любое количество, при котором можно вернуть корректный результат. Поэтому минимум определим не как комбинацию нулевой и первой отсортированных цифр, а как минимальная не включая нули плюс просто минимальная. Ещё ничего не сказано про повторное использование цифр - так что максимум будет не третья-вторая отсортированные, а максимальная продублированная.

Исправляем:

print((lambda s: min(s.replace('0', '')) + min(s) + ' ' + max(s) * 2)(input()))

Кстати, заодно и сократили.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
deeplay Новосибирск
от 130 000 ₽
от 130 000 ₽
Enjoy PRO Санкт-Петербург
от 140 000 до 180 000 ₽
20 окт. 2020, в 22:57
5000 руб./за проект
20 окт. 2020, в 21:37
300000 руб./за проект
20 окт. 2020, в 21:18
500 руб./за проект