Buat Jam Fibonacci ASCII

16

Seseorang membuat jam yang benar-benar mewah menggunakan angka Fibonacci, yang terlihat sangat bagus tetapi tidak bisa digunakan. Seperti kita menyukainya! Mari kita buat ulang ini.

Jam terdiri dari 5 bagian yang sesuai dengan lima angka Fibonacci pertama, mulai dari 1 (yaitu 1, 1, 2, 3, 5):

ccbeeeee
ccaeeeee
dddeeeee
dddeeeee
dddeeeee

Jam ini mampu menampilkan waktu 12 jam dengan peningkatan 5 menit. Inilah cara kerjanya. Pertimbangkan waktu 7:20. Jam 7 dapat didekomposisi menjadi angka-angka Fibonacci yang diberikan sebagai

7 = 2 + 5

Ada juga 4 unit lima menit. 4 dapat didekomposisi sebagai

4 = 2 + 1 + 1

Sekarang jam ditampilkan dalam warna merah, menit memotong hijau, dan jika angka digunakan untuk jam dan menit, itu ditunjukkan dengan warna biru. Jika angka tidak digunakan sama sekali, itu tetap putih. Jadi di atas akan ditampilkan sebagai:

BBGRRRRR
BBGRRRRR
WWWRRRRR
WWWRRRRR
WWWRRRRR

Tapi tunggu, masih ada lagi. Dekomposisi di atas bukan satu-satunya kemungkinan. Satu juga dapat menulis 7 = 3 + 2 + 1 + 1dan 4 = 3 + 1, yang akan memberikan satu

GGRWWWWW          GGBWWWWW
GGBWWWWW          GGRWWWWW
BBBWWWWW    or    BBBWWWWW
BBBWWWWW          BBBWWWWW
BBBWWWWW          BBBWWWWW

tergantung yang mana 1 dipilih. Tentu saja ada kombinasi lain juga. Jam memilih dari semua penguraian yang valid secara acak.

Seperti yang saya katakan ... ini mungkin tidak memenangkan penghargaan kegunaan, tapi itu bagus untuk dilihat.

Tantangan

Tugas Anda adalah mengimplementasikan jam seperti itu. Program Anda (atau fungsi) harus mencetak representasi ASCII dari waktu saat ini (dibulatkan ke kelipatan 5 menit terakhir) seperti yang dijelaskan di atas untuk STDOUT atau alternatif terdekat. Anda dapat memilih untuk membaca waktu dalam format umum apa pun sebagai input atau mendapatkannya dengan fungsi perpustakaan standar. Anda tidak boleh berasumsi bahwa waktu saat ini / waktu yang diberikan dapat dibagi 5 menit.

Solusi Anda harus memilih secara acak dari semua kemungkinan representasi waktu saat ini. Yaitu setiap representasi harus dicetak dengan probabilitas bukan nol.

Tengah malam dan siang hari harus diperlakukan 0:00(berbeda dengan 12:00).

Anda dapat mencetak satu karakter trailing baris baru.

Anda dapat menggunakan empat karakter ASCII yang dapat dicetak yang berbeda (kode karakter 0x20 hingga 0xFE) sebagai pengganti RGBW. Silakan sebutkan pilihan Anda dalam jawaban Anda dan gunakan secara konsisten.

Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.

Martin Ender
sumber
(a) dapatkah kita berasumsi bahwa input mengikuti aturan 12 = 0? (B) apakah output harus dalam orientasi itu, atau bisakah kita memutarnya?
sirpercival
@sirpercival a) Ya, saya pikir itu dianggap sebagai "format umum". b) Itu harus menjadi orientasi yang diberikan dalam tantangan.
Martin Ender
2
Tantangan ini melahirkan kata kerja yang tidak menguntungkan "fibclocking."
Alex A.
1
Apa motivasi untuk tengah malam / siang menjadi 0 bukannya 12? Lima angka pertama dalam urutan menambahkan tepat hingga 12.
Brian J
@BrianJ Saya hanya ingin memilih satu untuk membuatnya konsisten dan kebetulan memilih nol. Seharusnya tidak terlalu mempengaruhi solusi. Saya pikir pilihan ini akan membuat segalanya lebih sederhana karena notulen juga memiliki kisaran 0,11.
Martin Ender

Jawaban:

6

CJam, 61 byte

l~5/]:A{;L[TT][XXYZ5]{4mr_2bW%Mf*@.+\Ps=M*aM*@+W%z\}fMA=!}gN*

Mengambil dua bilangan bulat yang dipisahkan ruang melalui STDIN, dan menggunakan masing 3.14- WRGBmasing. Cobalah online .

Ini adalah versi "waras" RGBWuntuk beberapa byte tambahan:

l~5/]:A{;L[TT][XXYZ5]{4mr_2bW%Mf*@.+\"WRGB"=M*aM*@+W%z\}fMA=!}gN*

Penjelasan

Algoritma ini sama dengan jawaban Python saya - sampel penolakan dengan menghasilkan jam sampai kami mendapatkan yang benar.

l~5/]:A            Read input and make array [<hours> <minutes>/5]
{...}g             Do...

  ;                  Pop the only element on the stack
  L                  Push empty array, which will become our clock
  [TT]               Push [0 0] for [h m], to keep track of our sample
  [XXYZ5]{...}fI     For I in [1 1 2 3 5]...
    4mr                Push random number from [0 1 2 3]
    _2bW%              Copy and get reversed base 2 rep for one of [0] [1] [0 1] [1 1]
    If*                Multiply bit(s) by I
    @.+                Add element-wise to [h m] array
    \Ps=               Index the random number into stringified pi for one of "3.14"
    I*aI*              Make into I by I square
    @+W%z\             Add above clock and rotate clockwise

  A=!              ... while the resulting clock is incorrect
N*                 Riffle clock with newlines
Sp3000
sumber
9

Python 2, 194 182 byte

from random import*
h=m=H,M=input()
while[h,m]!=[H,M/5]:
 h=m=0;s=[]
 for n in 1,1,2,3,5:c=randint(0,3);h+=c%2*n;m+=c/2*n;s=zip(*(["WRGB"[c]*n]*n+s)[::-1])
for L in s:print"".join(L)

Algoritma ini hanya pengambilan sampel penolakan, sehingga terus menghasilkan jam sampai mendapatkan yang benar. Jam ini dibangun dengan memulai dari nol, lalu melakukan "tambahkan kotak di atas dan putar searah jarum jam" 5 kali.

Membawa dua bilangan bulat yang dipisahkan koma melalui STDIN.

>>> ================================ RESTART ================================
>>> 
7,17
BBBWWWWW
BBRWWWWW
RRRWWWWW
RRRWWWWW
RRRWWWWW
>>> ================================ RESTART ================================
>>> 
7,17
GGBRRRRR
GGRRRRRR
WWWRRRRR
WWWRRRRR
WWWRRRRR
Sp3000
sumber
4

Python 2, 421 byte

Ugh, saya yakin ini bisa bermain golf lebih banyak.

from itertools import*
from random import*
f,r=[1,1,2,3,5],range
c={_:[x for x in chain(*[combinations(f,i)for i in r(6)])if sum(x)==_]for _ in r(13)}
k=[[2,1,4],[2,0,4]]+[[3,4]]*3
def b(h,m):
 o=['W']*5;m/=5;h,m=choice(c[h]),choice(c[m])
 l=dict(zip(zip('WWR',[m,h,m]),'GRB'))
 for x in h,m:
    d={1:[0,1],2:[2],3:[3],5:[4]}
    for _ in x:j=d[_].pop();o[j]=l[o[j],x]
 print'\n'.join([''.join(o[i]*f[i]for i in _)for _ in k])

Kasus cobaan:

>>> b(7,20)
WWBRRRRR
WWRRRRRR
GGGRRRRR
GGGRRRRR
GGGRRRRR
>>> b(7,20)
RRBWWWWW
RRRWWWWW
BBBWWWWW
BBBWWWWW
BBBWWWWW
Sirpercival
sumber
@Optimizer sekarang kita hanya perlu memasukkan IDL ke sistem google prettify agar saya bisa mendapatkan sintaks IDL yang menyoroti XD
sirpercival
3

Ruby, 286 byte

Mungkin golf, tetapi akan mencoba waktu lain.

z=[]
13.times{z<<[]}
(0..5).to_a.permutation{|p|l=p.take_while{|n|n<5};z[l.map{|n|[1,1,2,3,5][n]}.reduce(0,:+)]<<l}
t=Time.now
h,m=z[t.hour%12].sample,z[t.min/5].sample
5.times{|y|puts (0..7).map{|x|a=(x>2?4:y>1?3:x<2?2:y<1?1:0);q=m.include?(a);h.include?(a)?q ? ?B:?R: q ??G:?W}*""}

Penjelasan:

z=[]
13.times{z<<[]}                 # Initialize the array where we will have all the combinations
(0..5).to_a.permutation{|p|     # Get all the permutations of the 5 positions plus a 5, which will be used as a separator
    l=p.take_while{|n|n<5};     # Get the permutation until the separator. This way we get all the possible sum combinations of the other five numbers
    z[l.map{|n|[1,1,2,3,5][n]}.reduce(0,:+)]<<l}     # Add the permutation to the list with id=the permutation's sum

t=Time.now # Get current time
h,m=z[t.hour%12].sample,z[t.min/5].sample     # For the hour and the minute, get a random permutation that has the expected sum
5.times{|y|                 # For each row
    $><<(0..7).map{|x|      # For each column
        a=(x>2?4:y>1?3:x<2?2:y<1?1:0);     # Get the panel we are in
        q=m.include?(a);h.include?(a)?q ? ?B:?R: q ??G:?W     # Get the color this panel is painted
    }*""}                   # Join the string and print it
rorlork
sumber
1
Anda dapat menggantinya (0..5).to_adengan[*0..5]
addison