🐍🧩 5 классичСских Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Python для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… с Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ΄Π±ΠΎΡ€ΠΊΡƒ интСрСсных Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Python Ρ€Π°Π·Π½ΠΎΠΉ стСпСни слоТности с Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ: Π·Π°Π΄Π°Ρ‡Π° Π˜ΠΎΡΠΈΡ„Π° Ѐлавия, Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΠΎ спирали, Ρ…ΠΎΠ΄Ρ‹ ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠ³ΠΎ фСрзя, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° подсписки ΠΈ магичСский ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚.
🐍🧩 5 классичСских Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Python для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… с Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ

1. Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΠΎ спирали

Π­Ρ‚Π° классичСская Π·Π°Π΄Π°Ρ‡Π° часто встрСчаСтся Π½Π° собСсСдованиях ΠΈ ΠΎΠ»ΠΈΠΌΠΏΠΈΠ°Π΄Π°Ρ…. Рассмотрим нСсколько способов Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° Python.

На Π²Ρ…ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠ΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π° Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹Ρ… числа n ΠΈ m. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая создаСт ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ n Ρ… m, Π·Π°ΠΏΠΎΠ»Π½ΠΈΠ² Π΅Π΅ ΠΏΠΎ спирали числами ΠΎΡ‚ 1 Π΄ΠΎ n x m. Π‘ΠΏΠΈΡ€Π°Π»ΡŒ начинаСтся Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ ΠΈ закручиваСтся ΠΏΠΎ часовой стрСлкС.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°:

7 6

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°:

        1  2  3  4  5  6  
22 23 24 25 26 7  
21 36 37 38 27 8  
20 35 42 39 28 9  
19 34 41 40 29 10 
18 33 32 31 30 11 
17 16 15 14 13 12
    

РСшСниС

Бпособ 1:

        n, m = map(int, input().split())
matrix = [[0] * m for _ in range(n)]
dx, dy, x, y = 0, 1, 0, 0

for i in range(1, n * m + 1):
    matrix[x][y] = i
    if matrix[(x + dx) % n][(y + dy) % m]:
        dx, dy = dy, -dx
    x += dx
    y += dy    
for line in matrix:
    print(*(f'{i:<3}' for i in line), sep='')
    

Бпособ 2:

                
n, m = (int(i) for i in input().split())
spiral = []
x, y, dx, dy, k = 0, 0, 1, 0, 1
spiral = [[0]* n for _ in range(m)]
for i in range(1, n * m + 1):
    spiral[x][y] = i
    nx, ny = x + dx, y + dy
    if 0 <= nx < m and 0 <= ny < n and spiral[nx][ny] == 0:
        x, y = nx, ny
    else:
        dx, dy = -dy, dx
        x, y = x + dx, y + dy
for i in range(n):
    for j in range(m):
        print(str(spiral[j][i]).ljust(3), end=' ')
    print()
    

Бпособ 3:

        n, m = [int(i) for i in input().split()]
spiral = [[0] * m for _ in range(n)]
c = 1
for k in range(min(n // 2 + 1, m //2 + 1)):  
    for j in range(k, m - k):  
        if spiral[k][j] == 0:  
            spiral[k][j] = c 
            c += 1
    for i in range(1 + k, n - k):  
        if spiral[i][m - k - 1] == 0:
            spiral[i][m - k - 1] = c 
            c += 1
    for j in range(m - k - 2, k - 1, -1):  
        if spiral[n - k - 1][j] == 0:
            spiral[n - k - 1][j] = c 
            c += 1
    for i in range(n - k - 2, k, -1):  
        if spiral[i][k] == 0:
            spiral[i][k] = c 
            c += 1
for i in range(n):  
    for j in range(m):
        print(str(spiral[i][j]).ljust(3), end=' ')
    print()
    
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»

2. ЕдинствСнный Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΠΉ

Π­Ρ‚ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ классичСской Π·Π°Π΄Π°Ρ‡ΠΈ Π˜ΠΎΡΠΈΡ„Π° Ѐлавия. Π’ ΠΊΡ€ΡƒΠ³Ρƒ стоят n Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… числами ΠΎΡ‚ 1 Π΄ΠΎ n. НачинаСтся расчСт, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ k-ΠΉ ΠΏΠΎ счСту Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ Π²Ρ‹Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ· ΠΊΡ€ΡƒΠ³Π°, послС Ρ‡Π΅Π³ΠΎ счСт продолТаСтся со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° Π½ΠΈΠΌ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΡƒΡŽ Π½ΠΎΠΌΠ΅Ρ€ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ останСтся Π² ΠΊΡ€ΡƒΠ³Ρƒ послСдним.

Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅:

Числа n ΠΈ k Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… строках.

        #ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°
9 3
    

Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅:

НомСр послСднСго ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π³ΠΎΡΡ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°.

        #ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°
1
    

РСшСниС

Бпособ 1:

        n, k = int(input()), int(input())
last = 0
for i in range(1, n + 1):
    last = (last + k) % i
print(last + 1)

    
    

Бпособ 2 – рСкурсия:

        def lastSurvivor(n, k):
    if n == 1:
        return 1
    elif n > 1:
        return (1 + (lastSurvivor(n - 1, k) + k - 1) % n)
 
n, k = int(input()), int(input())
print(lastSurvivor(n, k))

    
    

3. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ магичСского ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

ΠœΠ°Π³ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹ ΠΈΠ·Π΄Π°Π²Π½Π° ΠΈΠ½Ρ‚Ρ€ΠΈΠ³ΠΎΠ²Π°Π»ΠΈ Π²ΠΎΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ людСй: Π΄Π°Ρ‚Π° изготовлСния Π΄Ρ€Π΅Π²Π½Π΅ΠΉΡˆΠ΅ΠΉ ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ²ΡˆΠ΅ΠΉΡΡ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ относится ΠΊ 2200 Π³. Π΄ΠΎ Π½.э. ΠœΠ°Π³ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ – это квадратная Ρ‚Π°Π±Π»ΠΈΡ†Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π° n Ρ… n, составлСнная ΠΈΠ· всСх чисСл 1, 2, 3 … n2 Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ суммы ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ столбцу, ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкС ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ Ρ€Π°Π²Π½Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ собой. НапишСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая опрСдСляСт, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ магичСским ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠΌ.

Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅:

Число n, Π·Π°Ρ‚Π΅ΠΌ n строк с n Ρ†ΠΈΡ„Ρ€ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ.

        #ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°
3
8 1 6
3 5 7
4 9 2


    

Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅:

YES, Ссли ввСдСнная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° являСтся магичСским ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠΌ, ΠΈ NO Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ случаС.

        #ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°
YES


    

РСшСниС

Бпособ 1:

        n = int(input())
matrix = [list(map(int, input().split())) for _ in range(n)]
if all(i in sum(matrix,[]) for i in range(1, n**2 + 1)):
    print('YES' if all(sum(i) == sum(j) == sum([matrix[i][i] for i in range(n)]) == sum([matrix[n-i-1][i] for i in range(n)]) for i in matrix for j in list(map(list, zip(*matrix)))) else 'NO')
else:
    print('NO')
    
    

Бпособ 2 – с магичСской константой ΠΈ мноТСствами:

         
n = int(input())
square = [[*map(int, input().split())] for _ in range(n)]
m_const = n * (1 + n ** 2) // 2                                                      
print(('NO', 'YES')[all(sum(el) == m_const for x in (((square[i][i] for i in range(n)),(square[i][~i] for i in range(n))), square, zip(*square)) for el in x) and set(sum(square, [])) == set(range(1, n ** 2 + 1))])

    


    

4. РаздСлСниС списка на подсписки

На Π²Ρ…ΠΎΠ΄ подаСтся строка чисСл, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ формируСтся список. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΡƒΡŽ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ список, элСмСнтами ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ подсписки исходного списка, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ пустой.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°:

a f z

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°:

[[], ['a'], ['f'], ['z'], ['a', 'f'], ['f', 'z'], ['a', 'f', 'z']]

РСшСниС

Бпособ 1:

        lst = input().split()
def sub_lists(lst):
    lists = [[]]
    for i in range(len(lst) + 1):
        for j in range(i):
            lists.append(lst[j:i])
    lists = sorted(lists, key=len)
    return lists
print(sub_lists(lst))
    

Бпособ 2:

        print([[]] + [lst[j:i + j + 1] for lst in [input().split()] for i in range(len(lst)) for j in range(len(lst) - i)])
    
    

Бпособ 3:

        st, lst = input().split(), [[]]
for i in range(1, len(st) + 1):
    for j in range(len(st) - i + 1):
        lst += [st[j:j+i]]
print(lst)

    
    

5. Π₯ΠΎΠ΄Ρ‹ ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠ³ΠΎ фСрзя

На ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠΉ доскС 8 Ρ… 8 стоит Ρ„Π΅Ρ€Π·ΡŒ. ΠžΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ фСрзя Π½Π° доскС ΠΈ всС ΠΊΠ»Π΅Ρ‚ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡŒΠ΅Ρ‚ Ρ„Π΅Ρ€Π·ΡŒ. ΠšΠ»Π΅Ρ‚ΠΊΡƒ, Π³Π΄Π΅ стоит Ρ„Π΅Ρ€Π·ΡŒ, ΠΎΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ Π±ΡƒΠΊΠ²ΠΎΠΉ Q, ΠΊΠ»Π΅Ρ‚ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡŒΠ΅Ρ‚ Ρ„Π΅Ρ€Π·ΡŒ, ΠΎΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠ°ΠΌΠΈ *, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ. Π¨Π°Ρ…ΠΌΠ°Ρ‚Π½Ρ‹ΠΉ Ρ„Π΅Ρ€Π·ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ, Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈ ΠΏΠΎ диагоналям.

Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅:

ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ фСрзя Π½Π° ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠΉ доскС Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π½ΠΎΠΌΠ΅Ρ€ столбца (Π±ΡƒΠΊΠ²Π° ΠΎΡ‚ a Π΄ΠΎ h, слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ) ΠΈ Π½ΠΎΠΌΠ΅Ρ€ строки (Ρ†ΠΈΡ„Ρ€Π° ΠΎΡ‚ 1 Π΄ΠΎ 8, снизу Π²Π²Π΅Ρ€Ρ…).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°:

c4

Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅:

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ стилизованноС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠΉ доски со схСмой Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΉ фСрзя.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°:

        . . * . . . * .
. . * . . * . .
* . * . * . . .
. * * * . . . .
* * Q * * * * *
. * * * . . . .
* . * . * . . .
. . * . . * . .
    

РСшСниС

Бпособ 1:

        x, y, board = *('abcdefgh87654321'.index(i) % 8 for i in input()), range(8)
[print(*['?Q**.'[len({j - x, x - j, i - y, y - i})] for j in board]) for i in board]
    
    

Бпособ 2:

        x, y = ('abcdefgh87654321'.index(i) % 8 for i in input())
directions = lambda i, j: (j - i == x - y) + (j + i == x + y) + ((j == x) != (i == y))
[print(*['.*Q'[directions(i, j)] for j in range(8)]) for i in range(8)]
    

Бпособ 3:

        coor = input()
board = [['.'] * 8 for _ in range(8)]
y, x = 8 - int(coor[1]), ord(coor[0]) - 97
for i in range(8):
    for j in range(8):
        if (y == i) or (x == j) or abs(y - i) == abs(x - j):
            board[i][j] = '*'
board[y][x] = 'Q'
for line in board:
    print(*line)

    
    
***

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

ΠœΠ•Π ΠžΠŸΠ Π˜Π―Π’Π˜Π―

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•