ASCII 피보나치 시계 만들기


16

누군가 피보나치 숫자를 사용하여 정말 멋진 시계 를 만들었습니다. 우리가 좋아하는 방식! 이것을 다시 만들어 봅시다.

시계는 1부터 시작하여 처음 5 개의 피보나치 수에 해당하는 5 개의 섹션으로 구성됩니다 (예 : 1, 1, 2, 3, 5).

ccbeeeee
ccaeeeee
dddeeeee
dddeeeee
dddeeeee

시계는 12 시간을 5 분 단위로 표시 할 수 있습니다. 작동 방식은 다음과 같습니다. 시간 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것이 선택 되었는지에 따라 . 물론 다른 조합도 있습니다. 시계는 모든 유효한 분해 중에서 무작위로 선택합니다.

내가 말했듯이 ... 이것은 유용성 상을 얻지 못할 수도 있지만보기에 좋습니다.

도전

당신의 임무는 그러한 시계를 구현하는 것입니다. 프로그램 (또는 함수)은 위에서 설명한대로 현재 시간 (5 분의 마지막 배수로 반올림)의 ASCII 표현을 STDOUT 또는 가장 가까운 대안으로 인쇄해야합니다. 일반적인 형식으로 시간을 입력으로 읽거나 표준 라이브러리 함수를 사용하여 시간을 얻도록 선택할 수 있습니다. 현재 / 제공된 시간을 5 분으로 나눌 수 있다고 가정해서는 안됩니다.

솔루션 현재 시간의 가능한 모든 표현 중에서 무작위로 선택 해야 합니다. 즉, 각 표현은 0이 아닌 확률로 인쇄되어야합니다.

자정과 정오는 0:00(와 반대로 12:00) 처리해야합니다 .

선택적으로 단일 후행 개행 문자를 인쇄 할 수 있습니다.

대신에 인쇄 가능한 4 개의 ASCII 문자 (문자 코드 0x20 ~ 0xFE)를 사용할 수 있습니다 RGBW. 귀하의 답변에 선택 사항을 기재하고 일관되게 사용하십시오.

이것은 코드 골프이므로 가장 짧은 대답 (바이트)이 이깁니다.


(a) 입력이 12 = 0 규칙을 따른다고 가정 할 수 있습니까? (b) 출력이 그 방향에 있어야합니까, 아니면 회전 할 수 있습니까?
sirpercival

@sirpercival a) 예, "모든 공통 형식"으로 간주됩니다. b) 도전에 주어진 방향이어야한다.
마틴 엔더

2
이 도전은 불행한 동사 "fibclocking"을 일으켰습니다.
Alex A.

1
자정 / 정오가 12 대신 0이되는 동기는 무엇입니까? 시퀀스에서 처음 5 개의 숫자는 정확히 12를 더합니다.
Brian J

@BrianJ 방금 일관성을 유지하고 0을 선택하기 위해 하나를 선택하고 싶었습니다. 어쨌든 솔루션에 너무 많은 영향을 미치지 않아야합니다. 분이 0..11 범위를 갖기 때문에이 선택이 일을 더 간단하게 만들 것이라고 생각했습니다.
Martin Ender

답변:


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*

설명

이 알고리즘은 내 파이썬 답변 과 같습니다 . 올바른 것을 얻을 때까지 클럭을 생성하여 거부 샘플링입니다.

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, 194182 바이트

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

파이썬 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

내가 IDL이 XD 구문 강조 얻을 수 있도록 @Optimizer 지금 우리는 단지 구글 싸게 치장 시스템에 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.