Gambarkan jam analog asterisk untuk jam N

22

Tantangan:

Buat fungsi atau program yang akan mengambil input N (angka dari 0 - 24) yang mewakili JAM.

Output harus menarik jam analog dari tanda bintang yang menunjukkan jam N.

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


Catatan:

• Jarum menit harus lebih panjang dari jarum jam (dalam hal jumlah tanda bintang yang digunakan)

• Jarum menit harus minimal 2 tanda bintang.

• Tengah hari, 15:00, 18:00, dan 21:00 akan selalu ortogonal. Output Anda untuk jam perantara, bila diatur oleh derajat, harus dalam urutan yang sama dengan jam sehari. Yang saya maksud adalah pada siang hari jam tangan adalah 0º dan pada 3:00 jam tangan 90º jadi untuk kasus output dari 13:00 dan 2PM berikut harus benar: 0pm_deg < 1pm_deg < 2pm_deg < 3pm_deg. Terlepas dari aturan ini, jumlah gelar aktual dapat menjadi apa pun yang Anda putuskan, jelas itu akan berubah tergantung pada font dan faktor asli lainnya.

• Sambungan penghubung antara jarum jam dan jarum menit adalah karakter unicode melingkar / oval dalam bentuk apa pun. o, O, •, 0, etc.


Contoh Input / Output (Dapat bervariasi tergantung pada gaya gambar)

 N = 3;

 *
 *
 *
 O  *  *

 N = 4;

 *
 *
 *
 O
    *
       *

 N = 5;

 *
 *
 *
 0
  *
   *

 N = 6;

 *
 *
 o
 *

 N = 7;

      *
      *
      *
      •
    *
  *

 N = 0,12,24;

 *
 *
 *
 o

Contoh Membedakan Output:

 N = 4     VS     N = 5     VS     N = 6

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

Ini adalah , sehingga program dengan bytecount terpendek menang!

Albert Renshaw
sumber
8
Jam biasanya dari 0-23 atau 1-12 bukan 0-24 kecuali Anda punya 25 jam dalam sehari
fəˈnɛtɪk
1
Jarum menit harus lebih panjang dari jarum jam, tetapi apakah mereka perlu mempertahankan ukurannya? Misalnya, mungkinkah jarum menit untuk 3ukuran yang berbeda dari jarum menit 7?
AdmBorkBork
@LliwTelracs tapi 23:00adalah 11:00. Dalam pikiran saya, saya mencoba untuk memutar kembali ke 12 tangan lagi
Albert Renshaw
6
@LliwTelracs Beberapa hari pasti merasa seperti itu!
1
Apakah lead / trailing blank / newlines diterima? Bagaimana dengan padding?
Titus

Jawaban:

18

Javascript (ES6), 105 76 65 byte

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 byte:

    • Mengurangi ukuran menit dan jarum jam menjadi 2 dan 1 asterisk masing-masing. Jam lebih kecil = lebih sedikit byte :-P
  • -11 byte:

    • Mengubah perbandingan string menjadi perbandingan numerik.
    • y==(N%12).toString(16)?'*':' ' -> '0x'+y^N%12?' ':'*'

Asli dengan tangan yang lebih panjang: ( 105 94 byte)

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
sumber
1
Itu sangat pintar!
AdmBorkBork
1
Oh wow, aku sangat suka ini!
Albert Renshaw
Ups. Jawaban Python saya terlihat sedikit seperti aslinya. Saya memposting sebelum saya melihat jawaban Anda, jujur. Kira kita punya ide yang sama dengan hex.
ElPedro
2
dan entah bagaimana saya membacanya sebagai "Jarum jam harus setidaknya 2 ..." jadi +1 untuk membacanya dengan benar dan memperpendek tangan.
ElPedro
1
@ ElPedro itulah yang saya pikir saya baca awalnya juga :)
nderscore
14

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

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>

Sunting: Disimpan 9 byte berkat @nderscore.

Neil
sumber
Ide yang sangat keren!
nderscore
Jawaban yang sangat bagus.
ElPedro
Anda dapat mencukur 4 byte dari tag input Anda dengan menukarnya dengan ini<body onload=f(prompt())>
Albert Renshaw
1
Anda juga dapat menyematkan kode fungsi dalam atribut oninput secara langsung:<input oninput=h.style.transform=`rotate(${this.value*30}deg)`>
nderscore
9

Python 2 , 148 140 135 byte

-8 dengan menghapus beberapa ruang sisa dan baris baru yang tidak dibutuhkan.

-5 dengan mengubah (' ','*')ke' *'

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

Cobalah online!

ElPedro
sumber
5

C (gcc) , 144 byte

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

Cobalah online!

Ahemone
sumber
+1; Rekursi suci! Saya merasa lucu bahwa Anda dapat menyimpan byte dalam tantangan kode-golf dengan mem-makro sebuah koma ahha
Albert Renshaw
Saya juga tidak mengharapkannya, meskipun tidak ada rekursi yang terlihat. Ini adalah jawaban yang sulit dikodekan, meskipun sedikit dikaburkan.
Ahemone
Saya tidak berpikir Anda membutuhkan ruang sebelum koma
ceilingcat
4

SmileBASIC, 90 88 74 byte

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

Contoh output:

? 5
  *
  *
  o

   *

? 3
  *
  *
  o *
12Me21
sumber
3

Python 3 , 86 85 byte

-1 byte, clockface yang lebih baik (kredit DuctrTape, seperti yang digunakan dalam jawaban Jelly saya)

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

Cobalah online!

Jonathan Allan
sumber
3

Jelly , 35 34 33 byte

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

Cobalah online! (tI©!) atau lihat semuanya (0 - 24) .

Bagaimana?

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

Perhatikan bahwa “ tI©’Œ?Ḋ(permutasi pada indeks, dequeued) adalah byte save over “9ȧỤ_ÑḶ’b⁴(basis 16 of), yang merupakan byte save over “¦þxṙ<ȥ’ḃ13(bijective base 13 of).

Mengenai pop - kami memiliki ruang ekstra dalam string, yang merupakan tanda bintang untuk 0, 12, 24 akan memungkinkan mod-12 mengindeks daftar indeks, memunculkan karakter terakhir dari sana byte-lebih murah daripada melakukan penyatuan “**o”sebelumnya dan menimpa salah satu tanda bintang itu.

Mengenai rotasi - ini adalah byte penyimpanan lebih dari membangun string dengan `" ** o "di tengah (baik dengan itu sebelum atau setelah penempatan tanda bintang).

Jonathan Allan
sumber
3

Haskell, 148 byte

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

Fungsi c adalah fungsi yang menyelesaikan tugas yang diberikan

Sacchan
sumber
2

Utilitas Bash + Unix, 57 byte

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

(Ada spasi setelah backslash terakhir.)

Cobalah online!

Bukan jam yang sangat cantik, tetapi memenuhi semua persyaratan.

Mitchell Spector
sumber
2

PHP, 71 byte

1 jam tangan asterisk, 2 menit tangan asterisk.

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

mengambil input dari argumen baris perintah; jalankan bersama -nr.

  1. tentukan template
  2. memetakan jam ke posisi (decode dari huruf) dan mengatur karakter di posisi menjadi tanda bintang
  3. mencetak
Titus
sumber
1

05AB1E , 41 byte

Ini terlalu lambat untuk TIO.

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

Untuk kode serupa yang berfungsi pada TIO coba ini

Cukup yakin ini masih bisa golf dan dipercepat.
Penjelasan datang nanti.

Emigna
sumber
1

Logicode 634 bytes

Tidak dapat menemukan cara memasukkan sehingga ada var a = ... untuk masukan di bagian atas tautan 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)

Sudah menyerah bermain golf ini. Bisa membuatnya lebih pendek dengan biaya membuat jam tampak mengerikan.

Cobalah secara Online

fəˈnɛtɪk
sumber