Плитка шахівниці чотириколірними тріоміно


12

Завдання:

Розглянемо проблему: "давши шаховій дошці з відсутністю одного квадрата, розріжте її на 21 L-триоміно". Існує добре відомий конструктивний доказ того, що це можна зробити для будь-якого квадратного розміру шахової дошки потужністю два. Це працює, розбиваючи шахівницю на меншу шахівницю з отвором у ній і однією великою тріоміно, а потім спостерігаючи, що це тріоміно можна рекурсивно розрізати на чотири триоміно.

У цьому завданні вам потрібно вирізати шахову дошку розміром 8х8 на трійчасті форми у формі L, а потім пофарбувати їх чотирма кольорами, щоб жодні дві сусідні триоміно не мали одного кольору.

Специфікація:

Ваш вхід - це положення дірки, яке задається у вигляді пари цілих чисел. Ви можете вибрати, який - індекс стовпця, а індекс - рядок. Ви можете вибрати, якщо кожен починається на 0 або на 1, і далеко від кута вони збільшуються. Вам може знадобитися A..H в якості першої координати замість 0..7 або 1..8. Ви також можете прийняти обидві координати, упаковані в одне ціле число 0..63 або 1..64 в лексикографічному порядку (рядок-великий або стовпець-великий, зліва направо або справа наліво, вгору вниз або вниз вгору). Ви можете написати повну програму або функцію.

Ви можете виводити плитку як ASCII, як кольоровий ASCII або як графічний примітив. Якщо ви виберете вихід ASCII, ви можете вибрати будь-які чотири символи для друку ASCII, які представлятимуть чотири кольори. Якщо ви вибрали кольоровий ASCII, ви можете обрати будь-які чотири символи для друку ASCII або лише один символ, крім пробілу. Отвір повинен бути представлений символом пробілу. Якщо один із ваших персонажів є символом пробілу, жодне тріоміно, що примикає до отвору чи на краю шахової дошки, не може бути такого кольору.

Якщо ви вибрали кольоровий ASCII або графічний вихід, ви можете вибрати будь-які чотири кольори з # 000, # 00F, # 0F0, # 0FF, # F00, # F0F, # FF0, #FFF або їх найближчих еквівалентів, наявних у вашому середовищі. Якщо ви виберете графічний вихід, ваші графічні примітиви повинні бути заповнені квадратами розміром не менше 32х32 пікселів і розділені не більше ніж двома пікселями іншого кольору. Якщо вищезазначене перевищує роздільну здатність екрана вашого оточення, вимога до мінімального розміру зменшується до найбільшого розміру квадрата, який все ще відповідає екрану.

Ви можете вибрати будь-яку дійсну плитку даної шахової дошки. Ви можете вибрати будь-яке чотириколірне обране вами плитка. Ваш вибір з чотирьох кольорів повинен бути однаковим для всіх результатів, але вам не потрібно використовувати кожен колір у кожному висновку.

Приклади:

Можливий вихід для вводу = [0, 0] (лівий верхній кут)

 #??##??
##.?#..?
?..#??.#
??##.?##
##?..#??
#.??##.?
?..#?..#
??##??##

Інший можливий вихід тієї ж програми (input = [0, 7]):

??#??#?
?##?##??
..xx..xx
.?x#.?x#
??##??##
..xx..xx
.?x#.?x#
??##??##

Для введення "D1" також може бути створена інша програма (зверніть увагу на нестандартну, але дозволену орієнтацію шахової дошки),

AABBCCAA
ACBACBAC
CCAABBCC
 ABBAADD
AABDABDC
BBDDBBCC
BABBACAA
AABAACCA

4
Якщо є вхід, це насправді не складність Колмогорова
Джонатан Аллан

@JonathanAllan в описі тегу використовується хто, хто цей покемон, як приклад питання про складність колгорогова, який бере участь. Ви вирішуєте, якщо ви хочете стиснути набір 64 постійних розчинів або якщо ви хочете здійснити процедуру, щоб викласти плитку шаховою дошкою, а потім розфарбувати її.
Джон Дворак


1
Не вистачає трьох кольорів?
Арнольд

1
@Arnauld Я дозволю це. Я відредагую.
Джон Дворак

Відповіді:


22

JavaScript (ES6),  184 ... 171  163 байт

(x)(y)0х70у7012

h=>v=>(a=[...'3232132031021010'],a[5+(v&4|h>3)]^=3,a[v/2<<2|h/2]=v%2*2+h%2,g=x=>y&8?'':(x<8?x-h|y-v?a[y/2<<2|x/2]^y%2*2+x%2?(x^y)&2:1:' ':`
`)+g(-~x%9||!++y))(y=0)

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

Метод

4×4

(т0т1т2т3т4т5т6т7т8т9т10т11т12т13т14т15)

Кожне тріоміно є одним із:

триоміно

Початкова конфігурація матриці така:

(3232132031021010)

Перші два кольори ми чергуємо так само, як і на будь-якій шаховій дошці, яка дає:

матриця0

Наступні кроки:

  1. т5т6т9т10
  2. Ми обертаємо тріоміно, на якому знаходиться отвір (воно може бути таким же тріоміно, як на кроці №1), щоб воно не закривало отвір.
  3. Заповнюємо отвори 3-м кольором (крім «справжнього» отвору).

(3,0)

матриця1

І ось у цьому випадку кінцевою матрицею є:

(3132102031021010)

Прокоментував

h => v => (                       // (h, v) = hole coordinates
  a = [...'3232132031021010'],    // a[] = flat representation of the 4x4 matrix
  a[5 + (v & 4 | h > 3)] ^= 3,    // first rotation, achieved by XOR'ing with 3
  a[v / 2 << 2 | h / 2] =         // second rotation according to the
    v % 2 * 2 + h % 2,            // position of the hole within the triomino's square
  g = x =>                        // g is a recursive function that converts the 4x4
                                  // matrix into a 8x8 ASCII art
    y & 8 ?                       // if y = 8:
      ''                          //   stop recursion and return an empty string
    :                             // else:
      ( x < 8 ?                   //   if this is not the end of the row:
          x - h | y - v ?         //     if this is not the position of the hole:
            a[y / 2 << 2 | x / 2] //       if this part of the triomino located at this
            ^ y % 2 * 2 + x % 2 ? //       position is 'solid':
              (x ^ y) & 2         //         use either color #0 or color #2
            :                     //       else:
              1                   //         use color #1
          :                       //     else:
            ' '                   //       the hole is represented with a space
        :                         //   else:
          `\n`                    //     append a linefeed
      ) + g(-~x % 9 || !++y)      //   append the result of a recursive call
)(y = 0)                          // initial call to g with x = y = 0

Графічний вихід

Клацніть на малюнку, щоб встановити положення отвору.


Конструктивний доказ того, що трьох кольорів завжди достатньо, дуже приємно!
Джон Дворак

6
Любіть графічний вихід, який можна натискати!
Кевін Кройссен

3

Вугілля деревне , 78 байт

NθNη”{⊞⊟¦≦⁶q×fΣ\⊙t×_⊟✳-Y⁴℅=⁶υ”≔›θ³ζ≔›η³εFζ≦⁻⁷θFε≦⁻⁷ηJ⊕÷θ²⊕÷粧#$⁺ⅈⅉJθη Fζ‖Fε‖↓

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Виводи з використанням #$%символів. Пояснення:

NθNη

Введіть координати порожнього квадрата.

”{⊞⊟¦≦⁶q×fΣ\⊙t×_⊟✳-Y⁴℅=⁶υ”

Виведіть стислий рядок. Він містить нові рядки, щоб уникнути порушення потоку цього пояснення, ви знайдете рядок в кінці відповіді.

≔›θ³ζ≔›η³εFζ≦⁻⁷θFε≦⁻⁷η

Якщо будь-яка координата більше, ніж 3 тоді, пам’ятайте цей факт і віднімайте координату від 7.

J⊕÷θ²⊕÷粧#$⁺ⅈⅉ

Перейти до найближчого % лівого верхнього квадрата %s та перезапишіть його# або, $якщо потрібно. (Але це буде перезаписано порожнім, якщо воно вже було на цій площі.)

Jθη Fζ‖Fε‖↓

Викресліть квадрат за зменшеними координатами, а потім відобразіть висновок за необхідності, щоб дістати порожнє до початкового положення.

##$$##$$
#%%$#%%$
$%%#$$%#
$$##%$##
##$%%#$$
#%$$##%$
$%%#$%%#
$$##$$##

Я спробував почати з площі %s в центрі і пропрацював потрібні координати, але це зайняло 90 байт.

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