ASCII Jigsaw Puzzle

27

Это 3x3ASCII-пазл:

 _____ _____ _____
|    _|     |_    |
|   (_   _   _)   |
|_   _|_( )_|_   _|
| (_) |_   _| (_) |
|  _   _) (_   _  |
|_( )_|_   _|_( )_|
|    _| (_) |_    |
|   (_       _)   |
|_____|_____|_____|

Это также 3x3ASCII-пазл:

 _____ _____ _____
|     |_   _|     |
|  _   _) (_   _  |
|_( )_|_   _|_( )_|
|    _| (_) |_    |
|   (_   _   _)   |
|_   _|_( )_|_   _|
| (_) |_   _| (_) |
|      _) (_      |
|_____|_____|_____|

Каждая строка в мозаике ASCII (за исключением случаев с краями, то есть кусков буквально по краям) состоит из следующего шаблона:

   _           _           _
 _( )_ _   _ _( )_ _   _ _( )_
|_   _| (_) |_   _| (_) |_   _|
 _) (_   _   _) (_   _   _) (_
|_   _|_( )_|_   _|_( )_|_   _| ...
  (_)         (_)         (_)

Принимая во внимание 2 целых числа , Hи Wгде Hвысота ( по вертикали количество) и Wширина (величина горизонтальной) и Hи Wявляются >1выводить возможно HxWASCII - головоломки.

Примеры

Тестовый пример 1

Входные данные: 2, 4

Выход:

 _____ _____ _____ _____
|     |_   _|     |_    |
|  _   _) (_   _   _)   |
|_( )_|_   _|_( )_|_   _|
|    _| (_) |_   _| (_) |
|   (_       _) (_      |
|_____|_____|_____|_____|

Тестовый пример 2

Входные данные: 4, 4

Выход:

 _____ _____ _____ _____
|     |_   _|     |_    |
|  _   _) (_   _   _)   |
|_( )_|_   _|_( )_|_   _|
|    _| (_) |_   _| (_) |
|   (_   _   _) (_   _  |
|_   _|_( )_|_   _|_( )_|
| (_) |_   _| (_) |_    |
|  _   _) (_   _   _)   |
|_( )_|_   _|_( )_|_   _|
|    _| (_) |_   _| (_) |
|   (_       _) (_      |
|_____|_____|_____|_____|

Тестовый пример 3

Входные данные: 3, 5

Выход:

 _____ _____ _____ _____ _____
|     |_   _|     |_   _|     |
|  _   _) (_   _   _) (_   _  |
|_( )_|_   _|_( )_|_   _|_( )_|
|    _| (_) |_   _| (_) |_    |
|   (_   _   _) (_   _   _)   |
|_   _|_( )_|_   _|_( )_|_   _|
| (_) |_   _| (_) |_   _| (_) |
|      _) (_       _) (_      |
|_____|_____|_____|_____|_____|

Тестовый пример 4

Входные данные: 2, 2

Выход:

 _____ _____
|    _|     |
|   (_   _  |
|_   _|_( )_|
| (_) |_    |
|      _)   |
|_____|_____|

Разъяснения

  • Высота и ширина каждого кусочка головоломки не должны увеличиваться или уменьшаться.
  • С Hи Wбыть больше единицы, самые маленькие размеры возможных являются 2x2(см IO 4).
  • Вы можете иметь полную программу или функцию.
  • Ввод будет состоять из 2 строк с H1-го и W2-го, если вы используете функцию, вы можете иметь их в параметрах.
  • Вывод на стандартный вывод (или что-то подобное).
  • Это код-гольф, поэтому выигрывает самый короткий ответ в байтах.
Bobas_Pett
источник
Должны ли выступы кусков быть в чередующихся направлениях?
Згарб
Должен ли я выводить случайным образом или я могу выводить только одну головоломку каждый раз? Если наугад, все ли головоломки должны быть одинаково доступны?
user48538 29.12.16
@Zgarb да, я редактируются в базовой модели каждая строка головоломки следующим
Bobas_Pett
@ zyabin101 вам просто нужно вывести возможную «головоломку ASCII», поэтому только 1 вывод на 1 ввод
Bobas_Pett
1
Первая попытка выглядит так, как будто она окажется в мегабайте. Хороший вопрос
ElPedro

Ответы:

6

JavaScript (ES6) 272 277 271

Редактировать исправление ошибки

Редактировать 2 сохраненных 6 байтов thx @ L.Serné

Редактировать 3 исправление ошибки снова

(w,h,z=(s,q=3,i=h)=>'|  '.slice(0,q)+s.repeat(w).substr(i%2*6+q,w*6-q-~-q)+`  |
`.slice(~q))=>eval("t=z(' _____',0,0)+z('|_   _|     ',2,--h)+z(b=' _) (_   _  ')+z(c='|_   _|_( )_',0);for(a='|_   _| (_) ';--h;)t+=z(a,2)+z(b)+z(c,0)")+z(a,2)+z(' _) (_      ')+z('|_____',1)

Меньше гольфа

(w,h,
  z=(s,q=3,i=h)=>'|  '.slice(0,q)+s.repeat(w).substr(i%2*6+q,w*6-q-~-q)+'  |\n'.slice(~q),
  a='|_   _| (_) ',
  b=' _) (_   _  ',
  c='|_   _|_( )_',
  t=z(' _____',0,0)+z('|_   _|     ',2,--h)+z(b)+z(c,0)
)=>{
  for(;--h;)
    t+=z(a,2)+z(b)+z(c,0);
  return t+z(a,2)+z(' _) (_      ')+z('|_____',1)
}

Тест

F=
(w,h,z=(s,q=3,i=h)=>'|  '.slice(0,q)+s.repeat(w).substr(i%2*6+q,w*6-q-~-q)+`  |
`.slice(~q))=>eval("t=z(' _____',0,0)+z('|_   _|     ',2,--h)+z(b=' _) (_   _  ')+z(c='|_   _|_( )_',0);for(a='|_   _| (_) ';--h;)t+=z(a,2)+z(b)+z(c,0)")+z(a,2)+z(' _) (_      ')+z('|_____',1)

function update() {
  var w=+W.value,h=+H.value
  O.textContent=F(w,h)
}

update()
W<input id=W value=2 oninput='update()' type=number min=2>
H<input id=H value=2 oninput='update()' type=number min=2>
<pre id=O></pre>

edc65
источник
Очень хорошо! Однако игра в гольф доставляет мне неприятности: Nx2 не работает (например, 3x2 дает неопределенное значение | | ( ) | _ | | (_ _) | | _____ | _____ | _____ |, а отправка нечетной высоты приводит к появлению в верхнем правом углу фигуре не хватает ее верхней границы. Похоже, что что-то потеряно в гольфе для гольфа. Редактировать: ошибка "странной высоты" является результатом кода как для игры в гольф, так и для игры в гольф
Bence Joful
@BenceJoful Недостаточно теста после последнего игры в гольф. Сейчас исправлено
edc65
Вы можете переместить объявление последнего аргумента (t) и четвертого аргумента (a) в цикл for (и переместить объявление b и c в объявление t следующим образом: for(t=z(' _____',0,0)+z('|_ _| ',2,--h)+z(b=' _) (_ _ ')+z(c='|_ _|_( )_',0);--h;a='|_ _| (_) ')это сохраняет 4 запятые, поэтому вы в конечном итоге получаете только 273. Символы РЕДАКТИРОВАТЬ: тестовый фрагмент все еще прослушивается ...
Люк
@ L.Serné прослушал как? Вы не можете положить t=...внутрь для, это не удается для h == 2. Это именно та ошибка, которую я исправил сегодня.
edc65
1
np, я поигрался с твоим кодом, и причина обьявления undefinedоказалась aв последней части forцикла. Я немного изменил код и закончил с этим. Вы должны быть в состоянии объединить это с eval для другого сохранения 2B. (w,h,z=(s,q=3,i=h)=>'| '.slice(0,q)+s.repeat(w).substr(i%2*6+q,w*6-2*q+1)+' |\n'.slice(~q),a='|_ _| (_) ')=>{for(t=z(' _____',0,0)+z('|_ _| ',2,--h)+z(b=' _) (_ _ ')+z(c='|_ _|_( )_',0);--h;)t+=z(a,2)+z(b)+z(c,0);return t+z(a,2)+z(' _) (_ ')+z('|_____',1)}(276 В).
Люк
5

Python, 513 байт

def r(m,n):
 r=3*m
 c=6*n
 l=3-(n%2)*3
 z=[1,2,3,4,5,0]
 p=zip
 return"\n".join("".join(" |_()"[[[((j%6,i%3)in[(1,0),(5,0)])*2or((j%6,i%3)in[(0,1),(0,0)])or((j%4,i%6)in[(1,1),(1,2),(3,4),(3,5)])*2or((i%6,j%12)in p(z,[10,2,10,4,8,4]))*4or((i%6,j%12)in p(z,[8,4,8,2,10,2]))*3,1,0][j in[0,c]or((j,i%6)in p([1,1,2,2],[1,2]*2)+p([c-1,c-1,c-2,c-2],[1+l,2+l]*2)or(i,j%12)in[(1,8),(1,9),(1,10),(2,8),(2,9),(2,10),(r-1,9)]or(i,j%12)==(r-1,3+6*(m%2)))*2],2*(j%6>0)or i>0][i in[0,r]]]for j in range(c+1))for i in range(r+1))

Возможно, это скорее упражнение в запутывании, чем в гольфе. Это работает, решая, к какому символу (x,y)относится каждая координата, а не выстраивая каждый паттерн за верёвкой. Похоже, без швов

char_codes = " |_()"
def base(row, col):
    if col % 6 in [5] and row % 3 in [0, 2]:
        return 1
    if col % 6 in [0, 4] and row % 3 in [2]:
        return 2
    return 0

def underscores(row, col):
    if col % 4 in [0] and row % 6 in [0, 1] or col % 4 in [2] and row % 6 in [3, 4]:
        return 2
    return 0

def parentheses(row, col):
    if (row % 6, col % 12) in [(0, 9), (1, 1), (2, 9), (3, 3), (4, 7), (5, 3)]:
        return 4
    if (row % 6, col % 12) in [(0, 7), (1, 3), (2, 7), (3, 1), (4, 9), (5, 1)]:
        return 3
    return 0

def value(row, col):
    return base(row, col) + underscores(row, col) + parentheses(row, col)

def new_value(last_row, last_col, row, column):
    if row in [0, last_row]:
        return 2*(column % 6 > 0) or row>0
    if column in [0, last_col]:
        return 1
    if column in [1,2] and row % 6 in [1, 2]:
        return 0
    if column in [last_col - 1, last_col - 2] and row % 6 in [[4,5],[1,2]][last_col%12>0]:
        return 0
    if row in [1, 2] and column % 12 in [8,9,10]:
        return 0
    if row == last_row - 1 and column % 12 == 9:
        return 0
    return value(row - 1, column - 1)

def puzzle(rows, cols):
    last_row = rows * 3
    last_col = cols * 6
    return "\n".join("".join(new_value(last_row, last_col, row, col) for col in range(last_col + 1)) for row in range(last_row + 1))

Сами узоры выглядят как

мы можем видеть это как таблицу поиска из целых чисел со столбцами, взятыми мод 6 и строк мод 3

 012345
0     |
1
2_   _|

 0123
0_
1_
2
3  _
4  _
5

 0123456789AB
0       ( )
1 ) (
2       ( )
3 ( )
4       ) (
5 ( )

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

walpen
источник
1
Вы можете сэкономить 7 байтов, поместив все это в одну строку, разделенную точкой с запятой
Blue
@Blue Спасибо, приятель, прошло много времени с моего последнего игры в гольф, и я забыл некоторые хитрости.
Walpen
2

Mathematica, 384 байта

(m=#~Mod~2&;a=#~Array~Y&;s=(h="   _  ")[o="|_( )_",z="|_   _",w=" _) (_",z,p="| (_) "];l="|  _  "[o,"|    _",u="|   (_",z,p];r=h[o,q="|_    ",t=" _)   ",z,p];{X,Y}=#;a[" _____"&]<>" \n"<>Join[{a[If[#<Y,z,q]["|     "][[m@#]]&]},Table[Which[y<2,l,y<Y,s,0<1,r][[Mod[x+3y,6]]],{x,3,3X-1},{y,1,Y}],{a[If[#<2,"|     "[u],"      "[If[#<Y,w,t]]][[m[X+#]]]&],a["|_____"&]}]~Riffle~"|\n"<>"|")&

Безымянная функция, принимающая упорядоченную пару целых чисел в качестве аргумента и возвращающую строку, содержащую соответствующие символы новой строки. С добавлением пробелов и переносов:

(m = Mod[#1, 2] &; a = Array[#1, Y] &; 
 s = (h = "   _  ")[o = "|_( )_", z = "|_   _", w = " _) (_", z, p = "| (_) "];
 l = "|  _  "[o, "|    _", u = "|   (_", z, p]; 
 r = h[o, q = "|_    ", t = " _)   ", z, p];
 {X, Y} = #1; 
 a[" _____" &] <> " \n" <>
 Riffle[
   Join[
     {a[If[#1 < Y, z, q]["|     "][[m[#1]]] &]}, 
     Table[
       Which[y < 2, l, y < Y, s, 0 < 1, r][[Mod[x + 3 y, 6]]],
       {x, 3, 3 X - 1}, {y, 1, Y}
     ],
     {a[If[#1 < 2, "|     "[u], "      "[If[#1 < Y, w, t]]][[m[X + #1]]] &],
     a["|_____" &]}
   ], "|\n"
 ] <> "|") &
Грег Мартин
источник
2

Пакет, 562 528 байт

@echo off
set t=!  !
set w=%2
set a= _) (_!_   _! (_) !        _  !_( )_!_   _ _) (_
call:d "!     !_   _" 2 " _____ _____" 4
for /l %%j in (2,1,%1)do call:t
call:d "!_____!_____" 1 "%a:~18,6%%a:~-6%" 3
exit/b
:t
set a=%a:~24%%a:~0,24%
call:d "%a:~6,6%%a:~30,6%" 1 "%a:~0,6%%a:~24,6%" 3
call:c "%a:~12,6%%a:~36,6%" 2
exit/b
:d
call:c %3 %4
:c
set s=
for /l %%i in (%w%,-2,1)do call set s=%~1%%s%%&if %%i==1 call set s=%%s:~6%%
if %2 lss 4 set s=%s%!&call set s=%%t:~0,%2%%%%s:~%2,-%2%%%%t:~-%2%%
echo %s:!=^|%

Доказано, что он устойчив к игре в гольф, поскольку повторение, как правило, обходится слишком дорого, чтобы исключить его, например, я вручную передаю номер строки, номер 3, потому что это слишком дорого для вычисления. Редактировать: Кроме того, я непреднамеренно играл в гольф |каждую третью линию, что неверно. Исправление этого фактически спасло меня 2 байта (4 байта в моей оригинальной версии). Пояснение: aсодержит различные кусочки головоломки. Эти :tфункции свопы их над каждым набором из трех строк, а затем извлекают необходимые подстроки , которые :cфункция затем повторяет в парах, но удаление первого столбца , если wнечетно. Случаи левого и правого края затем обрабатываются до вывода строки. Другой крайний случай - это самая первая строка, в которой !s заменяются пробелами вместо|s (код избегает |s, потому что их сложно обрабатывать в пакетном режиме).

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

Befunge, 263 243 байта

|_   _| (_)
 _) (_   _
|_   _|_( )_

|
|
|_____
 _____
>&:08p3*28p&:18p6*38pv
@#!`g82:,_v0+55+1p84:<_
\g82+g84<| `g83:+1,g\%*6-g852+*6/3+2g84\++%3+2\!:g84*4p85:!!+*`0%6\!*`
6/08g+2%^>>::::48g3/2%2*`\48g3/18g+2%!2*+38g\`*!48g3%0`*\::6/2%!48g\`\

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

Это работает путем итерации по координатам x, y области, которую мы хотим вывести, и сопоставления этих значений x , y с координатами u , v в шаблоне головоломки (сохраненном в первых трех строках игрового поля). Это отображение достигается с помощью следующих основных формул:

u = (x+(y+2)/3*6) % 12
v = (y+2)%3 + (y==0)

У координат повторяется каждые 12 столбцов, но также должна быть компенсирована 6 каждые 3 ряда. V координат повторяется каждые 3 строк, но мы добавим y==0к значению , так что очень первая строка может быть оказана как частный случай. Однако для обработки ребер нам необходимо ввести дополнительное логическое значение e , которое верно для различных положений ребер и которое корректирует формулы следующим образом:

u = (x+(y+2)/3*6) % (e?6:12)
v = (y+2)%3 + (y==0) + e*4

Таким образом, если мы находимся на ребре, мы добавляем 4 к координате v, чтобы использовать более простой шаблон ребер в строках с 5 по 7. И теперь нам также нужно изменить координату u на 6, а не на 12, поскольку этот шаблон ребер повторяется каждые 6 столбцов.

Что касается самого значения e , то для этого требуется довольно сложная формула, поскольку расположение краев охватывает несколько нерегулярную область границы головоломки.

elr = (x <= 2*y/3%2 or x >= w-2*!(y/3+cols)%2) and (y%3 > 0)
etb = (y <= !(x/6%2) or y >= h-(x/6+rows)%2) and (x%6 > 0)
e   = elr or etb

Не вдаваясь в подробности, основной недостаток состоит в том, что elr сопоставляет местоположения кромок вдоль левой и правой границ, а etb сопоставляет местоположения вдоль верхней и нижней границ.

Джеймс Холдернесс
источник
1

JavaScript (ES6), 285 байт

f=
(h,w,a=` _) (_|_   _| (_)    _  |_( )_|_   _      |     |_____`.match(/.{6}/g),g=(l,r,j)=>a[7].slice(0,j)+(a[l]+a[r]).repeat(w).slice(j,w*6+1-j)+`  |`.slice(-j))=>[` _____`.repeat(w),g(1,7,2),...[...Array(--h*3)].map((_,i)=>g(i%6,(i+3)%6,"312"[i%3])),g(h=h%2*6,6-h,3),g(8,8,1)].join`
`
<div oninput=o.textContent=+h.value&&+w.value?f(h.value,w.value):''><input id=h type=number min=1><input id=w type=number min=1><pre id=o>

Это порт моего Пакетного ответа, просто чтобы посмотреть, конкурирует ли он с ответом @ edc65. Раздражающе длинная строка содержит кусочки головоломки. Первые шесть частей представляют два ряда одного столбца внутренней части мозаики. Седьмая часть используется для предпоследней линии головоломки вместо четвертой части. Восьмой кусок используется во второй строке головоломки вместо пятого, а также выполняет двойную функцию в качестве левого края головоломки. Девятый кусок является последней строкой головоломки.

Нил
источник