Considere la siguiente cuadrícula estándar de crucigramas de 15 × 15 .
Podemos representar esto en el arte ASCII utilizando #
bloques y (espacio) para cuadrados blancos.
# #
# #
#
# #
### ## ##
## #
# #
# ##
## ## ###
# #
#
# #
# #
Dada una cuadrícula de crucigramas en el formato de arte ASCII anterior, determine cuántas palabras contiene. (La cuadrícula anterior tiene 78 palabras. Resulta ser el rompecabezas del New York Times del lunes pasado ).
Una palabra es un grupo de dos o más espacios consecutivos que se ejecutan vertical u horizontalmente. Una palabra comienza y termina con un bloque o el borde de la cuadrícula y siempre corre de arriba a abajo o de izquierda a derecha, nunca en diagonal o hacia atrás. Tenga en cuenta que las palabras pueden abarcar todo el ancho del rompecabezas, como en la sexta fila del rompecabezas de arriba. Una palabra no tiene que estar conectada a otra palabra.
Detalles
- La entrada siempre será un rectángulo que contenga los caracteres
#
o(espacio), con filas separadas por una nueva línea (
\n
). Puede suponer que la cuadrícula está compuesta de 2 caracteres ASCII imprimibles distintos en lugar de#
y.
- Puede suponer que hay una nueva línea final opcional. Los caracteres de espacio final SÍ cuentan, ya que afectan el número de palabras.
- La cuadrícula no siempre será simétrica, y puede ser todos los espacios o todos los bloques.
- Teóricamente, su programa debería poder trabajar en una cuadrícula de cualquier tamaño, pero para este desafío nunca será mayor que 21 × 21.
- Puede tomar la cuadrícula como entrada o el nombre de un archivo que contiene la cuadrícula.
- Tome la entrada de stdin o los argumentos de línea de comando y la salida a stdout.
- Si lo prefiere, puede usar una función con nombre en lugar de un programa, tomando la cuadrícula como un argumento de cadena y generando un entero o una cadena a través de stdout o retorno de función.
Casos de prueba
Entrada:
# # #
Salida:
7
(Hay cuatro espacios antes de cada uno#
. El resultado sería el mismo si se eliminara cada signo de número, pero Markdown elimina espacios de líneas vacías).Entrada:
## # ##
Salida:
0
(Las palabras de una letra no cuentan).Entrada:
###### # # #### # ## # # ## # #### #
Salida:
4
Entrada: ( rompecabezas del Sunday NY Times del 10 de mayo )
# ## # # # # # # # ### ## # # ## # # # ## # ## # ## # # ### ## # ## ## # ## ### # # ## # ## # ## # # # ## # # ## ### # # # # # # # ## #
Salida:
140
Puntuación
El código más corto en bytes gana. Tiebreaker es la publicación más antigua.
py -3 slip.py regex.txt input.txt
ypy -3 slip.py regex.txt input.txt no
, que son tres bytes (incluido el espacio anteriorn
)Haskell, 81 bytes
Utiliza espacios
como caracteres de bloque y cualquier otro carácter (no espacios en blanco) como una celda vacía.
Cómo funciona: divide la entrada en una lista de palabras en espacios. Tome un
1
por cada palabra con al menos 2 caracteres y sume esos1
s. Aplique el mismo procedimiento a la transposición (división en\n
) de la entrada. Añade ambos resultados.fuente
JavaScript ( ES6 ) 87
121 147Construya la transposición de la cadena de entrada y añádala a la entrada, luego cuente las cadenas de 2 o más espacios.
Ejecute el fragmento en Firefox para probar.
Créditos @IsmaelMiguel, una solución para ES5 (122 bytes):
fuente
F=z=>{for(r=z.split(/\n/),i=0;i<r[j=0][L='length'];i++)for(z+='#';j<r[L];)z+=r[j++][i];return~-z.split(/ +/)[L]}
? Tiene 113 bytes de longitud. Su expresión regular se reemplazó con/ +/
(2 espacios),j=0
se agregó The en elfor
ciclo 'padre' y en lugar de usar la sintaxisobj.length
, cambié a usarL='length'; ... obj[L]
, que se repite 3 veces.F=z=>
, tuve que usarvar F=(z,i,L,j,r)=>
). Lo probé en IE11 y funciona!/\n/
con una cadena de plantilla con una nueva línea real entre ellas. Eso ahorra 1 byte ya que no tiene que escribir la secuencia de escape.Pyth,
151413 bytesEstoy usando
como separador y
#
como caracteres de relleno en lugar de su significado opuesto del OP. Pruébelo en línea: demostraciónEn lugar de
#
como carácter de relleno, esto también acepta letras. Por lo tanto, podría tomar el crucigrama resuelto, e imprimiría la cantidad de palabras. Y si elimina ell
comando, incluso imprime todas las palabras. Pruébalo aquí: el rompecabezas del Sunday NY Times del 10 de mayoExplicación
fuente