Плитка шахматная доска с четырехцветным триомино


12

Задача:

Рассмотрим проблему: «учитывая шахматную доску без одного квадрата, нарежьте ее на 21 L-триомино». Существует хорошо известное конструктивное доказательство того, что это можно сделать для любого квадратного размера шахматной доски, который является степенью двойки. Он работает, разбивая шахматную доску на меньшую шахматную доску с отверстием в ней и одним большим триомино, а затем наблюдая, что это триомино можно рекурсивно разрезать на четыре триомино.

В этом задании вы должны разрезать шахматную доску 8x8 на 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 или их ближайших эквивалентов, доступных в вашей среде. Если вы выбираете графический вывод, ваши графические примитивы должны быть заполнены квадратами размером не менее 32x32 пикселей и разделены не более чем двумя пикселями другого цвета. Если вышеупомянутое превышает разрешение экрана вашей среды, требование минимального размера смягчается до самого большого квадратного размера, который все еще помещается на экране.

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

Примеры:

Возможный вывод для ввода = [0, 0] (верхний левый угол)

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

Другой возможный вывод той же программы (input = [0, 7]):

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

Другая программа может также произвести для ввода «D1» (обратите внимание на нестандартную, но разрешенную ориентацию шахматной доски),

AABBCCAA
ACBACBAC
CCAABBCC
 ABBAADD
AABDABDC
BBDDBBCC
BABBACAA
AABAACCA

4
Если есть входные данные, это не совсем колмогоровская сложность
Джонатан Аллан

@JonathanAllan описание тега использует who's the pokemon в качестве примера вопроса сложности колмогорова, который принимает входные данные. Вам решать, хотите ли вы сжать набор из 64 постоянных решений или если вы хотите реализовать процедуру для разбиения шахматной доски, а затем раскрасить ее.
Джон Дворак


1
Разве трех цветов недостаточно?
Арно

1
@Arnauld Я позволю это. Я отредактирую
Джон Дворак

Ответы:


22

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

(x)(y)0Икс70Y7012

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

(T0T1T2T3T4T5T6T7T8T9T10T11T12T13T14T15)

Каждое триомино является одним из:

triominoes

Начальная конфигурация матрицы выглядит следующим образом:

(3232132031021010)

Мы чередуем первые 2 цвета, как на любой шахматной доске, что дает:

matrix0

Следующие шаги:

  1. T5T6T9T10
  2. Мы вращаем триомино, на котором расположено отверстие (это может быть то же самое, что и на шаге 1), чтобы оно не закрывало отверстие.
  3. Заполняем отверстия 3-м цветом (кроме «настоящего» отверстия).

(3,0)

Matrix1

И в этом случае окончательная матрица:

(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.