Pull to refresh

Comments 53

Конечно, гуру Python’а скажут “И что тут такого?”, но стоит заметить, что указанный подход не является очевидным для начинающих.

Начинающим такой подход противопоказан.

Создадим язык, который требует использовать отступы для сохранения понятной структуры, а потом будем пилить в нем однострочные программы, к которым требуется страница комментариев.
Это скорее «Code golf», жаль на Хабре нет такой дисциплины :)
j=''.join;r=range(1,11);print(j(j(f'{x*y}\t' for x in r)+'\n' for y in r))

Вариант в одну строку с print
UPD: Выкинул квадратные скобки
Не знал про такое направление. И да, по сути это получается «Code golf». ))

С использованием точки с запятой неинтересно

Да, что-то я забыл сбросить переменные:
_=[print(*[x*y for x in range(1,11)],sep='\t')for y in range(1,11)]

Да, не так интересно…
Это больше для тренировки мозгов, чем для практического применения. Прошли те времена, когда на Спектруме плавно гасили экран кодом из 21 байта.
r=range(1,11);print('\n'.join('\t'.join(f'{x*y}'for x in r)for y in r))
71

во 2м питоне можно 89, так как скобочки у принта не нужны:
r=range(1,11);print'\n'.join('\t'.join(str(x*y)for x in r)for y in r)
Самое короткое, конечно, в байтах (то есть в две строки):
r=range(1,11)
for y in r:print('\t'.join(str(x*y)for x in r))
62 байта в p3, 60 в p2
О, ванлайнер в 65 для p3 (не для p2):
r=range(1,11);_=[print('\t'.join(str(x*y)for x in r))for y in r]

[63, если допустить непустой результат, как ниже GCU сделал]:
r=range(1,11);[print('\t'.join(str(x*y)for x in r))for y in r]
Ваше Кунг-Фу сильнее )))
Можно в одну строку и с print
_=[print(*[str(x*y) for x in range(1,11)],sep='\t') for y in range(1,11)]

Прикольно получилось c распаковкой и переводом строки от print. Можно ещё чуток укоротить:
r=range(1,11);[print(*[str(x*y)for x in r],sep='\t')for y in r]
Преобразование в строку оказалось не нужным
r=range(1,11);[print(*[x*y for x in r],sep='\t')for y in r]

59
Скобок можно ещё меньше
r=range(1,11);for y in r:print(*(x*y for x in r),sep='\t')

58
Ещё на символ короче, итого 71
for(s='',i=11;i++<121;s+=(r=i%11)?'\t'+(i/11|0)*r:'\n');console.log(s);

И кажется подсветка не осилила
Всё ещё 71, но немного извратнее
for(s='',l=i=11;i++-l*l;s+=(r=i%l)?'\t'+(i/l|0)*r:'\n');console.log(s);
Точку с запятой в конце строки можно опустить. Минус 1! =)
Блин, я всё пытался так сделать, но не получалось
Если писать код в консоли, то вот так тоже работает
for(s='',l=i=11;i++-l*l;s+=i%l?'\t'+i%l*(i/l|0):'\n');s 

image

но не в терминале node


> for(s='',l=i=11;i++<l*l;s+=i%l?'\t'+i%l*(i/l|0):'\n');s

'\t1\t2\t3\t4\t5\t6\t7\t8\t9\t10\n\t2\t4\t6\t8\t10\t12\t14\t16\t18\t20\n\t3\t6\t9\t12\t15\t18\t21\t24\t27\t30\n\t4\t8\t12\t16\t20\t24\t28\t32\t36\t40\n\t5\t10\t15\t20\t25\t30\t35\t40\t45\t50\n\t6\t12\t18\t24\t30\t36\t42\t48\t54\t60\n\t7\t14\t21\t28\t35\t42\t49\t56\t63\t70\n\t8\t16\t24\t32\t40\t48\t56\t64\t72\t80\n\t9\t18\t27\t36\t45\t54\t63\t72\t81\t90\n\t10\t20\t30\t40\t50\t60\t70\t80\t90\t100\n'
Меняем порядок операндов, убираем точку с запятой в конце. Получается 69 байт

for(s='',i=11;i++<121;s+=i%11?'\t'+i%11*(i/11|0):'\n');console.log(s)

как гуру питона я такой код реждекчу на code review. Причина — я ничерта не понимаю что хочет автор. Что делает — понимаю, а что хочет — нет. И это не одно и то же, к сожалению. Если бы было одно и то же, то у нас бы не было багов.


А баг возникнет в тот момент, когда кто-то заменит 11 на чуть большую константу.


>>> print (''.join([''.join([f'{x*y}\t' for x in range(999999, 1000010)])+'\n' for y in range(9,12)]))
8999991 9000000 9000009 9000018 9000027 9000036 9000045 9000054 9000063 9000072 9000081 
9999990 10000000    10000010    10000020    10000030    10000040    10000050    10000060    10000070    10000080    10000090    
10999989    11000000    11000011    11000022    11000033    11000044    11000055    11000066    11000077    11000088    11000099

Вы уверены, что это таблица умножения?

За попытку протащить кодегольф в прод следует лишение пальцев рук линейками в фигуральном смысле.
в прод? без валидаций? :)
при for(s='',l=i=11.1;i++-l*l;s+=(r=i%l)?'\t'+(i/l|0)*r:'\n');console.log(s);
вкладка съест 2 Гб за минуту и упадет
from itertools import starmap, product
from operator import mul

for i in range(1, 11): print(*starmap(mul, product(range(1, 11), [i])), sep="\t")

Длиннее, зато питонистее :)

Не мог пройти мимо


julia> [x*y for x in 1:10, y in 1:10]
10?10 Array{Int64,2}:
  1   2   3   4   5   6   7   8   9   10
  2   4   6   8  10  12  14  16  18   20
  3   6   9  12  15  18  21  24  27   30
  4   8  12  16  20  24  28  32  36   40
  5  10  15  20  25  30  35  40  45   50
  6  12  18  24  30  36  42  48  54   60
  7  14  21  28  35  42  49  56  63   70
  8  16  24  32  40  48  56  64  72   80
  9  18  27  36  45  54  63  72  81   90
 10  20  30  40  50  60  70  80  90  100

julia> "[x*y for x in 1:10, y in 1:10]"|>length
30

или юзая линал (транспонирование столбца в строку):


[1:10...].*[1:10...]'

Ладно, то что интерпретатор выводит результат не честно, тогда


["$(prod(["$(x*y) " for x=1:10]))\n" for y=1:10]|>prod|>print

61 символ

59 символов с использованием анонимных функций и 55 с если можно брать точку с запятой


prod(y->prod(x->"$(x*y) ",[1:10...])*'\n',[1:10...])|>print
X=[1:10...];prod(y->prod(x->"$(x*y) ",X)*'\n',X)|>print
UFO just landed and posted this here

Откуда взялось магическое число 60?

UFO just landed and posted this here
Имхо это карго культ. Часто такие строки становятся совершенно нечитаемы. Это имело смысл во времена когда в терминал влазило 60 символов. Сегодня нужно либо договориться об общем ограничении команды, либо вообще забить на это и множество других правил и работать не изображая формализм и веря что формализм приведёт нас к решению поставленных задач. Технические решения человеческих проблем не решают.
UFO just landed and posted this here

Даже в PEP-8 указано 79 символов. Всё что меньше — это уже мазохизм какой-то

Удивительны дела твои, Хабр: людям понравилось упражняться в сжимании кода в одну строчку, а статью все равно минусуют!
Хотя бы раз попробую оправдать свой ник и поучаствую в челендже
++++++++++[>++++++++++<-]>[->+>[-]>[-]++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>[<+>-]>[-]>[<+<+>>-]+<[>-<[-]]>[>-<<<++++++++++>>-]<<[>+>+<<-]>>>+<[>[>+>+<<-]>[<+>-]<<-]>[-]>>[>>+>+<<<-]>>>[<<<+>>>-]<<+>[<->[>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]++++++++[<++++++>-]>[<<+>>-]>[<<+>>-]<<]>]<[->>++++++++[<++++++>-]]<[.[-]<]<[-]<<<<---------->+<[>-<[-]+++++++++.[-]]>[[-]++++++++++.[-]]<<<<]
P.S. Ужимать код не пытался, главное, что вообще работает.

Мощно! Можно для сжатия сделать обертку, что-то типа +10[>+10<-]… да и раз алфавит такой короткий, можно использовать, скажем, Int16

Как раз учу Питон и вспомнил топик. Если красота неважна, можно в 60 символов
import numpy;x=range(1,11);print(numpy.multiply.outer(x, x))
Sign up to leave a comment.

Articles