Rompecabezas ASCII

27

Este es un 3x3rompecabezas ASCII:

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

Este también es un 3x3rompecabezas ASCII:

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

Cada línea en un rompecabezas ASCII (excluyendo las cajas de borde, es decir, las piezas literalmente en los bordes) consta del siguiente patrón:

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

Dados 2 enteros Hy Wdónde Hestá la altura (cantidad vertical) y Wes el ancho (cantidad horizontal) Hy Wse >1generan un posible HxWrompecabezas ASCII.

Ejemplos

Caso de prueba 1

Entrada: 2, 4

Salida:

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

Caso de prueba 2

Entrada: 4, 4

Salida:

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

Caso de prueba 3

Entrada: 3, 5

Salida:

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

Caso de prueba 4

Entrada: 2, 2

Salida:

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

Aclaraciones

  • La altura y el ancho de cada pieza del rompecabezas no deben ampliarse o reducirse.
  • Con Hy Wsiendo mayor que uno, las dimensiones más pequeñas posibles son 2x2(ver IO 4).
  • Puede tener un programa completo o una función.
  • La entrada será de 2 líneas con Hla primera y Wla segunda si está utilizando una función que puede tener en los parámetros.
  • Salida a stdout (o algo similar).
  • Este es el código de golf, por lo que la respuesta más corta en bytes gana.
Bobas_Pett
fuente
¿Deben las pestañas de las piezas estar en direcciones alternas?
Zgarb
¿Debo generar al azar o puedo generar solo un rompecabezas cada vez? Si es aleatorio, ¿todos los rompecabezas deberían estar disponibles de manera uniforme?
usuario48538
@ Zgarb sí, edité en el patrón básico que sigue cada línea en el rompecabezas
Bobas_Pett
@ zyabin101 solo necesita generar un posible "rompecabezas ASCII", por lo que solo 1 salida para 1 entrada
Bobas_Pett
1
Parece que el primer intento va a terminar en aproximadamente un megabyte. Buena pregunta.
ElPedro

Respuestas:

6

JavaScript (ES6) 272 277 271

Editar corrección de errores

Editar 2 guardados 6 bytes thx @ L.Serné

Editar 3 corrección de errores nuevamente

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

Menos golf

(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)
}

Prueba

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
fuente
¡Muy agradable! Sin embargo, la versión de golf me está causando problemas: Nx2 no funciona (por ejemplo, 3x2 produce indefinido | | ( ) | _ | | (_ _) | | _____ | _____ | _____ | y enviar una altura impar resulta en la esquina superior derecha pieza que falta su borde superior. Parece que algo se perdió en el campo de golf. Edición: el error de "altura extraña" es el resultado del código de golf y no golf.
Bence Joful
@BenceJoful No hay suficiente prueba después del último golf. Ahora arreglado
edc65
Puede mover la declaración del último argumento (t) y el cuarto argumento (a) al bucle for (y mover la declaración de byc dentro de la declaración de t de esta manera:. for(t=z(' _____',0,0)+z('|_ _| ',2,--h)+z(b=' _) (_ _ ')+z(c='|_ _|_( )_',0);--h;a='|_ _| (_) ')Esto ahorra 4 comas, por lo que termina con solo 273 caracteres. EDITAR: El fragmento de prueba todavía tiene errores ...
Luke
@ L.Serné fastidió cómo? No puedes poner t=...dentro de for, falla para h == 2. Es exactamente el error que solucioné hoy.
edc65
1
np, jugué con su código, y la causa del undefinedresultado fue declarar aen la última parte del forbucle. Cambié un poco el código y terminé con esto. Debería poder integrar eso con la evaluación para otro 2B guardar. (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 B).
Lucas
5

Python, 513 bytes

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))

Quizás sea más un ejercicio de ofuscación que de golf, este funciona decidiendo a qué personaje (x,y)va cada coordenada en lugar de construir cada patrón por cuerda. Sin golf parece

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))

Los patrones en sí se parecen

podemos ver esto como una tabla de búsqueda de enteros con columnas tomadas mod 6 y filas mod 3

 012345
0     |
1
2_   _|

 0123
0_
1_
2
3  _
4  _
5

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

Esta estrategia de combinar diferentes patrones no me ha funcionado realmente porque expresarlos es bastante engorroso (aunque creo que podría haber jugado más al golf) y porque los casos extremos requieren tantos caracteres para solucionarlos. Estoy poniendo esto de todos modos porque me tomó un minuto y podría ser de interés.

Walpen
fuente
1
Puede guardar 7 bytes poniendo todo en 1 línea separada por punto
Azul
@Blue Gracias amigo, ha pasado un tiempo desde mi último golf y he olvidado algunos trucos.
walpen
2

Mathematica, 384 bytes

(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"<>"|")&

Función sin nombre que toma un par ordenado de enteros como argumento y devuelve una cadena que contiene líneas nuevas apropiadas. Con espacios y líneas nuevas agregadas:

(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"
 ] <> "|") &
Greg Martin
fuente
2

Lote, 562 528 bytes

@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:!=^|%

Probó resistencia al golf, ya que la repetición tendía a costar demasiados bytes para eliminar, por ejemplo, paso manualmente el número de línea mod 3 porque es demasiado costoso de calcular. Editar: Además, inadvertidamente jugué golf extra |cada tercera línea, lo cual es incorrecto. Arreglar esto realmente me ahorró 2 bytes (4 bytes en mi versión original). Explicación: acontiene varios bits de rompecabezas. La :tfunción los intercambia sobre cada conjunto de tres filas, luego extrae las subcadenas requeridas que la :cfunción luego repite en pares, pero elimina la primera columna si wes impar. Los casos de borde izquierdo y derecho se manejan antes de que se envíe la fila. El otro caso de borde es la primera fila en la que las !s se cambian a espacios en lugar de|s (el código evita |s porque son difíciles de manejar en Batch).

Neil
fuente
2

Befunge, 263 243 bytes

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

|
|
|_____
 _____
>&: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\`\

Pruébalo en línea!

La forma en que esto funciona es iterando sobre las coordenadas x, y del área que queremos generar, y asignando esos valores x , y a las coordenadas u , v en el patrón del rompecabezas (almacenado en las primeras tres líneas del campo de juego). Este mapeo se logra con las siguientes fórmulas básicas:

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

La coordenada u se repite cada 12 columnas, pero también debe compensarse con 6 cada 3 filas. La coordenada v se repite cada 3 filas, pero agregamos y==0al valor para que la primera fila se pueda representar como un caso especial. Sin embargo, para manejar los bordes, necesitamos introducir un valor booleano adicional, e , que es cierto para varias ubicaciones de bordes, y que ajusta las fórmulas de la siguiente manera:

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

Por lo tanto, si estamos en un borde, agregamos 4 a la coordenada v para usar el patrón de borde más simple en las líneas 5 a 7. Y ahora también necesitamos modificar la coordenada u por 6 en lugar de 12, ya que este patrón de borde Se repite cada 6 columnas.

En cuanto al valor e en sí, eso requiere una fórmula bastante compleja, ya que las ubicaciones de los bordes abarcan un área algo irregular del borde del rompecabezas.

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

Sin entrar en demasiados detalles, el desglose básico es que elr coincide con las ubicaciones de los bordes a lo largo de los bordes izquierdo y derecho, mientras que etb coincide con las ubicaciones a lo largo de los bordes superior e inferior.

James Holderness
fuente
1

JavaScript (ES6), 285 bytes

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>

Este es un puerto de mi respuesta Batch, solo para ver si compite con la respuesta de @ edc65. La cadena molestamente larga contiene piezas de rompecabezas. Las primeras seis piezas representan dos filas de una columna del interior del rompecabezas. La séptima pieza se usa para la penúltima línea del rompecabezas, en lugar de la cuarta pieza. La octava pieza se usa en la segunda línea de la sierra de calar, en lugar de la quinta pieza, y también cumple una doble función como el borde izquierdo de la sierra de calar. La novena pieza es la última línea del rompecabezas.

Neil
fuente