Из шахматной доски по границам клеток выпилили связную (не распадающуюся на части) фигуру без дыр. Требуется определить ее периметр.
Выпиленные клетки задаются в ячейках A1:An, записью от a1 до h8 (строчная латинская буква совместно с цифрой), при этом заполнено столько ячеек сколько выпиливается клеток.
Пример 1. Если в ячейках A1:A3 указаны следующие клетки: A1: a1 A2: a2 A3: b1 Результат формулы должен быть равен 8
Пример 2. A1: a1 A2: a2 A3: b1 A4: b2 Результат - 8
Пример 3. A1: h8 Результат - 4
Пример 4: в A1:A15: a1, a2, a3, a4, a5, a6, a7, a8, b1, c1, d1, e1, f1, g1, h1 Результат - 32
Задачу можно решить как макросом, так и формулой, Для меня формулой интереснее
Из шахматной доски по границам клеток выпилили связную (не распадающуюся на части) фигуру без дыр. Требуется определить ее периметр.
Выпиленные клетки задаются в ячейках A1:An, записью от a1 до h8 (строчная латинская буква совместно с цифрой), при этом заполнено столько ячеек сколько выпиливается клеток.
Пример 1. Если в ячейках A1:A3 указаны следующие клетки: A1: a1 A2: a2 A3: b1 Результат формулы должен быть равен 8
Пример 2. A1: a1 A2: a2 A3: b1 A4: b2 Результат - 8
Пример 3. A1: h8 Результат - 4
Пример 4: в A1:A15: a1, a2, a3, a4, a5, a6, a7, a8, b1, c1, d1, e1, f1, g1, h1 Результат - 32
Задачу можно решить как макросом, так и формулой, Для меня формулой интереснееMCH
Сообщение отредактировал MCH - Среда, 14.11.2012, 15:04
Неправильный ввод (распадающаяся фигура) не рассматриваем. Правильно понял?
Подразумевается, что исходная информация корректна, клетки указаны без повторения. То что фигура "не разваливается" думаю не имеет значения, т.к. при правильно написанной формуле будет посчитан периметр как единой фигуры, так и нескольки отделно расположенных фигур. Имелось ввиду, что если клетки указаны рядом, то они принадлежат одной фигуре
Задачу попытался изобразить в файле
PS: Виктор, за прогул двух последних задач с тебя задача, а лучше две
Quote (vikttur)
Почему "доска" расположена не в A1:H8?
В столбце A указываются только вырезаемые клетки
Quote (vikttur)
Неправильный ввод (распадающаяся фигура) не рассматриваем. Правильно понял?
Подразумевается, что исходная информация корректна, клетки указаны без повторения. То что фигура "не разваливается" думаю не имеет значения, т.к. при правильно написанной формуле будет посчитан периметр как единой фигуры, так и нескольки отделно расположенных фигур. Имелось ввиду, что если клетки указаны рядом, то они принадлежат одной фигуре
Задачу попытался изобразить в файле
PS: Виктор, за прогул двух последних задач с тебя задача, а лучше две MCH
Прикрутил к файлу небольшой макрос, который раскрашивает фигуру и считает периметр, думаю так будет понятнее Можно выбрать фигуру из готовых вариантов, либо нарисовать свою задав нужные клетки в столбце A
Прикрутил к файлу небольшой макрос, который раскрашивает фигуру и считает периметр, думаю так будет понятнее Можно выбрать фигуру из готовых вариантов, либо нарисовать свою задав нужные клетки в столбце AMCH
На данный момент имею вариант решения формулами с шестью доп.столбцами и одной результирующей ячейкой, выдающей периметр. Общая длина 7 формул - 111 знаков. Попробую всё это втиснуть в одну ячейку. По ощущениям, знаки возрастут в 5-10 раз.
На данный момент имею вариант решения формулами с шестью доп.столбцами и одной результирующей ячейкой, выдающей периметр. Общая длина 7 формул - 111 знаков. Попробую всё это втиснуть в одну ячейку. По ощущениям, знаки возрастут в 5-10 раз.Gustav
На данный момент имею вариант решения формулами с шестью доп.столбцами и одной результирующей ячейкой, выдающей периметр. Общая длина 7 формул - 111 знаков. Попробую всё это втиснуть в одну ячейку. По ощущениям, знаки возрастут в 5-10 раз.
Пока вышел на 357 знаков в одной ячейке. Пока неоптимально - тупо дважды повторяется большой фрагмент. Попробую в выходные вынести его за скобки.
Quote (Gustav)
На данный момент имею вариант решения формулами с шестью доп.столбцами и одной результирующей ячейкой, выдающей периметр. Общая длина 7 формул - 111 знаков. Попробую всё это втиснуть в одну ячейку. По ощущениям, знаки возрастут в 5-10 раз.
Пока вышел на 357 знаков в одной ячейке. Пока неоптимально - тупо дважды повторяется большой фрагмент. Попробую в выходные вынести его за скобки.Gustav
[/vba] Более быстрая формула отличается от короткой тем, что в СЧЕТЕСЛИ вместо A:A указан диапазон A1:A64
UDF: [vba]
Code
Function chess&(r As Range) Dim a&(8, 8), i&, j&, x For Each x In r.Value If x Like "[A-Ha-h][1-8]" Then a(Asc(LCase$(x)) - 96, Val(Right$(x, 1))) = 1 Next x For i = 1 To 8 For j = 1 To 8 chess = chess + 2 * a(i, j) * (2 - a(i - 1, j) - a(i, j - 1)) Next j, i End Function
[/vba] Более быстрая формула отличается от короткой тем, что в СЧЕТЕСЛИ вместо A:A указан диапазон A1:A64
UDF: [vba]
Code
Function chess&(r As Range) Dim a&(8, 8), i&, j&, x For Each x In r.Value If x Like "[A-Ha-h][1-8]" Then a(Asc(LCase$(x)) - 96, Val(Right$(x, 1))) = 1 Next x For i = 1 To 8 For j = 1 To 8 chess = chess + 2 * a(i, j) * (2 - a(i - 1, j) - a(i, j - 1)) Next j, i End Function
Обращаю внимание, что перенос строки (символ с кодом 10, вводимый при помощи Alt+Enter) после КОДСИМВ(A1:A64&" участвует в вычислениях! Для большей ясности см. в файле предыдущий вариант на 144 знака.
У меня подход был такой. Он хорошо просматривается на втором листе (Лист1). Каждая ячейка (клетка доски), упомянутая в колонке A, вносит свои 4 границы в общий список всех границ. Из этого общего списка надо было исключить те границы, которые встречаются два раза, или, что то же самое, оставить только те, которые встречаются один раз, и пересчитать их.
Оставалось только разработать систему генерирования уникальных кодов границ в зависимости от адреса ячейки. Я разместил горизонтальные границы ячеек, грубо говоря, в одной сотне, а вертикальные - в другой. Позже сотни (10 х 10) ужались до "восьмидесяти одноек" (9 х 9) - для экономии знаков. Строки адресов записывались в десятки (позже в "девятки"), а столбцы - в единицы. Число "9" - потому что 8 ячеек ("клеток доски"), расположенные в ряд в одном направлении, имеют 9 перпендикулярных границ в этом направлении. Т.е. ячейки в схеме (и это очевидно) располагаются между границами.
Функция НАИМЕНЬШИЙ используется для превращения двухмерного массива (4 столбца границ х строк по кол-ву клеток в колонке A) в одномерный массив (с тем же общим кол-вом элементов), отсортированный по возрастанию. 256 это = 64 клетки (всего возможные на шахматной доске) x 4 границы.
Обращаю внимание, что перенос строки (символ с кодом 10, вводимый при помощи Alt+Enter) после КОДСИМВ(A1:A64&" участвует в вычислениях! Для большей ясности см. в файле предыдущий вариант на 144 знака.
У меня подход был такой. Он хорошо просматривается на втором листе (Лист1). Каждая ячейка (клетка доски), упомянутая в колонке A, вносит свои 4 границы в общий список всех границ. Из этого общего списка надо было исключить те границы, которые встречаются два раза, или, что то же самое, оставить только те, которые встречаются один раз, и пересчитать их.
Оставалось только разработать систему генерирования уникальных кодов границ в зависимости от адреса ячейки. Я разместил горизонтальные границы ячеек, грубо говоря, в одной сотне, а вертикальные - в другой. Позже сотни (10 х 10) ужались до "восьмидесяти одноек" (9 х 9) - для экономии знаков. Строки адресов записывались в десятки (позже в "девятки"), а столбцы - в единицы. Число "9" - потому что 8 ячеек ("клеток доски"), расположенные в ряд в одном направлении, имеют 9 перпендикулярных границ в этом направлении. Т.е. ячейки в схеме (и это очевидно) располагаются между границами.
Функция НАИМЕНЬШИЙ используется для превращения двухмерного массива (4 столбца границ х строк по кол-ву клеток в колонке A) в одномерный массив (с тем же общим кол-вом элементов), отсортированный по возрастанию. 256 это = 64 клетки (всего возможные на шахматной доске) x 4 границы.Gustav