Модули, множества, словари, форматирование строки

  • {o} — тема по Linux

  • <!> ­— необязательная тема

Домашнее задание

  • {i} — теоретическое задание

  • {*} — новая тема

  1. {i} Прочесть Подробнее об определении функций в учебнике

  2. {i} Прочесть Модули в учебнике

  3. {i} Прочитать Прихотливое форматирование вывода в учебнике

  4. Проверить, хорошо ли работает генератор случайных чисел: посчитать, сколько из 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)])
  5. Написать программу, заполняющую список списков 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])
  6. Классическая задача о ферзях: расставить 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 )

      | * _ _ _ _ _ _ _ |
      | _ _ _ _ _ _ * _ |
      | _ _ _ _ * _ _ _ |
      | _ _ _ _ _ _ _ * |
      | _ * _ _ _ _ _ _ |
      | _ _ _ * _ _ _ _ |
      | _ _ _ _ _ * _ _ |
      | _ _ * _ _ _ _ _ |
  7. Решить общую задачу о числовом ребусе вида <A1A2…An> + <B1B2…Bn> = <C1C2…Cn> (или …Cn+1), где различным буквам соответствуют различные цифры, но сами буквы Ai, Bi и Ci могут совпадать


CategoryClass CategoryVmsh

LecturesVMSH/2010-11-17 (last edited 2010-11-24 18:25:30 by PavelSutyrin)