สร้างนาฬิกา ASCII Fibonacci


16

มีคนสร้างนาฬิกาแฟนซีขึ้นมาจริงๆโดยใช้ตัวเลขฟีโบนักชีซึ่งดูดีมาก แต่ใช้ไม่ได้ ในแบบที่เราชอบ! มาสร้างใหม่กันเถอะ

นาฬิกาประกอบด้วย 5 ส่วนที่สอดคล้องกับหมายเลข Fibonacci ห้าตัวแรกเริ่มต้นจาก 1 (เช่น 1, 1, 2, 3, 5):

ccbeeeee
ccaeeeee
dddeeeee
dddeeeee
dddeeeee

นาฬิกาสามารถแสดงเวลา 12 ชั่วโมงโดยเพิ่มทีละ 5 นาที นี่คือวิธีการทำงาน พิจารณาเวลา 7:20 7 ชั่วโมงสามารถแบ่งออกเป็นตัวเลขที่ได้รับ Fibonacci เป็น

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ในสถานที่ของ โปรดระบุตัวเลือกของคุณในคำตอบและใช้อย่างสม่ำเสมอ

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ


(a) เราสามารถสมมติได้ว่าอินพุตเป็นไปตามกฎ 12 = 0 หรือไม่ (b) เอาต์พุตต้องอยู่ในทิศทางนั้นหรือเราหมุนได้หรือไม่?
sirpercival

@sirpercival a) ใช่ฉันคิดว่านับเป็น "รูปแบบทั่วไปใด ๆ " b) ต้องมีการปฐมนิเทศที่กำหนดในการท้าทาย
Martin Ender

2
ความท้าทายนี้กลับกลายเป็นคำกริยาที่โชคร้ายที่เรียกว่า
Alex A.

1
แรงจูงใจในการเที่ยงคืน / เที่ยงเป็น 0 แทนที่จะเป็น 12 คืออะไร ตัวเลขห้าตัวแรกในลำดับเพิ่มขึ้นถึง 12 อย่างแน่นอน
Brian J

@BrianJ ฉันแค่ต้องการเลือกหนึ่งตัวเพื่อให้สอดคล้องและเกิดขึ้นเพื่อเลือกศูนย์ มันไม่ควรส่งผลกระทบต่อโซลูชั่นมากเกินไป ฉันคิดว่าตัวเลือกนี้จะทำให้สิ่งต่าง ๆ ง่ายขึ้นเพราะนาทีก็มีช่วง 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*

คำอธิบาย

อัลกอริทึมเหมือนกับคำตอบ 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

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]
แอดดิสัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.