En este desafío, calcularás cuán grande es tu tierra.
Escriba un programa o función que calcule el tamaño de su tierra, dado un muro que ha construido. Se le proporciona una cadena de entrada no vacía que contiene un conjunto de 4 caracteres distintos de su elección que representan las cuatro direcciones "arriba", "abajo", "izquierda" y "derecha" (usaré ^ v < >
en este desafío). No es posible tomar giros de 180 grados ( <>
o ^v
), pero puede cruzar la pared.
La forma en que "captura" la tierra es rodeándola con su muro. El muro en sí también se considera parte de su tierra. Algunos ejemplos lo aclararán más. Lo usaré o
para terrenos que han sido rodeados por el muro, x
para el muro mismo y S
para el punto de partida del muro, solo para ilustrar cómo está construido el muro. El resultado debe ser el tamaño total de su tierra (el número de o
, x
y S
en los casos de prueba a continuación).
Input: >>>>
Land: Sxxxx
Output: 5
Input: <<<^^^>>>vv
Land:
xxxx
xoox
xoox
xxxS
Output: 16
Input: <<<^^^>>>v
Land:
xxxx
x x
x
xxxS
Output: 11
Input: <
Land: xS
Output: 2
Input: >>>>>>vvvvvvvvv<<<<<^^^^>>>>>>>>vvvvvvvvvv<<<<<<<<<<<<<<<^^^^^^^^^>>>vvvvvv<<<<<
Land:
Sxxxxxx
x
x
x
x
xxxxxxxxx
xxxx xoooox x
xoox xoooox x
xoox xoooox x
xoox xxxxxx x
xoox x
xoox x
xxxxxx x
x x
x x
xxxxxxxxxxxxxxxx
Output: 101
Input: >>vvvv>>^^<<<<^
Land:
Sxx
xox
xxxxx
xox
xxx
Output: 17
Input: <<^^^>>>vv
Land:
xxxx
x x
x x
xxS
Output: 11 <- Note, diagonal edges do not close the "loop"
Aclaraciones:
- No necesita dibujar el muro, la salida solo debe ser un número entero
- El formato de entrada es opcional. Puede tomar una cadena con
<>^v
, una lista de dígitos(1, -1, i, -i)
, una lista de caracteres,ABCD
etc.
Este es el código de golf, por lo que gana el código más corto en cada idioma . ¡Recuerde, las explicaciones son importantes, incluso en los idiomas "normales"!
Respuestas:
Python 2 ,
385345332 bytesPruébalo en línea! o Pruebe todos los casos de prueba
La entrada es numérica, 0 ~ 3, el índice 0 de los símbolos aquí:
>v<^
Esta es la matriz resultante:
fuente
Octava,
83858379 bytesPruébalo en Octave Online!
Una función que toma como entrada un vector de columna que contiene
(1, -1, i, -i)
Usando el enfoque de la respuesta de Mathematica de @ lanlock4, agregue la longitud de la entrada a las coordenadas para evitar coordenadas no positivas, en lugar de restarles un mínimo de coordenadas. Guardado 4 bytes.
Respuesta anterior:
Pruébalo en Octave Online!
Cambiado para una mejor visualización.
Explicación:
fuente
Haskell,
579530 bytesm
es la función principal, que toma una cadenav^<>
y devuelve el entero apropiado.Sin golf:
fuente
Mathematica, 124 bytes
Probablemente no se sorprenda al saber que Mathematica tiene una función incorporada para medir el área rodeada por una pared. Por desgracia, es bastante bytey:
ComponentMeasurements[..., "FilledCount", CornerNeighbors -> False]
.Con eso en mente, aquí está mi respuesta completa. Es una función que toma una lista de 1, i, -1 o -i:
Explicación:
FoldList[#+#2&,2(1+I)Length@#,#]
construye el muro comenzando en la coordenada 2 (1 + i) (longitud del muro) y agregando sucesivamente los elementos de la lista de entrada. (Tenemos que comenzar en la coordenada ridículamente grande 2 (1 + i) (longitud de la pared) para asegurarnos de que las coordenadas de la pared se mantengan positivas, de lo contrario las cosas se romperán).SparseArray[{Re@#,Im@#}&/@...->1]
convierte estas coordenadas de números complejos a pares de enteros, y forma una matriz con 1s donde está el muro y 0s en otro lugar.1/.ComponentMeasurements[...,"FilledCount",CornerNeighbors->1<0]&
usa la magia incorporada de Mathematica para medir el área encerrada por la pared.fuente
PHP> = 5.6.2, 888 bytes
Versión en línea
fuente