Todos hemos visto las imágenes subtituladas "¿Cuántos cuadrados hay en esta imagen? ¡El 98% no entenderá esto correctamente!" Bueno, esta es tu oportunidad de reírte de ese 98%.
Entrada
Un bloque rectangular hecho de solo 2 caracteres. En una forma general, esto se define por m líneas, cada una con n caracteres.
Ejemplo:
0000xxx
00x00xx
00000xx
xxxxx0x
Esto se puede representar como una cadena separada por una nueva línea, una matriz de cadenas o una matriz 2D de caracteres. Cualquier otro tipo de entrada debe sugerirse en los comentarios.
Salida
La salida será un número entero que representa la cantidad total de cuadrados representados individualmente por ambos caracteres (en pseudocódigo, num_squares (char1) + num_squares (char2))
Un cuadrado se define como un conjunto de instancias del mismo carácter que delinea completamente un cuadrado geométrico de longitud lateral de al menos 2 . Estos cuadrados no necesitan ser rellenados por el personaje que lo describe. Los siguientes ejemplos ilustran este concepto:
x0
0x // no squares
xxx
x0x
xxx // 1 square of side length 3
0000
0xx0
0xx0
0000 // 1 square of side length 2, 1 square of side length 4
Puntuación
Su programa se puntuará según 2 criterios, en orden descendente de importancia:
- Número de caracteres en su bloque de código que no son parte de un cuadrado, como se definió anteriormente (¡debe intentar minimizar esto!) (Nota: los caracteres dentro de un cuadrado no se consideran automáticamente como parte de ese cuadrado) (Nota 2: las nuevas líneas no cuentan para este puntaje)
- Número de bytes (¡debes intentar minimizar esto!)
El segundo criterio actuará como un desempate para el primero.
Reglas de desafío
- En aras de la flexibilidad, puede optar por utilizar 2 caracteres alfanuméricos para reemplazar el 0 yx de mis ejemplos, siempre que no sean el mismo carácter.
- Cada línea en el rectángulo de entrada debe tener la misma longitud y no debe contener ningún carácter que no sea el 2 especificado para su respuesta al desafío (además del carácter de nueva línea, si corresponde)
- Los cuadrados triviales (cuadrados 1x1 denotados por un solo carácter) no cuentan para la salida. Ellos apestan.
- Su programa no tiene que manejar entradas vacías, pero debe manejar casos en los que no hay cuadrados posibles (cuando una de las dimensiones del rectángulo de entrada es 1)
- También puedes elegir especificar que estás manejando cuadrados alineados en diagonal si disfrutas el desafío. Esto se agregaría a la salida especificada en las especificaciones de desafío.
Ejemplo de este concepto:
Input:
00x00
0x0x0
x000x
0x0x0
00x00
Output: 6 (1 diagonally aligned square of side length 3, 5 diagonally aligned squares of side length 2)
Casos de prueba
Los siguientes son algunos casos de prueba básicos que su programa debe coincidir. El valor entre paréntesis es el resultado si elige contar cuadrados alineados diagonalmente.
Input:
xxxx
x00x
x0xx
xxxx
Output: 2 (2)
Input:
x00000xxx0
Output: 0 (0)
Input:
xxx0x0x000xx0xx0
0x000x00x0x0xx00
00xx0xx00xx0000x
x0x0x0x0x00x0xxx
00xx0xxx00xxx0x0
Output: 0 (5)
Input:
0000
0000
0000
0000
0000
0000
Output: 26 (34)
Input:
xxx00
xx000
Output: 2 (2)
Reglas generales
- Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código.
- Agregar una explicación para su respuesta es muy recomendable.
- ¿Alguna pregunta / corrección / consejo para mí? ¡Comenta abajo! Esta es mi primera pregunta, así que estoy emocionado de aprender tanto como sea posible.
fuente
Respuestas:
Perl, 0 caracteres no en cuadrados (25430 bytes)
Como puede ver, cada personaje es parte de un cuadrado. La mitad superior de cada cuadrado grande se comenta mediante comentarios de línea, y la mitad inferior (incluida la segunda línea no comentada) se escapa mediante un gran documento aquí que comienza en el medio del cuadrado (
<<'';#
) y termina en la línea vacía después de la gran plaza.Este programa se generó automáticamente a partir del siguiente programa:
Que es un programa para resolver el mismo desafío, pero (muy ligeramente) jugó para bytes y longitudes de línea cortas, no para puntaje.
Toma como entradas primero la altura y el ancho del rectángulo, luego los caracteres individuales del rectángulo separados por espacios. Ejemplo de uso: para resolver el rectángulo
llamas al programa así:
perl theprogram.pl 3 5 x x x y y x x y y y x y y x x
De todos modos, al cuadrar el código de esta manera, debería ser posible obtener una puntuación de 0 o 2 con cualquier lenguaje de programación que tenga una solución de una línea y un carácter de comentario de línea, transformando el un trazo
Me gusta esto:
Los únicos caracteres que no forman parte de un cuadrado son los dos espacios. Dependiendo del idioma, también puede haber formas de usar cadenas o comentarios inteligentes de varias líneas (como los documentos de Perl) o algún tipo de código redundante para convertir esos dos caracteres de espacio en un cuadrado.
En cuanto al recuento bajo de bytes, mi solución tiene muchas mejoras inmediatas, y estoy seguro de que también hay muchas otras formas de refinar esta técnica, pero no tengo paciencia para eso; Solo quería ofrecer una demostración para que ustedes puedan volverse locos.
fuente
MAT ,
18161410 caracteres no en cuadrados (92103111127 bytes)La entrada es una matriz de caracteres con caracteres
+
y-
. No cuenta cuadrados diagonales.Pruébalo en línea!
O verifique todos los ejemplos y casos de prueba .
fuente
Jalea ,
20 1917 19081905 bytes , puntaje200Un programa completo que toma una lista de listas
.
y+
personajes. (Funciona para cualquier personaje, incluso más de 2).Pruébalo en línea!
Cualquier intento de reducir la puntuación introduciendo caracteres parece aumentar aún más la puntuación. ¡Creo que la forma de ganar este desafío es encontrar el Lenguaje adecuado !Pero Jelly no tiene carácter de comentario, por lo que se requiere un poco de creatividad extra ...
Los programas Jelly consisten en "Enlaces" - código separado por caracteres de nueva línea, caracteres de pilcrow (
¶
- interpretados como el mismo byte que las nuevas líneas) o caracteres válidos de página de códigos que carecen de un comportamiento definido (en la actualidadq
es un ejemplo). El último realmente cuenta como un Enlace cada uno en lugar de un separador puro. La ejecución del programa comienza en la parte inferior derecha del enlace, el "Enlace principal" (aquí⁽⁽ĿĿ
).Ŀ
⁽⁽ĿĿ
⁽⁽Ŀ
⁽⁽ĿĿ
q
ẆZṡLƊ€ẎṖƇZU$ƬḢ€ẎEƲ€S
q
fuente
¶
que en realidad es solo un proxy para una nueva línea. El programa realmente se parece más a esto¶
s podrían reemplazarse por 9q
s o(
so lo que sea (como dije en la propaganda).q
como pensé que sería: /⁽⁽ĿĿ
evalúaq
es un byte no utilizado? También funciona conu
lo que tampoco se utiliza. </s> no importa