ASCIIフィボナッチ時計を作成する


16

誰かがフィボナッチ数を使って本当に派手な時計作りました。好きなように!これを作り直しましょう。

クロックは、1から始まる最初の5つのフィボナッチ数に対応する5つのセクションで構成されます(つまり、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 + 1また4 = 3 + 1、とを書くこともできます。

GGRWWWWW          GGBWWWWW
GGBWWWWW          GGRWWWWW
BBBWWWWW    or    BBBWWWWW
BBBWWWWW          BBBWWWWW
BBBWWWWW          BBBWWWWW

どちら1が選択されるかによります。もちろん、他の組み合わせもあります。クロックは、すべての有効な分解からランダムに選択します。

私が言ったように...これはユーザビリティ賞を受賞しないかもしれませんが、それは確かに見て素晴らしいです。

チャレンジ

あなたの仕事は、そのようなクロックを実装することです。プログラム(または関数)は、上記のSTDOUTまたは最も近い代替のように、現在時刻のASCII表現(最後の5分の倍数に切り捨てられます)を出力する必要があります。入力として任意の一般的な形式で時間を読み取るか、標準ライブラリ関数を使用して取得することを選択できます。現在/指定された時間が5分で割り切れると想定しないでください。

ソリューションは、現在の時間の可能なすべての表現からランダムに選択する必要があります。つまり、各表現はゼロ以外の確率で印刷する必要があります。

真夜中と正午は0:00(としてではなく12:00)として扱われるべきです。

オプションで、単一の末尾改行文字を印刷できます。

の代わりに、任意の4つの異なる印刷可能なASCII文字(文字コード0x20〜0xFE)を使用できRGBWます。答えに選択肢を明記し、一貫して使用してください。

これはコードゴルフなので、最短の回答(バイト単位)が勝ちです。


(a)入力が12 = 0ルールに従うと仮定できますか?(b)出力はその方向にある必要がありますか、それとも回転できますか?
サーパーシバル

@sirpercival a)はい、それは「一般的な形式」とみなされます。b)チャレンジで与えられたオリエンテーションでなければなりません。
マーティンエンダー

2
この挑戦は不幸な動詞「fibclocking」を生み出しました。
アレックスA.

1
真夜中/正午が12ではなく0になる動機は何ですか?シーケンスの最初の5つの数字は、合計で正確に12になります。
ブライアンJ

@BrianJ一貫性を保つために1つを選択したかったのですが、偶然ゼロを選択しました。とにかくソリューションにあまり影響を与えてはいけません。分には0..11の範囲もあるため、この選択により物事がより簡単になると考えました。
マーティンエンダー

回答:


6

CJam、61バイト

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

STDIN経由でスペースで区切られた2つの整数を受け取り、それぞれの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を介して2つのコンマ区切り整数を受け取ります。

>>> ================================ 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構文の強調表示XDことができるようにグーグル飾り立てるシステムにIDLを取得する必要があります
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]
アディソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.