Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Составление календаря чемпионата по круговой системе - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Составление календаря чемпионата по круговой системе
Gustav Дата: Воскресенье, 09.12.2012, 00:52 | Сообщение № 1
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

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

На организаторском поприще особенно мне нравилось составлять расписания круговых ("каждый с каждым") турниров. В этом мне помогала старенькая брошюра с гордым названием "Шахматный кодекс", в конце которой имелись специальные таблицы для подготовки расписания встреч в турнирах с числом участников от 3 до 20, с равномерным чередованием цвета фигур у различных участников от тура к туру.

Как-то я задумался о том, что вот поеду я, например, в колхоз (студенческий) и захотят там устроить шахматный турнир, а Кодекса у меня с собой не будет и как же быть? И решил я на досуге попробовать разгадать алгоритм этих волшебных таблиц, чтобы при необходимости воспроизводить их с помощью лишь карандаша и бумаги (ну, и головы, конечно). О том, что эти таблицы называются таблицами Бергера, я узнал совсем недавно, прошерстив Интернет перед этой публикацией.

Получилось у меня следующее. Расписание всегда составляется для четного числа участников. При нечетном числе участник, которому в очередном туре выпадает встреча с последним (несуществующим) участником, отдыхает. Для первого тура пары образуются очень просто: первый номер играет с последним, второй - с предпоследним и т.д. Например, для 12 участников первый тур будет выглядеть следующим образом: 1-12, 2-11, 3-10, 4-9, 5-8, 6-7. А дальше с периодичностью в два тура повторяются операции перестановки, которые лучше всего изобразить графически (см. на листе "Алгоритм" в прилагаемом файле).

Номера участников следует определять жребием. Не следует связывать их с каким-либо рангом, рейтингом, например, по результатам прошлых заслуг в соревнованиях. Если же задать номера в соответствии с рангом, то следует иметь в виду, что по таблицам встреча номеров 1 и 2 происходит уже во втором туре, что ослабляет интригу турнира по сравнению с тем, если бы эта встреча состоялась в самом последнем туре. И всё же, при непреодолимом желании обеспечения хорошей интриги и нумерации участников в соответствии с рангом - туры, сформированные по таблицам Бергера, следует каким-либо способом перетасовать (подобная творческая перетасовка выходит за рамки данного сообщения).

В прилагаемом файле - 4 листа: "Бергер", играющий основную вычислительную роль в демонстрируемом функционале, а также "Календарь", "Участники", "Алгоритм".

На первом листе "Бергер" в ячейку A1 следует ввести количество участников - целое положительное число не более 50, после чего ниже на этом листе автоматически сформируется расписание турнира. На большее, чем 50, кол-во не настроены формулы, да и трудно представить круговой турнир с таким большим числом участников. Обычно при таких количествах уже используются другие системы соревнований - олимпийская, швейцарская и др. Но при большом желании или теоретическом интересе формулы могут быть легко добавлены и для числа больше 50 - пока не упремся по ширине таблицы в технические ограничения Excel. Наименования колонок "Б" и "Ч" означают белый и черный цвет фигур для шахмат, шашек и иных интеллектуальных игр. Сопутствующие наименования в скобках "(х)" и "(г)" означают "хозяина" и "гостя" - для футбола, баскетбола и т.д.

На втором листе "Календарь" встречи, сгенерированные на листе "Бергер" с горизонтальным расположением туров, развернуты в более привычную хронологическую последовательность туров (и встреч внутри туров) сверху вниз. Для удобства практического использования файла без дополнительного "формулизма" на этот же лист подтягиваются имена участников, соответствующие номерам (задаются на третьем листе).

На третьем листе "Участники" как раз и происходит расшифровка безликих числовых номеров. В качестве примера я выбрал список команд российской премьер-лиги по футболу сезона 2012-2013. Для какого-либо своего турнира пропишите на этот лист своих участников (Иванов, Петров, Сидоров и т.п.), после чего возьмите расписание встреч с листа "Календарь" и играйте на здоровье.

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

В качестве "Списка литературы" - несколько ссылок по таблицам Бергера, которые я отметил для себя:

http://otvet.mail.ru/question/35011020

http://www.tournamentdirector.co.uk/berger_pairings.html

http://www.fide.com/component/handbook/?id=20&view=category (см. раздел "Annex 1: Berger Tables for Round-Robin Tournaments")

http://www.devenezia.com/round-robin/forum/YaBB.pl?num=1152214269

По третьей ссылке мне встретилось любопытное замечание, о котором я раньше не задумывался: "Для двухкругового турнира рекомендуется поменять местами два последних тура первого круга. Это позволит избежать трех последовательных игр с тем же самым цветом." Например, номер 1 играет два первых тура белыми в первом круге и, следовательно, будет играть два первых тура черными во втором круге. Но он играет черными и в последнем туре первого круга, поэтому на рубеже первого и второго круга, если не последовать упомянутому замечанию, у номера 1 получится три партии подряд чёрными.
К сообщению приложен файл: BergerTable.rar (136.2 Kb)


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеВ детстве я увлекался шахматами. Причем как самой игрой, так и организацией всевозможных турниров (чемпионатов класса, школы, лагеря, факультета), старостой и главным судьей которых, как правило, я сам же и выступал.

На организаторском поприще особенно мне нравилось составлять расписания круговых ("каждый с каждым") турниров. В этом мне помогала старенькая брошюра с гордым названием "Шахматный кодекс", в конце которой имелись специальные таблицы для подготовки расписания встреч в турнирах с числом участников от 3 до 20, с равномерным чередованием цвета фигур у различных участников от тура к туру.

Как-то я задумался о том, что вот поеду я, например, в колхоз (студенческий) и захотят там устроить шахматный турнир, а Кодекса у меня с собой не будет и как же быть? И решил я на досуге попробовать разгадать алгоритм этих волшебных таблиц, чтобы при необходимости воспроизводить их с помощью лишь карандаша и бумаги (ну, и головы, конечно). О том, что эти таблицы называются таблицами Бергера, я узнал совсем недавно, прошерстив Интернет перед этой публикацией.

Получилось у меня следующее. Расписание всегда составляется для четного числа участников. При нечетном числе участник, которому в очередном туре выпадает встреча с последним (несуществующим) участником, отдыхает. Для первого тура пары образуются очень просто: первый номер играет с последним, второй - с предпоследним и т.д. Например, для 12 участников первый тур будет выглядеть следующим образом: 1-12, 2-11, 3-10, 4-9, 5-8, 6-7. А дальше с периодичностью в два тура повторяются операции перестановки, которые лучше всего изобразить графически (см. на листе "Алгоритм" в прилагаемом файле).

Номера участников следует определять жребием. Не следует связывать их с каким-либо рангом, рейтингом, например, по результатам прошлых заслуг в соревнованиях. Если же задать номера в соответствии с рангом, то следует иметь в виду, что по таблицам встреча номеров 1 и 2 происходит уже во втором туре, что ослабляет интригу турнира по сравнению с тем, если бы эта встреча состоялась в самом последнем туре. И всё же, при непреодолимом желании обеспечения хорошей интриги и нумерации участников в соответствии с рангом - туры, сформированные по таблицам Бергера, следует каким-либо способом перетасовать (подобная творческая перетасовка выходит за рамки данного сообщения).

В прилагаемом файле - 4 листа: "Бергер", играющий основную вычислительную роль в демонстрируемом функционале, а также "Календарь", "Участники", "Алгоритм".

На первом листе "Бергер" в ячейку A1 следует ввести количество участников - целое положительное число не более 50, после чего ниже на этом листе автоматически сформируется расписание турнира. На большее, чем 50, кол-во не настроены формулы, да и трудно представить круговой турнир с таким большим числом участников. Обычно при таких количествах уже используются другие системы соревнований - олимпийская, швейцарская и др. Но при большом желании или теоретическом интересе формулы могут быть легко добавлены и для числа больше 50 - пока не упремся по ширине таблицы в технические ограничения Excel. Наименования колонок "Б" и "Ч" означают белый и черный цвет фигур для шахмат, шашек и иных интеллектуальных игр. Сопутствующие наименования в скобках "(х)" и "(г)" означают "хозяина" и "гостя" - для футбола, баскетбола и т.д.

На втором листе "Календарь" встречи, сгенерированные на листе "Бергер" с горизонтальным расположением туров, развернуты в более привычную хронологическую последовательность туров (и встреч внутри туров) сверху вниз. Для удобства практического использования файла без дополнительного "формулизма" на этот же лист подтягиваются имена участников, соответствующие номерам (задаются на третьем листе).

На третьем листе "Участники" как раз и происходит расшифровка безликих числовых номеров. В качестве примера я выбрал список команд российской премьер-лиги по футболу сезона 2012-2013. Для какого-либо своего турнира пропишите на этот лист своих участников (Иванов, Петров, Сидоров и т.п.), после чего возьмите расписание встреч с листа "Календарь" и играйте на здоровье.

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

В качестве "Списка литературы" - несколько ссылок по таблицам Бергера, которые я отметил для себя:

http://otvet.mail.ru/question/35011020

http://www.tournamentdirector.co.uk/berger_pairings.html

http://www.fide.com/component/handbook/?id=20&view=category (см. раздел "Annex 1: Berger Tables for Round-Robin Tournaments")

http://www.devenezia.com/round-robin/forum/YaBB.pl?num=1152214269

По третьей ссылке мне встретилось любопытное замечание, о котором я раньше не задумывался: "Для двухкругового турнира рекомендуется поменять местами два последних тура первого круга. Это позволит избежать трех последовательных игр с тем же самым цветом." Например, номер 1 играет два первых тура белыми в первом круге и, следовательно, будет играть два первых тура черными во втором круге. Но он играет черными и в последнем туре первого круга, поэтому на рубеже первого и второго круга, если не последовать упомянутому замечанию, у номера 1 получится три партии подряд чёрными.

Автор - Gustav
Дата добавления - 09.12.2012 в 00:52
антон Дата: Четверг, 26.12.2013, 13:57 | Сообщение № 2
Группа: Гости
Хотел бы задать вопрос, я вляется ли возможны запрограммировать этот алгоритм. я очевидных способов не вижу, возможно вы поможете.
 
Ответить
СообщениеХотел бы задать вопрос, я вляется ли возможны запрограммировать этот алгоритм. я очевидных способов не вижу, возможно вы поможете.

Автор - антон
Дата добавления - 26.12.2013 в 13:57
vet80 Дата: Пятница, 28.03.2014, 00:44 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 9
Репутация: 0 ±
Замечаний: 0% ±

Gustav, здравствуйте, а не смогли бы вы составить подобный календарь, для такого турнира по хоккею(играем в НХЛ 2009)
принцип такой:
- по 4 игры с каждой из команд внутри дивизиона
- по 3 игры с каждой из команд внутри внутри конференции
- по 2 игры с каждой из команд другой конференции
всего в конце у каждой из команд должно быть по 73 игры

Западная конференция
Бобров 1
Бобров 2
Бобров 3
Бобров 4
Бобров 5
Бобров 6
Бобров 7

Тарасов 1
Тарасов 2
Тарасов 3
Тарасов 4
Тарасов 5
Тарасов 6
Тарасов 7

Восточная конференция
Харламов 1
Харламов 2
Харламов 3
Харламов 4
Харламов 5
Харламов 6
Харламов 7

Чернышев 1
Чернышев 2
Чернышев 3
Чернышев 4
Чернышев 5
Чернышев 6
Чернышев 7

буду очень благодарен


Сообщение отредактировал vet80 - Пятница, 28.03.2014, 00:45
 
Ответить
СообщениеGustav, здравствуйте, а не смогли бы вы составить подобный календарь, для такого турнира по хоккею(играем в НХЛ 2009)
принцип такой:
- по 4 игры с каждой из команд внутри дивизиона
- по 3 игры с каждой из команд внутри внутри конференции
- по 2 игры с каждой из команд другой конференции
всего в конце у каждой из команд должно быть по 73 игры

Западная конференция
Бобров 1
Бобров 2
Бобров 3
Бобров 4
Бобров 5
Бобров 6
Бобров 7

Тарасов 1
Тарасов 2
Тарасов 3
Тарасов 4
Тарасов 5
Тарасов 6
Тарасов 7

Восточная конференция
Харламов 1
Харламов 2
Харламов 3
Харламов 4
Харламов 5
Харламов 6
Харламов 7

Чернышев 1
Чернышев 2
Чернышев 3
Чернышев 4
Чернышев 5
Чернышев 6
Чернышев 7

буду очень благодарен

Автор - vet80
Дата добавления - 28.03.2014 в 00:44
Gustav Дата: Пятница, 28.03.2014, 18:24 | Сообщение № 4
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
принцип такой:
- по 4 игры с каждой из команд внутри дивизиона
- по 3 игры с каждой из команд внутри внутри конференции
- по 2 игры с каждой из команд другой конференции

Интересная задачка. Я бы пошёл примерно таким путем:

1. составляем расписание для 2-х кругов турнира из всех 28 команд - всего одно такое расписание.
2. составляем расписание для 1-го круга турнира из 14 команд одной конференции - всего два таких расписания.
3. составляем расписание для 1-го круга турнира из 7 команд одного дивизиона - всего четыре таких расписания.

Дальнейшие рассуждения и нюансы зависят от того, надо ли в вашем турнире соблюдать понятия "хозяин/гость" (не соблюдать - проще, разумеется), а также в какой последовательности играть турниры, т.е. именно строго в указанной (1, 2, 3 - и так проще) или произвольно перемешивать матчи этих этапов. Я не в курсе, как, например, в нашей КХЛ сделано. Если знаете - расскажите.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
принцип такой:
- по 4 игры с каждой из команд внутри дивизиона
- по 3 игры с каждой из команд внутри внутри конференции
- по 2 игры с каждой из команд другой конференции

Интересная задачка. Я бы пошёл примерно таким путем:

1. составляем расписание для 2-х кругов турнира из всех 28 команд - всего одно такое расписание.
2. составляем расписание для 1-го круга турнира из 14 команд одной конференции - всего два таких расписания.
3. составляем расписание для 1-го круга турнира из 7 команд одного дивизиона - всего четыре таких расписания.

Дальнейшие рассуждения и нюансы зависят от того, надо ли в вашем турнире соблюдать понятия "хозяин/гость" (не соблюдать - проще, разумеется), а также в какой последовательности играть турниры, т.е. именно строго в указанной (1, 2, 3 - и так проще) или произвольно перемешивать матчи этих этапов. Я не в курсе, как, например, в нашей КХЛ сделано. Если знаете - расскажите.

Автор - Gustav
Дата добавления - 28.03.2014 в 18:24
vet80 Дата: Понедельник, 31.03.2014, 14:28 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 9
Репутация: 0 ±
Замечаний: 0% ±

Gustav, понятия "хозяин/гость" соблюдаться не будут, чисто по тех. причинам, последовательность туров тоже не будет соблюдаться, мы делаем так, допустим турнир играется 4 недели, в первую неделю мы открываем первых 10 туров сразу, и люди их играют в любой последовательности, единственный нюанс, это проведение игр между командами разных конференций, в выходные дни, так как играем мы кто с Украины, кто с Белоруссии, кто-то с дальнего востока, чтоб преодолеть разницу в часах, вот собственно и всё, путь мною понят, но к сожалению, нет столько навыков чтоб это сделать и времени, поэтому если у Вас есть сделать это всё для меня, то назовите как вы оцениваете свой труд, я постараюсь удовлетворить Ваш интерес, если он будет в разумных пределах, был товарищ, он сделал нам шаблон для нхл в 80 игры, но тут число команд в дивизионах иное, и их не 6(дивизий), а 4, поэтому чуть сложнее, и секретов, как он и с помощью чего сделал тот шаблон, тот человек не сообщил, поэтому вот прошу Вас, если можете, то помогите), шаблон в текстовом файле могу скинуть, если нужно
 
Ответить
СообщениеGustav, понятия "хозяин/гость" соблюдаться не будут, чисто по тех. причинам, последовательность туров тоже не будет соблюдаться, мы делаем так, допустим турнир играется 4 недели, в первую неделю мы открываем первых 10 туров сразу, и люди их играют в любой последовательности, единственный нюанс, это проведение игр между командами разных конференций, в выходные дни, так как играем мы кто с Украины, кто с Белоруссии, кто-то с дальнего востока, чтоб преодолеть разницу в часах, вот собственно и всё, путь мною понят, но к сожалению, нет столько навыков чтоб это сделать и времени, поэтому если у Вас есть сделать это всё для меня, то назовите как вы оцениваете свой труд, я постараюсь удовлетворить Ваш интерес, если он будет в разумных пределах, был товарищ, он сделал нам шаблон для нхл в 80 игры, но тут число команд в дивизионах иное, и их не 6(дивизий), а 4, поэтому чуть сложнее, и секретов, как он и с помощью чего сделал тот шаблон, тот человек не сообщил, поэтому вот прошу Вас, если можете, то помогите), шаблон в текстовом файле могу скинуть, если нужно

Автор - vet80
Дата добавления - 31.03.2014 в 14:28
Gustav Дата: Четверг, 11.06.2015, 12:21 | Сообщение № 6
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
На первом листе "Бергер" в ячейку A1 следует ввести количество участников - целое положительное число не более 50, после чего ниже на этом листе автоматически сформируется расписание турнира.


Откликаясь на приватную просьбу о круговом календаре на 128 участников, взял повышенные обязательства и расширил до 200 участников.

Файл BergerTable200.xlsx доступен для скачивания по ссылке: https://drive.google.com/file....sharing


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
На первом листе "Бергер" в ячейку A1 следует ввести количество участников - целое положительное число не более 50, после чего ниже на этом листе автоматически сформируется расписание турнира.


Откликаясь на приватную просьбу о круговом календаре на 128 участников, взял повышенные обязательства и расширил до 200 участников.

Файл BergerTable200.xlsx доступен для скачивания по ссылке: https://drive.google.com/file....sharing

Автор - Gustav
Дата добавления - 11.06.2015 в 12:21
Бреду Дата: Пятница, 11.03.2016, 17:56 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Gustav, добрый день.
Во первых хочу поблагодарить за таблицу, раньше по книжке составлял. (Занимаюсь футболом)
Вы применили немного другой подход, но все равно очень эффективно получается, особенно с количеством туров и играх в них.
На днях (было время на выходных) решил прикрутить Ваше творение, но не тут то было, дело далее второго тура не пошло. :(
Прошу подсказать, что не так?
К сообщению приложен файл: 6358243.xlsx (43.8 Kb)
 
Ответить
СообщениеGustav, добрый день.
Во первых хочу поблагодарить за таблицу, раньше по книжке составлял. (Занимаюсь футболом)
Вы применили немного другой подход, но все равно очень эффективно получается, особенно с количеством туров и играх в них.
На днях (было время на выходных) решил прикрутить Ваше творение, но не тут то было, дело далее второго тура не пошло. :(
Прошу подсказать, что не так?

Автор - Бреду
Дата добавления - 11.03.2016 в 17:56
Gustav Дата: Пятница, 11.03.2016, 19:14 | Сообщение № 8
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Бреду, дело в том, что пытаться использовать формулы с листа "Бергер" в ином, чем на этом листе, взаимном расположении ячеек относительно друг друга, вообще говоря, чревато... Там же сплошь и рядом используются функции СМЕЩ, которая не всегда склонна к правильному пересчету при модификации таблицы. А еще функция ЧЁТН... Попробуйте просто вставить пару пустых столбцов в середину "Бергера" и всё поймёте. Поэтому в некотором смысле да, действительно "колдовство какое-то" :)

Но отчаиваться не надо - в моём файле же есть замечательный лист "Календарь", где всё уже сведено в удобную линейную таблицу. Берите номер тура и номер игры внутри тура и ВПРьте себе по ней на здоровье для поиска команд!

Настройте ВПР-формулы в Вашем файле на листе ТЗ для одного тура и потом скопируйте этот настроенный диапазон в остальные туры. Естественно, придется взять из моего файла 3 первые листа и добавить в Ваш. Либо в моём всё рассчитать на нужное количество команд, а потом перенести в Ваш "только значения" с моего листа "Календарь". Как-то так мне видится решение...


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеБреду, дело в том, что пытаться использовать формулы с листа "Бергер" в ином, чем на этом листе, взаимном расположении ячеек относительно друг друга, вообще говоря, чревато... Там же сплошь и рядом используются функции СМЕЩ, которая не всегда склонна к правильному пересчету при модификации таблицы. А еще функция ЧЁТН... Попробуйте просто вставить пару пустых столбцов в середину "Бергера" и всё поймёте. Поэтому в некотором смысле да, действительно "колдовство какое-то" :)

Но отчаиваться не надо - в моём файле же есть замечательный лист "Календарь", где всё уже сведено в удобную линейную таблицу. Берите номер тура и номер игры внутри тура и ВПРьте себе по ней на здоровье для поиска команд!

Настройте ВПР-формулы в Вашем файле на листе ТЗ для одного тура и потом скопируйте этот настроенный диапазон в остальные туры. Естественно, придется взять из моего файла 3 первые листа и добавить в Ваш. Либо в моём всё рассчитать на нужное количество команд, а потом перенести в Ваш "только значения" с моего листа "Календарь". Как-то так мне видится решение...

Автор - Gustav
Дата добавления - 11.03.2016 в 19:14
Бреду Дата: Четверг, 17.03.2016, 19:17 | Сообщение № 9
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Gustav, добрый вечер. Да я изначально видел все нелепые казусы происходящие при добавлении строк или перемещении на листе.

Пробую разобраться в синтаксисе написанной формулы. Стало более менее понятно, что все зависит от числовых констант функции СМЕЩ.
По сути я сместил данные на 5 столбцов и вроде результат стал виден, но при изменении количества команд все съезжает начиная со 2 тура.
Постараюсь уделить больше вниманию константам СМЕЩ и ЧЕТН,
Прошу подсказку - я двигаюсь в правильном направлении или нет.

Следящим МОЗГОЕГАМ (с большим почтением) просьба не глумиться
 
Ответить
СообщениеGustav, добрый вечер. Да я изначально видел все нелепые казусы происходящие при добавлении строк или перемещении на листе.

Пробую разобраться в синтаксисе написанной формулы. Стало более менее понятно, что все зависит от числовых констант функции СМЕЩ.
По сути я сместил данные на 5 столбцов и вроде результат стал виден, но при изменении количества команд все съезжает начиная со 2 тура.
Постараюсь уделить больше вниманию константам СМЕЩ и ЧЕТН,
Прошу подсказку - я двигаюсь в правильном направлении или нет.

Следящим МОЗГОЕГАМ (с большим почтением) просьба не глумиться

Автор - Бреду
Дата добавления - 17.03.2016 в 19:17
Gustav Дата: Четверг, 17.03.2016, 19:59 | Сообщение № 10
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Прошу подсказку - я двигаюсь в правильном направлении или нет.

Настройте ВПР-формулы в Вашем файле на листе ТЗ для одного тура и потом скопируйте этот настроенный диапазон в остальные туры. Естественно, придется взять из моего файла 3 первые листа и добавить в Ваш. Либо в моём всё рассчитать на нужное количество команд, а потом перенести в Ваш "только значения" с моего листа "Календарь". Как-то так мне видится решение...

ИМХО, это по-прежнему самое перспективное направление в плане минимальных трудозатрат. Хотя я, конечно, не могу Вам запретить двигаться в любом другом по Вашему желанию...

P.S. Добавил файл со своими представлениями на листе ТЗ.
К сообщению приложен файл: Bredu.xlsx (47.2 Kb)


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Четверг, 17.03.2016, 23:43
 
Ответить
Сообщение
Прошу подсказку - я двигаюсь в правильном направлении или нет.

Настройте ВПР-формулы в Вашем файле на листе ТЗ для одного тура и потом скопируйте этот настроенный диапазон в остальные туры. Естественно, придется взять из моего файла 3 первые листа и добавить в Ваш. Либо в моём всё рассчитать на нужное количество команд, а потом перенести в Ваш "только значения" с моего листа "Календарь". Как-то так мне видится решение...

ИМХО, это по-прежнему самое перспективное направление в плане минимальных трудозатрат. Хотя я, конечно, не могу Вам запретить двигаться в любом другом по Вашему желанию...

P.S. Добавил файл со своими представлениями на листе ТЗ.

Автор - Gustav
Дата добавления - 17.03.2016 в 19:59
Gustav Дата: Суббота, 19.03.2016, 17:21 | Сообщение № 11
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1

Хотел бы задать вопрос, я вляется ли возможны запрограммировать этот алгоритм. я очевидных способов не вижу, возможно вы поможете.

Честно говоря, вот уже третий год чувствовал некий внутренний долг перед этим сообщением. Но что-то всё это время душило мой порыв процедурной реализации своей схемы генерации расписания. И, как выяснилось, не зря! Благодаря недавнему интересу к теме со стороны Бреду, я вновь стал шерстить Сеть по данному вопросу. И в числе прочего обнаружил симпатичную статью:
http://chess.sainfo.ru/tablei.php

В ней представлены три способа составления расписания, все достаточно просты, но первый прост до невозможного (и существенно проще моего!). Именно он и был выбран в качестве "ТЗ" для нижеследующей процедуры:
[vba]
Код
Sub roundTournamentSchedule()
    Dim players%, n%, i%, j%, k%, a%(), b%()
        
    players = 7 'фактическое количество участников
        
    n = WorksheetFunction.Even(players) 'ближайшее четное
        
    ReDim a(1 To n - 1, 1 To n / 2)
    ReDim b(1 To n - 1, 1 To n / 2)
        
    For i = 1 To n - 1 Step 2: b(i, 1) = n: Next
    For i = 2 To n - 2 Step 2: a(i, 1) = n: Next
        
    k = 0
    For i = 1 To n - 1: For j = 1 To n / 2
        k = IIf(k < n - 1, k + 1, 1)
        If a(i, j) = 0 Then
            a(i, j) = k
        Else
            b(i, j) = k
        End If
    Next j, i
        
    k = n - 1
    For i = 1 To n - 1: For j = 1 To n / 2
        If b(i, j) = 0 Then
            b(i, j) = k
            k = IIf(k = 1, n - 1, k - 1)
        End If
    Next j, i
        
    Debug.Print "Тур", "Встреча", "Пара"
    Debug.Print "-----------------------------------"
    For i = 1 To n - 1
        For j = 1 To n / 2
            Debug.Print i, j, a(i, j) & " - " & b(i, j)
        Next j
        Debug.Print "-----------------------------------"
    Next i
        
End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение

Хотел бы задать вопрос, я вляется ли возможны запрограммировать этот алгоритм. я очевидных способов не вижу, возможно вы поможете.

Честно говоря, вот уже третий год чувствовал некий внутренний долг перед этим сообщением. Но что-то всё это время душило мой порыв процедурной реализации своей схемы генерации расписания. И, как выяснилось, не зря! Благодаря недавнему интересу к теме со стороны Бреду, я вновь стал шерстить Сеть по данному вопросу. И в числе прочего обнаружил симпатичную статью:
http://chess.sainfo.ru/tablei.php

В ней представлены три способа составления расписания, все достаточно просты, но первый прост до невозможного (и существенно проще моего!). Именно он и был выбран в качестве "ТЗ" для нижеследующей процедуры:
[vba]
Код
Sub roundTournamentSchedule()
    Dim players%, n%, i%, j%, k%, a%(), b%()
        
    players = 7 'фактическое количество участников
        
    n = WorksheetFunction.Even(players) 'ближайшее четное
        
    ReDim a(1 To n - 1, 1 To n / 2)
    ReDim b(1 To n - 1, 1 To n / 2)
        
    For i = 1 To n - 1 Step 2: b(i, 1) = n: Next
    For i = 2 To n - 2 Step 2: a(i, 1) = n: Next
        
    k = 0
    For i = 1 To n - 1: For j = 1 To n / 2
        k = IIf(k < n - 1, k + 1, 1)
        If a(i, j) = 0 Then
            a(i, j) = k
        Else
            b(i, j) = k
        End If
    Next j, i
        
    k = n - 1
    For i = 1 To n - 1: For j = 1 To n / 2
        If b(i, j) = 0 Then
            b(i, j) = k
            k = IIf(k = 1, n - 1, k - 1)
        End If
    Next j, i
        
    Debug.Print "Тур", "Встреча", "Пара"
    Debug.Print "-----------------------------------"
    For i = 1 To n - 1
        For j = 1 To n / 2
            Debug.Print i, j, a(i, j) & " - " & b(i, j)
        Next j
        Debug.Print "-----------------------------------"
    Next i
        
End Sub
[/vba]

Автор - Gustav
Дата добавления - 19.03.2016 в 17:21
igor2239 Дата: Понедельник, 18.03.2019, 23:09 | Сообщение № 12
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 1 ±
Замечаний: 0% ±

Excel 2016
Gustav, придумал решение без применения массивов, но требующее последующей сортировки по турам. Подойдёт для ввода в базы данных, где всё равно без сортировки не обойтись:

Код
Sub roundTournamentSchedule2()

NumIgrokovFakt = 9 ' Фактическое количество участников
NumIgrokov = NumIgrokovFakt + NumIgrokovFakt Mod 2 ' Ближайшее чётное

For Player1 = 1 To NumIgrokovFakt - 1
      For Player2 = Player1 + 1 To NumIgrokovFakt
            Temp = IIf(Player2 = NumIgrokov, Player1 * 2, Player1 + Player2)
            NumTur = IIf(Temp <= NumIgrokov, Temp - 1, Temp - NumIgrokov)
            OrderPair = IIf(Player2 <> NumIgrokov, (Player1 Xor Player2) And 1, IIf(Player1 <= NumIgrokov / 2, 1, 0))
            If OrderPair = 1 Then Debug.Print NumTur, Player1, Player2 Else Debug.Print NumTur, Player2, Player1
      Next Player2
Next Player1

End Sub


Сообщение отредактировал igor2239 - Понедельник, 18.03.2019, 23:23
 
Ответить
СообщениеGustav, придумал решение без применения массивов, но требующее последующей сортировки по турам. Подойдёт для ввода в базы данных, где всё равно без сортировки не обойтись:

Код
Sub roundTournamentSchedule2()

NumIgrokovFakt = 9 ' Фактическое количество участников
NumIgrokov = NumIgrokovFakt + NumIgrokovFakt Mod 2 ' Ближайшее чётное

For Player1 = 1 To NumIgrokovFakt - 1
      For Player2 = Player1 + 1 To NumIgrokovFakt
            Temp = IIf(Player2 = NumIgrokov, Player1 * 2, Player1 + Player2)
            NumTur = IIf(Temp <= NumIgrokov, Temp - 1, Temp - NumIgrokov)
            OrderPair = IIf(Player2 <> NumIgrokov, (Player1 Xor Player2) And 1, IIf(Player1 <= NumIgrokov / 2, 1, 0))
            If OrderPair = 1 Then Debug.Print NumTur, Player1, Player2 Else Debug.Print NumTur, Player2, Player1
      Next Player2
Next Player1

End Sub

Автор - igor2239
Дата добавления - 18.03.2019 в 23:09
Gustav Дата: Вторник, 13.06.2023, 00:50 | Сообщение № 13
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Прошло семь лет... А значит - самое время для какого-то пересмотра темы. На фоне своего текущего интереса к новым массивным функциям Excel и Google Sheets 2022-2023 года решил поупражняться в перекладке на язык современных формул своего макроса VBA из сообщения №11.

Макрос генерирует расписание игр турнира процедурным способом, причем используя цикл с повторным переприсвоением новых значений переменным. Напрямую подобных средств даже в новых функциях нет. Позволяющая объявлять пользовательские переменные функция LET не допускает никаких циклов внутри себя (во всяком случае, пока), а присваивать одно и то же имя фрагментам формул можно только один раз - повторное переопределение внутри одной и той же функции LET недопустимо. Видимо, пора писать в уважаемые компании-производители письма-хотелки на эту тему. Впрочем, наверняка, они уже и сами что-то думают в этом направлении. Ну, дай-то Бог! (в сторону скриптов здесь мы, понятное дело, не смотрим, пытаясь решить задачу исключительно формулами)

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

Ну, а что в итоге получилось - судите сами. Как всегда в подобных случаях я немножко извиняюсь, ибо, возможно, формулы "многословны" или фрагментами неоптимальны, но одно несомненное достоинство присутствует - формулы-таки работают и, скажу без лишней скромности, довольно лихо. Согласитесь, всего лишь ввести в ячейку A1 количество команд, а в соседнюю B1 - формулу, которая мгновенно рассчитается и заполнит окрестные ячейки сформированным турнирным календарём - реально таинство, магия-с!

Представляю две версии расчётной формулы: одну для таблиц Google (по традиции с английскими названиями функций) и другую - для Excel (по традиции с русскими названиями функций). Прикольно, да? Формула - одна, т.е. вообще одна (в одной-единственной ячейке), а версий - целых две :)

Хотя версия, на самом деле, фактически одна, потому что, несмотря на некоторые возможные различия в синтаксисе формул, я в данном случае постарался использовать только те выразительные элементы, которые совпадают в обеих табличных процессорах. Поэтому если бы формульный тэг Форума обеспечивал неразрушение минимального "форматирования", заданного автором (например, сохранял заданное число пробелов или переносы строк в нужных местах), то можно было бы опубликовать только одну формулу и переключать в ней функции с кириллицы на латиницу с помощью известной кнопочки слева от формул. Но поскольку формульный тэг не "держит" авторскую разбивку, то я использую, опять же по традиции подобных случаев, тэг VBA.

Итак, формула для Таблиц Google (вводится в одну любую ячейку, отличную от A1 - в A1 же мы вводим количество команд):
[vba]
Код
=LET(
players;    A1;
n;          EVEN(players);
tours;      n - 1;
pairs;      n / 2;
arrSeq;     SEQUENCE(tours*pairs);
arrB;       MAKEARRAY(tours; pairs; LAMBDA(r;c; IF(AND(ISNUMBER(XMATCH(r;SEQUENCE(tours;1;1;2)));c=1);n;0)));
arrA;       MAKEARRAY(tours; pairs; LAMBDA(r;c; IF(AND(ISNUMBER(XMATCH(r;SEQUENCE(tours-1;1;2;2)));c=1);n;0)));
arrK;       SCAN(0; arrSeq; LAMBDA(k;i; IF(k < tours; k + 1; 1)));
arrTour;    MAP(arrSeq; LAMBDA(i; TRUNC((i-1)/pairs)+1));
arrGame;    MAP(arrSeq; LAMBDA(i; MOD(i-1;pairs)+1));
arrIdx;     HSTACK(arrTour; arrGame);
arrA_2;     MAKEARRAY(tours; pairs; LAMBDA(r;c; IF(INDEX(arrA;r;c)=0; INDEX(arrK;(r-1)*pairs+c); INDEX(arrA;r;c))));
arrB_2;     MAKEARRAY(tours; pairs; LAMBDA(r;c; IF(INDEX(arrA;r;c)<>0; INDEX(arrK;(r-1)*pairs+c); INDEX(arrB;r;c))));
arrK_2;     SCAN(tours; arrSeq; LAMBDA(k;i; IF(INDEX(arrB_2;TRUNC((i-1)/pairs)+1;MOD(i-1;pairs)+1)=0; IF(k = 1; tours; k - 1); k)));
arrB_3;     MAKEARRAY(tours; pairs; LAMBDA(r;c; IF(INDEX(arrB_2;r;c)=0; INDEX(arrK_2;(r-1)*pairs+c-1); INDEX(arrB_2;r;c))));
arrPair;    MAP(arrTour; arrGame; LAMBDA(r;c; INDEX(arrA_2;r;c) & " - " & INDEX(arrB_3;r;c)));

VSTACK(HSTACK("Tour"; "Game"; "Pair"); HSTACK(arrTour; arrGame; arrPair))
)
[/vba]

Формула для Excel новейших версий (для Microsoft 365, для Microsoft 365 для Mac, для Интернета, Excel 2021):
[vba]
Код
=LET(
players;    A1;
n;          ЧЁТН(players);
tours;      n - 1;
pairs;      n / 2;
arrSeq;     ПОСЛЕД(tours*pairs);
arrB;       MAKEARRAY(tours; pairs; LAMBDA(r;c; ЕСЛИ(И(ЕЧИСЛО(ПОИСКПОЗX(r;ПОСЛЕД(tours;1;1;2)));c=1);n;0)));
arrA;       MAKEARRAY(tours; pairs; LAMBDA(r;c; ЕСЛИ(И(ЕЧИСЛО(ПОИСКПОЗX(r;ПОСЛЕД(tours-1;1;2;2)));c=1);n;0)));
arrK;       SCAN(0; arrSeq; LAMBDA(k;i; ЕСЛИ(k < tours; k + 1; 1)));
arrTour;    MAP(arrSeq; LAMBDA(i; ОТБР((i-1)/pairs)+1));
arrGame;    MAP(arrSeq; LAMBDA(i; ОСТАТ(i-1;pairs)+1));
arrIdx;     ГСТОЛБИК(arrTour; arrGame);
arrA_2;     MAKEARRAY(tours; pairs; LAMBDA(r;c; ЕСЛИ(ИНДЕКС(arrA;r;c)=0; ИНДЕКС(arrK;(r-1)*pairs+c); ИНДЕКС(arrA;r;c))));
arrB_2;     MAKEARRAY(tours; pairs; LAMBDA(r;c; ЕСЛИ(ИНДЕКС(arrA;r;c)<>0; ИНДЕКС(arrK;(r-1)*pairs+c); ИНДЕКС(arrB;r;c))));
arrK_2;     SCAN(tours; arrSeq; LAMBDA(k;i; ЕСЛИ(ИНДЕКС(arrB_2;ОТБР((i-1)/pairs)+1;ОСТАТ(i-1;pairs)+1)=0; ЕСЛИ(k = 1; tours; k - 1); k)));
arrB_3;     MAKEARRAY(tours; pairs; LAMBDA(r;c; ЕСЛИ(ИНДЕКС(arrB_2;r;c)=0; ИНДЕКС(arrK_2;(r-1)*pairs+c-1); ИНДЕКС(arrB_2;r;c))));
arrPair;    MAP(arrTour; arrGame; LAMBDA(r;c; ИНДЕКС(arrA_2;r;c) & " - " & ИНДЕКС(arrB_3;r;c)));

ВСТОЛБИК(ГСТОЛБИК("Tour"; "Game"; "Pair"); ГСТОЛБИК(arrTour; arrGame; arrPair))
)
[/vba]

Проверить правильность получаемых результатов можно по таблицам Бергера, опубликованным, например, здесь: http://razam.ru/tabsequenceplay/ .


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеПрошло семь лет... А значит - самое время для какого-то пересмотра темы. На фоне своего текущего интереса к новым массивным функциям Excel и Google Sheets 2022-2023 года решил поупражняться в перекладке на язык современных формул своего макроса VBA из сообщения №11.

Макрос генерирует расписание игр турнира процедурным способом, причем используя цикл с повторным переприсвоением новых значений переменным. Напрямую подобных средств даже в новых функциях нет. Позволяющая объявлять пользовательские переменные функция LET не допускает никаких циклов внутри себя (во всяком случае, пока), а присваивать одно и то же имя фрагментам формул можно только один раз - повторное переопределение внутри одной и той же функции LET недопустимо. Видимо, пора писать в уважаемые компании-производители письма-хотелки на эту тему. Впрочем, наверняка, они уже и сами что-то думают в этом направлении. Ну, дай-то Бог! (в сторону скриптов здесь мы, понятное дело, не смотрим, пытаясь решить задачу исключительно формулами)

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

Ну, а что в итоге получилось - судите сами. Как всегда в подобных случаях я немножко извиняюсь, ибо, возможно, формулы "многословны" или фрагментами неоптимальны, но одно несомненное достоинство присутствует - формулы-таки работают и, скажу без лишней скромности, довольно лихо. Согласитесь, всего лишь ввести в ячейку A1 количество команд, а в соседнюю B1 - формулу, которая мгновенно рассчитается и заполнит окрестные ячейки сформированным турнирным календарём - реально таинство, магия-с!

Представляю две версии расчётной формулы: одну для таблиц Google (по традиции с английскими названиями функций) и другую - для Excel (по традиции с русскими названиями функций). Прикольно, да? Формула - одна, т.е. вообще одна (в одной-единственной ячейке), а версий - целых две :)

Хотя версия, на самом деле, фактически одна, потому что, несмотря на некоторые возможные различия в синтаксисе формул, я в данном случае постарался использовать только те выразительные элементы, которые совпадают в обеих табличных процессорах. Поэтому если бы формульный тэг Форума обеспечивал неразрушение минимального "форматирования", заданного автором (например, сохранял заданное число пробелов или переносы строк в нужных местах), то можно было бы опубликовать только одну формулу и переключать в ней функции с кириллицы на латиницу с помощью известной кнопочки слева от формул. Но поскольку формульный тэг не "держит" авторскую разбивку, то я использую, опять же по традиции подобных случаев, тэг VBA.

Итак, формула для Таблиц Google (вводится в одну любую ячейку, отличную от A1 - в A1 же мы вводим количество команд):
[vba]
Код
=LET(
players;    A1;
n;          EVEN(players);
tours;      n - 1;
pairs;      n / 2;
arrSeq;     SEQUENCE(tours*pairs);
arrB;       MAKEARRAY(tours; pairs; LAMBDA(r;c; IF(AND(ISNUMBER(XMATCH(r;SEQUENCE(tours;1;1;2)));c=1);n;0)));
arrA;       MAKEARRAY(tours; pairs; LAMBDA(r;c; IF(AND(ISNUMBER(XMATCH(r;SEQUENCE(tours-1;1;2;2)));c=1);n;0)));
arrK;       SCAN(0; arrSeq; LAMBDA(k;i; IF(k < tours; k + 1; 1)));
arrTour;    MAP(arrSeq; LAMBDA(i; TRUNC((i-1)/pairs)+1));
arrGame;    MAP(arrSeq; LAMBDA(i; MOD(i-1;pairs)+1));
arrIdx;     HSTACK(arrTour; arrGame);
arrA_2;     MAKEARRAY(tours; pairs; LAMBDA(r;c; IF(INDEX(arrA;r;c)=0; INDEX(arrK;(r-1)*pairs+c); INDEX(arrA;r;c))));
arrB_2;     MAKEARRAY(tours; pairs; LAMBDA(r;c; IF(INDEX(arrA;r;c)<>0; INDEX(arrK;(r-1)*pairs+c); INDEX(arrB;r;c))));
arrK_2;     SCAN(tours; arrSeq; LAMBDA(k;i; IF(INDEX(arrB_2;TRUNC((i-1)/pairs)+1;MOD(i-1;pairs)+1)=0; IF(k = 1; tours; k - 1); k)));
arrB_3;     MAKEARRAY(tours; pairs; LAMBDA(r;c; IF(INDEX(arrB_2;r;c)=0; INDEX(arrK_2;(r-1)*pairs+c-1); INDEX(arrB_2;r;c))));
arrPair;    MAP(arrTour; arrGame; LAMBDA(r;c; INDEX(arrA_2;r;c) & " - " & INDEX(arrB_3;r;c)));

VSTACK(HSTACK("Tour"; "Game"; "Pair"); HSTACK(arrTour; arrGame; arrPair))
)
[/vba]

Формула для Excel новейших версий (для Microsoft 365, для Microsoft 365 для Mac, для Интернета, Excel 2021):
[vba]
Код
=LET(
players;    A1;
n;          ЧЁТН(players);
tours;      n - 1;
pairs;      n / 2;
arrSeq;     ПОСЛЕД(tours*pairs);
arrB;       MAKEARRAY(tours; pairs; LAMBDA(r;c; ЕСЛИ(И(ЕЧИСЛО(ПОИСКПОЗX(r;ПОСЛЕД(tours;1;1;2)));c=1);n;0)));
arrA;       MAKEARRAY(tours; pairs; LAMBDA(r;c; ЕСЛИ(И(ЕЧИСЛО(ПОИСКПОЗX(r;ПОСЛЕД(tours-1;1;2;2)));c=1);n;0)));
arrK;       SCAN(0; arrSeq; LAMBDA(k;i; ЕСЛИ(k < tours; k + 1; 1)));
arrTour;    MAP(arrSeq; LAMBDA(i; ОТБР((i-1)/pairs)+1));
arrGame;    MAP(arrSeq; LAMBDA(i; ОСТАТ(i-1;pairs)+1));
arrIdx;     ГСТОЛБИК(arrTour; arrGame);
arrA_2;     MAKEARRAY(tours; pairs; LAMBDA(r;c; ЕСЛИ(ИНДЕКС(arrA;r;c)=0; ИНДЕКС(arrK;(r-1)*pairs+c); ИНДЕКС(arrA;r;c))));
arrB_2;     MAKEARRAY(tours; pairs; LAMBDA(r;c; ЕСЛИ(ИНДЕКС(arrA;r;c)<>0; ИНДЕКС(arrK;(r-1)*pairs+c); ИНДЕКС(arrB;r;c))));
arrK_2;     SCAN(tours; arrSeq; LAMBDA(k;i; ЕСЛИ(ИНДЕКС(arrB_2;ОТБР((i-1)/pairs)+1;ОСТАТ(i-1;pairs)+1)=0; ЕСЛИ(k = 1; tours; k - 1); k)));
arrB_3;     MAKEARRAY(tours; pairs; LAMBDA(r;c; ЕСЛИ(ИНДЕКС(arrB_2;r;c)=0; ИНДЕКС(arrK_2;(r-1)*pairs+c-1); ИНДЕКС(arrB_2;r;c))));
arrPair;    MAP(arrTour; arrGame; LAMBDA(r;c; ИНДЕКС(arrA_2;r;c) & " - " & ИНДЕКС(arrB_3;r;c)));

ВСТОЛБИК(ГСТОЛБИК("Tour"; "Game"; "Pair"); ГСТОЛБИК(arrTour; arrGame; arrPair))
)
[/vba]

Проверить правильность получаемых результатов можно по таблицам Бергера, опубликованным, например, здесь: http://razam.ru/tabsequenceplay/ .

Автор - Gustav
Дата добавления - 13.06.2023 в 00:50
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!