Narysuj gwiazdkowy zegar analogowy dla godziny N.

22

Wyzwanie:

Utwórz funkcję lub program, który przyjmie wartość N (liczbę od 0 do 24), która reprezentuje GODZINĘ.

Wyjście powinno wyciągnąć zegar analogowy z gwiazdek pokazujących godzinę N.

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


Uwagi:

• Wskazówka minutowa musi być dłuższa niż wskazówka godzinowa (pod względem liczby użytych gwiazdek)

• Wskazówka minutowa musi zawierać co najmniej 2 gwiazdki.

• Południe, godzina piętnasta, godzina szesnasta i godzina dwudziesta trzecia zawsze będą ustawione prostopadle. Twoje wyniki dla godzin pośrednich, jeśli są uporządkowane według stopni, powinny być w tej samej kolejności, co godziny w ciągu dnia. Chodzi mi o to w południe godzinowa wynosi 0 ° i 3 po południu godzinowa wynosi 90º tak dla przypadków wyjściowych 1pm i 2pm dodaje musi być prawdą 0pm_deg < 1pm_deg < 2pm_deg < 3pm_deg. Oprócz tej zasady rzeczywista ilość stopni może być dowolna, oczywiście zmieni się w zależności od czcionki i innych czynników rodzimych.

• Połączenie między wskazówką godzinową i wskazówką minutową jest dowolnym okrągłym / owalnym znakiem Unicode. o, O, •, 0, etc.


Przykład wejścia / wyjścia (może się różnić w zależności od stylów rysowania)

 N = 3;

 *
 *
 *
 O  *  *

 N = 4;

 *
 *
 *
 O
    *
       *

 N = 5;

 *
 *
 *
 0
  *
   *

 N = 6;

 *
 *
 o
 *

 N = 7;

      *
      *
      *
      •
    *
  *

 N = 0,12,24;

 *
 *
 *
 o

Przykład różnicowania wyników:

 N = 4     VS     N = 5     VS     N = 6

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

To jest , więc wygrywa program z najkrótszą liczbą bajtów!

Albert Renshaw
źródło
8
Godziny zwykle wynoszą od 0 do 23 lub od 1 do 12, a nie od 0 do 24, chyba że masz 25 godzin dziennie
f 16nɛtɪk
1
Wskazówka minutowa musi być dłuższa niż wskazówka godzinowa, ale czy muszą zachować swoje rozmiary? Na przykład, czy wskazówka minutowa może 3mieć inny rozmiar niż wskazówka minutowa 7?
AdmBorkBork
@LliwTelracs, ale 23:00jest 11:00. W mojej głowie próbowałem ponownie powrócić do 12 ręki
Albert Renshaw
6
@LliwTelracs Niektóre dni na pewno się tak zdają!
1
Czy akceptowane są wiodące lub końcowe puste / nowe linie? Co z wypełnieniem?
Tytus

Odpowiedzi:

18

JavaScript (ES6), 105 76 65 bajtów

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 bajtów:

    • Zmniejszono rozmiar wskazówki minutowej i godzinowej odpowiednio do 2 i 1 gwiazdki. Mniejszy zegar = mniej bajtów :-P
  • -11 bajtów:

    • Zmieniono porównanie ciągów na porównanie numeryczne.
    • y==(N%12).toString(16)?'*':' ' -> '0x'+y^N%12?' ':'*'

Oryginał z dłuższymi rękami: ( 105 94 bajtów)

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
źródło
1
To naprawdę sprytne!
AdmBorkBork
1
Och, wow, bardzo to lubię!
Albert Renshaw
Ups Moja odpowiedź w języku Python wygląda trochę jak oryginał. Powiedziałem, zanim zobaczyłem twoją odpowiedź, szczerze. Chyba mieliśmy ten sam pomysł z hexem.
ElPedro
2
i jakoś przeczytałem to jako „Wskazówka godzinowa musi wynosić co najmniej 2 ...”, więc +1 za prawidłowe odczytanie i skrócenie wskazówek.
ElPedro
1
@ElPedro to właśnie myślałem, że przeczytałem również oryginalnie :)
nderscore
14

CSS / HTML (JavaScript), 62 + 106 = 180 168 bajtów

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>

Edycja: Zapisano 9 bajtów dzięki @nderscore.

Neil
źródło
Bardzo fajny pomysł!
nderscore
Naprawdę miła odpowiedź.
ElPedro
Możesz ogolić 4 bajty z tagu wejściowego, zamieniając go tym<body onload=f(prompt())>
Albert Renshaw
1
Możesz także osadzić kod funkcji bezpośrednio w atrybucie oninput:<input oninput=h.style.transform=`rotate(${this.value*30}deg)`>
nderscore
9

Python 2 , 148 140 135 bajtów

-8 poprzez usunięcie niektórych resztek spacji i niepotrzebnej nowej linii.

-5, zmieniając (' ','*')na' *'

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

Wypróbuj online!

ElPedro
źródło
5

C (gcc) , 144 bajty

#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);}

Wypróbuj online!

Ahemone
źródło
+1; Święta rekursja! Uważam, że to zabawne, że możesz zaoszczędzić bajty w wyzwaniu golfa kodując przecinek ahha
Albert Renshaw
Też się nie spodziewałem, choć nie widać rekurencji. To jest mocno zakodowana odpowiedź, choć nieco zaciemniona.
Ahemone
Nie sądzę, żebyś potrzebował miejsca przed przecinkiem
pułapkę na kotku
4

SmileBASIC, 90 88 74 bajtów

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

Przykładowe dane wyjściowe:

? 5
  *
  *
  o

   *

? 3
  *
  *
  o *
12Me21
źródło
3

Python 3 , 86 85 bajtów

-1 bajt, lepsza tarcza zegara (kredyt DuctrTape, jak w mojej odpowiedzi Jelly)

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

Wypróbuj online!

Jonathan Allan
źródło
3

Galaretka , 35 34 33 bajtów

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

Wypróbuj online! (tI©!) lub zobacz wszystkie (0–24) .

W jaki sposób?

ị“ 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

Zauważ, że “ tI©’Œ?Ḋ(permutacja przy indeksie, odznaczanie kolejki) to zapisywanie bajtów ponad “9ȧỤ_ÑḶ’b⁴(podstawa 16 z), które jest zapisywanie bajtów ponad “¦þxṙ<ȥ’ḃ13(podstawa 13 bijective).

Jeśli chodzi o pop - mamy dodatkowe miejsce w ciągu, w którym gwiazdka dla 0, 12, 24 pójdzie, aby pozwolić na indeksowanie mod-12 listy indeksów, usunięcie ostatniego znaku jest bajtem tańszym niż dokonanie “**o”wcześniejszego połączenia i nadpisanie jednej z tych gwiazdek.

Odnośnie rotacji - jest to zapis bajtowy nad budowaniem łańcucha ze znakiem „** **” w środku (albo z nim przed, albo po umieszczeniu gwiazdki).

Jonathan Allan
źródło
3

Haskell, 148 bajtów

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))

Funkcja c to ta, która rozwiązuje dane zadanie

Sacchan
źródło
2

Narzędzia Bash + Unix, 57 bajtów

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

(Po ostatnim odwrotnym ukośniku jest spacja).

Wypróbuj online!

Niezbyt ładny zegar, ale spełnia wszystkie wymagania.

Mitchell Spector
źródło
2

PHP, 71 bajtów

1 wskazówka godzin gwiazdki, 2 wskazówki minut gwiazdki.

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

pobiera dane wejściowe z argumentu wiersza poleceń; biegać z -nr.

  1. zdefiniuj szablon
  2. zamapuj godzinę na pozycję (dekoduj z litery) i ustaw znak na pozycji na gwiazdkę
  3. wydrukować
Tytus
źródło
1

05AB1E , 41 bajtów

Jest to zbyt wolne dla TIO.

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

Aby uzyskać podobny kod działający na TIO, spróbuj tego

Jestem całkiem pewien, że można to jeszcze pograć w golfa i przyspieszyć.
Wyjaśnienie nastąpi później.

Emigna
źródło
1

Kod logiczny 634 bajtów

Nie mogłem dowiedzieć się, jak wpisać, więc istnieje var a = ... dla danych wejściowych na górze tio link

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)

Zrezygnowałem z gry w golfa. Może to jednak skrócić czas kosztem spowodowania, że ​​zegar będzie wyglądał okropnie.

Wypróbuj online

Fəˈnɛtɪk
źródło