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

Вход

Регистрация

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

 

= Мир MS Excel/Шахматная доска - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: китин  
Мир MS Excel » Работа и общение » Мозговой штурм » Шахматная доска
Шахматная доска
MCH Дата: Среда, 14.11.2012, 15:03 | Сообщение № 1
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

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

Выпиленные клетки задаются в ячейках 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 - Среда, 14.11.2012, 15:04
 
Ответить
СообщениеИз шахматной доски по границам клеток выпилили связную (не распадающуюся на части) фигуру без дыр. Требуется определить ее периметр.

Выпиленные клетки задаются в ячейках 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
Дата добавления - 14.11.2012 в 15:03
ZORRO2005 Дата: Воскресенье, 18.11.2012, 18:22 | Сообщение № 21
Группа: Друзья
Ранг: Обитатель
Сообщений: 382
Репутация: 148 ±
Замечаний: 0% ±

Excel2010
Quote (MCH)
Серег, притормози, я еще помозгую

Зато будет у тебя бронза в копилке.

Хорошо, даю еще время до 19:00 zorro
 
Ответить
Сообщение
Quote (MCH)
Серег, притормози, я еще помозгую

Зато будет у тебя бронза в копилке.

Хорошо, даю еще время до 19:00 zorro

Автор - ZORRO2005
Дата добавления - 18.11.2012 в 18:22
ZORRO2005 Дата: Воскресенье, 18.11.2012, 18:35 | Сообщение № 22
Группа: Друзья
Ранг: Обитатель
Сообщений: 382
Репутация: 148 ±
Замечаний: 0% ±

Excel2010
Предлагаю в этот раз свои решения подробно объяснить (расписать).
 
Ответить
СообщениеПредлагаю в этот раз свои решения подробно объяснить (расписать).

Автор - ZORRO2005
Дата добавления - 18.11.2012 в 18:35
MCH Дата: Воскресенье, 18.11.2012, 18:45 | Сообщение № 23
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Quote (ZORRO2005)
Хорошо, даю еще время до 19:00

до 19 наверно не успею, дай срок до 20:00
Я ведь как в четверг до 158 ужал больше над задачей не думал
То что Константин замутил пока не понятно, но вроде считает правильно, в этом направлении не буду думать
Формулу в 138 можно на символ сократить, вместо &"00" можно написать &0&0

Пока свою формулу сократил до 149 146:
Code
=2*СУММ(СЧЁТЕСЛИ(A:A;СИМВОЛ(СТРОКА(8:73)/8+96)&ОСТАТ(СТРОКА(8:73);8)+1)*(1-СЧЁТЕСЛИ(A:A;СИМВОЛ(СТРОКА(8:73)/8+{96;97})&ОСТАТ(СТРОКА(8:73);8)+{2;1})))

[vba]
Code
=2*СУММ(СЧЁТЕСЛИ(A:A;АДРЕС(СТРОКА(8:71)/8;ОСТАТ(СТРОКА(8:71);8)+1;4))*(1-СЧЁТЕСЛИ(A:A;АДРЕС(СТРОКА(8:71)/8+{0;1};ОСТАТ(СТРОКА(8:71);8)+{2;1};4))))
[/vba]
буду еще думать


Сообщение отредактировал MCH - Воскресенье, 18.11.2012, 19:44
 
Ответить
Сообщение
Quote (ZORRO2005)
Хорошо, даю еще время до 19:00

до 19 наверно не успею, дай срок до 20:00
Я ведь как в четверг до 158 ужал больше над задачей не думал
То что Константин замутил пока не понятно, но вроде считает правильно, в этом направлении не буду думать
Формулу в 138 можно на символ сократить, вместо &"00" можно написать &0&0

Пока свою формулу сократил до 149 146:
Code
=2*СУММ(СЧЁТЕСЛИ(A:A;СИМВОЛ(СТРОКА(8:73)/8+96)&ОСТАТ(СТРОКА(8:73);8)+1)*(1-СЧЁТЕСЛИ(A:A;СИМВОЛ(СТРОКА(8:73)/8+{96;97})&ОСТАТ(СТРОКА(8:73);8)+{2;1})))

[vba]
Code
=2*СУММ(СЧЁТЕСЛИ(A:A;АДРЕС(СТРОКА(8:71)/8;ОСТАТ(СТРОКА(8:71);8)+1;4))*(1-СЧЁТЕСЛИ(A:A;АДРЕС(СТРОКА(8:71)/8+{0;1};ОСТАТ(СТРОКА(8:71);8)+{2;1};4))))
[/vba]
буду еще думать

Автор - MCH
Дата добавления - 18.11.2012 в 18:45
ZORRO2005 Дата: Воскресенье, 18.11.2012, 18:49 | Сообщение № 24
Группа: Друзья
Ранг: Обитатель
Сообщений: 382
Репутация: 148 ±
Замечаний: 0% ±

Excel2010
OK. В 21:00 покажем свои решения с объяснениями.
 
Ответить
СообщениеOK. В 21:00 покажем свои решения с объяснениями.

Автор - ZORRO2005
Дата добавления - 18.11.2012 в 18:49
Gustav Дата: Воскресенье, 18.11.2012, 18:53 | Сообщение № 25
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1138 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Сергей, предлагаю пусть Миша думает до полуночи. Я даже не против, если ему пригодятся мои изыскания и он их сожмет. Вон с ходу уже на 1 ужал! smile


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеСергей, предлагаю пусть Миша думает до полуночи. Я даже не против, если ему пригодятся мои изыскания и он их сожмет. Вон с ходу уже на 1 ужал! smile

Автор - Gustav
Дата добавления - 18.11.2012 в 18:53
MCH Дата: Воскресенье, 18.11.2012, 20:20 | Сообщение № 26
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Ужал - 128/131

В общем уже 21:00, поэтому выкладываю
128:
[vba]
Code
=СУММ(ПРОСМОТР(МУМНОЖ(СЧЁТЕСЛИ(A:A;АДРЕС(СТРОКА(8:71)/8+{0;0;1};ОСТАТ(СТРОКА(8:71);8)+{1;2;1};4));{4:2:1});{0;4;5;7};{0;4;2;0}))
[/vba]
Формула основана на том же принципе, что и предыдущие

Для начала легче объяснить формулу из 17 поста в 158 знаков
СЧЕТЗ - считаем кол-во заполненных ячеек и умножаем на 4, т.е. считаем максимальное кол-во возможных границ
Затем вычитаем количество границ, которые отсутствуют, т.е. находятся между заполненными ячейками, для этого определяем количестово рядом стоящих заполненных ячеек по горизонтали и по вертикали и умножаем на 2

Формируем вертикальный массив из 64 элементов : a1, a2,a3 ... h6, h7, h8 (кстати в формуле была ошибка, вместо диапазона 8:73 нужно было указывать 8:71, но на результаты это не повлияло)
с помощьюСЧЕТЕСЛИ считаем есть ли полученные клетки (от a1 до h8) в столбце A
Также формируем двойной массив со смещением вниз и со смещением вправо, {"a2";"b1":"a3";"b2": ... :"h8";"i7":"h9";"i8"}, при перемножении двух массивов и проссумировав результат получаем количество пар заполненных рядомстоящих ячеек (вертикально или горизонтально)

Формула в 146, из 23 поста:
Примерно тоже самое, для формирования массива "A1" ... "H8" использовал функцию АДРЕС вместо СИМВОЛ
общее кол-во ячеек не считал, а считал сколько раз происходит переход с заполненной ячейки на незаполненную (также вертикально и горизонтально) и умножел полученное кол-во на 2
По такому же принципу работает и UDF

ну и текущая формула в 128 символов
Формируем три массива от A1 до H8 в трех вариантах, без смещения, со смещением на клетку вправо и со смещением на клетку вниз.
С помощью МУМНОЖ получаем вертикальный массив, при этом каждый подмассив имеет свой вес, без смещения - 4, вниз и вправо - 2 и 1
Таким образом если клетка заполнена, а снизу и справа не заполнена , то результат будет 4 и кол-во границ должно быть 4, если клетка заполнени, a рядом заполнена только одна клетка (либо сверху либо снизу) то результат будет 5 или 6 и кол-во границ нужно считать - 2, во всех остальных случаях кол-во границ - 0.
Кол-во границ после МУМНОЖ определяем через ПРОСМОТР
как то так, надеюсь понятно объяснил


Сообщение отредактировал MCH - Воскресенье, 18.11.2012, 21:29
 
Ответить
СообщениеУжал - 128/131

В общем уже 21:00, поэтому выкладываю
128:
[vba]
Code
=СУММ(ПРОСМОТР(МУМНОЖ(СЧЁТЕСЛИ(A:A;АДРЕС(СТРОКА(8:71)/8+{0;0;1};ОСТАТ(СТРОКА(8:71);8)+{1;2;1};4));{4:2:1});{0;4;5;7};{0;4;2;0}))
[/vba]
Формула основана на том же принципе, что и предыдущие

Для начала легче объяснить формулу из 17 поста в 158 знаков
СЧЕТЗ - считаем кол-во заполненных ячеек и умножаем на 4, т.е. считаем максимальное кол-во возможных границ
Затем вычитаем количество границ, которые отсутствуют, т.е. находятся между заполненными ячейками, для этого определяем количестово рядом стоящих заполненных ячеек по горизонтали и по вертикали и умножаем на 2

Формируем вертикальный массив из 64 элементов : a1, a2,a3 ... h6, h7, h8 (кстати в формуле была ошибка, вместо диапазона 8:73 нужно было указывать 8:71, но на результаты это не повлияло)
с помощьюСЧЕТЕСЛИ считаем есть ли полученные клетки (от a1 до h8) в столбце A
Также формируем двойной массив со смещением вниз и со смещением вправо, {"a2";"b1":"a3";"b2": ... :"h8";"i7":"h9";"i8"}, при перемножении двух массивов и проссумировав результат получаем количество пар заполненных рядомстоящих ячеек (вертикально или горизонтально)

Формула в 146, из 23 поста:
Примерно тоже самое, для формирования массива "A1" ... "H8" использовал функцию АДРЕС вместо СИМВОЛ
общее кол-во ячеек не считал, а считал сколько раз происходит переход с заполненной ячейки на незаполненную (также вертикально и горизонтально) и умножел полученное кол-во на 2
По такому же принципу работает и UDF

ну и текущая формула в 128 символов
Формируем три массива от A1 до H8 в трех вариантах, без смещения, со смещением на клетку вправо и со смещением на клетку вниз.
С помощью МУМНОЖ получаем вертикальный массив, при этом каждый подмассив имеет свой вес, без смещения - 4, вниз и вправо - 2 и 1
Таким образом если клетка заполнена, а снизу и справа не заполнена , то результат будет 4 и кол-во границ должно быть 4, если клетка заполнени, a рядом заполнена только одна клетка (либо сверху либо снизу) то результат будет 5 или 6 и кол-во границ нужно считать - 2, во всех остальных случаях кол-во границ - 0.
Кол-во границ после МУМНОЖ определяем через ПРОСМОТР
как то так, надеюсь понятно объяснил

Автор - MCH
Дата добавления - 18.11.2012 в 20:20
ZORRO2005 Дата: Воскресенье, 18.11.2012, 21:48 | Сообщение № 27
Группа: Друзья
Ранг: Обитатель
Сообщений: 382
Репутация: 148 ±
Замечаний: 0% ±

Excel2010
Code
=СЧЁТЗ(A:A)*4-СЧЁТ(ПОИСКПОЗ(ПОИСК(ЛЕВСИМВ(A:A);"abcdefgh")*9+ПСТР(A:A;2;1)+{-9;9;-1;1};ПОИСК(ЛЕВСИМВ(A:A);"abcdefgh")*9+ПСТР(A:A;2;1);))

Объяснение в файле на 2-ой странице.
К сообщению приложен файл: Chess_ZORRO2005.xls (78.0 Kb)
 
Ответить
Сообщение
Code
=СЧЁТЗ(A:A)*4-СЧЁТ(ПОИСКПОЗ(ПОИСК(ЛЕВСИМВ(A:A);"abcdefgh")*9+ПСТР(A:A;2;1)+{-9;9;-1;1};ПОИСК(ЛЕВСИМВ(A:A);"abcdefgh")*9+ПСТР(A:A;2;1);))

Объяснение в файле на 2-ой странице.

Автор - ZORRO2005
Дата добавления - 18.11.2012 в 21:48
MCH Дата: Воскресенье, 18.11.2012, 22:14 | Сообщение № 28
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Сергей, твоя формула не будет работать в 2003 из за указания целых диапазонов A:A
Если указать, A1:A64, то это приведет к увеличению на 12 символов, но для 2007/2010 ее можно сократить до 120 символов:
[vba]
Code
=СЧЁТЗ(A:A)*4-СЧЁТ(ПОИСКПОЗ(ПОИСК(ЛЕВБ(A:A);"abcdefgh")*9+ПРАВБ(A:A)+{9;1};ПОИСК(ЛЕВБ(A:A);"abcdefgh")*9+ПРАВБ(A:A);))*2
[/vba]


Сообщение отредактировал MCH - Воскресенье, 18.11.2012, 22:14
 
Ответить
СообщениеСергей, твоя формула не будет работать в 2003 из за указания целых диапазонов A:A
Если указать, A1:A64, то это приведет к увеличению на 12 символов, но для 2007/2010 ее можно сократить до 120 символов:
[vba]
Code
=СЧЁТЗ(A:A)*4-СЧЁТ(ПОИСКПОЗ(ПОИСК(ЛЕВБ(A:A);"abcdefgh")*9+ПРАВБ(A:A)+{9;1};ПОИСК(ЛЕВБ(A:A);"abcdefgh")*9+ПРАВБ(A:A);))*2
[/vba]

Автор - MCH
Дата добавления - 18.11.2012 в 22:14
SM Дата: Воскресенье, 18.11.2012, 22:33 | Сообщение № 29
Группа: Друзья
Ранг: Участник
Сообщений: 64
Репутация: 59 ±
Замечаний: 0% ±

2003
Моя "формула" - самая длинючая - 419 знаков (без пробелов) weep .
Создаю из адресов "вырезаемых ячеек" диапазон "шахматнойфигуры".
Число вертикальных границ = (число областей пересечения этого диапазона и строк листа)*2,
число горизонтальных границ = (число областей пересечения диапазона и столбцов листа)*2.
[vba]
Code
Function PerimeterOf(ChessCells As Range)
     Dim Chessman As Range, XRng As Range, Cell As Variant, K As Long, P As Double
     '
     Set Chessman = Cells(9, 9)
     On Error Resume Next
     For Each Cell In ChessCells.Value
         Set Chessman = Union(Chessman, Range(Cell))
     Next
     On Error GoTo 0
     For K = 1 To 8
         Set XRng = Intersect(Rows(K), Chessman)
         If Not XRng Is Nothing Then P = P + XRng.Areas.Count
         Set XRng = Intersect(Columns(K), Chessman)
         If Not XRng Is Nothing Then P = P + XRng.Areas.Count
     Next
     PerimeterOf = P * 2
End Function
[/vba]


Excel изощрён, но не злонамерен
 
Ответить
СообщениеМоя "формула" - самая длинючая - 419 знаков (без пробелов) weep .
Создаю из адресов "вырезаемых ячеек" диапазон "шахматнойфигуры".
Число вертикальных границ = (число областей пересечения этого диапазона и строк листа)*2,
число горизонтальных границ = (число областей пересечения диапазона и столбцов листа)*2.
[vba]
Code
Function PerimeterOf(ChessCells As Range)
     Dim Chessman As Range, XRng As Range, Cell As Variant, K As Long, P As Double
     '
     Set Chessman = Cells(9, 9)
     On Error Resume Next
     For Each Cell In ChessCells.Value
         Set Chessman = Union(Chessman, Range(Cell))
     Next
     On Error GoTo 0
     For K = 1 To 8
         Set XRng = Intersect(Rows(K), Chessman)
         If Not XRng Is Nothing Then P = P + XRng.Areas.Count
         Set XRng = Intersect(Columns(K), Chessman)
         If Not XRng Is Nothing Then P = P + XRng.Areas.Count
     Next
     PerimeterOf = P * 2
End Function
[/vba]

Автор - SM
Дата добавления - 18.11.2012 в 22:33
MCH Дата: Воскресенье, 18.11.2012, 22:36 | Сообщение № 30
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Еще варианты
117:
[vba]
Code
=СЧЁТЗ(A:A)*4-2*СУММ(СЧЁТЕСЛИ(A:A;ПСТР(" abcdefgh";ПОИСК(ЛЕВБ(A1:A64);" abcdefgh")+{1;0};1)&(0&ПРАВБ(A1:A64))+{0;1}))
[/vba]

93:
[vba]
Code
=СЧЁТЗ(A:A)*4-2*СУММ(СЧЁТЕСЛИ(A:A;СИМВОЛ(КОДСИМВ(A1:A64&"i")+{1;0})&(0&ПРАВБ(A1:A64))+{0;1}))
[/vba]


Сообщение отредактировал MCH - Воскресенье, 18.11.2012, 22:48
 
Ответить
СообщениеЕще варианты
117:
[vba]
Code
=СЧЁТЗ(A:A)*4-2*СУММ(СЧЁТЕСЛИ(A:A;ПСТР(" abcdefgh";ПОИСК(ЛЕВБ(A1:A64);" abcdefgh")+{1;0};1)&(0&ПРАВБ(A1:A64))+{0;1}))
[/vba]

93:
[vba]
Code
=СЧЁТЗ(A:A)*4-2*СУММ(СЧЁТЕСЛИ(A:A;СИМВОЛ(КОДСИМВ(A1:A64&"i")+{1;0})&(0&ПРАВБ(A1:A64))+{0;1}))
[/vba]

Автор - MCH
Дата добавления - 18.11.2012 в 22:36
vikttur Дата: Воскресенье, 18.11.2012, 22:47 | Сообщение № 31
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2941
Репутация: 526 ±
Замечаний: 0% ±

Я только вздохнул.
Алгоритм родился сразу: определить числа "задвоенных" границ ячеек (где контактируют вырезанные ячейки). До формулы дело не дошло... Некогда...
 
Ответить
СообщениеЯ только вздохнул.
Алгоритм родился сразу: определить числа "задвоенных" границ ячеек (где контактируют вырезанные ячейки). До формулы дело не дошло... Некогда...

Автор - vikttur
Дата добавления - 18.11.2012 в 22:47
Мир MS Excel » Работа и общение » Мозговой штурм » Шахматная доска
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

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