Введение в запутанный код Python

Обфускация и минимизация в программировании настолько популярны, что люди соревнуются в этом. Вот несколько руководств по началу работы с обфускацией в Python.

Мы создадим скрипт, который постоянно показывает текущий час, минуту и ​​секунду в консоли, и постараемся минимизировать количество символов, запутав его.

Вывод 8 будет выглядеть так (каждая цифра имеет 5 строк и 4 столбца);

####
#  #
####
#  #
####

Таким образом, при запуске «python clock.py 1234567890» вывод будет выглядеть следующим образом:

   # #### #### #  # #### #### #### #### #### ####
   #    #    # #  # #    #       # #  # #  # #  #
   # #### #### #### #### ####    # #### #### #  #
   # #       #    #    # #  #    # #  #    # #  #
   # #### ####    # #### ####    # #### #### ####

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

Нам нужно всего четыре строки, чтобы полностью выразить каждую цифру:

0: '####'
1: '#  #'
2: '#   '
3: '   #'

Чтобы напечатать число 9, мы будем использовать строки 0, 1, 0, 3, 0:

0: '####'
1: '#  #'
0: '####'
3: '   #'
0: '####'

Итак, для числа 9 у нас есть список этих целых чисел, представленных в виде вектора, [0,1,0,3,0], и аналогично для других чисел. Если у нас есть список различных типов линий, ["####","# #","# "," #"], мы можем распечатать их, используя индексы из наших только что созданных векторов.

Чтобы напечатать число 9:

Но теперь у нас может быть гораздо больше чисел в качестве аргумента, поэтому мы должны сделать это для каждого числа. Расширив список, включив в него все векторы для каждого числа, мы получим что-то вроде следующего (n[4] — это строки для числа 4 и так далее):

Теперь у нас есть программа, которая печатает числа в формате ascii, но мы можем сделать ее намного короче, используя понимание списка и некоторые маленькие хитрости.

Массив можно сократить, сделав из него строку. Строка — это то же самое, что и список символов, поэтому она ничем не отличается от текущего массива, за исключением того, что мы должны индексировать ее немного иначе, поскольку теперь у нас есть один список вместо списка списков. int("01030"[1]) совпадает с [0,1,0,3,0][1], но мы получаем меньше символов, так как нам не нужны запятые. Теперь переменная n меняется на это:

И чтобы проиндексировать его правильно, все, что нам нужно сделать, это взять текущее число, которое мы должны напечатать, умножить его на пять (поскольку строк пять, поэтому число будет в пять раз больше числа элементов с самого начала) плюс текущая строка (0-4).

И, наконец, с некоторым пониманием списка мы можем уместить все это в одну строку. Начинаем со спины. После того, как для каждого указанного числа будет напечатана одна строка, должна быть новая строка, поэтому у нас будет оператор '\n'.join() для начала. После этого мы печатаем строки одну за другой:

Если мы затем удалим комментарии, символы новой строки и пробелы, мы получим следующий красивый фрагмент кода.

И если мы теперь заменим в нем переменную lines на значение lines, и то же самое с переменной n, мы получим следующее (включены разрывы строк, чтобы все поместилось).

Наконец, этот пост был о цифровых часах, поэтому мы импортируем модуль time и называем его t, помещаем все в цикл while, добавляем t.sleep(1) в конце, заменяем sys.argv[1] на t.strftime("%H%M%S"), замените "####" на '#'*4 (на один символ меньше) и очистите экран.

Я использовал print '\n'*99 вместо os.system("clear"), так как это меньше кода (а также не нужно импортировать модуль os). Вот что мы получаем:

И мы закончили. 225 символов (без переноса строки).

Спасибо, что прочитали, и не стесняйтесь оставлять комментарии или вопросы!