Пусть шахматная доска 8x8 будет представлена любыми двумя различными значениями, одно из которых будет пустым квадратом, а другое - королевой. В следующих примерах я использую 0 в качестве пустых квадратов и 1 в качестве королев. Например:
дан кем-то
1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1
Рассмотрим количество пар королев, которые атакуют, каждая из которых находится на расстоянии не менее одного квадрата (как напоминание, королевы атакуют ортогонально и по диагонали). В приведенном выше примере на следующей невероятной уродливой диаграмме все эти пары показаны в виде стрелок.
Выше 43 пар дают следующий контрольный пример:
Input:
1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1
Output: 43
Вызов
Напишите программу, которая, учитывая состояние платы, представленное двумя различными значениями, выводит количество пар королев, которые атакуют друг друга, по крайней мере, с одним квадратом между ними.
- Вы можете вводить в любом удобном для вас формате, который использует два значения для представления пустых квадратов и королев, например, строку размером 64 ". Для пустых квадратов и" Q "для королев по строкам снизу вверх, 8x8 матрица логических значений, список целых чисел 0 и 1 и т. д., если это объясняется в вашем решении
- Выход является целым числом
- Применяются стандартные методы ввода / вывода и запрещены стандартные лазейки
- Это код гольф, поэтому самый короткий ответ в байтах выигрывает
Тестовые случаи:
Используя формат 0 и 1, где 0 - пустые квадраты, а 1 - королева:
Input:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Output: 0
Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 0
Input:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 1 0 0 0 0 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Output: 1
Input:
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 1 0 0 0 0 1 0
0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0
0 0 0 1 0 0 1 0
0 0 0 0 0 0 0 0
Output: 10
Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 4
Input:
1 1 0 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 11
источник
Ответы:
Python 2 , 105 байт
Попробуйте онлайн!
объяснение
Мы принимаем ввод как строку из 64 символов
'0'
или'1'
. Используя пошаговые фрагменты, мы отбрасываем четыре «линии обзора» от каждой королевы, с которой сталкиваемся. Например, когда я = 10 и d = 7 , отмечая королеву как ♥ и плитки, выбранныеb[i+d::d]
как █:Ясно, что на самом деле мы не хотим, чтобы видение обернулось вокруг доски таким образом Таким образом, мы вычисляем, как далеко находится край доски в каждом направлении, и видим плитки на
b[i+d::d][:…]
.Для каждой пары направления плитки мы считаем:
Это не удастся всякий раз, когда
c
не королева; илиfind
возвращает 0); илиfind
возвращает -1).Каждая пара ферзей проверяется только один раз, поскольку лучи всегда направляются вперед в порядке чтения, от «более ранней» королевы до «более поздней».
источник
JavaScript (ES7), 86 байт
Принимает входные данные в виде массива из 64 целых чисел с 254 для ферзя и 0 для пустого квадрата.
Попробуйте онлайн!
Эта версия злоупотребляет арифметическим понижением, чтобы получить условие остановки в рекурсивной части.
JavaScript (ES7), 89 байт
Принимает ввод как массив из 64 бит.
Попробуйте онлайн!
Как?
Мы рекурсивно вызываем именованную функцию обратного вызова,
map()
чтобы пройти через квадраты в заданном направлении. Хотя нам действительно не нужно содержимое третьего параметра обратного вызова (map()
был вызван массив ), тем не менее, мы косвенно используем его, чтобы узнать, является ли это первой итерацией или нет.Это переменная х в коде.
источник
Улитки , 14 байт
Попробуйте онлайн!
Ввод в формате 0/1 без пробелов в строках.
Улитки были созданы для языкового проектирования PPCG . Самое главное, он по умолчанию выводит количество найденных совпадений, что идеально подходит для этой задачи.
A
устанавливает опцию «все пути», так что если ферзь состоит из нескольких пар, каждая из этих пар будет генерировать совпадение.rdaa7
устанавливает направление совпадения на S, SE, E и NE. Установка во всех направлениях (z
) приведет к двойному счету.\1\0+\1
соответствует a1
, затем одному или нескольким0
s, затем другому1
.источник
APL (Dyalog Classic) ,
413932 байтаПопробуйте онлайн!
≠⍨
«не равен самому себе» - матрица с нулевым размером 8x8⊢,≠⍨,⌽,≠⍨
- если исходная матрица естьABC...
, это выражение возвращает:8 31⍴
изменяет его с 8x32 на 8x31, повторно используя элементы в главном порядке строк:⊢,⍉,
добавляет исходную матрицу и ее транспонирование (дополнительные пробелы для ясности):2<⌿0⍪
добавляет 0 к вершине и сравнивает, используя<
каждый элемент, с элементом под ним, поэтому мы получаем 1 для ведущего 1 в каждой вертикальной группе 1, а 0 - везде+⌿-⌈⌿
суммы по столбцам минус максимумы по столбцам - мы вычисляем количество разрывов между 1-группами в каждом столбце, 0, если их нет+/
суммаисточник
Желе ,
2220 байтПопробуйте онлайн!
источник
Retina 0.8.2 ,
6058 байтПопробуйте онлайн! Принимает ввод как 8-символьные двоичные строки, разделенные запятыми, но заголовок преобразует предоставленный формат для вас. Объяснение:
Создайте все подстроки доски, начиная с ферзя. Присвойте значение маркера каждой подстроке. Редактировать: Сохранено 2 байта, оставив несколько строк мусора; они эффективно игнорируются.
Разделите каждый маркер вверх на включающий диапазон и добавьте 7 к ненулевым элементам.
Удалить каждый набор символов, равный длине маркера. Это эквивалентно нахождению каждого восточного, юго-западного, южного или юго-восточного луча от каждой королевы.
Подсчитайте все лучи, которые проходят через хотя бы один пустой квадрат, прежде чем встретить другую королеву.
источник
JavaScript (ES6) + SnakeEx , 38 байт
Принимает участие в форме
'10111000\n10101011\n10101101\n01010100\n01100101\n10001000\n01000111\n01110101'
. Оказывается, SnakeEx все еще можно использовать за пределами своего первоначального испытания!источник
К (нгн / к) , 45 байт
Попробуйте онлайн!
источник