Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi / песни о паскале.pdf
Скачиваний:
62
Добавлен:
26.03.2016
Размер:
5.16 Mб
Скачать

Глава 38 Множества «в бою»

Множества, множества... — заполучив столь острое оружие, удержимся ли не пустить его в ход? Вот ещё несколько задач, — мы изрубим их в капусту!

Активисты, шаг вперед!

Прежде всего, отдадим долги Семену Семеновичу. Мы обещали директору выявить разгильдяев, что отлынивают от кружков, и сдержали слово. Теперь найдем активистов, состоящих в нескольких кружках. Откуда подступиться к этой задаче?

Положим для простоты, что в школе лишь три кружка, их списки представлены множествами S1, S2 и S3. Выявить тех, кто состоит одновременно в кружках S1 и S2 легко, — достаточно найти пересечение S1*S2. Точно так же поступим с другими парами: S1 и S3, S2 и S3. Объединив все три пересечения, мы выявим интересующих нас школяров. Итак, решение задачи выразится формулой.

R := S1*S2 + S1*S3 + S2*S3;

Попадут ли в это множество ученики, состоящие во всех трех кружках? Если да, то, как их отделить от прочих? Придумайте, как выявить тех, кто состоит:

в трех кружках:

в двух кружках и не более;

только в одном из кружков.

Надеюсь, что с этим проектом, назовем его P_38_1, вы справитесь сами, желаю успеха!

Подвиг контрразведчика

Контрразведка некоторого государства обнаружила утечку информации из лабораторий секретного учреждения. Для поимки шпиона позвали сыщика Шерлока Ивановича Холмского. Первым делом, он попросил списки сотрудников лабораторий. Лаборатории именовались латинскими буквами: A, B, C и так далее, причем некоторые сотрудники допускались в несколько лабораторий. Шерлок Иванович оцифровал списки, заменив фамилии сотрудников их табельными номерами, то есть, уникальными числами. Затем сгруппировал эти числа по лабораториям и составил табл. 6.

268

Глава 38 Множества «в бою»

Табл. 6 – Исходные данные для «вычисления» завербованного сотрудника

 

Лабо—

 

 

 

 

Номера сотрудников, допущенных в лабораторию

 

 

 

ратория

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

2

4

5

 

9 11

 

13

15 22

23 24

25

27 30

 

31

 

37

41 42

 

43 44

 

45

 

A

 

46

48

 

50

51 56

 

64 70

72

73 74

75

76 77

 

82

 

84

86 87

 

89 92

 

95

 

 

97

98 101 102 103 104 105 106 107 108 111 113 116 117 118 124 125 127

 

 

 

 

 

 

130 132 133 134 138 143 144 145 147 149 150

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

16

21

 

22

23 24

 

25 26

27

28 29

31

33 35

 

37

 

39

41 44

 

47 49

 

50

 

B

51

52

 

54

55 56

 

57 59

61

62 65

66

69 70

 

71

 

72

77 78

 

79 81

 

83

 

84

85

 

91

92 93

 

94 95

96

98 100 101 103 107 108 109 112 113 115 117

 

 

 

 

 

 

 

 

118 119 121 122 124 129

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

3

5

9

12 19

22

25 33

34 41 42

46 50

52

55

56 57

58 59

61

 

C

66

69

 

72

80 81

 

82 84

87

88 94

97

99 100 101 102 112 119 121

123

 

125 129 134 137 138 139 149 152 153 154 155

157 158 165 166 168 171

 

 

 

 

 

 

172 180 184 185 190 193 194 198 199 205 213

216 220

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

6

7

8

 

9 10

 

11

12 13

14 16

18

21 22

 

23

 

24

27 28

 

29 30

 

31

 

D

 

32

34

 

35

38 40

 

41 42

43

44 45

46

47 48

 

51

 

52

53 54

 

55 57

 

58

 

 

59

60

 

61

62 63

 

64 65

66

67 70

71

73 74

 

75

 

76

78 79

 

80 81

 

82

 

 

 

84

85

 

86

88 89

 

91 92

93

94 95

96

97 98

 

99 100 104 105 106 107

 

 

 

108 111 112 113 115 116 117 118 119 120

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

15

 

16

26 33

 

40 42

44

50 53

65

67 74

 

79

 

82

83 85

 

87 90

 

91

 

E

93

99 106 108 110 120 121 124 125 132 135 146 148 149 151 156 157 158

 

163 166 168 169 171 175 183 184 189 195 197

205 206 207 216 220 221

 

 

 

 

 

 

225 226 227 241 244

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8

12

21 25

26

29 30

31 34 48

49 50

52

55

59 60

62

70 71

73 83

 

 

 

85

90

 

91

92 93

 

94 96

97

99 100 102 103 104 105 106 108 119 121 122

 

F

124 127 128 130 132 141 142 144 156 160 165 166 169 171 173 176 179

 

 

 

191 192 195 199 200 207 209 220 221 222 224

226 229 233 234 236 239

 

 

 

240

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

23

24

 

26

27 29

 

30 35

36

41 42

44

45 46

 

49

 

52

55 56

 

58 60

 

61

 

G

 

63

64

 

65

68 72

 

74 76

77

81 82

86

87 88

 

90

 

93

94 95

 

96 97

 

98

 

 

100 101 102 107 108 109 112 113 114 115 117 120 123 127 132 133 135

 

 

 

137 138 143 145 146 147 150 152 155 156 159

161 162 163 164 165 168

 

 

 

170 172 177 178 179 180

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

15

17

 

19

20 21

 

22 23

26

28 29

30

32 33

 

34

 

36

38 41

 

42 44

 

45

 

 

 

46

48

 

49

52 57

 

60 62

65

66 68

73

74 77

 

78

 

83

84 85

 

88 89

 

90

 

H

 

91

92

 

95

96 97

 

98 99 100 101 102 103 104 107

108 115 116 118 127

 

 

128 129 130 131 134 135 136 137 139 145 146

150 151 152 154 157 160

 

 

 

 

 

 

161 164 166 167 172 173 177 178 179 180 182

185 188 189 190 193 195

 

 

 

197 204 207

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Дальнейшее разбирательство показало, что секреты просачивались только из лабораторий A, D, G и H (в таблице они выделены серым). При этом секреты

269

Глава 38 Множества «в бою»

остальных лабораторий (B, C, E и F) остались нетронутыми. Это направило дедуктивную мысль в правильное русло.

«Очевидно, — рассуждал Шерлок Иванович, — шпионить может тот, кто допущен в «дырявые» лаборатории. Из этого круга исключим тех, кто работает в нетронутых лабораториях, иначе их секреты тоже стали бы известны». Рассудив так, Шерлок Иванович достал ноутбук, и через 30 минут агент был вычислен, — подозреваемым оказался сотрудник с номером 45. Установленная за ним слежка подтвердила подозрение, и шпион был задержан.

Слабо ли вам повторить подвиг контрразведчика? Воспроизведите программу, написанную Шерлоком Ивановичем, я подскажу вам только её первую строку:

{ P_38_2 – подвиг контрразведчика }

В тридевятом царстве

Это случилось на затерянном в океане материке, что носил на себе несколько царств-государств. Жители материка — те ещё скряги — тратили для названий своих стран всего по одной букве: A, B, C и так далее. И мы будем их так называть. Границами стран служили каналы, специально для того прорытые; каналы были пронумерованы. Некоторые страны выходили к океану, берега которого тоже были пронумерованы и служили границами.

Самым могущественным было царство A. Однако, ввиду его обширности и частых политических перемен, тамошний государь никак не мог уяснить точные границы своей страны. Он толком не знал даже ближайших соседей, — сведения были самыми разноречивыми. Когда терпение монарха лопнуло, он повелел своим инженерам запустить спутник, который бы исследовал границы и внес ясность в этот вопрос.

Слово царя — закон, и вскоре спутник кружился на орбите. С высоты ясно наблюдались берега океана и каналы, составлявшие границы царств. Рис. 87 показывает то, что «увидел» спутник. Буквами обозначены названия стран, а числами — участки границ. В центре континента темным цветом выделено обширное царство A. К нему примыкают несколько стран, отмеченные серым, — это его соседи. Страны, примыкающие к царству A уголками своих границ, соседями не считаются. Они и все прочие «не соседи» отмечены белым цветом, а вокруг — океан.

Увы, примитивная техника тех лет не смогла отправить на землю эту фотографию. Спутник передал лишь номера границ каждого государства в виде текстового файла, содержащего строчки чисел.

270

Глава 38 Множества «в бою»

 

1

 

 

2

 

3

 

 

 

 

 

 

 

 

 

 

 

 

H

 

17

 

18

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

16

 

28

 

B

 

 

14

 

 

 

 

 

 

 

 

 

 

29

 

C

 

15

 

I

 

 

19

 

 

32

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

13

27

 

 

 

 

 

20

5

 

 

31

 

A

 

 

G

 

 

 

 

 

 

 

 

 

 

 

21

 

 

 

26

 

 

30

 

 

D

6

12

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

F

 

 

22

 

 

 

 

 

 

23

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

24

E

 

7

 

 

 

 

 

 

 

 

 

 

11

 

 

 

 

 

 

 

 

 

 

 

25

 

 

 

 

 

 

10

 

9

 

8

 

 

 

 

 

 

 

 

 

 

Рис. 87 – Вид на материк из космоса

Выдернув из принтера ещё теплую распечатку файла, первый министр примчался во дворец, протянул листок монарху и покорно припал к подножию трона. Царь встрепенулся, стал разглядывать бумажку, вертеть её так и сяк, и даже на зуб попробовал. Наконец терпение государя иссякло: «Болван, — обратился он к министру, — покажи тут наших соседей. Что? Не можешь? Так проваливай с глаз долой!». И смятая распечатка угодила в лицо министра. «А ведь хотел, как лучше…» — стучало в башке убегающего премьера. «А получилось, как всегда!»

— догнал его вопль взбешённого монарха.

Куда податься бедолаге? Разумеется, к самому умному — к придворному программисту. «Выручай, браток, я тебе премию выпишу!». Инженеры, создавшие спутник, тоже не остались в стороне и растолковали программисту суть проблемы. Расправив скомканную царской рукой бумагу, Ник — так звали придворного программиста — увидел вот что.

271

Глава 38 Множества «в бою»

29 21 30 31 32

17 18 19 29 28

3 4 5 20 19 18

6 7 22 21 20

8 9 25 24 23 22

10 11 26 30 23 24 25

12 13 15 27 26

14 1 2 17 16 15

16 28 32 31 27

Каждая строка этого файла, — объяснили инженеры, — перечисляет границы некоторого царства: первая строка — царства A, вторая — царства B и так далее. Имена стран в файле не указаны, но подразумевается их алфавитный порядок. Надо составить список стран, которые соседствуют с нашей страной A — первой в этом списке.

Друзья, отложите книгу и попытайтесь решить эту интересную задачу. В случае успеха, я похлопочу за вас при дворе!

А пока вы раздумываете, я исполню свой долг перед историей и покажу решение заморского коллеги. Ник сразу понял, что имеет дело с двумя видами множеств: множеством границ, обозначенных числами, и множеством стран, обозначенных буквами (вы помните, что страны именовались буквами?). Парень смекнул, что две страны соседствуют тогда, когда пересечение множеств их границ не пусто (это значит, что у них есть общие границы). Дальше его мысли устремились так быстро, что пальцы едва успевали тыкать по клавишам. Вот плод его труда.

{ P_38_3 – поиск стран–соседей

}

type TBoundSet = set of byte;

{ множество границ }

TStateSet = set of Char;

{ множество стран }

{––––– Распечатка множества стран (символов) –––––}

procedure WriteCharSet(var aFile: text; const aSet : TStateSet);

var c : char;

 

begin

 

for c:='A' to 'Z' do

if c in aSet then Write(aFile, c:2);

Writeln(aFile);

 

end;

 

272

Соседние файлы в папке delphi