首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >朝九晚五

朝九晚五
EN

Code Golf用户
提问于 2016-05-24 19:32:42
回答 2查看 266关注 0票数 4

正常运行时间是一个非常重要的指标,正如我们都知道的,所以我们想测量自我们的服务第一次推出以来的正常运行时间。SLA指定一定数量的9的正常运行时间,例如至少99.9%正常运行时间为3 9,或至少为90%正常运行时间为1 9,您想知道是否确实遇到了SLA。因为您知道在上周五晚上有人推动生产时,服务已经停止了,而且这基本上是这里的标准实践,因此您认为您的代码没有必要将100%的正常运行时间作为特例处理。

每次服务器停止或启动时,Nagios都会向您发送电子邮件。所讨论的服务具有一定的容错能力,因此只有m服务器才能在线才能获得该服务。你只是写了一个快速的脚本,从这些电子邮件中提取重要信息。现在是玩得开心的时候了,你也有心情打高尔夫球了。

您的任务是编写一个程序或函数,分析输入,计算出正常运行时间,并打印服务实现的最大整数9。

输入:

  • 要在线考虑的服务运行所需的服务器数量:m > 0。
  • 后面至少有一行,每台服务器一行。每一行都包含该服务器的开始/停止时间。自从服务启动以来,我们已经对此进行了测量,因此,第一个数字是服务器第一次启动的时间。第二次是停止时间,第三次是另一次开始时间等等。
  • 从来没有一台服务器同时启动和停止。
  • 这意味着,如果服务器当前正在运行,您还没有收到一封关于服务器关闭的电子邮件,因此,这条线路上的数字将是奇怪的。
  • 行是排序的,但不同行之间的排序没有强制执行。
  • 输入是EOF终止的.输入的最后一个字符是\n,后面是EOF (ctrl+D)。
  • 时间从时间0开始,结束于单个服务器上一次记录的开始/停止,因为这是我们到目前为止所掌握的全部信息。这可以通过在所有奇数行的末尾添加最大值(每行的最后一个数字)来实现。
  • 时间是离散的。
  • 所有输入数字都保证符合32位整数。
  • 服务永远不会有100%的正常运行时间。
  • 如果您想要添加一个整数,告诉您有多少服务器,您可以这样做。您还可以在每条服务器行的开头添加一个整数,告诉您该服务器有多少度量。参见第一个测试案例中的示例。您也可以使用任何您想要的本地格式。

输出:

输出由一个整数组成;可以保证在事后才能保证的9的最高数量,即3至少用于99.9%正常运行时间,或4用于至少99.99%正常运行时间。

测试案例:

第一:

代码语言:javascript
运行
复制
1
0 5 8 10
0 1 7

-> 1

首先,使用计数(如果您喜欢的话):

代码语言:javascript
运行
复制
1 2
4 0 5 8 10
3 0 1 7

-> 1

第二:

代码语言:javascript
运行
复制
1
0 999 1001 2000

-> 3

第三:

代码语言:javascript
运行
复制
3
0 42

-> 0

参考实现:(Python 2)

代码语言:javascript
运行
复制
"""
Slow and huge, but useful for checking smaller inputs.

input: m, followed by n lines of start and stop times, all servers are turned off in the beginning, all numbers fit inside 32bit signed integers, counts are optional
output: number of nines of uptime

example:
1
0 5 8 9
0 1 7
parsed:
1st node: on 0:5, 7:9
2nd node: on 0:1, 6:9
at least one server is running during:
0:5, 7:9
known time interval: 0:9, only timestep 6 is down, so 90% uptime during the part we can see.
output:
1

"""

import sys


def rangeify(l):
    res = []
    for i in range(0, len(l), 2):
        res += range(l[i], l[i + 1] + 1)
    return res


def parse():
    m = input()
    lines = [map(int, x.split()) for x in sys.stdin.read().split("\n")[:-1]]
    if not lines:
        return [], m
    top = max(map(max, lines))
    nlines = [x + [top] if len(x) % 2 else x for x in lines]

    n2lines = map(rangeify, nlines)
    return n2lines, m


def flatten(ls):
    res = []
    for l in ls:
        res += l
    return sorted(res)


def join(ups):
    res = {}
    for up in ups:
        if up not in res:
            res[up] = 0
        res[up] += 1
    return res


def bin(ups, m):
    res = []
    for up in range(max(ups)+1):
        res += [up in ups and ups[up] >= m]
    return res


def nines(a):
    s = ("%.15f" % a)[2:]
    s2 = s.lstrip("9")
    return len(s) - len(s2)


def solve(l, m):
    if len(l) < m:
        return nines(0)
    b = bin(join(flatten(l)), m)
    return nines(sum(b) / float(len(b)))


print solve(*parse())
EN

回答 2

Code Golf用户

发布于 2016-05-24 23:39:45

JavaScript (ES6),161个字节

代码语言:javascript
运行
复制
(m,a)=>a.map(b=>b.map(n=>l=n>l?n:l),l=0)|a.map(b=>c.map((_,i)=>{k=b[j]==i;j+=k;n^=k;c[i]+=n|k},j=n=0),c=Array(++l).fill(0))|Math.log10(l/c.filter(n=>n<m).length)

接受表示并发服务器的最小数目的整数和表示每个服务器的开始和停止时间的数组。编辑:现在使用包含范围,因此正确返回第一个示例的1。

票数 1
EN

Code Golf用户

发布于 2016-05-25 01:00:56

Pyth - 26字节

代码语言:javascript
运行
复制
/`.Omgsm%lf<dTk2.QQeSs.Q`9

在网上试一试

票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/80563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档