Neste desafio, você calculará o tamanho da sua terra.
Escreva um programa ou função que calcule o tamanho da sua terra, considerando um muro que você construiu. Você recebe uma sequência de entrada não vazia contendo um conjunto de 4 caracteres distintos de sua escolha que representam as quatro direções "para cima", "para baixo", "esquerda" e "direita" (usarei ^ v < >
neste desafio). Não é possível fazer curvas de 180 graus ( <>
ou ^v
), mas você pode atravessar a parede.
A maneira como você "captura" a terra é cercando-a com sua parede. O muro em si também é considerado parte de sua terra. Alguns exemplos tornarão mais claro. Usarei o
para terrenos cercados pela parede, x
para a parede em si e S
para o ponto de partida da parede, apenas para ilustrar como a parede é construída. A saída deve ser o tamanho total da sua terra (o número de o
, x
e S
nos casos de teste abaixo).
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"
Esclarecimentos:
- Você não precisa desenhar a parede, a saída deve ser apenas um número inteiro
- O formato de entrada é opcional. Você pode usar uma string com
<>^v
, uma lista de dígitos(1, -1, i, -i)
, uma lista de caracteresABCD
etc.
Este é o código-golfe, portanto o código mais curto em cada idioma vence. Lembre-se, as explicações são importantes, mesmo em idiomas "regulares"!
Respostas:
Python 2 ,
385345332 bytesExperimente online! ou Experimente todos os casos de teste
A entrada é numérica, 0 ~ 3, o índice 0 dos símbolos aqui:
>v<^
Esta é a matriz resultante:
fonte
Oitava,
83858379 bytesExperimente no Octave Online!
Uma função que recebe como entrada um vetor de coluna contendo
(1, -1, i, -i)
Usando a abordagem da resposta do Mathematica do @ lanlock4, adicione o comprimento da entrada às coordenadas para evitar coordenadas não positivas, em vez de subtrair o mínimo de coordenadas delas. 4 bytes salvos.
Resposta anterior:
Experimente no Octave Online!
Alterado para melhor visualização.
Explicação:
fonte
Haskell,
579530 bytesm
é a função principal, que assume uma stringv^<>
e retorna o número inteiro apropriado.Ungolfed:
fonte
Mathematica, 124 bytes
Você provavelmente não ficará surpreso ao saber que o Mathematica possui uma função integrada para medir a área circundada por uma parede. Infelizmente, é muito bytey:
ComponentMeasurements[..., "FilledCount", CornerNeighbors -> False]
.Com isso em mente, aqui está a minha resposta completa. É uma função que recebe uma lista de 1, i, -1 ou -i:
Explicação:
FoldList[#+#2&,2(1+I)Length@#,#]
constrói a parede iniciando na coordenada 2 (1 + i) (comprimento da parede) e adicionando sucessivamente os elementos da lista de entrada. (Temos que começar na coordenada ridiculamente grande 2 (1 + i) (comprimento da parede) para garantir que as coordenadas da parede permaneçam positivas, caso contrário as coisas quebram.)SparseArray[{Re@#,Im@#}&/@...->1]
transforma essas coordenadas de números complexos em pares de números inteiros e cria uma matriz com 1s onde a parede está e 0s em outro lugar.1/.ComponentMeasurements[...,"FilledCount",CornerNeighbors->1<0]&
usa magia interna do Mathematica para medir a área cercada pela parede.fonte
PHP> = 5.6.2, 888 bytes
Versão Online
fonte