Desenhe um relógio analógico asterisco por hora N

22

Desafio:

Crie uma função ou programa que aceite uma entrada N (um número de 0 a 24) que represente a HOUR.

A saída deve extrair um relógio analógico dos asteriscos mostrando a hora N.

🕛🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛


Notas:

• O ponteiro dos minutos deve ser maior que o ponteiro das horas (em termos de número de asteriscos usados)

• O ponteiro dos minutos deve ter pelo menos 2 asteriscos.

• Meio-dia, 15h, 18h e 21h sempre serão ortogonais. Sua saída para horas intermediárias, quando organizadas em graus, deve estar na mesma ordem que as horas do dia. O que quero dizer é ao meio-dia o ponteiro das horas é 0º e às 3 da tarde o ponteiro das horas é 90º assim para seus casos de 13:00 saída e 2pm o seguinte deve ser verdadeiro: 0pm_deg < 1pm_deg < 2pm_deg < 3pm_deg. Além dessa regra, o valor do grau real pode ser o que você decidir, obviamente ele mudará dependendo da fonte e de outros fatores nativos.

• A junta de conexão entre o ponteiro das horas e o ponteiro dos minutos é um caractere unicode circular / oval de qualquer tipo. o, O, •, 0, etc.


Exemplo de entrada / saída (pode variar dependendo dos estilos de desenho)

 N = 3;

 *
 *
 *
 O  *  *

 N = 4;

 *
 *
 *
 O
    *
       *

 N = 5;

 *
 *
 *
 0
  *
   *

 N = 6;

 *
 *
 o
 *

 N = 7;

      *
      *
      *
      •
    *
  *

 N = 0,12,24;

 *
 *
 *
 o

Exemplo de diferenciação de saídas:

 N = 4     VS     N = 5     VS     N = 6

  *                *                *
  *                *                *
  O                O                O
      *              *              *

Isso é , então o programa com o menor número de bytes vence!

Albert Renshaw
fonte
8
Horas geralmente são de 0-23 ou 1-12 não 0-24 a menos que você tem 25 horas em um dia
fənɛtɪk
1
O ponteiro dos minutos deve ser maior que o ponteiro das horas, mas eles precisam manter seus tamanhos? Por exemplo, o ponteiro dos minutos pode 3ter um tamanho diferente do ponteiro dos minutos 7?
AdmBorkBork 16/02
@LliwTelracs mas 23:00é 11:00. Em minha mente eu estava tentando laço em torno de volta para o 12 mão de novo
Albert Renshaw
6
@LliwTelracs Alguns dias com certeza parecem!
1
Os espaços em branco iniciais / finais / novas linhas são aceitos? E o preenchimento?
Titus

Respostas:

18

Javascript (ES6), 105 76 65 bytes

F=N=>`  *
ab*12
 9@3
87654`.replace(/\w/g,y=>'0x'+y^N%12?' ':'*')
<!-- Snippet Demo: -->
N =  <input type="number" min="0" max="24" value="2" id="I" />
<button onclick="console.log(F(I.value))">Run</button>

  • -29 bytes:

    • Tamanho reduzido do ponteiro dos minutos e das horas para 2 e 1 asteriscos, respectivamente. Relógio menor = menos bytes :-P
  • -11 bytes:

    • Comparação de string alterada para comparação numérica.
    • y==(N%12).toString(16)?'*':' ' -> '0x'+y^N%12?' ':'*'

Original com ponteiros mais longos: ( 105 94 bytes)

F=N=>`    *
a b * 1 2
  ab*12
  99@33
  87654
8 7 6 5 4`.replace(/\w/g,y=>'0x'+y^N%12?' ':'*')
<!-- Snippet Demo: -->
N =  <input type="number" min="0" max="24" value="2" id="I" />
<button onclick="console.log(F(I.value))">Run</button>

nderscore
fonte
1
Isso é realmente inteligente!
AdmBorkBork 16/02
1
Oh uau, eu gosto muito disso!
Albert Renshaw
Opa Minha resposta em Python se parece um pouco com a sua original. Postei antes de ver sua resposta, honestamente. Acho que tivemos a mesma idéia com o hex.
ElPedro
2
e de alguma forma eu li como "O ponteiro das horas deve ser pelo menos 2 ...", então +1 para lê-lo corretamente e encurtar os ponteiros.
ElPedro
1
@ElPedro é isso que eu pensei que eu li originalmente também :)
nderscore
14

CSS / HTML (JavaScript), 62 + 106 = 180 168 bytes

pre{position:absolute;left:99px;bottom:99px;transform-origin:50% 80%}
<input oninput=h.style.transform=`rotate(${this.value*30}deg)`><pre>*
*
o</pre><pre id=h>*

</pre>

Editar: salvou 9 bytes graças a @nderscore.

Neil
fonte
Idéia muito legal!
Ndscore
Resposta muito boa.
ElPedro
Você pode raspar 4 bytes fora de sua marca de entrada, trocando-o com esta<body onload=f(prompt())>
Albert Renshaw
1
Você também pode incorporar o código de função no atributo oninput diretamente:<input oninput=h.style.transform=`rotate(${this.value*30}deg)`>
nderscore 16/02
9

Python 2 , 148 140 135 bytes

-8 excluindo alguns espaços restantes e uma nova linha desnecessária.

-5 mudando (' ','*')para' *'

a=input()
b='''    *
a b * 1 2
  ab*12
9 9 o 3 3
  87654
8 7 6 5 4'''
for x in range(1,12):b=b.replace(hex(x)[2],' *'[x==a%12])
print b

Experimente online!

ElPedro
fonte
5

C (gcc) , 144 bytes

#define v ,t
h;t(i){putchar(i>12?i-9:h^i?32:42);}n(i){h=i%12;puts("  *")v(10)v(11)v(h)v(1)v(2)v(19)v(12)v(9)v(57)v(3)v(19)v(8)v(7)v(6)v(5)v(4);}

Experimente online!

Ahemone
fonte
+1; Santa recursão! Eu acho hilário que você pode salvar bytes em um desafio de código-golfe por macroing uma vírgula ahha
Albert Renshaw
Eu também não esperava, embora não haja recursão à vista. Esta é uma resposta codificada, embora um pouco ofuscada.
Ahemone
Eu não acho que você precisa do espaço antes da vírgula
roofcat 13/11
4

SmileBASIC, 90 88 74 bytes

INPUT H?("  *"+" "*47)*2;"  o
R=H/1.9LOCATE 2.5+SIN(R)*2,3.5-COS(R)*2?"*

Exemplo de saída:

? 5
  *
  *
  o

   *

? 3
  *
  *
  o *
12Me21
fonte
3

Python 3 , 86 85 bytes

-1 byte, melhor relógio (crédito DuctrTape, como usado na minha resposta Jelly)

def f(h):print(*([c,' *'[h%12+64==ord(c)]][c>'@']for c in'''
K*A
J*B
I0C
HFD
G E'''))

Experimente online!

Jonathan Allan
fonte
3

Geléia , 35 34 33 bytes

ị“ tI©’Œ?Ḋ¤µ⁶ẋ13”*⁸¦Ṗ;“**o”ṙ7s5ZY

Experimente online! (tI©!) ou veja todos (0 - 24) .

Quão?

ị“ tI©’Œ?Ḋ¤µ⁶ẋ13”*⁸¦Ṗ;“**o”ṙ7s5ZY - Main link: h
          ¤                       - nilad followed by link(s) as a nilad:
 “ tI©’                           -     base 250 number: 522956007
       Œ?                         - shortest permutation of [1,N] that would be at
                                     that index in a lexicographically sorted
                                     list: [2,3,4,5,6,7,1,12,11,10,9,8,13]
         Ḋ                        - dequeue: [3,4,5,6,7,1,12,11,10,9,8,13]
ị                                 - index into (1-based and modular, so h=2 picks 4,
                                     as does h=14 [as do h=26, h=-10, etc.])
           µ                      - monadic chain separation (call the result j)
            ⁶                     - space character
             ẋ13                  - repeat 13 times
                   ¦              - apply to index...
                  ⁸               - ...left argument (j)
                ”*                -     an asterisk character (replacemes the space
                                         at index j with an asterisk)
                    Ṗ             - pop the last character off the list †
                     ;“**o”       - concatenate "**o"
                           ṙ7     - rotate left by 7 ‡
                             s5   - split into chunks of length 5 (columns)
                               Z  - transpose (get the rows of the clock)
                                Y - join with line feeds
                                  - implicit print

Observe que “ tI©’Œ?Ḋ(permutação no índice, desenfileirado) é um salvamento em bytes “9ȧỤ_ÑḶ’b⁴(base 16 de), que é um salvamento em bytes “¦þxṙ<ȥ’ḃ13(base bijetiva 13 de).

Em relação ao pop - temos um espaço extra na string, que é onde o asterisco para 0, 12, 24 irá permitir a indexação mod-12 da lista de índices. fazendo a concatenação de “**o”antemão e substituindo um desses asteriscos.

Com relação à rotação - este é um salvamento em byte sobre a construção de uma string com o `` ** o '' no meio (com ela antes ou depois da colocação do asterisco).

Jonathan Allan
fonte
3

Haskell, 148 bytes

c n=mapM_ putStrLn$(t(n-3)!(t n!(\_->'*')))(map(\x->(2!(\_->x))"     ")"**O  ")
n!f=(\(x,a:y)->x++f a:y).splitAt n
t n=2+truncate(2.5*sin(n*pi/6))

A função c é a que resolve a tarefa fornecida

Sacchan
fonte
2

Utilitários Bash + Unix, 57 bytes

tr `dc -e12o$1O%p` \*<<<'B*1
A*2
9O3
864
7 5'|tr 1-9AB \ 

(Há um espaço após a barra invertida final.)

Experimente online!

Não é um relógio muito bonito, mas atende a todos os requisitos.

Mitchell Spector
fonte
2

PHP, 71 bytes

1 ponteiro de horas de asterisco, 2 ponteiros de asterisco de minutos.

$s="  *
  *  
  O  
";$s[ord(BGHNTSRQPJDE[$argv[1]%12])&31]="*";echo$s;

recebe entrada do argumento da linha de comando; corra com -nr.

  1. definir modelo
  2. mapeie a hora para a posição (decodifique da letra) e defina o caractere na posição para asterisco
  3. impressão
Titus
fonte
1

05AB1E , 41 bytes

Isso é muito lento para o TIO.

14Ýœ•2!&ô÷‰•èv… *@y_2L11+¹12%0‚ìyå+èJ}3ô»

Para código semelhante trabalhando no TIO, tente isto

Tenho certeza de que isso ainda pode ser jogado e acelerado.
Explicação em breve.

Emigna
fonte
1

Código de lógica 634 bytes

Não foi possível descobrir como inserir, para que haja um var a = ... para a entrada na parte superior do link do tio

circ v(a)->cond((a&1000)+0)&a->0/a
circ n(a)->cond a&10000->((a&100)+0)|!(a&100)&((a&011)|100)/a
circ y(a)->cond((a&100)+0)&a->a&10011/a
var s=@100000
var m=@101010
var x=y(n(v(a)))
var e=x&1000
var f=(x&100)+0
var t=(x&10)+00
var o=(x&1)+000
circ r(a,b)->cond(a)->b/@a
out s+s+s+s+m
out r(e&t&!o,m)+s+r(o&e&t,m)+s+m+s+r(o&!e&!f&!t,m)+s+r(t&!o&!f&!e,m)
out s+s+r(e&t&!o,m)+r(e&t&o,m)+m+r(o&!t&!f&!e,m)+r(t&!o&!f&!e,m)
out r(e&o&!t,m)+s+r(e&o&!t,m)+s+@110000+s+r(t&o&!f&!e,m)+s+r(t&o&!f&!e,m)
out s+s+r(e&!t&!o,m)+r((f&t&o),m)+r(f&t&!o,m)+r(f&!t&o,m)+r(f&!t&!o,m)
out r(e&!t&!o,m)+s+r(f&t&o,m)+s+r(f&t&!o,m)+s+r(f&o&!t,m)+s+r(f&!t&!o,m)

Desistiram de jogar isso. Poderia torná-lo mais curto, com o custo de fazer o relógio parecer horrível.

Experimente Online

fəˈnɛtɪk
fonte