1 Востаннє редагувалося koala (08.11.2015 18:29:46)

Тема: Задачі в один рядок на Пітоні

Потроху граю на https://en.hexlet.io/games, вирішив викладати рішення задач в один рядок тут.
1. Перевірити, чи може число бути n-ічним (n<=10), наприклад false == solution(6161, 3)

Прихований текст
def solution(n,b):
  return all(int(c)<b for c in str(n))

Словами: всі цифри числа n є менші за b

2. Перевірити, чи є число досконалим (тобто чи дорівнює воно сумі своїх множників), наприклад true == solution(6)

Прихований текст
def solution(n):
  return n==sum(i for i in range(n) if n%i==0)

Слоами: число дорівнює сумі i до n, якщо n ділиться на i

3. Перевірити, чи є рядок анаграмою слова-паліндрома (тобто чи можна так переставити його літери, щоб він читався справа наліво так само, як і зліва направо), наприкла true == solution("abcabc")

Прихований текст
def solution(s):
  return [s.count(c)%2 for c in set(s)].count(1)<2

Словами: серед літер s менше двох таких, що зустрічаються непарну кількість раз в рядку

Подякували: leofun01, Betterthanyou2

2 Востаннє редагувалося koala (08.11.2015 18:41:14)

Re: Задачі в один рядок на Пітоні

4. В масиві цілих чисел, впорядкованих за зростанням, знайти нерухому точку (тобто число, яке дорівнює своєму номеру в масиві) якщо його нема - повернути -1. Наприклад, 3 == solution([-10,-5,0,3,7])

Прихований текст
def solution(l):
  return ([i for i,e in enumerate(l) if i==e]+[-1])[0]

Словами: з усіх номерів елементів i, для яких елемент дорівнює i, та -1, повернути перше значення

5. Перевірити, чи дорівнює сума елементів масиву 21, наприклад true == solution([3,4,5,6,3])

Прихований текст
def solution(l):
  return 21==sum(l)

Словами: умова

3

Re: Задачі в один рядок на Пітоні

6. Відсортувати масив чисел за кількістю одиниць в їхньому двійковому представлені, наприклад [1,2,4,3] == solution([1,2,3,4])

Тут - напівфейл
import sys
def solution(l):
  return sorted(l,key=lambda x:bin(x&sys.maxsize).count('1'))

Словами: l, відсортований за кількістю одиниць в двійковому представлені x, з "погашеними" одиницями вище, ніж в sys.maxsize

bin дає прямий код для від'ємних чисел (так, bin(-5)=='-0b101'), а в задачі йдеться про доповнюваний код. sys.maxsize наразі виглядає (в двійковій формі) як 0b111111111111111111111111111111111111111111111111111111111111111 (63 одинички), і за логікою буде десь так і надалі виглядати, але ніхто не гарантує, що так і буде. А це погано.

4 Востаннє редагувалося koala (08.11.2015 20:51:01)

Re: Задачі в один рядок на Пітоні

7. По заданій цифрі x знайти суму чисел x+xx+xxx+... (x доданків) у вигляді стрічки. Наприклад "369" == solution(3)

Прихований текст
def solution(x):
  return str(sum(int(str(x)*i) for i in range(1,x+1)))

Словами: умова, тільки перетворень рядок-число багато :)

8. Знайти всі входження слова в рядок. Наприклад [12] == solution("find a word in some sentence", "in")

Прихований текст
def solution(s,w):
  return [i for i in range(len(s)) if s[i:i+len(w)]==w]

Словами: всі i до довжини s, для яких підрядок s, що починається з i-го символа, дорівнює w

5

Re: Задачі в один рядок на Пітоні

koala, Ви почали вчити Python?)

Подякували: koala1

6

Re: Задачі в один рядок на Пітоні

Де патч Бірмана на пітоні і ністрочки коду ?

7 Востаннє редагувалося koala (08.11.2015 22:02:09)

Re: Задачі в один рядок на Пітоні

A.N.Onim написав:

koala, Ви почали вчити Python?)

Як ви дійшли такого висновку? Відчувається дедуктивна школа Ш. Голмса.

reverse2500 написав:

Де патч Бірмана на пітоні і ністрочки коду ?

Прошу:

 

І більше не плутайте Барміна з Бірманом, Борманом, Штірліцем і ін.

8

Re: Задачі в один рядок на Пітоні

в інеті хто як хоче так і пише хто Бірман, хто Бармін

9 Востаннє редагувалося koala (08.11.2015 22:21:22)

Re: Задачі в один рядок на Пітоні

9. Знайти в послідовності чисел від 1 до N, наведених в довільному порядку, пропущене. Наприклад 1 == solution([2,3,4,5]).

Прихований текст
def solution(l):
  return [i for i in range(1,len(l)+2) if l.count(i)==0][0]

Словами: перше число, менше довжини l+2 (+2 - бо 1 елементу немає, а відлік іде з 0, а не з 1), яке зустрічається в l 0 разів

Альтернативний варіант
def solution(l):
  return (len(l)+2)*(len(l)+1)//2-sum(l)

Словами: сума прогресії від 1 до len(l)+1 по шкільній формулі мінус сума елементів масива

10

Re: Задачі в один рядок на Пітоні

10. Знайти кількість точок на комплекті доміно з максимальною кількістю точок n. Наприклад 12 == solution(2).

Прихований текст
def solution(n):
  return  n * (n+1) * (n+2) //2

Словами: кожне число на кістках зустрічається n+2 разів (на n кістках - x-0,x-1 і т.д., при чому на дублі - двічі). Отже, нам потрібна сума чисел від 0 до n, помножена на n+2.

11

Re: Задачі в один рядок на Пітоні

11. Викинути кожний n-й елемент зі списку. Наприклад ["a","b","d","e","g","h","k"] == solution(3, ["a","b","c","d","e","f","g","h","i","k"])

Прихований текст
def solution(n,l):
 del l[n-1::n]; return l

Словами: умова

От і вивчив оператор del.

12

Re: Задачі в один рядок на Пітоні

12. Викинути з рядка зайві пробіли, наприклад "This string has too much spaces" == solution("This  string has   too much    spaces")

Прихований текст
def solution(s):
  return ' '.join(s.split())

Словами: розбити рядок на слова і об'єднати, розділивши одним пробілом

13 Востаннє редагувалося koala (09.11.2015 00:02:29)

Re: Задачі в один рядок на Пітоні

13. Полічити, з кількох рисок на екрані калькулятора буде складатися число, подане рядком (1 - 2 риски, 8 - 7 рисок і т.д.) Наприклад, 18 == solution("12134")

Прихований текст
def solution(s):
  return sum([6,2,5,5,4,5,6,3,7,6][int(c)] for c in s)

Словами: для кожної цифри беремо кількість рисок і складаємо.

14 Востаннє редагувалося koala (09.11.2015 23:14:12)

Re: Задачі в один рядок на Пітоні

14. Перевірити, чи можна взаємно однозначно замінити літери в рядку a, щоб вийшов рядок b. Наприклад, true == solution("egg", "add")

Прихований текст
def solution(a,b):
  return len(dict(zip(a,b)))==len(set(b))

Словами: довжина словника з пар відповідних літер з a та b дорівнює кількості різних літер в b

15. Знайти суму всіх таких чисел, менших за n, які діляться на a чи на b. Нариклад, 23 == solution(10, 3, 5)

Прихований текст
def solution(n,a,b):
  return sum(i for i in range(1,n) if i%a==0 or i%b==0)

Словами: умова

16. Знайти в масиві перший за порядком елемент, що зустрічається більше одного разу. Наприклад, 5 == solution([10,5,3,4,3,5,6])

Прихований текст
def solution(l):
  return ([x for x in l if l.count(x)>1]+[None])[0]

Словами: умова, тільки до списку додаємо None на випадок, коли всі елементи різні

15 Востаннє редагувалося koala (12.11.2015 17:00:19)

Re: Задачі в один рядок на Пітоні

17. Знайти суму двох найбільших елементів в масиві. Наприклад 11 == solution([1,2,3,4,5,6])

Прихований текст
def solution(l):
    return sum(sorted(l)[-2:])

Словами: сума двох останніх елементів з відсортованого списка

18. Перевірити код ISBN. 10-цифровий код ISBN вважається коректним, якщо його перша цифра, множена на 10, плюс друга, множена на 9 і т.д., в сумі дають число, що ділиться на 11 без залишку. Наприклад: true == solution("0-684-84328-5")

Прихований текст
def solution(s):  
  return sum((10-i)*n for i,n in enumerate([int(c) for c in s if c.isdigit()]))%11==0

Словами: залишок від ділення на 11 суми (10-i)*n, де i -номер елементу, n - елемент множини цифр з s, дорівнює нулю

19. Обернути всі слова в рядку. Наприклад, "olleH ,ereht dna woh era ?uoy" == solution("Hello there, and how are you?")

Прихований текст
def solution(s):
  return ' '.join(w[::-1] for w in s.split())

Словами: об'єднані через пробіл обернені слова з розбитого на слова рядка

Подякували: Q-bart, A.N.Onim2

16 Востаннє редагувалося koala (22.11.2015 19:38:23)

Re: Задачі в один рядок на Пітоні

20. Замінити кожен елемент масиву на перший в масиві, більший за нього, або на -1, якщо такого не існує. Наприклад, [5,25,25,-1] == solution([4,5,2,25])

Прихований текст
def solution(l):
  return [([y for y in l[i:] if y > x]+[-1])[0] for i,x in enumerate(l)]

Словами: список перших з елементів, більших за x, з тих, що належать до множини l[i:] (тобто лежать праворуч від x), або -1, де i - номери елементів x початкового списку.

21. Перевірити коректність виразу з дужками. Наприклад, false == solution("( ) )")

Прихований текст
def solution(s):
  return s.count('(')==s.count(')') and all(s[:i].count('(')>=s[:i].count(')') for i in range(len(s)))
 

Словами: кількість дужок, що відкриваються, дорівнює кількості дужок, що закриваються, і в усіх підрядках, що починаються з початку рядка, кількість дужок, що відкривається, не менша за ті, що закриваються.

22. Об'єднати дві стрічки через один символ. Якщо одна зі стрічок довша - просто додати її символи в кінець. Наприклад, "awbxcydz" == solution("abcd", "wxyz")

Некрасиво
def solution(a,b):
  return ''.join(map(lambda x: ''.join(x), zip(a[:len(b)],b[:len(a)])))+a[len(b):]+b[len(a):]

17

Re: Задачі в один рядок на Пітоні

23. Перевірити, чи містить стрічка гірлянду, і повернути максимальну довжину гірлянди, або 0, якщо її нема. Гірляндою в стрічці зветься підстрічка, що повторюється на початку і в кінці стрічки, але менша за всю стрічку. Наприклад, 2 == solution("onion")

Прихований текст
def solution(w):
  return max([r for r in range(len(w)) if w[:r]==w[-r:]]+[0])

Словами: повернути максимальне r з таких r, що початок рядка довжиною r дорівнює кінцю рядка довжиною r, або 0

18

Re: Задачі в один рядок на Пітоні

І трохи гумору.
Знайти кількість "щасливих квитків", тобто таких, сума першої половини цифр номерів яких дорівнює сумі другої половини. Номери від 1 до 999999.

from math import *
print(len([x for x in range(1,1000000) if sum(int(d) for d in str(x//10**int((log10(x)+1)//2)))==sum(int(d) for d in str(x%10**int((log10(x)+1)//2)))]))
Подякували: ping1

19 Востаннє редагувалося P.Y. (03.10.2016 20:52:54)

Re: Задачі в один рядок на Пітоні

koala написав:

І трохи гумору.
Знайти кількість "щасливих квитків", тобто таких, сума першої половини цифр номерів яких дорівнює сумі другої половини. Номери від 1 до 999999.

from math import *
print(len([x for x in range(1,1000000) if sum(int(d) for d in str(x//10**int((log10(x)+1)//2)))==sum(int(d) for d in str(x%10**int((log10(x)+1)//2)))]))

Можна зробити трохи коротше:

print(len(list(filter(lambda x, f=(lambda s:sum(map(ord, s))):f(x[:3])==f(x[3:]), 
                                       map('%06d'.__mod__, range(1, 1000000))))))

Або ще коротше (щоправда, ціною зниження швидкості обчислень):

print(sum((1 for i in range(1,1000000) if eval('%c+%c+%c==%c+%c+%c'%tuple('%06d'%i)))))

Хоч, мабуть, найправильніше ось так (трохи більше коду, але, на відміну від усіх решти попередніх варіантів розв'язку, рахується миттєво):

import itertools as it
print(sum(len(list(l))**2 for k, l in it.groupby(sorted(map(sum, it.product(range(10),repeat=3)))))-1)

20 Востаннє редагувалося P.Y. (08.10.2016 02:10:28)

Re: Задачі в один рядок на Пітоні

koala написав:

22. Об'єднати дві стрічки через один символ. Якщо одна зі стрічок довша - просто додати її символи в кінець. Наприклад, "awbxcydz" == solution("abcd", "wxyz")

Некрасиво
def solution(a,b):
  return ''.join(map(lambda x: ''.join(x), zip(a[:len(b)],b[:len(a)])))+a[len(b):]+b[len(a):]
З використанням itertools
import itertools as it
def solution(a, b):
    return ''.join(it.chain(*it.zip_longest(a, b, fillvalue='')))