Introdução
Escreva um programa ou função que, dadas as coordenadas de onde um dardo pousa em um alvo, retorne a pontuação desse dardo. As coordenadas do dardo são dadas como dois números inteiros, x,y
medidos a partir do centro do alvo, com precisão milimétrica.
Como marcar um dardo
Dardos é um jogo jogado jogando um dardo em um tabuleiro circular. O jogo de dardos é dividido em 20 "cunhas" de tamanho igual. Começando do topo e indo no sentido horário, as seções têm valores de 20,1,18,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12 5. Se o seu dardo cair nas partes preta ou branca de qualquer uma das cunhas, você marcará o valor indicado na parte externa dessa cunha.
.
No entanto, se o seu dardo cair no anel externo verde / vermelho do alvo, você pontuará o dobro dos pontos indicados na parte externa da cunha que acertou. Da mesma forma, ao tocar no anel verde / vermelho interno (aquele entre as duas seções branco / preto), você obtém o triplo do número indicado na parte externa da cunha. Se o seu dardo atinge o círculo mais interno (o olho de boi vermelho), você ganha 50 pontos e, finalmente, se o seu dardo atinge o segundo círculo mais interno (o anel verde ao redor do olho de boi), você ganha 25 pontos.
As dimensões dos anéis, medidas a partir do centro do alvo, são as seguintes:
Bullseye (50): [0mm-6mm)
25: [6mm-16mm)
Inner Single: [16mm-99mm)
Triple: [99mm-107mm)
Outer Single: [107mm-162mm)
Double: [162mm-170mm)
Miss (0): 170mm+
Nota 1: As imagens fornecidas são apenas para fins ilustrativos e não estão em escala.
Nota 2: As medidas fornecidas são aproximadas e podem não ser precisas para um alvo de dardos real.
Nota 3: Todas as medidas fornecidas são [inclusive-exclusive)
. Para os propósitos deste desafio, não vamos nos preocupar com dardos acertando o arame e quicando. Se o dardo cair "no fio" com uma das linhas radiais, cabe ao respondente decidir se quer quebrar o empate no sentido horário ou anti-horário. A direção de desempate deve ser consistente e indicada.
Nota 4: O alvo é pendurado da maneira padrão, com o meio da seção 20 diretamente acima do alvo e a seção 3 diretamente abaixo do alvo.
Entrada
Dois números inteiros representando as x,y
coordenadas de onde o dardo pousou, medido em milímetros, em relação ao centro do alvo.
Saída
Um único inteiro, para o número de pontos que seriam concedidos a um dardo que aterrissasse nas coordenadas fornecidas.
Amostra
0,0 -> 50
2,101 -> 60
-163,-1 -> 22
6,18 -> 1
-6,18 -> 5
45,-169 -> 0
22, 22 -> 4 (if tie-broken clock-wise)
18(if tie-broken counter-clockwise)
-150,0 -> 11
-150,-1 -> 11
Pontuação
código-golfe . O menor número de bytes no seu código-fonte vence.
-150,-1
e-150,0
que devem dar11
e podem ser um caso de vantagem em algumas implementações, pois essa é a transição entre theta convergindo para -pi e theta = + pi nas coordenadas polares. (Minha resposta inicial falhou no 2º um.)Respostas:
JavaScript (ES7), 137 bytes
Leva as coordenadas na sintaxe de currying
(x)(y)
. Usa tie-break no sentido anti-horário.Experimente online!
Quão?
Saída gráfica
O seguinte snippet de código ES6 desenha o alvo usando a mesma lógica do código de golfe.
Mostrar snippet de código
fonte
JavaScript (ES6) + SVG (HTML5),
53 + 52351 +519507 =576570558 bytesA entrada é através de um clique do mouse, a saída via
alert
. Editar: salvou 12 bytes usando cores um pouco mais aproximadas, conforme sugerido por @Arnauld.fonte
b33
e474
para vermelho e verde. :-)b33
sejabb3333
tãob22
(akabb3322
) está mais perto do seu originalbe3628
.Conjunto Intel 8086/8087,
180144142138 bytesIsso usa o co-processador matemático do 8087 para toda a aritmética trigonométrica e de ponto flutuante. Todos os cálculos são feitos em hardware com precisão de ponto flutuante de 80 bits.
Escrito como um MACRO MAC (basicamente uma função), pega X e Y como coordenadas e retorna a pontuação calculada no AX. O empate está quebrado no sentido horário.
Um exemplo de programa de teste para PC DOS. Faça o download aqui no DARTTEST.COM .
Saída
Exemplo de uso do programa de teste acima . É necessário um PC IBM real com 8087, DOSBox ou seu emulador favorito.
* Edições:
fonte
Geléia , 56 bytes
Um link monádico que aceita o par como uma lista
[x,y]
que gera a pontuação.Usa quebra de ligação no sentido horário.
Experimente online! Ou veja a suíte de testes
NB: uma versão diádica também tem 56 bytes
Quão?
fonte
TI-Basic (TI-84 Plus CE),
147146 bytesSolicita X e Y em linhas separadas.
Desempate no sentido anti-horário.
TI-Basic é uma linguagem tokenizada ; todos os tokens usados aqui são de um byte.
Explicação:
Utiliza o fato de que as comparações booleanas do TI-Basic retornam 0 ou 1 adicionando-as e multiplicando por valores em pontos.
fonte
T-SQL,
392 374366 bytesQuebras de linha são para facilitar a leitura. A inicial
UPDATE
cuida dox=y=0
problema que, de outra forma, geraria um erroATN2()
, mas não altera a pontuação.A entrada é obtida através da tabela t pré-existente , de acordo com nossas diretrizes de IO . Devido ao uso
TOP 1
, esta tabela deve conter apenas uma única linha.Basicamente, eu estou juntando 3 tabelas:
ROUND()
, que era um pouco mais curto, mas causava um desempate inconsistente.)TOP 1
. O valor f é uma pontuação fixa (para um alvo) ou um multiplicador para a pontuação da cunha.EDIT : Largou o
ORDER BY
, parece funcionar corretamente sem ele, pelo menos no SQL 2017. Também larguei oAND y=0
na condição de atualização; Testei todos osy
valores inteiros , mudandox=0
parax=1
nunca alterar a pontuação.EDIT 2 : Removida a coluna g da tabela d , substituída por uma
IIF()
instrução que retornaf
diretamente (para um alvo) ouf*b
salva 8 bytes. Também removeu o espaço depoisTOP 1
.fonte
Haskell , 198 bytes
Quebra de gravata no sentido anti-horário.
(#)
é uma função de pesquisa. O ângulo polar é usado para indexar a partir da lista de números, começando noatan2
ponto de corte em 11. A distância é usada para indexar a partir da lista de funções[const 50, const 25, id, (*3), id, (*2), const 0]
e, finalmente, essa função é aplicada ao número que obtivemos anteriormente.Experimente online!
fonte
Perl 5
-MMath::Trig':pi' -MMath::Trig':radial' -apl
, 166 bytesExperimente online!
Pega o espaço das duas coordenadas separado em STDIN. O desempate é no sentido anti-horário.
fonte