Xây dựng đồng hồ Fibre ASCII


16

Ai đó đã chế tạo một chiếc đồng hồ thực sự lạ mắt bằng cách sử dụng các số Fibonacci, trông thực sự đẹp nhưng khá khó sử dụng. Chỉ là cách chúng tôi thích nó! Hãy tạo lại điều này.

Đồng hồ được tạo thành từ 5 phần tương ứng với năm số Fibonacci đầu tiên, bắt đầu từ 1 (tức là 1, 1, 2, 3, 5):

ccbeeeee
ccaeeeee
dddeeeee
dddeeeee
dddeeeee

Đồng hồ có khả năng hiển thị thời gian 12 giờ với gia số 5 phút. Đây là cách nó hoạt động. Hãy xem xét thời gian 7:20. Giờ 7 có thể được phân tách thành các số Fibonacci đã cho

7 = 2 + 5

Ngoài ra còn có 4 đơn vị năm phút. 4 có thể được phân tách thành

4 = 2 + 1 + 1

Bây giờ giờ được hiển thị bằng màu đỏ, các phút có màu xanh lục và nếu một số được sử dụng cho cả giờ và phút thì nó sẽ hiển thị bằng màu xanh lam. Nếu một số hoàn toàn không được sử dụng, nó vẫn có màu trắng. Vì vậy, ở trên sẽ được hiển thị như sau:

BBGRRRRR
BBGRRRRR
WWWRRRRR
WWWRRRRR
WWWRRRRR

Nhưng xin chờ chút nữa. Các phân tách trên không phải là khả năng duy nhất. Người ta cũng có thể viết 7 = 3 + 2 + 1 + 14 = 3 + 1, sẽ cung cấp cho một trong

GGRWWWWW          GGBWWWWW
GGBWWWWW          GGRWWWWW
BBBWWWWW    or    BBBWWWWW
BBBWWWWW          BBBWWWWW
BBBWWWWW          BBBWWWWW

tùy thuộc vào cái nào 1được chọn Tất nhiên có những kết hợp khác là tốt. Đồng hồ chọn từ tất cả các phân tách hợp lệ một cách ngẫu nhiên.

Như tôi đã nói ... điều này có thể không giành được giải thưởng về khả năng sử dụng, nhưng nó chắc chắn là tốt để xem xét.

Các thách thức

Nhiệm vụ của bạn là thực hiện một chiếc đồng hồ như vậy. Chương trình (hoặc chức năng) của bạn nên in một đại diện ASCII của thời gian hiện tại (làm tròn xuống bội số cuối cùng của 5 phút) như được mô tả ở trên để STDOUT hoặc thay thế gần nhất. Bạn có thể chọn đọc thời gian ở bất kỳ định dạng phổ biến nào dưới dạng đầu vào hoặc lấy nó với các chức năng thư viện tiêu chuẩn. Bạn không được cho rằng thời gian hiện tại / đã cho là chia hết cho 5 phút.

Giải pháp của bạn phải chọn ngẫu nhiên từ tất cả các đại diện có thể có của thời điểm hiện tại. Đó là mỗi đại diện phải được in với xác suất khác không.

Nửa đêm và buổi trưa nên được coi là 0:00(trái ngược với 12:00).

Bạn có thể tùy ý in một ký tự dòng mới.

Bạn có thể sử dụng bất kỳ bốn ký tự ASCII có thể in riêng biệt (mã ký tự 0x20 đến 0xFE) thay thế RGBW. Vui lòng nêu sự lựa chọn của bạn trong câu trả lời của bạn và sử dụng nó một cách nhất quán.

Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.


(a) chúng ta có thể giả sử rằng đầu vào tuân theo quy tắc 12 = 0 không? (b) đầu ra phải theo hướng đó, hoặc chúng ta có thể xoay nó không?
sirpercival

@sirpercival a) Có, tôi nghĩ rằng nó được tính là "bất kỳ định dạng phổ biến". b) Nó phải là định hướng được đưa ra trong thử thách.
Martin Ender

2
Thử thách này đã sinh ra động từ không may "xơ xác".
Alex A.

1
Động lực cho nửa đêm / trưa là 0 thay vì 12 là gì? Năm số đầu tiên trong chuỗi thêm tối đa 12 chính xác.
Brian J

@BrianJ Tôi chỉ muốn chọn một cái để làm cho nó nhất quán và tình cờ chọn số không. Nó không thực sự ảnh hưởng đến giải pháp quá nhiều. Tôi cho rằng lựa chọn này sẽ làm mọi thứ đơn giản hơn vì các phút cũng có phạm vi 0..11.
Martin Ender

Câu trả lời:


6

CJam, 61 byte

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

Lấy hai số nguyên được phân tách bằng dấu cách qua STDIN và sử dụng 3.14thay vì WRGBtương ứng. Hãy thử trực tuyến .

Đây là RGBWphiên bản "lành mạnh" cho một vài byte bổ sung:

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

Giải trình

Thuật toán giống như câu trả lời Python của tôi - lấy mẫu từ chối bằng cách tạo đồng hồ cho đến khi chúng tôi nhận được đúng.

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

Thuật toán chỉ là lấy mẫu từ chối, vì vậy nó tiếp tục tạo đồng hồ cho đến khi nó đạt được điều đó đúng. Đồng hồ được chế tạo bằng cách bắt đầu không có gì, sau đó thực hiện "thêm hình vuông ở trên và xoay theo chiều kim đồng hồ" 5 lần.

Có hai số nguyên được phân tách bằng dấu phẩy thông qua STDIN.

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

4

Python 2, 421 byte

Ugh, tôi chắc chắn rằng điều này có thể được chơi golf nhiều hơn.

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

Trường hợp thử nghiệm:

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

@Optimizer bây giờ chúng ta chỉ cần đưa IDL vào hệ thống google prettify để tôi có thể lấy cú pháp IDL làm nổi bật XD
sirpercival

3

Ruby, 286 byte

Nó có thể là golf, nhưng sẽ thử một thời gian khác.

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

Giải trình:

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
Bạn có thể thay thế (0..5).to_abằng[*0..5]
addison
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.