建立ASCII斐波那契时钟


16

有人使用斐波那契数字建立了一个非常漂亮的时钟,它看起来很不错,但是却无法使用。就是我们喜欢的方式!让我们重新创建它。

时钟由与前五个斐波那契数相对应的5个部分组成,从1(即1、1、2、3、5)开始:

ccbeeeee
ccaeeeee
dddeeeee
dddeeeee
dddeeeee

时钟能够以5分钟为增量显示12小时时间。这是这样的。考虑时间7:20。可以将小时7分解为给定的斐波那契数

7 = 2 + 5

还有5分钟的4个单元。4可以分解为

4 = 2 + 1 + 1

现在,小时显示为红色,分钟显示为绿色,如果小时和分钟都使用数字,则显示为蓝色。如果根本不使用数字,它将保持白色。因此,上面将显示为:

BBGRRRRR
BBGRRRRR
WWWRRRRR
WWWRRRRR
WWWRRRRR

但是,等等,还有更多。上述分解并不是唯一的可能性。一个人也可以写7 = 3 + 2 + 1 + 14 = 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。请在回答中说明您的选择,并一贯使用。

这是代码高尔夫球,因此最短的答案(以字节为单位)获胜。


(a)我们可以假设输入遵循12 = 0规则吗?(b)输出是否必须在该方向上,还是可以旋转它?
sirpercival,2015年

@sirpercival a)是的,我认为这可以算作“任何常见格式”。b)必须是挑战中给出的方向。
马丁·恩德

2
这一挑战催生了不幸的动词“ fibclocking”。
Alex A.

1
午夜/中午从0改为12的动机是什么?序列中的前五个数字正好等于12。
布赖恩J

@BrianJ我只是想选择一个使其一致,并且碰巧选择了零。无论如何,它不应该对解决方案产生太大影响。我认为此选择将使事情变得更简单,因为分钟数的范围也为0..11。
马丁·恩德 Martin Ender)

Answers:


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

蟒蛇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字节

gh,我确定gh这可以打更多。

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 Prettify系统即可,这样我就可以得到IDL语法突出显示XD
sirpercival

3

Ruby,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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.