Introducción
Recientemente ha aceptado una oferta de trabajo en Pretty Good Software Company. Estás bastante contento con el tamaño de tu oficina, pero ¿tienes la oficina más grande ? Es un poco difícil de distinguir simplemente mirando las oficinas de tus compañeros de trabajo cuando pasas por aquí. La única forma de resolver esto es examinar los planos del edificio ...
Tu tarea
Escriba un programa, script o función que tome un plano de planta para su edificio e indique si su oficina es la más grande. El plano de planta es fácil de leer porque el edificio es un cuadrado de n por n .
La entrada consistirá en n + 1 \n
líneas delimitadas. La primera línea tendrá el número n . Las siguientes n líneas serán el plano del edificio. Un ejemplo de entrada simple:
6
......
. . .
.X . .
. . .
. . .
......
Las reglas para el plano son las siguientes:
.
(ASCII 46) Se utilizará para representar paredes.(Espacio [ASCII 32]) se utilizará para representar el espacio abierto.
- Estás representado por un
X
(ASCII 88). Estas en tu oficina - El plano será de n líneas, cada una con n caracteres.
- El edificio está totalmente rodeado de paredes por todos lados. Esto implica que la segunda línea de entrada (la primera línea del plano de planta) y la última línea de entrada serán todas
.
s. También implica que el primer y último carácter de cada línea del plano será.
s. - El tamaño de una oficina se define como la suma de espacios adyacentes (contiguos moviéndose en 4 direcciones, N, S, E, W, sin atravesar una pared).
- Para el tamaño de la oficina, la X que lo representa cuenta como un
(espacio abierto)
- 4 <= n <= 80
Debe indicar si su oficina es estrictamente más grande que todas las demás. La salida puede ser cualquier cosa que signifique inequívocamente Verdadero o Falso en el lenguaje de programación de su elección y se adhiera a las convenciones estándar de cero, nulo y vacío que significa Falso. Verdadero implica que su oficina es estrictamente la más grande.
Salida de muestra para la entrada anterior:
1
Porque su oficina es de 8 pies cuadrados, y la única otra oficina es de 4 pies cuadrados.
Pautas de E / S
- La entrada puede leerse desde stdin, y responder la salida a stdout.
O
- La entrada puede ser un argumento de cadena única para una función, y la respuesta será el valor de retorno de esa función.
Preguntas más frecuentes
- Todo el edificio consta de muros y oficinas.
- El edificio es de una sola planta.
- Se garantiza que haya una X en la entrada, pero no se garantiza que haya ningún espacio. Podrías tener una oficina 1x1 y el resto del edificio son paredes (¡tienes la oficina más grande! ¡Hurra!).
Otro ejemplo
10
..........
. . . .
. . . .
. . . .
. .. . .
.. .
..........
. X .
. .
..........
Aquí hay 3 oficinas, su oficina sur es rectangular, la oficina noroeste es un triángulo (ish) y la oficina noreste está extrañamente deformada, pero es más grande que la suya. La salida debe ser False.
¡Es un desafío escribir el código más corto, feliz código de golf !
fuente
X
permitido en la entrada. :)Respuestas:
Ruby 2.0, 133 caracteres
Una colaboración con @Ventero. ¡Siempre es una buena señal cuando comienza a romper el resaltador de sintaxis!
Esta es una solución recursiva de relleno de inundación. Lecturas de STDIN y salidas a STDOUT:
Ver que se ejecuta en Ideone .
fuente
f
un poco:f=->l{a=[*l];a.product([~n,-1,1,n+1]){|p,d|a|=[p+d]if$_[p+d]<?.};a!=l ?f[a]:l.size}
. Y me corrija si estoy equivocado, pero parece que en realidad no importa si la primera línea que contiene la longitud se deja en$_
, lo que permitirá acortar el análisis de entrada agets$e;n=$_.to_i
gets(p)
comop
no hace nada y devuelvenil
si se llama sin argumento.product
devuelve el receptor para eliminar porl
completo:f=->*a{a.product([~n,-1,1,n+1]){|p,d|a|=[p+d]if$_[p+d]<?.}!=a ?f[*a]:a.size}
- desafortunadamente no podemos cambiar los valores de lhs y rhs!=
para eliminar el espacio, ya que de lo contrario ambos lados apuntan a la matriz no modificada.String#scan
yARGV
encontrar la habitación más grande se puede acortar un poco:$_.scan(/ /){$*<<f[$
.size]}; p $ *. Max <f [~ / X /] `n
enf
algo así[~n=$_.to_i,...]
, puedes combinar la primera y la tercera líneagets(p).scan(...
para obtener un total de 134 caracteres.GolfScript (85 bytes)
Demostración en línea
Esto tiene tres secciones:
Una transformación de entrada inicial que produce una matriz 2D usando
0
para representar un muro,N
(el número total de celdas) para representar mi posición inicial, y un número distinto entre ellos para cada uno de los espacios abiertos.Un diluvio.
El conteo final. Esto utiliza una variante en la punta para el elemento más común en una matriz , agregando un interruptor de desempate contra el cual se influye
N
.fuente
qN/(~_*:T:U;{[{i5%[0_U(:UT]
=}/]}%{{[{_2$*!!{[\]$W=_}*}*]}%z}T*:+0-:A{_T=A@-,2*+}$0=T=
.Javascript (E6)
155292Versión base sin golf
Prueba
Consola Javascript en Firefox
F('6\n......\n. . .\n.X . .\n. . .\n. . .\n......')
F('10\n..........\n. . . .\n. . . .\n. . . .\n. .. . .\n.. .\n..........\n. X .\n. .\n..........\n')
fuente
1
para mí también (en Firefox 30.0)C #,
444372 / (342 gracias HackerCow) bytesPuntaje bastante pobre y tarde a la fiesta, pero parece funcionar. Salidas 1 cuando tiene la oficina más grande, 0 cuando no la tiene. Todavía no he sido muy intrincado con el golf. Funciona construyendo conjuntos disjuntos a partir de la entrada (primer bucle), calculando el tamaño de cada conjunto (segundo bucle) y luego mirando para ver si mi conjunto es el más grande (tercer bucle).
Se proporcionan dos versiones, una es un programa compilable que acepta la entrada desde la línea de comandos, la otra es solo una función que espera una cadena como entrada y devuelve un int como resultado (y es solo una copia reelaborada de la primera): no necesita cláusulas de uso o similares, debería poder colocarlo en cualquier lugar y funcionará.
Programa 372bytes :
Función 342bytes :
Menos golfizado:
fuente
Main
función y la reemplaza con, digamosint f(string s)
que podría usar ens.Split('\n')[0]
lugar deConsole.ReadLine()
y regresar1
o0
. Esto debería ahorrarle mucho códigoCJam, 106 bytes
Un enfoque diferente para el relleno de inundaciones. Aunque, lo hace más largo ...
Pruébalo aquí
fuente
Python 2 - 258 bytes
usa stdin para entrada
Nota: primero
if
está sangrado por un solo espacio, otras líneas sangradas están usando una sola pestaña char o una pestaña y un espacio.fuente
J:
150121 bytesEditar :
id
ycomp
fueron ridículamente complicados y lentos. Ahora funciona cambiando el mapa 4 veces, en lugar de escanearlo con una ventana de 3x3 usandocut
(;.
).Toma como argumento el plano como cadena. Explicado a continuación:
fuente
Python 2 - 378 bytes
Guau. Estoy fuera de práctica.
Esta es una respuesta de función, pero contamina el espacio de nombres global. Si esto es inaceptable, se puede arreglar al costo de 1 byte:
Tenía toda una larga explicación escrita, pero aparentemente no se guardó correctamente y no lo volveré a hacer lmao
fuente