Набор неповторяющихся элементов

Свой инструмент…

Пилипенко Сергей Андреевич

          Мой двоюродный дед Семён считал, что его дом стоит самым первым в деревне. В самом начале улицы. Но это опять же с какой стороны посмотреть? А если смотреть с обратного конца деревни, то вдруг и окажется, что он был самым последним на нашей улице. Так склонны были считать мы. Наша семья. Потому что наш дом стоял ровно на обратном конце длинной-предлинной, заросшей черёмухами выглядывающими из побелённых белой известкой палисадников, улицы. Дом у деда был старый, огромный, угрюмый или надёжный, так видимо лучше сказать? Почерневший от дождей и выгоревший на солнце. Такой дом ещё сможет простоять двести лет…, а то и все триста,  чего ему станется? Сибирская лиственница в два обхвата дерево на века. Таких  домов сейчас в деревне уже не очень много осталось, сейчас всё больше дома обложенные кирпичом в седых разводах соли, а то и вовсе оббитых поведённой и рассохшейся на стыках «вагонкой». По мне так пусть лучше бы была почерневшая от времени, и иссечённая холодными дождями до продольных чёрных морщин естественная красота дерева, с выступающей на сучках янтарной смолой, чем неприглядный новодел. Дед Семён и сам был такой же, как и дом. Несмотря на свои семьдесят с лишним лет. Большой, толстый, с крепкими борцовскими руками пахаря, но при этом спокойный и неторопливый. Бабка Домна Ивановна – ему под стать. Модифицированная копия, такая же большая и неторопливая. И с такой же как и у деда долей иронии в казалось бы, абсолютно серьёзных речах.

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

Получать уникальные значения из списка в python

Запах кукурузного силоса для тощих коров, до конца моей жизни впитался в мой мозг. А огромные кукурузные поля всегда манили нас, пацанов, своими таинственными зарослями и прохладной тенью высоких как деревья, зелёных стволов, так похожих на нарисованные пальмы. Кроме того в этих джунглях росли огромные белые шампиньоны и потихоньку-помаленьку мы пристрастились собирать и их, хотя и таёжных грибов было у всех навалом. Народ стал понемногу приходить в себя, стали посмелее, заново научились рассказывать анекдоты, сочинять частушки. В общем – «народу вышло облегчение». Народу то может быть и да, но на колхозниках это что-то никак не сказалось. Дед Семён и бабка Домна вместе получали колхозную пенсию, в итоге составляющую около двадцати рублей. Учитывая то, что надо было ещё кормить и поросёнка и корову – этого было очень мало. И тут осмелевший от последних перемен, председатель колхоза, сделал ему предложение, от которого тот не стал отказываться.

          Для того чтобы возить силос на ферму, потребовались огромные, плетеные короба, повышенной прочности, которые как оказалось, умел плести только он. Ну, то есть, желающих и умеющих  плести оказалось немало, но только все они очень быстро отказались от этого занятия. Такой короб – если его нагрузить доверху, мог вмещать в себя около тонны сырого и дурно пахнущего, но ужасно питательного силоса, в который кроме измельчённых стеблей кукурузы добавляли ещё клевер и люцерну. А то порой и овёс с ячменём. Ну, по крайней мере, так было во времена моего детства. Ставился он либо на сани, либо на телегу и переворачивался вручную. Все короба сделанные другими мастерами выдерживали от силы десяток таких поездок с кувырками. И только экземпляры, произведённые дедовыми руками, осмеливались считаться вечными. Так получилось, что скоро единственным мастером, которого просили сделать на заказ такие короба — остался он. Учитывая то, что за каждый такой короб он получал по полтора-два рубля, это был неплохой — как сказали бы сейчас бизнес. Каждый день он не спеша умудрялся делать по одному изделию. Кроме того в отличии от других мастеров они получались у него идеально ровными и плотными. А так как плелись они из плохо гнущихся молодых стеблей черёмухи, каждый из которых, представлял из себя — трёхметровый прут, толщиной по два, два с половиной сантиметра, то казалось удивительным как у него хватает силы в руках, заниматься таким непростым ремеслом. Но дед не жаловался, а только улыбался, загибая своими мощными ручищами непослушные прутья.

          — Тут ещё, хлопцы, кроме силы и инструмент специальный нужен, особый инструмент, сложный в эксплуатации и тонкий в обращении, — говорил он, хитро улыбаясь, когда кто нибудь, как бы ненароком удивлялся прочности и красоте сделанной работы.

          А коробов нужно было всё больше и больше. Трактора в ту пору в деревне были немногочисленны и недолговечны, как девичьи слёзы. Эдакие — почти «колёсники». Хотя «колёсники» к тому времени были уже все списаны и ржавели на задворках машинного двора, в деревню уже пригнали новые МТЗ. Только что на резиновом ходу, а всё так же без кабин и с деревянными тормозами, которые нужно было перетягивать каждый божий день. На время посевной и уборочной они все как один рекрутировались на поля. Зимой их невозможно было завести, да и не понятно мне до сих пор, как можно было на них зимой работать без кабин? Так что были трудолюбивые лошадки единственными кормилицами  таких же горемычных коров.  А дед так и оставался единственным поставщиком плетеных емкостей, на четыре окрестные деревни. Своими речами о необычном инструменте он очень заинтриговал всех, кто так или иначе интересовался столярными делами и плетением корзин. Он просто заразил их желанием увидеть необычное приспособление. Некоторые особо нетерпеливые, уже было взялись за изобретение собственных вариантов всевозможных стяжек и протяжек. Так было велико их желание, узнать секрет (великого) мастера и самим заработать денег. Но тайна так и оставалась нераскрытой, потому что ни на прутьях, ни на днищах коробов не оставалось никаких следов постороннего воздействия.

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

          — Не могу, — опять хитро улыбался дед, — инструмент специальный, — тонкой работы, требует к себе нежного обращения. Больше пяти десятков лет, уж пользуюсь почти кажный божий день, только зажим между нижними рычагами расхлябался немного, а всё сносу нет. Ещё от тёщи с тестем достался. Да и не влезет весь мой инструмент к тебе в двуколку!
          — Да приезжай к нам, — осторожно злился председатель, — у нас столярная мастерская, не чета вашей, любой инструмент есть, какой душе угодно. А чего не найдешь, так я враз в кузне своим мастерам закажу, мои ж орлы откуют, закалят так что любо-дорого, из под земли достанут – только приедь, — почти умолял он.

И получив очередной, насмешливый отказ, зачем-то пошёл разыскивать своего племянника, скотника Федьку – жившего в нашей деревне. И о чем-то с ним целый час проговорил.

          Федька племянник появился у него только через неделю. Откровенно и насмешливо с похмелья весёлый.
          — Ну, ставь председатель литру, как и обещал, — а когда тот вытащил обещанную бутыль, продолжил. — Выведал я у него про инструмент. Два вечера на крыше у соседа просидел. А ведь прав был дед Семён, не влезет у него инструмент в твою двуколку. Знаешь, как он короба вяжет? А вот сначала обыкновенно вяжет! А когда короб уже на половину готов, на тот бок что повыше, он усаживает сверху Домну Ивановну! А у Домны Ивановны инструмент в нижней части туловища, в два аршина ширины и в сто пятьдесят килограммов весу. Сам вяжет, плетёт, а её по кругу пересаживает, так и короб ровный, плотный и народ довольный! Нет, председатель…, бабку Домну ты же знаешь, не влезет её инструмент в двуколку…, ни как не влезет.   

© Copyright: Пилипенко Сергей Андреевич, 2010
Свидетельство о публикации №210072600868

Список читателей / Версия для печати / Разместить анонс / Заявить о нарушении

Другие произведения автора Пилипенко Сергей Андреевич

Рецензии

Написать рецензию

Спасибо! Отличная задорная миниатюра про смекалку и хитроумие! С уважением,

Иван Таратинский   04.03.2016 10:32   •   Заявить о нарушении

+ добавить замечания

Спасибо Иван!
Отличный инструмент — это девяносто процентов успешной и быстрой работы. Хотя и без умелых рук никакой инструмент не поможет… )))
Удачи и вдохновения!

Серёга

Пилипенко Сергей Андреевич   04.03.2016 21:47   Заявить о нарушении

+ добавить замечания

На это произведение написана 21 рецензия, здесь отображается последняя, остальные — в полном списке.

Написать рецензию     Написать личное сообщение     Другие произведения автора Пилипенко Сергей Андреевич

Тема 2. Элементы теории множеств и комбинаторика



3. Общие правила комбинаторики

Все разнообразие комбинаторных формул может быть выведено из двух основных утверждений, касающихся конечных множеств – правило суммы и правило произведения.

Правило суммы: пусть имеется n попарно непересекающихся множеств A1, A2, …, An, содержащих m1, m2, …, mn элементов соответственно. Число способов, которыми можно выбрать один элемент из всех этих множеств, равно m1 + m2 + … + mn.

Пример. Если на первой полке стоит X книг, а на второй Y, то выбрать книгу с первой или второй полки, можно X+Y способами.

Пример. Ученик должен выполнить практическую работу по математике. Ему предложили на выбор 17 тем по алгебре и 13 тем по геометрии. Сколькими способами он может выбрать одну тему для практической работы?

Решение: По правилу суммы получаем 17+13=30 вариантов.

Кортеж — конечная последовательность (допускающая повторения) элементов какого-нибудь множества.

Правило произведения: пусть имеется n множеств A1, A2, …, An содержащих m1, m2, …, mn элементов соответственно. Число способов, которыми можно выбрать по одному элементу из каждого множества, т. е. построить кортеж (а1, а2, …, аn), где аiÎАi1 (i = 1, 2, …, n), равно m1 · m2 · … · mn.

Пример. Если на первой полке стоит 5 книг, а на второй 10, то выбрать одну книгу с первой полки и одну со второй можно 5*10=50 способами.

Пример. Переплетчик должен переплести 12 различных книг в красный, зеленый и коричневые переплеты.

Слияние двух списков без дубликатов

Сколькими способами он может это сделать?

Решение. Имеется 12 книг и 3 цвета, значит по правилу произведения возможно 12*3=36 вариантов переплета.

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

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

Пример. Из цифр 1, 2, 3, 4, 5 можно составить следующие трехзначные числа 123, 431, 524, …и т.д. Это упорядоченные трехэлементные выборки, так как 123 и 132 — разные числа.

Пример. Из 20 учащихся класса выбрать двух дежурных. Любая пара дежурных представляет собой неупорядоченную двухэлементную выборку, так как порядок их выбора не важен.

Размещения

Размещениями из n элементов по m элементов (m < n) называются комбинации, составленные из данных n элементов по m элементов, которые отличаются либо самими элементами, либо порядком элементов.

Число размещений без повторений из n по m (n различных элементов) вычисляется по формуле:

Размещениями с повторениями из n элементов по m называются упорядоченныеm-элементные выборки, в которых элементы могут повторяться.

Число размещений с повторениями вычисляется по формуле:

Пример. Возьмем буквы Б, А, Р. Какие размещения из этих букв, взятых по две, можно получить? Сколько таких наборов получиться, если: 1) буквы в наборе не повторяются; 2) буквы могут повторяться?

Решение.

  1. Получатся следующие наборы: БА, БР, АР, АБ, РБ, РА.
  2. По формуле (3.1) получаем: наборов.

  3. Получатся наборы: ББ, БА, БР, АА, АБ, АР, РР, РБ, РА.
  4. По формуле (3.2) получаем: наборов.

Пример. Вдоль дороги стоят 6 светофоров. Сколько может быть различных комбинаций их сигналов, если каждый светофор имеет 3 состояния: "красный", "желтый", "зеленый"?

Решение. Выпишем несколько комбинаций: КККЖЗЗ, ЗЗЗЗЗЗ, КЖЗКЖЗ… Мы видим, что состав выборки меняется и порядок элементов существенен (ведь если, например, в выборке КЖЗКЖЗ поменять местами К и Ж, ситуация на дороге будет другой). Поэтому применяем формулу (3.2) и вычисляем число размещений с повторениями из 3 по 6, получаем комбинаций.

Перестановки

Перестановками из n элементов называются размещения из этих n элементов по n (Перестановки — частный случай размещений).

Число перестановок без повторений (n различных элементов) вычисляется по формуле:

Число перестановок c повторениями (k различных элементов, где элементы могут повторяться m1, m2, …, mk раз и m1 + m2 +… + mk = n, где n — общее количество элементов) вычисляется по формуле:

Пример. Возьмем буквы Б, А, Р. Какие перестановки из этих букв можно получить? Сколько таких наборов получится, если: 1) буквы в наборе не повторяются; 2) буква А повторяется два раза?

Решение.

  1. Получатся наборы: БАР, БРА, АРБ, АБР, РАБ, РБА.
  2. По формуле (3.3) получаем: наборов.

  3. Получатся наборы: БАРА, БРАА, БААР, ААРБ, ААБР, АБАР, АРАБ, АРБА, АБРА, РАБА, РААБ, РБАА.
  4. По формуле (3.4) получаем: наборов.

Пример. Сколько шестизначных чисел можно составить из цифр 0, 1, 2, 3, 4, 5 так, чтобы цифры в числе не повторялись?

Решение. Из данных шести цифр можно составить Р6 = 6! = 720 перестановок. Но числа, начинающиеся на нуль, не являются шестизначными. Такие числа отличаются друг от друга перестановкой пяти остальных цифр, значит, их будет Р5 = 120. Поэтому шестизначных чисел будет 720 — 120 = 600 чисел.

Пример. Сколькими способами можно расставить белые фигуры (2 ладьи, 2 коня, 2 слона, ферзь и король) на первой линии шахматной доски?

Решение. Первая линия шахматной доски представляет собой 8 клеток, на которых и надо расположить эти 8 фигур. Различные варианты расположения будут отличаться только порядком фигур, значит, это будут перестановки с повторениями Р8 (2,2,2).

По формуле (3.4) получаем: способов.

Сочетания

Сочетаниями из n элементов по m элементов называются комбинации, составленные из данных n элементов по m элементов, которые различаются хотя бы одним элементом (отличие сочетаний от размещений в том, что в сочетаниях не учитывается порядок элементов).

Число сочетаний без повторений (n различных элементов, взятых по m) вычисляется по формуле:

Число сочетаний c повторениями (n элементов, взятых по m, где элементы в наборе могут повторяться) вычисляется по формуле:

Пример. Возьмем буквы Б, А, Р. Какие сочетания из этих букв, взятых по две, можно получить? Сколько таких наборов получится, если: 1) буквы в наборе не повторяются; 2) можно брать по два одинаковые буквы.

Решение.

  1. Получатся наборы: БА (БА и АБ — один и тот же набор), АР и РБ
  2. По формуле (3.5) получаем: наборов.

  3. Получатся наборы: ББ, БА, БР, АА, АР, РР.
  4. По формуле (3.6) получаем: наборов.

Пример.

Из 20 учащихся надо выбрать двух дежурных. Сколькими способами это можно сделать?

Решение. Надо выбрать двух человек из 20. Ясно, что от порядка выбора ничего не зависит, то есть Иванов-Петров или Петров-Иванов — это одна и та же пара дежурных. Следовательно, это будут сочетания из 20 по 2.

По формуле (3.5) получаем: способов.

Пример. В хлебном отделе имеются булки белого и черного хлеба. Сколькими способами можно купить 6 булок хлеба?

Решение. Обозначая булки белого и черного хлеба буквами Б и Ч, составим несколько выборок: ББББББ, ББЧЧББ, ЧЧЧЧЧБ, … Состав меняется от выборки к выборке, порядок элементов несущественен, значит это — сочетания с повторениями из 2 по 6. По формуле (3.6) получаем способов.

Cделаем проверку и выпишем все варианты покупки: ББББББ, БББББЧ, ББББЧЧ, БББЧЧЧ, ББЧЧЧЧ, БЧЧЧЧЧ, ЧЧЧЧЧЧ. Их действительно 7.

Схема определения вида комбинации:


Односвязный список — это совокупность нескольких объектов, каждый из которых представляет собой элемент списка, состоящий из двух частей. Первая часть элемента — значение, которое он хранит, вторая — информация о следующем элементе списка.

Характер информации о следующем элементе зависит от того, где конкретно хранится список. Например, если это оперативная память, то информация будет представлять собой адрес следующего элемента, если файл — позицию следующего элемента в файле. Мы с Вами будем рассматривать реализацию списка хранящегося в оперативной памяти, однако, при желании, вы сможете создать собственный код для хранения списка в файле. Итак, приступим:

Каждый элемент списка мы представим программно с помощью структуры, которая состоит из двух составляющих:

1.Одно или несколько полей, в которых будет содержаться основная информация, предназначенная для хранения.

2.

Структурная организация данных

Поле, содержащее указатель на следующий элемент списка.

Отдельные объекты подобной структуры мы далее будем называть узлами, связывая их между собой с помощью полей, содержащих указатели на следующий элемент.

//узел списка struct node { // Информационная часть узла int value; // Указатель на следующий узел списка node *next; };

После создания структуры, нам необходимо инкапсулировать её объекты в некий класс, что позволит управлять списком, как цельной конструкцией. В классе будет содержаться два указателя (на хвост, или начало списка и голову, или конец списка), а так же набор функции для работы со списком.

//голова node *phead;//хвост node *ptail;

В целом, полученный список можно представить так:

Итак, основные моменты создания списка, мы рассмотрели, переходим непосредственно к его формированию.

Формирование списка. Отведем место для указателей в статической памяти.

node *phead; node *ptail;

Зарезервируем место для динамического объекта.

phead=new node;

Присвоим значение переменной ptail, и поместим в информационное поле значение элемента.

ptail = phead; ptail->value = "значение1";

Поместим в поле узла адрес еще одного — нового динамического объекта.

ptail->next = new node;

Переменная ptail должна содержать адрес последнего добавленного элемента, т. к. он добавлен в конец.

ptail = ptail->next;

Если требуется завершить построение списка, то в поле указателя последнего элемента нужно поместить NULL.

ptail->next = NULL; ptail->value = "значение2";

В результате построен линейный односвязный список, содержащий два узла.

Вставка узла в определенное заданное место списка. Здесь и далее, мы не будем приводить фрагменты кода, так как они являются крупными. Позже мы с вами просто рассмотрим пример реализации односвязного списка целиком. А, сейчас, разберем операции над списком с помощью иллюстраций. Выделить память под новый узел. Записать в новый узел значение. Записать в указатель на следующий узел адрес узла, который должен располагаться после нового узла. Заменить в узле, который будет располагаться перед новым узлом, записанный адрес на адрес нового узла.

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

#include <iostream> using namespace std; struct Element { // Данные char data; // Адрес следующего элемента списка Element * Next; }; // Односвязный список class List { // Адрес головного элемента списка Element * Head; // Адрес головного элемента списка Element * Tail; // Количество элементов списка int Count; public: // Конструктор List(); // Деструктор ~List(); // Добавление элемента в список // (Новый элемент становится последним) void Add(char data); // Удаление элемента списка // (Удаляется головной элемент) void Del(); // Удаление всего списка void DelAll(); // Распечатка содержимого списка // (Распечатка начинается с головного элемента) void Print(); // Получение количества элементов, находящихся в списке int GetCount(); }; List::List() { // Изначально список пуст Head = Tail = NULL; Count = 0; } List::~List() { // Вызов функции удаления DelAll(); } int List::GetCount() { // Возвращаем количество элементов return Count; } void List::Add(char data) { // создание нового элемента Element * temp = new Element; // заполнение данными temp->data = data; // следующий элемент отсутствует temp->Next = NULL; // новый элемент становится последним элементом списка // если он не первый добавленный if(Head!=NULL){ Tail->Next=temp; Tail = temp; } // новый элемент становится единственным // если он первый добавленный else{ Head=Tail=temp; } } void List::Del() { // запоминаем адрес головного элемента Element * temp = Head; // перебрасываем голову на следующий элемент Head = Head->Next; // удаляем бывший головной элемент delete temp; } void List::DelAll() { // Пока еще есть элементы while(Head != 0) // Удаляем элементы по одному Del(); } void List::Print() { // запоминаем адрес головного элемента Element * temp = Head; // Пока еще есть элементы while(temp != 0) { // Выводим данные cout << temp->data << " "; // Переходим на следующий элемент temp = temp->Next; } cout << "\n\n"; } // Тестовый пример void main() { // Создаем объект класса List List lst; // Тестовая строка char s[] = "Hello, World !!!\n"; // Выводим строку cout << s << "\n\n"; // Определяем длину строки int len = strlen(s); // Загоняем строку в список for(int i = 0; i < len; i++) lst.Add(s[i]); // Распечатываем содержимое списка lst.Print(); // Удаляем три элемента списка lst.Del(); lst.Del(); lst.Del(); //Распечатываем содержимое списка lst.Print(); }

Добавить комментарий

Закрыть меню