Задачи для питона сложные

Содержание
  1. Пять задачек из тех, которые хорошо бы уметь решать
  2. Задачи
  3. Первая задача
  4. Вторая задача
  5. Третья задача
  6. Четвёртая задача
  7. Пятая задача
  8. Решения
  9. Задача первая
  10. Задача вторая
  11. Задача третья
  12. Задача четвёртая
  13. Задача пятая
  14. Вместо заключения
  15. Python: 18 задач на вывод символов по заданному шаблону
  16. 1. Простой числовой треугольник
  17. 2. Обратный числовой треугольник
  18. 3. Полупирамида из чисел
  19. 4. Обратная пирамида из уменьшающихся чисел
  20. 5. Обратная пирамида, все элементы которой представлены одним и тем же числом
  21. 6. Пирамида из чисел, расположенных в обратном порядке
  22. 7. Обратная полупирамида из чисел
  23. 8. Пирамида из натуральных чисел меньше 10
  24. 9. Пирамида из чисел от 10, расположенных в обратном порядке
  25. 10. Пирамида из определённых наборов цифр
  26. 11. Обратная пирамида из связанных чисел
  27. 12. Пирамида из чётных чисел
  28. 13. Пирамида из наборов чисел
  29. 14. Пирамида, в каждой строке которой выводятся разные числа
  30. 15. Зеркально отражённая пирамида из чисел (прямоугольный числовой треугольник)
  31. 16. Равносторонний треугольник из символов *
  32. 17. Перевёрнутый треугольник из символов *
  33. 18. Пирамида из символов *

Пять задачек из тех, которые хорошо бы уметь решать

Зачем я всё это написал? Дело в том, что я давно уже работаю программистом. Прошёл множество собеседований и сам провёл не мало. Видел самых разных разработчиков, наблюдал за ними… И сделал для себя некоторые выводы.

Так как многие спрашивают моего мнения, я решил написать его. Не чтобы кому-то навязать, просто, чтобы не рассказывать много раз.

Конечно, задачи сильно зависят от того, на какую ставку вы идёте и чем предполагаете заниматься. Но поверьте, если вашему работодателю достаточно того, что вы умеете плести цепочки вызовов на jQuery, знаете HTML, или SQL, то задумайтесь, — возможно, вас ждёт скучноватая работёнка.

Читайте также:  El mpgu su course view php

Если же вашему работодателю не так уж важно на каком языке вам удобней выражать свои мысли. Если он больше обращает внимание на вашу эрудицию, — старайтесь получить эту работу. Вас, скорее всего, ждут разнообразные и интересные задачи.

Ладно, оставим разговоры. Сперва приведу задачи, а потом решения. Вы можете не проматывать до них и решить задачки самостоятельно. Если вы уложитесь в час, то ждём вас не собеседование ,-) Приступим.

Задачи

Первая задача

У вас есть массив чисел. Напишите три функции, которые вычисляют сумму этих чисел: с for-циклом, с while-циклом, с рекурсией.

Вторая задача

Напишите функцию, которая создаёт комбинацию двух списков таким образом:

[1, 2, 3] (+) [11, 22, 33] -> [1, 11, 2, 22, 3, 33] 

Третья задача

Вычислите первые 100 чисел Фибоначчи. (Напишите код.)

Четвёртая задача

У вас есть массив чисел, составьте из них максимальное число. Например:

Пятая задача

У вас есть девять цифр: 1, 2, …, 9. Именно в таком порядке. Вы можете вставлять между ними знаки «+», «-» или ничего. У вас будут получаться выражения вида 123+45-6+7+89 . Найдите все из них, которые равны 100.

Постарайтесь решить эти задачи за час.

Решения

Я буду приводить решения на Python3. Кроме того, это те решения, которые можно написать за час. В чём-то они не идеальны, это повод поговорить и, возможно, взять дополнительное время.

Задача первая

def sum_for_loop(a): s = 0 for x in a: s += x return s def sum_while_loop(a): s = 0 n = len(a) while n: n -= 1 s += a[n] return s def sum_recursive(a): if len(a) == 0: return 0 return a[0] + sum_recursive(a[1:]) if __name__ == '__main__': t = [5, 3, 4, 1, 7] for f in (sum_for_loop, sum_while_loop, sum_recursive): print(f(t)) 

Конечно, если вы рассказывайте про Python, то имеет смысл сказать и про функцию sum или reduce . Если речь идёт о других языках, будет не лишним упоминать возможности их библиотек. Но здесь интересно ваше решение.

В первой функции говорить особо не о чем. Спасибо Python.

Во втором случае уже можно порассуждать надо ли разрушать массив (вынимая из него элементы). Или пойти по тому пути, который выбрал я. Тут тоже можно обратить внимание на то, как эта функция невыгодно выглядит по сравнению с рекурсивной. Есть множество мест, где можно допустить ошибки.

Рекурсивная функция прекрасна.

Задача вторая

def combine_lists(a, b): len_a = len(a) len_b = len(b) if len_a < len_b: limit = len_a else: limit = len_b i = 0 r = [] while i < limit: r.append(a[i]) r.append(b[i]) i += 1 return r if __name__ == '__main__': a = ['a', 'b', 'c'] b = ['A', 'B', 'C', 'D'] print(repr(combine_lists(a, b))) 

Тут нет ничего необычного, но можно порассуждать о библиотеках. Если речь про Python можно предложить решение типа sum(zip(a, b), ()) .

Задача третья

def fibonacci(n=10, a=0, b=1): yield a yield b n -= 2 while n > 0: c = a + b a = b b = c yield c n -= 1 if __name__ == '__main__': for n in fibonacci(100): print(n) 

Я реализовал итератор. Этим можно было бы показать, что вы про них знаете и здесь их использование уместно.

Тут уже можно поговорить и о языке. Если ваш язык не Python, то, возможно, вам следует задуматься о типе и битности чисел, так как сотое число содержит 68 бит.

Кроме того, есть способ расчёта чисел Фибоначчи путём возведения в степень матриц. Он позволяет не рассчитывать все числа последовательности. Возможно, от вас хотят именно его.

Задача четвёртая

join_to_biggest = lambda a: int(''.join(sorted(map(str, a), reverse=True))) if __name__ == '__main__': print(join_to_biggest([501, 2, 1, 80, 9])) 

Эта задача больше всего зависит от языка. Я её решил, используя возможности Python.

Этот код провисел на сайте года три, пока, некто Роман Парпалак не указал мне на ошибку.

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

join_to_biggest = lambda x: ''.join(sorted( map(str, x), cmp=lambda x, y: cmp(y + x, x + y) )) 

Да, тут Python2. В Python3 придётся сделать что-то вроде этого:

class smart_key(object): def __init__(self, obj): self.obj = obj def __lt__(self, other): return (other.obj + self.obj) < (self.obj + other.obj) join_to_biggest = lambda x: ''.join(sorted( map(str, x), key=smart_key )) 

Зачем я сохранил неправильный код? По нескольким причинам.

Во-первых, удалить его было бы не честно с моей стороны. Я же декларировал, что решу задачи за час. За указанное время я дал именно это решение.

Во-вторых, чтобы читатель мог поискать ошибку, подумать, нет ли ошибок в его решении…

В-третьих, чтобы подчеркнуть, что все могут ошибаться. Решение задач на время всегда будет сопровождаться ошибками. Недавно я проходил очень интересное интервью. Будет время, — напишу про него отдельно. Но меня в нём поразило то, что олимпиадных задач не было, и спешки тоже не было. И мне кажется, что эти люди действительно хорошо понимают, кого ищут, и выстраивают интервью адекватно своему пониманию. Но это отдельная интересное история.

А тут я лишь скажу: спасибо, Роман. Интересно было бы узнать ваш вариант решения.

Задача пятая

Тут есть простор для творчества. Мой код таков:

def all_combinations(a): if len(a) 0: head += tail.pop(0) for s in all_combinations(tail): yield [head] + s def all_signs(n): if n == 0: yield () else: for tail in all_signs(n-1): for s in '+-': yield (s,) + tail def perform_operations(nums, signs): nums = list(map(int, nums)) result = nums.pop(0) n = 1 for s in signs: if s == '+': result += nums.pop(0) if s == '-': result -= nums.pop(0) n += 1 return result for numbers in all_combinations(tuple(map(str, range(1, 10)))): #print(numbers) for signs in all_signs(len(numbers) - 1): #print(signs) summ = perform_operations(numbers, signs) if summ == 100: print( ''.join(map( lambda x: ''.join(x), zip(numbers, signs))) + numbers[-1]) 

Мне кажется, в таком виде его проще всего и писать и читать и тестировать. Тут у меня три функции: all_combinations — итератор, который выдает все числа для операций (в терминах задачи: вставляет пустые места); all_signs — выдаёт все возможные сочетания знаков + и - заданной длинны (для единообразия, это тоже итератор с рекурсией); perform_operations — выполняет операции.

Тут, конечно, просится решение, избавленное от if-ов и кодирования операций с помощью символов. Но это решение будет более громоздким, о нём можно рассказать, но и писать, и читать его дольше. Лично я вышел бы за рамки отведённого часа.

Наверняка вам по душе будет какое-то иное решение. Мой пример — лишь одна из возможных реализаций.

Вместо заключения

Где можно взять таких задачек? Можно начать с Project Euler. Там, правда, немного более математизированные задачки, но это и не плохо. И сложность задач расчёт очень быстро. Я решил восемьдесят.

Если вы знаете ресурсы с хорошими задачками — пожалуйста напишите мне.

upd: В моём решении пятой задачи Мерзляков Александр из Уфы нашел неточность. Спасибо! Я поправил. Получается, что я на эти решения потратил больше часа.

Источник

Python: 18 задач на вывод символов по заданному шаблону

Подготовка к техническому собеседованию по Python — нелёгкая задача. На таком собеседовании вам, вполне возможно, встретятся задачи на вывод символов по заданным шаблонам. Если вы хотите научиться решать такие задачи — вам может пригодиться подборка способов их решения, приведённая в этом материале.

Здесь продемонстрировано 18 примеров кода. Начинающие программисты вполне могут проработать всё по порядку, а опытные могут разобраться именно с тем, что им нужно. Главное — понять, как устроен тот или иной пример. Отсутствие чёткого понимания того, что происходит в программах, способно сыграть злую шутку с тем, кто, например, заучив фрагмент кода и воспроизведя его на собеседовании, попытается объяснить то, как именно этот код работает. А тех, кто проводит собеседование, часто интересуют именно такие вот разъяснения.

1. Простой числовой треугольник

1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 
rows = 6 for num in range(rows): for i in range(num): print(num, end=" ") # вывод числа # вывод пустой строки после каждой строки с числами для правильного отображения шаблона print(" ") 

2. Обратный числовой треугольник

1 1 1 1 1 2 2 2 2 3 3 3 4 4 5 
rows = 5 b = 0 for i in range(rows, 0, -1): b += 1 for j in range(1, i + 1): print(b, end=' ') print('\r') 

3. Полупирамида из чисел

1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 
rows = 5 for row in range(1, rows+1): for column in range(1, row + 1): print(column, end=' ') print("") 

4. Обратная пирамида из уменьшающихся чисел

5 5 5 5 5 4 4 4 4 3 3 3 2 2 1 
rows = 5 for i in range(rows, 0, -1): num = i for j in range(0, i): print(num, end=' ') print("\r") 

5. Обратная пирамида, все элементы которой представлены одним и тем же числом

5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 
rows = 5 num = rows for i in range(rows, 0, -1): for j in range(0, i): print(num, end=' ') print('\r') 

6. Пирамида из чисел, расположенных в обратном порядке

1 2 1 3 2 1 4 3 2 1 5 4 3 2 1 
rows = 6 for row in range(1, rows): for column in range(row, 0, -1): print(column, end=' ') print("") 

7. Обратная полупирамида из чисел

0 1 2 3 4 5 0 1 2 3 4 0 1 2 3 0 1 2 0 1 
rows = 5 for i in range(rows, 0, -1): for j in range(0, i + 1): print(j, end=' ') print('\r') 

8. Пирамида из натуральных чисел меньше 10

currentNumber = 1 stop = 2 rows = 3 # Количество строк, из которых состоит пирамида for i in range(rows): for column in range(1, stop): print(currentNumber, end=' ') currentNumber += 1 print("") stop += 2 

9. Пирамида из чисел от 10, расположенных в обратном порядке

start = 1 stop = 2 currentNumber = stop for row in range(2, 6): for col in range(start, stop): currentNumber -= 1 print(currentNumber, end=' ') print("") start = stop stop += row currentNumber = stop 

10. Пирамида из определённых наборов цифр

1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 
rows = 6 for i in range(1, rows + 1): for j in range(1, i - 1): print(j, end=" ") for j in range(i - 1, 0, -1): print(j, end=" ") print() 

11. Обратная пирамида из связанных чисел

5 4 3 2 1 1 2 3 4 5 5 4 3 2 2 3 4 5 5 4 3 3 4 5 5 4 4 5 5 5 
rows = 6 for i in range(0, rows): for j in range(rows - 1, i, -1): print(j, '', end='') for l in range(i): print('', end='') for k in range(i + 1, rows): print(k, '', end='') print('\n') 

12. Пирамида из чётных чисел

10 10 8 10 8 6 10 8 6 4 10 8 6 4 2 
rows = 5 LastEvenNumber = 2 * rows evenNumber = LastEvenNumber for i in range(1, rows+1): evenNumber = LastEvenNumber for j in range(i): print(evenNumber, end=' ') evenNumber -= 2 print("\r") 

13. Пирамида из наборов чисел

0 0 1 0 2 4 0 3 6 9 0 4 8 12 16 0 5 10 15 20 25 0 6 12 18 24 30 36 
rows = 7 for i in range(0, rows): for j in range(0, i + 1): print(i * j, end=' ') print() 

14. Пирамида, в каждой строке которой выводятся разные числа

1 3 3 5 5 5 7 7 7 7 9 9 9 9 9 

15. Зеркально отражённая пирамида из чисел (прямоугольный числовой треугольник)

 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 
rows = 6 for row in range(1, rows): num = 1 for j in range(rows, 0, -1): if j > row: print(" ", end=' ') else: print(num, end=' ') num += 1 print("") 

16. Равносторонний треугольник из символов *

size = 7 m = (2 * size) - 2 for i in range(0, size): for j in range(0, m): print(end=" ") m = m - 1 # уменьшение m после каждого прохода цикла for j in range(0, i + 1): # вывод пирамиды из звёздочек print("*", end=' ') print(" ") 

17. Перевёрнутый треугольник из символов *

rows = 5 k = 2 * rows - 2 for i in range(rows, -1, -1): for j in range(k, 0, -1): print(end=" ") k = k + 1 for j in range(0, i + 1): print("*", end=" ") print("") 

18. Пирамида из символов *

rows = 5 for i in range(0, rows): for j in range(0, i + 1): print("*", end=' ') print("\r") 

Какие задачи вы посоветовали бы прорешать тем, кто готовится к собеседованию по Python?

Источник

Оцените статью