Графік лицаря на дошці N-by-N


20

У шахах лицар може переміщатися лише до позицій, позначених символом X відносно його поточного положення, позначеного ♞:

куди може переїхати лицар


A Графік Лицарський є графік , який представляє всі юридичні ходи лицаря шахових фігур на шаховій дошці. Кожна вершина цього графа являє собою квадрат шахової дошки, а кожен край з'єднує два квадрати, які є рицарським рухом один від одного.

Графік виглядає так для стандартної дошки 8 на 8.

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


Виклик:

З огляду на ціле число N , де 3 ≤ N ≤ 8 , виведіть матрицю N-на-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 з усіх 1s (де n - вхід). Нехай це буде М.

[2K0] - Натисніть на стек масив, що містить [2, 4, 0]

B - Перетворіть все на бінарне, набивання 0 за потребою

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+- Виконуйте 2D згортку K над попередньою матрицею M ( conv2(M, K, 'same')), підсумовуючи 1s у законних цілях переміщення лицаря для кожної позиції

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


ви можете кодувати матрицю згортки як, 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

Для кожної комірки з та обчислюємо індекс пошуку визначений як:0 x < n 0 y < n i x , y(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))

Спробуйте в Інтернеті!


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⍴⎕ дві копії N

⍳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

3

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

Це руйнується на N більший ніж 9. Тож я щасливий, що N можна перейти лише до 8 =)

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

Спробуйте в Інтернеті!


Брахілог , 44 36 байт

Цей також працює для числа вище 9

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

Спробуйте в Інтернеті!


1
Ви також можете скористатись ⟨∋≡∋⟩ранньою для генерування матричних координат і зберегти загальну кількість 7 байт (вихід - це плоский список, дозволений ОП): Спробуйте це в Інтернеті!
sundar

2

Сітківка , 161 байт

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

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

.+
*

Перетворити в одинарне.

L$`_
$=

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

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

Починаючи _з середини виразів, спробуйте відповідати достатньому контексту, щоб визначити, чи можливий кожен з восьми кроків лицаря. Кожен візерунок фіксує по одному символу, якщо збіг вдався. Я спробував використовувати іменовані групи, щоб кількість захоплень прямо дорівнювало бажаному результату, але це коштувало 15 байт.

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

З’єднайте всі успішні захоплення та візьміть на себе довжину.


2

Мова Вольфрама (Mathematica) , 34 байти

Ще одна вбудована система Mathematica.

VertexDegree@KnightTourGraph[#,#]&

Повертає сплющений список.

Спробуйте в Інтернеті!


Я фактично зробив коментар під викликом з цією відповіддю (хоча не правильний синтаксис, оскільки не знаю WL). Я видалив його трохи пізніше, оскільки вважав, що хтось інший, можливо, захоче опублікувати це як справжню відповідь.
Стюі Гріффін


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.