-
"अच्छा संख्या" का एक अनुभवहीन विस्तार [संपादित करें मैं http://www.acooke.org/cute/AutoScalin0.html में यह एक छोटे से अधिक विस्तार] एल्गोरिथ्म आधार 12 और 60 है, जो घंटे और मिनट के लिए अच्छा अंतराल देता है के लिए काम करने लगता है।उदाहरण के लिए
LIM10 = (10, [(1.5, 1), (3, 2), (7, 5)], [1, 2, 5])
LIM12 = (12, [(1.5, 1), (3, 2), (8, 6)], [1, 2, 6])
LIM60 = (60, [(1.5, 1), (20, 15), (40, 30)], [1, 15, 40])
def heckbert_d(lo, hi, ntick=5, limits=None):
'''
Heckbert's "nice numbers" algorithm for graph ranges, from "Graphics Gems".
'''
if limits is None:
limits = LIM10
(base, rfs, fs) = limits
def nicenum(x, round):
step = base ** floor(log(x)/log(base))
f = float(x)/step
nf = base
if round:
for (a, b) in rfs:
if f < a:
nf = b
break
else:
for a in fs:
if f <= a:
nf = a
break
return nf * step
delta = nicenum(hi-lo, False)
return nicenum(delta/(ntick-1), True)
def heckbert(lo, hi, ntick=5, limits=None):
'''
Heckbert's "nice numbers" algorithm for graph ranges, from "Graphics Gems".
'''
def _heckbert():
d = heckbert_d(lo, hi, ntick=ntick, limits=limits)
graphlo = floor(lo/d) * d
graphhi = ceil(hi/d) * d
fmt = '%' + '.%df' % max(-floor(log10(d)), 0)
value = graphlo
while value < graphhi + 0.5*d:
yield fmt % value
value += d
return list(_heckbert())
इसलिए, यदि आप 0 से 60 सेकंड प्रदर्शित करना चाहते हैं 0 से 5 के लिए
>>> heckbert(0, 60, limits=LIM60)
['0', '15', '30', '45', '60']
या घंटे,,:
>>> heckbert(0, 5, limits=LIM12)
['0', '2', '4', '6']
इस कोड को मैं सिर्फ एक साथ काट दिया है
"1.5 दिन", "9 दिन" जैसी चीजें कार्यान्वयन की अवधि में अत्यधिक भाषा निर्भर हैं (मेरे लिए)। उदाहरण के लिए, सी या यहां तक कि सी ++ में, मैं बस दोनों बार के बीच मिलीसेकंड में अंतर को पकड़ने के लिए एक हस्ताक्षरित लंबे समय तक उपयोग करता हूं, जबकि जावा में, मैं शायद समय या क्षण वर्ग बनाउंगा, और शायद पहले से ही उनमें से कुछ पहले से ही हैं। .. – Joanis