Граф коня на доске N-N-N

20

В шахматах рыцарь может перемещаться только в позиции, отмеченные знаком X, относительно его текущей позиции, отмеченной знаком ♞:

куда рыцарь может двигаться


A График Рыцарский представляет собой график , который представляет все юридические ходы рыцаря шахматных фигур на шахматной доске. Каждая вершина этого графа представляет квадрат шахматной доски, а каждое ребро соединяет два квадрата, которые являются движением рыцаря друг от друга.

График выглядит так для стандартной доски 8х8.

введите описание изображения здесь


Вызов:

Для заданного целого числа N , где 3 ≤ N ≤ 8 , выведите матрицу N-by-N, представляющую доску, где показано количество возможных ходов из каждой позиции. Для N = 8 на выходе будет матрица, показывающая значения каждой вершины на графике выше.

Выходной формат гибкий. Список списков или даже плоский список и т. Д. Являются допустимыми форматами.


Полный набор тестовых случаев:

--- N = 3 ---
2 2 2
2 0 2
2 2 2
--- N = 4 ---
2 3 3 2
3 4 4 3
3 4 4 3
2 3 3 2
--- N = 5 ---
2 3 4 3 2
3 4 6 4 3
4 6 8 6 4
3 4 6 4 3
2 3 4 3 2
--- N = 6 ---
2 3 4 4 3 2
3 4 6 6 4 3
4 6 8 8 6 4
4 6 8 8 6 4
3 4 6 6 4 3
2 3 4 4 3 2
--- N = 7 ---
2 3 4 4 4 3 2
3 4 6 6 6 4 3
4 6 8 8 8 6 4
4 6 8 8 8 6 4
4 6 8 8 8 6 4
3 4 6 6 6 4 3
2 3 4 4 4 3 2
--- N = 8 ---
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

Это поэтому выигрывает самое короткое решение на каждом языке. Пояснения приветствуются!

Стьюи Гриффин
источник
1
Соответствующий вызов для запроса количества ходов коня от квадрата на доске 8 * 8.
xnor
Может ли вывод быть простым списком из n * n элементов?
xnor
13
Это буквально просто крайний случай! :)
Джонатан Аллан

Ответы:

13

MATL , 17 16 байт

t&l[2K0]B2:&ZvZ+

Попробуйте онлайн!

(-1 байт благодаря @Luis Mendo.)

K

K=(0101010001000001000101010)

(Относительно центра матрицы, каждый 1 является действительным ходом коня.)

t&l- Сформировать матрицу nxn из всех 1 (где n - вход). Пусть это будет М.

[2K0] - Вставить массив, содержащий [2, 4, 0] в стек

B - Конвертировать все в двоичный файл, дополнив нулями при необходимости

0 1 0
1 0 0
0 0 0

2:&Zv- Отразите это на обоих измерениях, не повторяя последнюю строку / столбец («индексация симметричного диапазона»). Это дает нам необходимую матрицу К.

0 1 0 1 0
1 0 0 0 1
0 0 0 0 0
1 0 0 0 1
0 1 0 1 0

Z+- Выполните двумерную свертку K над более ранней матрицей M ( conv2(M, K, 'same')), суммируя 1-е на законных целях перемещения рыцаря для каждой позиции

Матрица результата отображается неявно.

sundar - Восстановить Монику
источник
Вы можете закодировать матрицу свертки как, 11043370BP5eно это не короче ...
Джузеппе
8

JavaScript (ES6), 88 байт

Возвращает строку.

n=>(g=k=>--k?[n>3?'-2344-6-6'[(h=k=>k*2<n?~k:k-n)(k%n)*h(k/n|0)]||8:k-4&&2]+g(k):2)(n*n)

Попробуйте онлайн!

Как?

n=3

20

(222202222)

3<n8

(x,y)0x<n0y<nix,y

ix,y=min(x+1,nx)×min(y+1,ny)

n=8

(1234432124688642369121296348121616128448121616128436912129632468864212344321)

T

T=[0,2,3,4,4,0,6,0,6]

где представляет неиспользуемый слот.0

Мы устанавливаем каждую ячейку в:(x,y)

{T(ix,y)if ix,y88otherwise

JavaScript (ES7), 107 байт

Наивная реализация, которая на самом деле пробует все ходы.

n=>[...10**n-1+''].map((_,y,a)=>a.map((k,x)=>~[...b=i='01344310'].map(v=>k-=!a[x-v+2]|!a[y-b[i++&7]+2])+k))

Попробуйте онлайн!

Arnauld
источник
6

Желе ,  23 22 14  10 байт

²ḶdðạP€ċ2)

Монадическая ссылка, дающая плоский список - использует идею, впервые использованную KSab в своем ответе на Python - ходы коня имеют «стороны» 1 и 2, единственные факторы 2.

Попробуйте онлайн! (нижний колонтитул вызывает единственную ссылку программы, а затем форматирует результат в виде сетки)

Кроме того, также для 10 байтов ²Ḷdðạ²§ċ5)(ходы коня - это все возможные ходы с расстоянием )5

Как?

²ḶdðạP€ċ2) - Link: integer, n (any non-negative) e.g. 8
²          - square n                                 64
 Ḷ         - lowered range                            [0,    1,    2,    3,    4,    5,    6,    7,    8,    9,    10,   11,   12,   13,   14,   15,   16,   17,   18,   19,   20,   21,   22,   23,   24,   25,   26,   27,   28,   29,   30,   31,   32,   33,   34,   35,   36,   37,   38,   39,   40,   41,   42,   43,   44,   45,   46,   47,   48,   49,   50,   51,   52,   53,   54,   55,   56,   57,   58,   59,   60,   61,   62,   63]
  d        - divmod (vectorises) i.e. x->[x//n,x%n]   [[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[3,6],[3,7],[4,0],[4,1],[4,2],[4,3],[4,4],[4,5],[4,6],[4,7],[5,0],[5,1],[5,2],[5,3],[5,4],[5,5],[5,6],[5,7],[6,0],[6,1],[6,2],[6,3],[6,4],[6,5],[6,6],[6,7],[7,0],[7,1],[7,2],[7,3],[7,4],[7,5],[7,6],[7,7]]
   ð     ) - new dyadic chain for each - call that L ( & e.g. R = [1,2] representing the "2nd row, 3rd column" ...-^ )
    ạ      -   absolute difference (vectorises)       [[1,2],[1,1],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[0,2],[0,1],[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[1,2],[1,1],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[2,2],[2,1],[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[3,2],[3,1],[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[4,2],[4,1],[4,0],[4,1],[4,2],[4,3],[4,4],[4,5],[5,2],[5,1],[5,0],[5,1],[5,2],[5,3],[5,4],[5,5],[6,2],[6,1],[6,0],[6,1],[6,2],[6,3],[6,4],[6,5]]
     P€    -   product of €ach                        [2,    1,    0,    1,    2,    3,    4,    5,    0,    0,    0,    0,    0,    0,    0,    0,    2,    1,    0,    1,    2,    3,    4,    5,    4,    2,    0,    2,    4,    6,    8,    10,   6,    3,    0,    3,    6,    9,    12,   15,   8,    4,    0,    4,    8,    12,   16,   20,   10,   5,    0,    5,    10,   15,   20,   25,   12,   6,    0,    6,    12,   18,   24,   30]
       ċ2  -   count 2s                          6:    ^-...1                  ^-...2                                                                  ^-...3                  ^-...4                        ^-...5      ^-...6
           - )                                                                                                     v-...that goes here
           -   ->                                  -> [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]

Предыдущие 22 байта

2RżN$Œp;U$+,ḟ€³R¤Ẉ¬Sðþ

Полная программа (из-за ³).

Попробуйте онлайн! (нижний колонтитул вызывает единственную ссылку программы, а затем форматирует результат в виде сетки)

Находит все ходы и подсчет тех , которые землю на борту , вероятно , определенно побиваемый путем вычисления (возможно побиваемый путем изменения «земли на борту» логики).

Джонатан Аллан
источник
4

APL (Dyalog Classic) , 18 байт

+/+/2=×/¨|∘.-⍨⍳2⍴⎕

Попробуйте онлайн!

оцененный вход N

2⍴⎕ две копии н

⍳2⍴⎕ индексы матрицы N × N - матрицы векторов длины 2

∘.-⍨ вычесть каждую пару индексов из каждой другой пары, получить массив N × N × N × N

| абсолютная величина

×/¨ продукт каждого

2=где 2s? вернуть логическую (0/1) матрицу

Обратите внимание, что конь движется ± 1 по одной оси и ± 2 по другой, поэтому абсолютное значение произведения этих шагов равно 2. Поскольку 2 не может быть учтено любым другим способом, это справедливо только для ходов рыцаря.

+/+/ сумма по последнему измерению, дважды

СПП
источник
3

RAD , 51 46 39 байт

{+/(⍵∘+¨(⊖,⊢)(⊢,-)(⍳2)(1¯2))∊,W}¨¨W←⍳⍵⍵

Попробуйте онлайн!

Как?

Подсчитывает количество действительных ходов рыцаря для каждого квадрата, видя, какие ходы рыцаря приземлились бы на доске:

{+/(⍵∘+¨(⊖,⊢)(⊢,-)(⍳2)(1¯2))∊,W}¨¨W←⍳⍵⍵
 +/                                     - The number of ...
                            ∊,W         - ... in-bounds ...
        (⊖,⊢)(⊢,-)(⍳2)(1¯2)             - ... knight movements ...
   (⍵∘+¨                   )            - ... from ...
{                              }¨¨W←⍳⍵⍵ - ... each square
Zachary
источник
3

Брахилог , 65 40 33 байта

Это разбивается на N больше, чем 9. Так что я рад, что N можно только перейти к 8 =)

⟦₅⟨∋≡∋⟩ᶠ;?z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -25 байт при переходе на формулу KSab
  • -7 байт за счет выравнивания массива благодаря sundar

Попробуйте онлайн!


Brachylog , 44 36 байт

Этот также работает для числа выше 9

gP&⟦₅⟨∋≡∋⟩ᶠ;z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -8 байт за счет выравнивания массива благодаря sundar

Попробуйте онлайн!

Kroppeb
источник
1
Вы можете также использовать ⟨∋≡∋⟩ранний способ для генерации координат матрицы и сохранить в целом 7 байтов (вывод - плоский список, который разрешен OP): попробуйте онлайн!
sundar - Восстановить Монику
2

Сетчатка , 161 байт

.+
*
L$`_
$=
(?<=(¶)_+¶_+)?(?=(?<=(¶)_*¶_*)__)?(?<=(¶)__+)?(?=(?<=(¶)_*)___)?_(?=(?<=___)_*(¶))?(?=__+(¶))?(?=(?<=__)_*¶_*(¶))?(?=_+¶_+(¶))?
$.($1$2$3$4$5$6$7$8)

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:

.+
*

Преобразовать в одинарный.

L$`_
$=

Перечислите значение один раз для каждого _значения, то есть создайте квадрат.

(?<=(¶)_+¶_+)?
(?=(?<=(¶)_*¶_*)__)?
(?<=(¶)__+)?
(?=(?<=(¶)_*)___)?
_
(?=(?<=___)_*(¶))?
(?=__+(¶))?
(?=(?<=__)_*¶_*(¶))?
(?=_+¶_+(¶))?

Начиная с _середины регулярного выражения, попробуйте сопоставить достаточно контекста, чтобы определить, возможен ли каждый из восьми ходов коня. Каждый шаблон захватывает один символ, если совпадение успешно. Я попытался использовать именованные группы, чтобы число захватов напрямую соответствовало желаемому результату, но это стоило 15 байт.

$.($1$2$3$4$5$6$7$8)

Объедините все удачные снимки и возьмите длину.

Нил
источник
2

Wolfram Language (Mathematica) , 34 байта

Еще одна встроенная Mathematica.

VertexDegree@KnightTourGraph[#,#]&

Возвращает плоский список.

Попробуйте онлайн!

alephalpha
источник
Я на самом деле сделал комментарий под вопросом с этим ответом (хотя и не правильный синтаксис, так как я не знаю WL). Через некоторое время я удалил его, так как подумал, что кто-то другой захочет опубликовать его как реальный ответ.
Стьюи Гриффин
1

C (gcc) , 133 125 байт

Это решение должно работать на доске любого размера.

#define T(x,y)(x<3?x:2)*(y<3?y:2)/2+
a,b;f(i){for(a=i--;a--;)for(b=i+1;b--;)printf("%i ",T(a,b)T(i-a,b)T(a,i-b)T(i-a,i-b)0);}

Попробуйте онлайн!

Кертис Бехтель
источник
@ceilingcat Конечно, спасибо! Но я не вижу, что изменится второе предложение
Кертис Бехтель