Hoy es Purim en el que una costumbre es distribuir galletas en forma de triángulo con relleno llamado hamantaschen (singular: hamantasch ). Otra costumbre es beber mucho.
No soy el panadero más perfecto ... ¡Tengo tantos hamantaschen de tamaño irregular para dar y tantos amigos para darles! Si le envié una foto de mis cookies, ¿puede decirme cuántas tengo de qué tamaño y relleno? Pero debido a que es Purim y estoy demasiado borracho para leer mucho código, debe ser un código tan pequeño como puedas.
Definiciones
Talla
Un hamantasch puede ser de cualquier tamaño . El hamantasch más pequeño es de tamaño 1 y se ve así:
/\ --
-- \/
A veces, múltiples hamantaschen pueden superponerse . La siguiente forma cuenta como dos hamantaschen (una talla 1, una talla 2):
/\
/\ \
----
Algunos hamantaschen tienen relleno . Esto se indicará rellenando todos los espacios en blanco con un carácter. Tenga en cuenta que el tamaño 1 hamantaschen no puede tener relleno.
Vamos a nombrar hamantaschen basado en el llenado y el tamaño. Usemos el formato <filling> <size>
y si no está lleno - <size>
(puede usar un espacio en lugar de un -
, pero a Markdown no le gusta eso).
Aquí hay a . 2
, a . 4
y a - 3
:
/\
/./\
---- /./ \
\../ /./ \
\/ --------
Estos son a @ 3
, a . 2
y a - 4
:
/\
/ /\
/\ / /@@\
/..\ / /@@@@\
---- --------
Aquí hay algo más difícil. ¿Ves cómo & 2
tiene menos relleno del que esperas debido a la inclinación de la superposición - 3
? Tiene un - 1
, un & 2
a - 3
y un & 4
:
--------
\ \/&/
\ /\/
\/&/
\/
Entrada
Se le dará un archivo de texto o una sola cadena de hamantaschen (nueva línea final opcional y espacio en blanco final opcionalmente acolchado para que sea par).
Límites
- Puede esperar que la cadena sea válida , es decir, cada carácter que no sea un espacio en blanco contribuye a un hamantasch deliciosamente dulce (¿por qué desperdiciar masa?).
- También puede esperar que se llene correctamente o no, es decir, cada hamantasch se llenará por completo con un carácter ASCII consistente: ASCII 32 para sin llenar, o cualquier cosa 32..127 para lleno (excluyendo
/
,\
y-
). - Estas hamantaschen no se apilan en 3 espacios. Todo
/
y\
será visible. Todos los-
que no están bloqueados/
y\
serán visibles. El relleno es lo último. - Todos los hamantaschen tendrán al menos la mitad de su línea horizontal (redondeando hacia arriba) visible.
- Cualquier bloque contiguo de relleno solo llena el hamantasch más pequeño que lo rodea.
Salida
Devuelva una lista de "nombres" de todos los hamantaschen que se pueden encontrar cumpliendo con los criterios anteriores. El resultado puede estar en la forma que desee (una cadena, un hash, stdout, etc.).
Casos de prueba
Caso de prueba n. ° 1
Entrada # 1:
/\
/ /\
/\ / /@@\
/..\ / /@@@@\
---- --------
/\
/**\
/*/\*\
/*/..\*\
--------
Salida # 1:
. 2
. 2
- 4
@ 3
* 4
Caso de prueba n. ° 2
Entrada # 2:
/\----
/\/\*\/
/ /\d\/
------
Salida # 2:
- 3
- 2
d 2
- 1
* 2
- 1
Prueba n. ° 3
Entrada # 3:
----
\/\/
/\/\ /\
---- /::\
----
Salida # 3:
- 1
- 1
- 2
- 1
- 1
- 2
: 2
Prueba n. ° 4
Entrada # 4:
/\/\
/ /\$\
-/--/\\
--/--\
/xxx/\
/xxx/##\
---/----\
/ \
--------
Salida # 4:
$ 2
x 4
- 3
- 2
- 4
- 1
- 1
# 2
Caso de prueba inválido # 5
Entrada:
/\
\/
Salida:
No necesita manejar esto.
fuente
/
y\
, y-
será siempre el llenado de triunfo.(1,0)
, están desactivadas por+1
. Aún así, sé a qué te refieres, y no estoy de acuerdo. ¿Qué indicación hay de que(2, 2)
es el centro superior de a- 2
y no solo la parte superior derecha e izquierda de los dos- 1
s superiores ? Ninguno que pueda ver. Y la misma lógica se aplica a(3, 2)
. A menos que desee agregar una regla para asumir el máximo hamantaschen posible ...Respuestas:
C #,
496452 bytesEditar: encontré un error con comprobación de límites ... pero también eliminé una carga de bytes que se vieron obligados a comprender mi propio código. Desenrollar la función local ayudó un poco y eliminó el código específico de C # 7. Esta pregunta ha sido muy divertida.
Pruébalo en línea
Programa completo, espera entrada rellenada con espacio para entrada estándar, salidas para salida estándar. La salida es una entrada por línea, con avance de línea final. Las cookies se emiten en orden de tamaño creciente, la parte superior izquierda en primer lugar. Me tomó un buen tiempo entender las reglas, pero creo que pasa todos los ejemplos proporcionados.
Funciona buscando repetidamente en toda la cuadrícula Hamantaschen válido, incrementando el tamaño 'permitido'. Para cada celda, verifica hacia arriba y hacia abajo, siguiendo el
\
y/
a cada lado tanto como sea posible. Si nota que la siguiente fila tiene muchos-
, y el tamaño actual es el tamaño 'permitido', entonces determina el relleno e imprime la entrada.El relleno se encuentra explorando todo el espacio de la cookie, buscando una celda 'no utilizada'. Cuando se encuentra una celda no utilizada, se marca como usada (dado que aumentamos el tamaño permitido, sabemos que somos la cookie más pequeña que la contiene), y registramos el relleno.
Código formateado y comentado:
Salidas para los 4 casos de prueba:
fuente