Você deve escrever um programa ou função que receba uma string representando um polígono asciótico como entrada e saída para retornar a área do polígono.
A entrada é uma sequência que consiste nos caracteres _ / \ L V space
e newline
define um polígono simples (o que significa que não há segmentos extras, nem toque automático nem interseção automática).
A área de uma célula de um caractere é 2
_
divide a célula em tamanhos0
e2
\
divide a célula em tamanhos1
e1
/
divide a célula em tamanhos1
e1
L
divide a célula em tamanhos0
e2
V
divide a célula em tamanhos1
e1
(Os dois lados doV
sempre estarão no mesmo lado do polígono, para que sejam tratados juntos na lista.)
Cada caractere conecta os dois cantos de sua célula de caracteres que você espera (por exemplo, no canto superior esquerdo e no canto direito V
).
Um exemplo com a área 7 ( 1+2+1
na segunda linha e 1+1+1
na terceira):
_
/ \
V\/
Entrada
- A entrada formará um retângulo, ou seja, haverá o mesmo número de caracteres entre as novas linhas.
- Pode haver espaço em branco extra em qualquer lado do polígono.
- A nova linha à direita é opcional.
Saída
- Um único número inteiro positivo, a área do polígono.
Exemplos
As saídas estão após a última linha de suas entradas.
_
V
1
/L
\/
3
/VV\
L /
L/
14
____/\
\ /
/\/ /
\____/
32
/V\
/ \__
\ /
/\/ /V
L____/
45
Este é o código-golfe, portanto a entrada mais curta vence.
^
intencionalmente?Respostas:
CJam,
48 4329 bytesAtualização : Jogava muito golfe usando matemática e o truque do estado * 2 da resposta do orlp.
Como funciona (desatualizado, atualizando em breve)
Dividimos a entrada na nova linha e, em seguida, para cada parte, mantemos um contador de ocorrências de caracteres de limite
L\/
. Este contador% 2 nos dirá qual das duas partições equivale a escolher para todos os caracteres. Então encontramos o índice de cada caractere na stringL _
.\/V
dará-1
referência ao último elemento em uma matriz. Depois de obter o índice, usamos4558Zb2/
para criar a matriz[[2 0] [0 2] [0 2] [1 1]]
e, em seguida, escolhemos a contagem correta usando o contador.Experimente online aqui
fonte
Pyth,
4746453630Explicação:
Temos dois estados "no polígono" e "fora do polígono". Os seguintes caracteres fazem o seguinte ao lê-los da parte superior esquerda para a parte inferior direita:
Observe que "adicione um à área" e "se estiver no polígono, adicione dois à área" são mutuamente exclusivos.
fonte
x=
funciona. Isso está documentado em algum lugar?+=
ou*=
ou qualquer outra coisa. Nesse caso,x
está sendo usado como xor, portanto é exatamente o mesmo que o do Python^=
.Retina , 293 + 15 = 308
314385bytesCada linha entra em um arquivo separado, então adicionei 13 à contagem de bytes. Como alternativa, você pode colocar tudo isso em um único arquivo como está e usar o
-s
sinalizador. O<empty>
suporte para arquivos ou linhas realmente vazios.Infelizmente, preciso de 187 bytes apenas para converter o resultado de unário para decimal. Eu acho que realmente deveria implementar isso em breve .
Explicação
Retina é uma linguagem baseada em regex (que eu escrevi exatamente para poder fazer coisas assim com regex). Cada par de arquivos / linhas define um estágio de substituição, sendo a primeira linha o padrão e a segunda linha a sequência de substituição. Os padrões podem ser precedidos por uma
`
cadeia de configuração delimitada, que pode conter os modificadores habituais de regex, além de algumas opções específicas da Retina. Para o programa acima, as opções relevantes são;
: suprime a saída desse estágio e+
aplica a substituição em um loop até que o resultado pare de mudar.A idéia da solução é contar cada linha separadamente, porque sempre podemos decidir pelos caracteres já encontrados se estamos dentro ou fora do polígono. Isso também significa que posso unir a coisa toda em uma única linha, porque o início e o fim de uma linha estão sempre fora do polígono. Também podemos observar que
_
e espaço são completamente idênticos para um algoritmo de varredura de linha, assim como\
e/
. Então, como um primeiro passo eu substituir todas as novas linhas e espaços,_
e todos\
por/
simplificar algum código mais tarde.Estou acompanhando o atual estado interno / externo com os personagens
i
eo
, ao mesmo tempo, usando osi
s para registrar a área. Para fazer isso, começo acrescentando umo
à linha unida para marcar que estamos fora do polígono. Também estou adicionando umiio
no final da entrada, que usarei como uma pesquisa para gerar novos caracteres.Então, o primeiro substituto grande simplesmente substitui um
i
ouo
seguido por um/V_L
com o próximo conjunto de caracteres, inundando e contabilizando a coisa toda. A tabela de substituição é a seguinte, onde as colunas correspondem ao último caractere nessa linha e as linhas ao próximo caractere (ondeS
é para espaço e<>
para uma sequência vazia). Incluí todos os caracteres da entrada para mostrar as equivalências das quais já usei:Observe que o caractere final sempre indica se, após o caractere, estamos dentro ou fora do polígono, enquanto o número de
i
s corresponde à área que precisa ser adicionada ao polígono. Como exemplo, aqui estão os resultados das quatro primeiras iterações na entrada do último exemplo (isso foi gerado por uma versão antiga que realmente inundou cada linha separadamente, mas o princípio ainda é o mesmo):Por fim, acabo de me livrar de todos os
o
sebras de linha removendo tudo o que corresponde[^i]
, e o restante é a conversão de decimal para unário, o que é bastante chato.fonte
Perl,
6558 bytesfonte
$/=\1;$-^=2*y,/\\L,,,$a+=y,/\\V,,||$-for<>;print$a
GNU sed, 290 + 1
O +1 é responsável pela
-r
mudança passada para sed. Comentários e espaços em branco adicionais não são contados na pontuação.Não olhei em detalhes, mas acho que isso provavelmente é semelhante à resposta de Martin na Retina :
visão global
:
Notas
sed
is line oriented so needs some work to process multiple lines at once. TheN
command does this by appending a newline then the next line to the current pattern space. The difficulty withN
is that once it gets to the input stream EOF, it quitssed
completely without any option to do further processing. To get around this, we count the current set of colons at the end of each line, just before reading in the next line.Output:
fonte
C, 93
96 108bytesEditar: levou em conta as sugestões nos comentários, converteu o tempo em um loop for de instrução única e removeu completamente a variável "i".
Post original:
Parecia um problema divertido e simples o suficiente para finalmente criar uma conta aqui.
O texto do polígono deve ser passado como o primeiro argumento da linha de comando; isso deve funcionar com ou sem qualquer quantidade de novas linhas / espaços em branco.
Isso apenas lê no polígono, um caractere de cada vez, s alterna atualmente dentro ou fora do polígono em '/', 'L' ou '\', e t aumenta 1 em '/', 'V', e '\', ou por 2 se dentro / 0 se fora em 'L', '_', espaço e nova linha.
This is my first time trying my hand at any sort of "golfing" (or C, to the extent it differs from C++), so any criticisms are appreciated!
fonte
i=t=s=0;
I think C initializes allint
s to 0 anyway. Also, see if you can turn thewhile
loop into afor
loop; that often saves a few bytes....int i,t,s;for(i=t=s=0;c=v[1][i++];t+=s+(c>46^!(c%19)^s))s^=c>13^c%9>4;...
which should save 4 bytes; one {, one } and two ;int i,t,v;
was to be put in front ofmain
instead of inside we could get rid ofi=t=s=0
altogether saving another 7 bytes.POSIX sed,
245244POSIX sed, no extensions or extended regexps. Input is limited to the maximum hold space size of sed - POSIX mandates at least 8192; GNU manages more. This version assumes that there will be no blank lines before or after the shape; an extra 10 bytes of code, indicated in the expansion, can accommodate that if it's a requirement (original question doesn't specify).
Expanded and annotated
fonte
C, 84 bytes
Mudamos de lado sempre que vemos
\
,/
ouL
; sempre adicionamos um para\\
,/
ouV
, mas adicionamos 2 (se dentro) ou 0 (se fora) para espaço, nova linhaL
ou_
.As variáveis
a
ei
estão a ser assumida zero na entrada - que deve ser redefinido se a função está a ser chamado mais de uma vez.Ungolfed:
Programa de teste:
fonte