Могу ли я сделать эту форму с блоками, плитами и лестницами?


13

Рассмотрим прямоугольную двумерную сетку, где каждая ячейка может быть пустой ( .) или полной ( 0).

например

..00....
0000....
.00000..
000...00
..000000
000.00..

Сетка считается бесконечной, все ячейки за пределами изображенной области пусты.

Цель состоит в том, чтобы покрыть заполненные пространства и оставить пустые пространства открытыми, используя набор из 7 кирпичей четкой формы, каждая из которых занимает 4 ячейки (2 × 2) сетки.

Это 7 кирпичей:

  • Блоки - 1 вариант

    11
    11
    
  • Плиты - 2 варианта

    ..
    22
    33
    ..
  • Лестница - 4 варианта

    .4
    44
    5.
    55
    66
    .6
    77
    7.

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

Итак, один из способов покрыть (иначе решить) приведенный выше пример выглядит так:

..11....
2211....
.47733..
447...22
..771133
227.11..

(Идентичные соседние кирпичи могут все еще вызывать неоднозначность, но тщательная идентификация большей сетки решает это.)

Недействительным решение

000000
000000

является

566774
556744

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

Действительное решение здесь - 3 блока подряд:

111111
111111

И еще одно правильное решение включает 6 плит:

......
222222
333333
......

Обратите внимание, что некоторые входные сетки имеют несколько решений .

Недействительным решение

00.00
00...

является

11.33
11...

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

Вызов

Напишите программу, которая принимает (через стандартный ввод / командную строку) прямоугольный блок текста .'s и0 ', который представляет сетку, которую нужно покрыть.

Если есть правильное решение покрытие, печать (через стандартный вывод) любое одно решение таким же образом , как указано выше, заменив все 0«S с соответствующим 1сквозным7 кирпичи.

Если решения не существует, ваша программа не должна ничего выводить, просто спокойно заканчивается нормально.

Примечания

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

  • Также можно обрезать строки и столбцы всех ., если это не повлияет на заполненные пробелы. например

    222222
    333333
    

    является действительным решением для

    000000
    000000
    

    И наоборот, два пустых столбца в 00..00не могут быть удалены, так как это нарушит заполненные пробелы.

  • При желании вы можете предположить, что вход имеет одну завершающую новую строку. Одиночный трейлинг-перевод строки в выводе также хорош, даже в случае отсутствия решения.

  • Полностью пустые (все .) сетки и тривиальная сетка 0 × 0 не являются входными данными, о которых вам нужно беспокоиться. Но 0сетка 1 × 1 , как и все другие сетки, содержит хотя бы одну сетку 0. (Вы не можете предполагать, что ширина или высота входной сетки четна!)

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

  • Вы можете использовать любые 9 различных печатаемых символов ASCII вместо . 0 1 2 3 4 5 6 7. Просто обязательно скажи, какие у тебя были замены! Новые строки должны оставаться как есть.

счет

Самый короткий код в байтах побеждает. Tiebreaker является самым высоко оцененным постом.

Эта задача была вдохновлена блоками , плитами и лестницами в Minecraft , которые следуют тем же правилам, что и здесь. Если вам нравятся PPCG и Minecraft, вы можете проверить PPCG Minecraft Server .


3
Похоже, что сервер Minecraft не реализован в сценарии Golf - скучно :-)
Томас Уэллер

5
@ThomasWeller Это было переопределено в CJam, чтобы сохранить несколько байтов.
Алекс А.

Ответы:


6

Питон - 525 491 478 430 байт

r=range
def t(s):
 m=s.find("\n")+1
 for q in r(4):
  try:
   for i in r(-q%2,m-1,2):
    for j in r(-q/2,len(s)/m,2):
     k,g=j*m+i,""
     b=[k,k+1,k+m,k+m+1]
     for z in b:g+=a(s,z)
     for z in b:
      if a(s,z)!="d":s=s[:z]+`dict(dddd=0,zzdd=3,ddzz=2,zzzd=7,zzdz=6,zdzz=5,dzzz=4,zzzz=1)[g]`+s[z+1:]
   return s
  except:d
def a(v,i):
 try:
  if v[i]!="\n":return v[i]
  return "d"
 except:return "d"

Объяснение: Это мой первый гольф-код, поэтому он может быть неоптимальным, но вот как это работает. Функция t (s) дает результат для переданной строки. Сначала она находит количество столбцов, затем проходит четыре возможных различных перевода на 1 (нет, влево, вверх, вверх-влево) и пытается ее решить. для каждого. Он просматривает каждый блок 2x2 и сопоставляет его с действительным номером блока, заданным словарем, и заменяет нули на номер.

Если он обнаруживает, что его нет в словаре, он отменяет это конкретное смещение и начинает заново со следующего. Если он проходит все 4 смещения, не находя правильного решения, он заканчивается без вывода чего-либо. a (v, i) допускает значение по умолчанию вне строки и игнорирует символы новой строки. Хотя он может привести к частичным решениям в течение всего цикла, он всегда переопределит их с окончательно правильным, если он существует.

Редактировать: используется другое сопоставление символов:. -> d, 0 -> z, все остальные числа идут на себя. Это относится как к входу, так и к выходу.


1
Добро пожаловать в PPCG! У нас есть несколько советов для игры в гольф на Python ; с помощью которого я думаю, что вы можете сохранить несколько байтов.
lirtosiast
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.