A bússola de 32 pontos é ... interessante, para dizer o mínimo.
Por Denelson83 (Trabalho próprio) [ GFDL ou CC-BY-SA-3.0 ], via Wikimedia Commons
Seu desafio é tomar uma medida de grau e convertê-la em uma direção na bússola de 32 pontos.
Cada direção tem 11,25 (360/32) graus a mais que a anterior. Por exemplo, N (norte) é 0 graus, NbE (norte a leste) é 11,25 graus, NNE (norte-nordeste) é 22,5 graus, etc.
Quanto a como você deve obter as instruções,
0 graus é N, 90 graus é E, 180 graus é S e 270 graus é W.
- Essas são chamadas direções cardinais.
Os pontos intermediários entre as direções cardinais são simplesmente as direções cardinais entre as concatenadas. N ou S sempre são os primeiros e W ou E são os segundos.
- Essas são chamadas direções ordinais.
Os pontos intermediários entre as direções cardinal e ordinal são as direções entre as quais são concatenadas, novamente, com um "-" no meio. As direções cardeais vão primeiro, segundo ordinal.
- Estes são chamados de direções intercardinais secundárias.
Os pontos intermediários entre as direções secundário-intercardinal e outras direções são as outras direções "por" a direção cardinal mais próxima (diferente da diretamente ao lado delas, é claro).
- Não faço ideia do que se chama: P
Se toda essa explicação machuca seu cérebro tanto quanto o meu, você pode consultar este gráfico:
1 North N
2 North by east NbE
3 North-northeast NNE
4 Northeast by north NEbN
5 Northeast NE
6 Northeast by east NEbE
7 East-northeast ENE
8 East by north EbN
9 East E
10 East by south EbS
11 East-southeast ESE
12 Southeast by east SEbE
13 Southeast SE
14 Southeast by south SEbS
15 South-southeast SSE
16 South by east SbE
17 South S
18 South by west SbW
19 South-southwest SSW
20 Southwest by south SWbS
21 Southwest SW
22 Southwest by west SWbW
23 West-southwest WSW
24 West by south WbS
25 West W
26 West by north WbN
27 West-northwest WNW
28 Northwest by west NWbW
29 Northwest NW
30 Northwest by north NWbN
31 North-northwest NNW
32 North by west NbW
Aqui está um gráfico mais detalhado e, possivelmente, uma melhor explicação dos pontos da bússola.
Seu desafio é obter entradas em graus e exibir o nome completo da direção da bússola a que corresponde, juntamente com sua abreviação.
Casos de teste:
Input Output
0 North N
23.97 North-northeast NNE
33.7 Northeast by north NEbN
73.12 East-northeast ENE
73.13 East by north EbN
219 Southwest by south SWbS
275 West W
276 West by north WbN
287 West-northwest WNW
Toda capitalização deve ser preservada, como nos casos de teste. O número máximo de casas decimais é 2. Todos os números de entrada serão maiores ou iguais a 0 e menores que 360. Se houver um ponto decimal, haverá dígitos nos dois lados (você não precisa manipular .1
ou 1.
).
Isso é código-golfe , então o código mais curto em bytes vence.
Respostas:
Perl,
250 236 231 188187Edit: Alguns bytes de exploração de simetria (como já vi na solução @bazzargh)
+ Edit: E alguns truques do mal ...
+ Editar : Voltar para onde eu comecei (trabalhando com lista, não com string) e explorando mais simetria = 1 byte de folga e muito mais feio.
Pretty-impresso:
5.014 necessário devido ao
r
modificador.fonte
Javascript
470453438434432421404Você pode copiar esse código no seu console e executá-lo. Ele solicita a entrada de graus e gera o resultado com
alert();
Javascript não destruído pode ser encontrado neste violino: http://jsfiddle.net/AezL3/11
fonte
calcPoint(32)
que 0 faz, para que você possa fazer isso com%32
ou similar.var name = calcPoint(input % 32);
faz o truqueHaskell
415372347330317304301CAcabou convergindo para uma solução como a do @ VadimR (e a simetria voltou!). Uso:
h 219
saídas"Southwest by south SWbS"
Mais 3 caracteres desaparecidos, obrigado @shiona.
fonte
drop 1
é o mesmo que cauda. Além disso, se não me engano, você pode fazere l@(x:_)=x:tail$d l
para raspar ainda mais um char.Python 3.8 ,
482438424 bytesExperimente online!
Foi isso que obtive depois de jogar a resposta de Tony Goodwin ; postado em sua própria resposta devido ao fato do link TIO ser muito longo para um comentário. Se ele optar por atualizar sua resposta para o acima, eu excluirei esta resposta.
Estou assumindo que é aceitável enviar uma função como uma solução e não como um programa completo. Caso contrário, aqui está um programa completo em 426 bytes.
Espero que muito ainda possa ser feito para diminuir
b
.Edit: Golfed off 44 bytes, cortesia da morsa majestosa. Ainda não sinto que
b
está terminando de jogar golfe.Edit2: Raspou outros 14 descompactando dict em vez de usar
keys()
eitems()
.fonte
Python,
2103164711031034924889848 bytesMuito tarde, eu sei. Obrigado pelo desafio, estou configurando um magnetômetro para a direção do vento com o meu Pi e queria uma solução de bússola de 16 pontos como essa para alimentar os algoritmos de previsão do tempo. Todo o meu código está em Python, então aqui está a versão da solução javascript já publicada em Python, mas com um toque extra que você pode especificar 32, 16 ou 8 pontos da bússola na variável j, e eu mudei o deslocamento de degHead na declaração anterior, dependendo do número de pontos. Usei um alogoritmo de renomeação modificado (e usei variáveis que eu poderia renomear sem corromper as palavras!) Para garantir que atendesse aos requisitos de caso da pergunta.
Eu sei que isso não vai ganhar, como Python é mais prolixo, e eu também.
Versão curta:
Versão clara
fonte