Побудуйте годинник ASCII Фібоначчі


16

Хтось побудував по-справжньому фантазійний годинник за допомогою цифр Фібоначчі, що виглядає дуже приємно, але є досить непридатним. Просто так, як нам це подобається! Давайте відтворимо це.

Годинник складається з 5 секцій, що відповідають першим п'яти числам Фібоначчі, починаючи з 1 (тобто 1, 1, 2, 3, 5):

ccbeeeee
ccaeeeee
dddeeeee
dddeeeee
dddeeeee

Годинник здатний відображати 12-годинний час з кроком 5 хвилин. Ось як це працює. Розглянемо час 7:20. Година 7 може бути розкладена на задані числа Фібоначчі як

7 = 2 + 5

Також є 4 одиниці по п'ять хвилин. 4 можна розкласти як

4 = 2 + 1 + 1

Тепер години відображаються червоним кольором, хвилини - зеленим, а якщо число використовується як години, так і хвилини, воно відображається синім кольором. Якщо число взагалі не використовується, воно залишається білим. Отже, вищезгадане було б показано як:

BBGRRRRR
BBGRRRRR
WWWRRRRR
WWWRRRRR
WWWRRRRR

Але зачекай, є ще. Вищезгадані розклади - не єдині можливості. Можна також написати 7 = 3 + 2 + 1 + 1і те 4 = 3 + 1, що дало б один із

GGRWWWWW          GGBWWWWW
GGBWWWWW          GGRWWWWW
BBBWWWWW    or    BBBWWWWW
BBBWWWWW          BBBWWWWW
BBBWWWWW          BBBWWWWW

залежно від того, який 1обраний. Звичайно, є й інші комбінації. Годинник вибирає з усіх дійсних розкладу навмання.

Як я вже говорив ... це може не виграти нагороду за зручність, але це приємно подивитися.

Змагання

Ваше завдання - реалізувати такий годинник. Ваша програма (або функція) повинна надрукувати ASCII-подання поточного часу (округлене до останнього кратного 5 хвилин), як описано вище до STDOUT або найближчої альтернативи. Ви можете прочитати час у будь-якому загальному форматі як вхідний або отримати його за допомогою стандартних функцій бібліотеки. Ви не повинні вважати, що поточний / заданий час ділиться на 5 хвилин.

Ваше рішення повинно вибиратися випадковим чином з усіх можливих уявлень поточного часу. Тобто кожне подання повинно бути надруковано з ненульовою ймовірністю.

Опівночі та полудні слід трактувати як 0:00(на відміну від 12:00).

Ви можете необов'язково надрукувати один символ нового рядка.

Ви можете використовувати будь-які чотири окремі символи ASCII для друку (коди символів 0x20 до 0xFE) замість RGBW. Будь ласка, вкажіть свій вибір у своїй відповіді та використовуйте послідовно.

Це кодовий гольф, тому найкоротша відповідь (у байтах) виграє.


(а) чи можна вважати, що вхід відповідає правилу 12 = 0? (b) чи повинен висновок бути у цій орієнтації, чи ми можемо його обертати?
серперцивал

@sirpercival a) Так, я думаю, що це вважається "будь-яким загальним форматом". б) Це має бути орієнтація, задана в виклику.
Мартін Ендер

2
Цей виклик породив невдале дієслово "fibclocking".
Олексій А.

1
Яка мотивація для опівночі / полудня 0, а не 12? Перші п'ять чисел у послідовності складають до 12 рівно.
Брайан Дж

@BrianJ Я просто хотів вибрати одну, щоб вона була послідовною, і трапилось вибрати нуль. Насправді це не повинно занадто сильно впливати на рішення. Я вважав, що цей вибір полегшить роботу, оскільки хвилини також мають діапазон 0..11.
Мартін Ендер

Відповіді:


6

CJam, 61 байт

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

Бере два цілих цілих числа через STDIN та використовує 3.14замість них WRGBвідповідно. Спробуйте в Інтернеті .

Ось "розумна" RGBWверсія для кількох зайвих байтів:

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

Пояснення

Алгоритм такий самий, як і моя відповідь Python - вибірки відхилення шляхом генерації годин, поки ми не отримаємо правильний.

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

9

Python 2, 194 182 байт

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)

Алгоритм є просто вибіркою відхилення, тому він продовжує генерувати тактові годинники, поки не отримає потрібний. Годинник будується починаючи з нічого, потім роблячи "додати квадрат вище і обертати за годинниковою стрілкою" 5 разів.

Бере два цілих числа, розділених комами, через STDIN.

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

4

Python 2, 421 байт

Фу, я впевнений, що в цьому можна більше пограти в гольф.

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

Тестовий випадок:

>>> b(7,20)
WWBRRRRR
WWRRRRRR
GGGRRRRR
GGGRRRRR
GGGRRRRR
>>> b(7,20)
RRBWWWWW
RRRWWWWW
BBBWWWWW
BBBWWWWW
BBBWWWWW

@Optimizer тепер нам просто потрібно запустити IDL в систему красивого пошуку Google, щоб я міг отримати синтаксис виділення синтаксису IDL XD
sirpercival

3

Рубін, 286 байт

Це може бути пограбовано, але спробуємо в інший раз.

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}*""}

Пояснення:

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

1
Ви можете замінити (0..5).to_aна[*0..5]
addison
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.