Введение
Арон Нимзович был ведущим шахматным мастером и влиятельным шахматным писателем.
В его книге «Моя система» первая глава рассказывает о важности центра и о том, почему вы должны доминировать в нем. Простая причина в том, что ваши фигуры имеют больше возможных прямых следующих ходов, когда находятся в центре, что снова дает игроку больше силы.
Это становится очень ясным, если взглянуть на различные позиции коня и его возможные последующие ходы (показаны розовым цветом) на пустой доске:
Задача
Оцените количество возможных прямых следующих ходов коня на пустой доске в зависимости от его положения.
Входные характеристики
Положение рыцаря.
Сначала х (столбец), а затем у (строка). 0 0
это левый нижний угол.
Для простоты я изменил метки шахматной доски только на цифры. В наших примерах и тестовых примерах мы используем индекс на основе 0, однако вы можете использовать индекс на основе 1.
Вы можете использовать любой тип возможных форматов ввода, массив, аргументы функций и т. Д.
Выходные характеристики
Количество потенциальных прямых следующих ходов для коня на пустой доске.
Тестовые случаи
3 4 => 8
4 6 => 6
7 7 => 2
1 0 => 3
В тестовых примерах используется индекс на основе 0. Полная сетка значений:
2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2
Ответы:
Python 2 , 35 байт
Попробуйте онлайн!
Python 2 , 39 байт
Попробуйте онлайн!
Принимает входы с 0 индексами.
Выражение
x*(7-x)/5
принимает значения координат0..7
в(
min(x,7-x,2)
делает то же самое, но длиннее.) Суммируя этоx
иy
получая правильный шаблон, но с неправильными числами(См . Решение Нейла для лучшего рассуждения о том, почему это дает правильную схему.)
Наконец, отображение
a -> 50/(8-a)-4
с разделением по полу дает правильные значенияАльтернативное решение одинаковой длины с 1-индексированными входами:
источник
(7-a)*a/5
на 3 байта корочеmin(a,7-a,2)
.*l
на самом деле стоит всего один байт,lambda a,b:"23468"[(7-a)*a/5+(7-b)*b/5]
всего 41 байт.x*(9-x)/6
одним индексом.<strike>
как все, чтобы показать прогресс в гольф?MATL ,
17141312 байтСпасибо @Neil за 1 байт!
Вход основан на 1.
Попробуйте онлайн!
объяснение
Это вычисляет евклидово расстояние от входа до каждой из 64 позиций на шахматной доске и определяет, сколько из этих значений равно квадратному корню из 5.
Поскольку координаты являются целочисленными значениями, мы можем быть уверены, что два значения с плавающей запятой, представляющие квадратный корень из 5 (рассчитанный по координатам и вычисленный напрямую), действительно одинаковы.
источник
double
число. Муравей спасает байтMathematica
6343 байтаС 20 байтами сохранено благодаря предложениям Мартина Эндера!
Выше указано количество квадратов, которые находятся на расстоянии 1 шага от данной ячейки на полном графике тура рыцарей.
g=KnightTourGraph[8,8,VertexLabels->"Name",Axes->True]
отображает полный круговой график коня с именами вершин и координатами. Обратите внимание, что по умолчанию в Mathematica используется индексация координат по одному.
#+1+8#2&[r,f]
Converts возвращает вершину, соответствующую квадрату в ранге (строке)r
и файле (столбце)f
, используя нулевые значения в качестве входных данных.Например
#+1+8#2&[2,1]
возвращает 11.EdgeCount
дает число ребер в графе окрестностей.Края для ранга 2, файл 1 (квадрат 11):
Подсвеченные края:
Метод 2: Евклидово расстояние
70 байт
Этот метод более длинный, но, возможно, представляет некоторый интерес. Подход заключается в проверке евклидова расстояния между центром шахматной доски и ячейкой интереса.
Иллюстрация
2
8
Чтобы помочь визуализировать, как расстояние от центра шахматной доски достаточно для присвоения значения.
Круг [{4.5, 4.5}, 4],
Circle [{4.5, 4.5}, 4.6], Flatten [f / @ {2, 3, 4, 6, 8}, 1]}, Axes -> True, AxesOrigin -> {-1, -1}]
Числа 2.2, 3, 4 и 4.6 являются радиусами окружностей.
источник
KnightTourGraph
Mathematica и его встроенные элементы ... :-)#
в конце вашего исходного кода есть паразит (прямо перед]
). Вы должны быть в состоянии использоватьIncidenceList
вместо,EdgeList@NeighborhoodGraph
хотя. (В качестве альтернативы, есть такжеEdgeCount
, но я думаю, что в конечном итоге будет дольше.)EdgeCount[8~KnightTourGraph~8,#+1+8#2<->_]&
EdgeCount
это очень круто!JavaScript (ES6), 38 байт
Принимает 0-индексированные входы. Пояснение: посмотрите на квадраты расстояний до центра:
Количество доступных квадратов делится на пять полос:
На самом деле я вычисляю 24,5 - (3,5 - х) ** 2 - (3,5 - у) ** 2 = (7 - х) * х + (7 - у) * у, поскольку это более короткий расчет, но все, что он делает, это наоборот порядок полос.
источник
x*(7-x)
что это просто операция, которая выглядит как нисходящая дуга0..7
и случается с подгонкой кривой, но это объясняет, почему она дает такой хороший шаблон при суммировании дляx
иy
.Желе, 10 байт
1-индексироваться. Принимает единственный аргумент формы
[x,y]
. Попробуй это здесь.Денис спас байт!
источник
Mathematica,
4440 байтВ настоящее время у меня есть три решения с одинаковым количеством байтов:
Все это безымянные функции, которые принимают пару координат типа
{3, 4}
, которые основаны на 1.Я попытался придумать несколько явную формулу. Общий шаблон на всей доске выглядит так:
Фактические значения этих цветов (от самых светлых до самых темных)
2, 3, 4, 6, 8
. Это:Сначала мы используем симметрию, сдвигая начало координат к центру, беря абсолютное значение и вычитая результат из
4
. Это дает нам координаты0.5
для3.5
увеличения от каждого угла. Чтобы сделать координаты центра одинаковыми, нам нужно сопоставить0.5
и1.5
разные значения,2.5
и3.5
одно и то же значение. Это легко сделать, умножив на0.8
(дает{0.4, 1.2, 2., 2.8}
) и получив результат. Так что теперь у нас есть{0, 1, 2, 2}
как расстояния от центра. Если мы сложим координаты в каждой ячейке, мы получим эту таблицу:Это имеет уникальные значения для всех возможных результатов, поэтому мы просто используем его как индекс в
2[3,4,6,8]
.Во втором варианте мы используем потолок вместо пола. Таким образом,
2
,3
и4
уже правильно, но мы получаем5
и6
вместо6
и8
, таким образом , мы исправим их вручную с помощью правила подстановки.Наконец, в третьем варианте, мы расширим
5
и6
вверх6
и8
с помощью потенцирования, а затем другой операции пола.источник
APL, 21 символ
По-английски:
(⍳8 8)
: Массив 8x8 ранг-2, содержащий координаты всех ячеек;+/¨×⍨(⍳8 8)-⊂⍵
: квадрат евклидовых расстояний данной ячейки относительно каждой ячейки на доске;5=
: матрица 0/1, где 1 появляются на квадрате расстояний, равных 5;+/,
: суммировать сплюснутую матрицуТест (в источнике 1):
В этой форме:
левый аргумент может указывать размеры доски. Следовательно,
8 8 f
будет работать на стандартной квадратной шахматной доске. Но на большой прямоугольной доске тестовые случаи дали бы другие результаты. Например, на доске 12x10:источник
≢⍸5=+/¨×⍨-∘⎕¨⍳8 8
Попробуйте онлайн!Java -
160150 байтUngolfed:
Код ungolfed идентичен, за исключением изменения границ цикла for для сохранения 4 байтов. Работает, повторяя каждое возможное движение и выполняя проверку границ (> 0 и <8). Использует тот факт, что смещения (1, 2), (2, 1), (-1, 2), (-2, 1) и т. Д., И может проверить 2 хода для каждого значения i и j.
Изменить: 10 байтов сохранено благодаря предложениям Лики Нун и u902383.
источник
int m=0,i=-1,j;
чтобы сохранить некоторые байтыC, 44 байта
Но это лучше
источник
;
. Не скомпилируется.Haskell,
4948 байтовисточник
[0..7]
в переменную 1 байт.Java, 81 символ (113 байт)
Закодируйте всю таблицу результатов как таблицу Юникода, а затем получите соответствующие байты, выполняя побитовые операции.
Вы можете увидеть это онлайн здесь: https://ideone.com/K9BojC
источник
Python, 94 байта
Использует 1 на основе индексации.
Демо на https://repl.it/C6gV .
источник
Pyth -
3315 байтСпасибо @LeakyNun за уменьшение моего размера вдвое.
Перестановка карт и
V
, возможно, позволит немного поиграть в гольф.Тестовый пакет .
источник
APL (Dyalog Unicode) , 15 байтов SBCS
Попробуйте онлайн!
источник
J , 23 байта
Попробуйте онлайн!
Посвящение методу Линн, преобразуется в J
источник
На самом деле, 18 байт
Попробуйте онлайн!
Это реализует ту же формулу , что и многие другие ответы были с помощью:
50/(8-x*(7-x)//5+y*(7-y))//5)-4
. Ввод принимается в виде списка:[x,y]
(или любой итеративный литерал в Python, например(x,y)
илиx,y
).Объяснение:
источник
Perl 6 , 44 байта
Попробуйте онлайн!
источник