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!


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>


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.


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!


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!


+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 *


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


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


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.


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ć

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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.