Comments 12
Ничего не понял, но допустим
Какая метрика, такой и результат, все логично.
Захотелось всё же алгоритмически решить задачку (никто не просил), вот что награфоманил:
Назовем банальным числом такое натуральное n, сумма цифр которого отличается по чётности от n-1, выбивающимся — сумма цифр которого совпадает по чётности с n-1. Если n кончается не нулём, то число банальное (так как для уменьшения достаточно заменить одну цифру на предшествующую), если строго одним нулём, то выбивающееся (так как при уменьшении заменим этот нуль на девятку И уменьшим цифру перед нулём на 1), и так аналогично в зависимости от чётного/нечётного количества конечных нулей (вместо которых у n-1 соответственно чётное/нечётное число девяток). Таким образом банальные числа — это у которых количество конечных нулей чётное (1, 2, 3…, 9, 11…, 99, 100, 101, 102 и т. п.), а выбивающиеся — у которых нечётное (10, 20, 30…, 90, 110…, 990, 1000, 1010, 1020 и т. п.). В ряде банальных чисел получается строгое чередование нечётных и чётных сумм, ряд выбивающихся же можно представить умножением ряда банальных на 10, и поскольку дописывание нуля не влияет на сумму цифр, то и в этом ряде есть это же строгое чередование. Таким образом в натуральном ряду чисел нарушение чередования происходит строго по очереди, сначала повторяется нечётная сумма (9 и 10), потом чётная (19 и 20), затем снова нечётная (21 и 30) и т. п. Рассматривая выбивающиеся числа попарно (10-20, 30-40 и т. п.) и переставляя первое перед вторым (9, 11... 19, 10, 20...) можно вновь добиться строгого чередования чётности сумм цифр, ограничивает нас в таких перестановках только верхняя граница определенного задачей массива в случае есть первое выбивающееся число из пары в массиве уже есть, а второе нет, например если массив от 1 до 30 или от 1 до 39, то мы не можем переставить 30, только выкинуть его (т. к. считать мы хотим чётные, а не нечётные как у первого числа пары суммы). Таким образом определяем в данном массиве наибольшее выбивающееся число, если его сумма цифр нечётная — уменьшаем размер воображаемого нормализованного массива на 1, и по итогу делим всё без остатка на 2 (т. к. первой идёт нечётная сумма). Фактически для суммы цифр наибольшего выбивающегося не требуется и находить само выбивающееся, представим что наибольшее кратное десяти число k в массиве окажется банальным, тогда k/10 будет выбивающимся и значит совпадать по чётности суммы цифр с k/10-1, отсюда k-10 (наибольшее выбивающееся) будет совпадать по чётности цифр с k, таким образом всё так же сводится к проверке именно этого числа.
(N - not(sum(map(int,str(N//10)))%2))//2 вроде так
Ничего не понял, но очень интересно!
Можно сильно проще получить практически такое же решение.
Скрытый текст
Все числа идут парочками X0-X1, X2-X3,... X8-X9. Не важно, какая четность у суммы X, в каждой паре одно число будет четное, другое нечетное. (N+1)//2 подсчитает количество пар целиком внутри 0..N. От каждой пары ровно одно число идет в ответ, кроме первой, потому что там это число 0, которое не учитывается в ответе. Поэтому у нас уже (N-1)//2 в ответе. Ну и осталось прибавить 1, если N дает четную сумму и само четное (последняя пара вошла в 0..N только своей половинкой N, ее надо подсчитать отдельно).
Получается что-то вроде (N-1)//2+ ((N%2==0) and sum(map(int,str(N//10)))%2 == 0)
От вашего решения это, кажется отличается, ибо тут варианты или (N-1)//2 или (N+1)//2. У вас же формула дет либо N//2 либо (N-1)//2. Похоже, у вас где-то ошибка. Хотя, может оно и дает те же результаты, ибо для четного N совпадают N//2 и (N+1)//2. Но в любом случае такая формула гораздо проще выводится.
c = input()
t = 'sum(map(int,c[%s]))'
b = eval(f"%s==%s"%(t%':3',t%'3:'))
print('YNEOS'[b::2])Почему online-python-compiler пишет: "SyntaxError: bad token T_OP on line 1" ?
Почему при наличии False в переменной b на выходе имеем YES, а при наличии True — NO ?
Почему при наличии False в переменной b на выходе имеем YES, а при наличии True — NO ?
b преобразуется в число. 0 для False и 1 для True. [1::2] и [0::2] - это питоновская индексация с 1 или с 0 через 2 индекса. Вот и получается, что в одном случае выводится Y*E*S, а во втором- *N*O*
Могу лишь предположить, что что-то не то скопировалось. Оффлайн у меня, как говорится, всё работает.
Потому что я собирал код из разных фрагментов и набросков) Благодарю, в статье исправил - вместо равенства конечно же нужно проверять на НЕ равенство.
И зачем забивать людям башку совершенно бесполезной инфой? Программирование, может быть и искусство, но искусство сугубо прикладное, утилитарное, направленное на создание гибких и способных к дальнейшему развитию литературных артефактов, наиболее эффективно и оптимально, по возможности полно и непротиворечиво, с субъективной точки зрения автора, описывающих на том или ином уровне абстракции, в том или ином контексте способ или форму решения некоторой задачи при помощи определенной информационно-вычислительной системы таким образом, чтобы получившийся исходный текст программы был в течение достаточно продолжительного времени вполне однозначно понятен иным потенциально заинтересованным людям, а не только его автору. Поэтому искусственное использование возможностей языка программирования исключительно в целях самовыражения, не связанных с утилитарным предназначением языка, является признаком инфантилизма и отсутствия ментальных способностей к рациональному целеполаганию и адекватному восприятию общепринятого предназначения информационно-технических орудий человеческого труда.
Это как дикарь с лопатой, кароч.
Спасибо за статью, довольно интересное задание, заставило задуматься. Я всегда писал просто чтобы работало, а насколько длинно получилось - никогда не думал)
Функцию list можно заменить на синтаксис списка:
c = list(map(int, s)) # 18, пример из статьи
c = [*map(int, s)] # 15
*c, = map(int, s) # 14Если join подаётся на print, то можно и использовать print, заодно пропадёт необходимость в строковости:
s = [1,2,3,4,5,6]
print(''.join(s)) # 17, нерабочий пример из статьи
print(*s, sep='') # 16У тернарника есть еще несколько вариантов, которые могут оказаться полезны:
print('A' if a==b else 'B') # 23, пример из статьи
print(a==b and 'A' or 'B') # 22
print((a==b) * 'A' or 'B') # 22Что касается финального решения в 34 символа через пробелы, то на acmp.ru изменили функцию подсчёта длины кода именно для борьбы с такими решениями:
[Размер кода] = max([длина кода без пробелов, табуляций и символов перевода строки], [полная длина кода, делённая нацело на 4])
Всегда короткий Python-код