Модули, множества, словари, форматирование строки
? тема по Linux
?? необязательная тема
- Использование модулей random и math
- Словари
- Множества (примеры использования)
Форматирование строки с помощью метода .format()
Домашнее задание
? теоретическое задание
? новая тема
Прочесть Подробнее об определении функций в учебнике
Прочесть Модули в учебнике
Прочитать Прихотливое форматирование вывода в учебнике
- Проверить, хорошо ли работает генератор случайных чисел: посчитать, сколько из 10**6 случайных чисел в диапазоне 1..20 попадает в каждый из единичных отрезков и вывести гистограмму (текстовыми символами "*" и " ")
Строчками слева направо
n = 10**6 k = 20 w = 70 import random stats = [0]*k for i in xrange(n): stats[ random.randint(1,k)-1 ] += 1 for i in xrange(k): print '#' * (w*stats[i]/(n/k))
Столбиками снизу вверх
n = 10**6 k = 20 h = 30 import random stats = [0]*k for i in xrange(n): stats[ random.randint(1,k)-1 ] += 1 for i in xrange(k): stats[i] = h*stats[i]/(n/k) for i in xrange(h): print ''.join([[' ','#'][ stats[j] >= h-i ] for j in xrange(k)])
Написать программу, заполняющую список списков M*N по спирали:
0 1 2 3 9 10 11 4 8 7 6 5
n = N = 3 # rows m = M = 4 # columns xs = 0 ys = 0 res = [[0 for j in range(m)] for i in range(n)] # Кстати, почему нельзя res=([0]*m)*n ? i = 0 while (n>0) and (m>=0): res[xs][ys:ys+m-1] = range(i,i+m-1) # верх i+=m-1 for j in xrange(n-1): # право res[xs+j][ys+m-1] = i i+=1 res[xs+n-1][ys+m-1:ys:-1] = range(i,i+m-1) # низ i+=m-1 for j in xrange(n-1): # лево res[xs+n-1-j][ys] = i i+=1 xs+=1 # вложенный прямоугольник ys+=1 n-=2 m-=2 # варианты вывода for x in range(N): for y in range(M): print '%2d' % res[x][y], print for x in range(N): for y in range(M): print '{0:2d}'.format(res[x][y]), print s = ' '.join(['{%d:2d}' % i for i in range(M)]) for x in range(N): print s.format(*res[x])
Классическая задача о ферзях: расставить N ферзей на шахматной доске NxN так, чтобы они не попадали под удар друг друга
Вариант: с форматированным выводом
def place(brd, n): def check(): for i in xrange(n+1): for j in xrange(i): if (brd[i] == brd[j]) or (abs(i-j) == abs(brd[i] - brd[j])): return False return True if n >= len(brd): return True while brd[n] < len(brd): if check() and place(brd,n+1): return True # для поиска всех решений, вместо return True #solutions.append( tuple(brd) ) #return False brd[n] += 1 brd[n]=0 # это будет откат, так что сбросим на начало return False def print_brd (brd): for i in range(N): print '|', for j in range(N): print ' '.join(['_','*'][brd[j]==i]), print '|' brd = [0]*N place(brd,0) print_brd( brd )
| * _ _ _ _ _ _ _ | | _ _ _ _ _ _ * _ | | _ _ _ _ * _ _ _ | | _ _ _ _ _ _ _ * | | _ * _ _ _ _ _ _ | | _ _ _ * _ _ _ _ | | _ _ _ _ _ * _ _ | | _ _ * _ _ _ _ _ |
Решить общую задачу о числовом ребусе вида <A1A2?An> + <B1B2?Bn> = <C1C2?Cn> (или ?Cn+1), где различным буквам соответствуют различные цифры, но сами буквы Ai, Bi и Ci могут совпадать