Tangencialmente inspirado por la apertura del libro What-If.
La entrada es un rectángulo de espacios como una cadena, lista de cadenas, etc., con objetos hechos de #
's dentro:
########
# #
########
### ####
### ####
###
Los objetos siempre serán rectángulos que no se crucen ni se crucen. Un objeto blando se define como un objeto que no se llena con #
's en el medio y es solo un borde, un objeto duro es uno que se llena. Un objeto con ancho o alto <=2
se considera duro. Todos los objetos son duros o blandos.
Si hay más objetos duros en la entrada, salida "Hard"
, si es más suave, salida "Soft"
, si son iguales, salida "Equal"
.
Este es el código de golf , por lo que gana el código más corto en bytes
Casos de prueba
Estos casos no son entradas completas, sino cómo se debe caracterizar cada objeto. La entrada real será como el arte ascii en la parte superior de la pregunta.
Difícil
#
####
##
##
##########
##########
##########
Suave
###
# #
###
###################
# #
# #
# #
###################
####
# #
# #
# #
# #
# #
# #
# #
####
Casos de prueba reales
########
# #
########
### ####
### ####
###
Hard
###
###
###
###################
# #
# #
# #
###################
Equal
######
# #
######
###
## # # #
###
########
# #
########
Soft
fuente
Respuestas:
MAT ,
105104585049 bytes¡Gracias a @Neil por una sugerencia que me permitió eliminar 46 bytes!
La entrada es una matriz de caracteres 2D, con filas separadas por
;
. El ejemplo en el desafío esAquí hay otro ejemplo:
Esto corresponde a
y así debería dar
'Equal'
.Como tercer ejemplo, correspondiente a
'Soft'
,es decir,
Pruébalo en línea!
Explicación
Esto utiliza convolución 2D para detectar formas. La entrada se convierte en una matriz 2D con
1
indicación#
y-1
para espacio; y se rellena con un marco de-1
valores. Esto asegura que también se detecten formas en el borde del campo original.La máscara detecta un objeto blando
que corresponde a la esquina superior izquierda del objeto con un punto interior vacío. Tenga en cuenta que la convolución invierte la máscara, por lo que se define como
[-1 1; 1 1]
en el código. El número S de posiciones en las cuales la convolución4
es igual es el número total de objetos blandos.La máscara detecta un objeto (blando o duro)
que corresponde a la esquina superior izquierda del objeto junto con algunos puntos exteriores vacíos. Esta máscara es la versión negada de la anterior, por lo que el resultado de convolución anterior se puede reutilizar. Específicamente, el número T de posiciones en las que ese resultado
-4
es igual es el número total de objetos.El número H de objetos duros es T - S . La cadena de salida se determina por el signo de S - H = 2 * S - T .
fuente
JavaScript (ES6),
123121118 bytes¡Ahorré 2 bytes gracias a @ edc65!
Toma la entrada como una cadena multilínea rellenada con espacios para formar una cuadrícula.
Explicación / Prueba
Muy cerca de la longitud MATL!Básicamente, busca la línea superior de#
s de cada objeto, y si la longitud de la línea superior es inferior a 2 o los primeros 2 caracteres debajo de la línea superior son iguales, es difícil, de lo contrario suave.fuente
###
vuelveEqual
.~g.search(/$/m)
es un poco más legible que~g.search`\n`||-1
.||-1
para solucionarlo, pero su sugerencia me hizo darme cuenta de que agregar|$
a la expresión regular ahorraría 2 bytes de todos modos. ¡Gracias!n=l=...
n>l?...:n<l?...:...
Gelatina,
5049464338343332 bytesPruébalo en línea! o verificar todos los casos de prueba .
Antecedentes
Hay 16 diferentes 2 x 2 patrones de bloques y espacios:
De estos, dado que dos objetos nunca se tocarán,
nunca ocurrirá en la entrada, dejándonos con 14 patrones posibles.
Asignando
un valor de 0 y
#
un valor de 1 , podemos codificar un patrón 2 × 2como 2 (2a + c) + (2b + d) = 4a + 2b + 2c + d , dejando los siguientes valores para los 14 patrones.
Para patrones parciales 2 × 1 , 1 × 2 o 1 × 1 en el borde inferior y / o derecho, los trataremos como si estuvieran rellenados con espacios, codificándolos como 4a + 2b , 4a + 2c y 4a , respectivamente .
De esta manera, cada objeto (blando o duro) tendrá exactamente un patrón 4 (su esquina inferior derecha); cada objeto blando tendrá exactamente dos 7 patrones (su esquina inferior izquierda y su esquina superior derecha).
Por lo tanto, restando la cantidad de 4 patrones del número de 7 patrones encontrados en la entrada dará (s + h) - 2s = h - s: = d , donde h y s son la cantidad de objetos duros y blandos que forman.
Imprimimos Hard si d> 0 , Soft si d <0 e Igual si d = 0 .
Cómo funciona
fuente
Julia,
999593 bytes!
espera una matriz de Char bidimensional como argumento. Pruébalo en línea!Cómo funciona
Esto usa casi exactamente la misma idea que mi respuesta de Jelly , con una mejora:
En lugar de contar la cantidad de 4 'y 7 ' s, eliminamos todos los demás números, luego restamos 5.5 al mapa (4, 7) a (-1.5, 1.5) . De esta manera, el signo de la suma de las diferencias resultantes determina la salida correcta.
fuente
TSQL,
328249 bytesDeclaración de variables y datos de prueba:
Código:
Código desinflado:
Explicación:
Script está escaneando el texto para el patrón:
Cada uno de esos es el comienzo de una caja
Para esas posiciones, el script verifica el patrón, no es necesario verificar la primera x:
Cuando eso existe es un objeto blando, de lo contrario es un objeto duro.
fuente