Bir ASCII Fibonacci Saati Oluşturun


16

Birisi gerçekten güzel görünen ama oldukça kullanılamaz olan Fibonacci sayılarını kullanarak gerçekten süslü bir saat inşa etti . Tam istediğimiz gibi! Bunu yeniden oluşturalım.

Saat, 1'den başlayarak (yani 1, 1, 2, 3, 5) ilk beş Fibonacci sayısına karşılık gelen 5 bölümden oluşur:

ccbeeeee
ccaeeeee
dddeeeee
dddeeeee
dddeeeee

Saat, 12 saatlik süreyi 5 dakikalık artışlarla gösterebilir. İşte böyle çalışır. Zamanı 7:20 düşünün. Saat 7 verilen Fibonacci sayılarına ayrılabilir

7 = 2 + 5

Ayrıca beş dakikalık 4 ünite vardır. 4 şu şekilde ayrıştırılabilir:

4 = 2 + 1 + 1

Şimdi saatler kırmızı renkte, dakikalar yeşil renkte gösterilir ve bir saat hem saat hem de dakika olarak kullanılırsa mavi renkte gösterilir. Bir sayı hiç kullanılmazsa, beyaz kalır. Yani yukarıdakiler şöyle gösterilecekti:

BBGRRRRR
BBGRRRRR
WWWRRRRR
WWWRRRRR
WWWRRRRR

Ama bekleyin, dahası var. Yukarıdaki ayrışmalar tek olasılık değildir. Bir de yazabilir 7 = 3 + 2 + 1 + 1ve 4 = 3 + 1birini verecek olan

GGRWWWWW          GGBWWWWW
GGBWWWWW          GGRWWWWW
BBBWWWWW    or    BBBWWWWW
BBBWWWWW          BBBWWWWW
BBBWWWWW          BBBWWWWW

hangisine bağlı olduğuna bağlı olarak 1. Tabii ki başka kombinasyonlar da var. Saat, geçerli tüm ayrışmalardan rastgele seçer.

Dediğim gibi ... bu bir kullanılabilirlik ödülü kazanmayabilir, ama bakmak güzel.

Meydan okuma

Senin görevin böyle bir saat uygulamak. Programınız (veya işleviniz) yukarıda açıklandığı gibi STDOUT veya en yakın alternatif için geçerli zamanın ASCII temsilini yazdırmalıdır (5 dakikanın son katına yuvarlanır). Saati herhangi bir ortak formatta girdi olarak okumayı veya standart kütüphane işlevleriyle almayı seçebilirsiniz. Geçerli / verilen sürenin 5 dakikaya bölünebileceğini varsaymamalısınız.

Çözümün gerekir şimdiki zaman mümkün olan tüm temsillerin rasgele seçim. Yani her gösterim sıfır olmayan bir olasılıkla basılmalıdır.

Gece yarısı ve öğlen olarak 0:00(aksine 12:00) ele alınmalıdır .

İsteğe bağlı olarak tek bir satırsonu karakteri yazdırabilirsiniz.

Bunun yerine dört farklı yazdırılabilir ASCII karakteri (0x20 - 0xFE karakter kodları) kullanabilirsiniz RGBW. Lütfen seçiminizi cevabınızda belirtin ve sürekli kullanın.

Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır.


(a) girdinin 12 = 0 kuralına uygun olduğunu varsayabilir miyiz? (b) çıktının bu yönde olması mı gerekiyor, yoksa onu döndürebilir miyiz?
sirpercival

@sirpercival a) Evet, bence bu "ortak bir biçim" olarak sayılıyor. b) Meydan okumada verilen yönelim olmalıdır.
Martin Ender

2
Bu meydan okuma talihsiz fiil "fibclocking" doğurdu.
Alex A.

1
Gece yarısı / öğlen 12 yerine 0 olmak için motivasyon nedir? Sekanstaki ilk beş sayı tam olarak 12'ye çıkar.
Brian J

@BrianJ Sadece tutarlı hale getirmek için birini seçmek istedim ve sıfır seçti. Zaten çözümleri çok fazla etkilememelidir. Bu seçimin daha basit olacağını düşündüm çünkü dakikalar da 0..11 menzile sahip.
Martin Ender

Yanıtlar:


6

CJam, 61 bayt

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

STDIN üzerinden iki boşlukla ayrılmış tamsayı alır ve sırasıyla 3.14yerine kullanır WRGB. Çevrimiçi deneyin .

RGBWBirkaç ekstra bayt için "aklı başında" sürümü:

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

açıklama

Algoritma Python cevabımla aynı - doğru olanı bulana kadar saatler üreterek reddetme örneklemesi.

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, 194182 bayt

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)

Algoritma sadece reddetme örneklemesidir, bu yüzden doğru olana kadar saatler üretmeye devam eder. Saat, hiçbir şeyle başlayıp, 5 kez "üstüne bir kare ekleyin ve saat yönünde döndürün".

STDIN ile virgülle ayrılmış iki tam sayı alır.

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

4

Python 2, 421 bayt

Ugh, eminim bu daha çok golf edilebilir.

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

Test durumu:

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

@Optimizer şimdi biz sadece IDL sözdizimi XD
sirpercival

3

Yakut, 286 bayt

Golf yapılabilir, ancak başka bir zaman deneyecek.

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

Açıklama:

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
Sen yerini alabilir (0..5).to_aile[*0..5]
addison
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.