time a given player spends actually connected to the
network.
We keep console logs of various game subsystems for each play session. Each log message
has the following format:
(MM/dd/yyyy-hh:mm:ss) :: [message logged]
Sample log lines:
(11/12/2015-02:34:56) :: START
(01/02/1990-13:10:00) :: DISCONNECTED
(03/13/2018-21:01:01) :: ERROR - File "close.png" not found.
Log messages that pertain to network connectivity are as follows:
START : Logged when the game starts up.
CONNECTED : Logged when a network connection is established.
DISCONNECTED : Logged when network connection is lost.
SHUTDOWN : Logged when the player is quitting the game.
A player's session length is the amount of time between the START and SHUTDOWN
messages.
A player's connected time is the amount of time they spend in a connected state. A player starts
the game disconnected, becomes connected when we log a CONNECTED message, and
becomes disconnected when we log a DISCONNECTED message.
You can make the following assumptions:
All logs will be properly formatted
All dates will be valid
No log message will stretch across multiple lines
All log files will be ordered chronologically
There will always be exactly one START and exactly one SHUTDOWN event logged
Input
A file containing lines of log messages.
Output
The connectivity percentage as a string, rounded down to an integer.
Examples
(01/01/2000-01:00:00) :: START
(01/01/2000-01:01:00) :: CONNECTED
(01/01/2000-01:21:00) :: DISCONNECTED
(01/01/2000-01:50:00) :: SHUTDOWN
The player spent 20 minutes out of 50 connected, 20 / 50 = 0.4, output should be "40%"
(02/03/2002-14:00:00) :: START
(02/03/2002-14:00:00) :: CONNECTED
(02/03/2002-14:08:00) :: DISCONNECTED
(02/03/2002-14:10:00) :: CONNECTED
(02/03/2002-14:15:00) :: SHUTDOWN
The player spent 13 minutes out of 15 connected, 13 / 15 = 0.8667, output should be "86%"
More sample input can be found in the text files input_1.txt, input_2.txt, and input_3.txt
有事游戏中有Log用于记录各种状态,想知道究竟用户连接的时间是多少。状态除了START, CONNECTED, DISCONNECTED, SHUTDONW外还有ERROR啥的,但是只需要关注前四个。
输入形式: vector<string> lines
(11/01/2015-04:00:00) :: START
(11/01/2015-04:00:00) :: CONNECTED
(11/01/2015-04:30:00) :: DISCONNECTED
(11/01/2015-04:45:00) :: CONNECTED
(11/01/2015-05:00:00) :: SHUTDOWN

涉及到处理Date, 以及STDIN from a file

处理Date可以用SimpleDateFormat这个class

static Date parseTime(String timeStr) {
  Date time = new Date();
  DateFormat dft = new SimpleDateFormat("MM/dd/yyyy-hh:mm:ss");
  try {
    time = dft.parse(timeStr);
  }catch (ParseException ignored) {}
  return time;
}

 package pocketGems;

 import java.io.*;
import java.util.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat; public class LogParser2 {
public static void main(String[] args)
throws FileNotFoundException, IOException {
String filename = "C:/Users/yang liu/workspace/Interview2017/src/pocketGems/test1.txt";
if (args.length > 0) {
filename = args[0];
} String answer = parseFile(filename);
System.out.println(answer);
} static String parseFile(String filename)
throws FileNotFoundException, IOException{
BufferedReader input = new BufferedReader(new FileReader(filename));
List<String> allLines = new ArrayList<String>();
String line = "";
while ((line = input.readLine()) != null) {
allLines.add(line);
}
input.close();
return parseLines(allLines.toArray(new String[allLines.size()]));
} static String parseLines(String[] lines) {
Map<String, Integer> status = new HashMap<String, Integer>(); status.put("START", 0);
status.put("CONNECTED", 1);
status.put("DISCONNECTED", -1);
status.put("SHUTDOWN", -2); long totalTime = 0;
long connectTime = 0;
boolean isConnected = false;
Date lastConnectMoment = new Date();
Date startMoment = new Date();
Date shutMoment = new Date(); for (String line : lines) {
String[] lineSplit = line.split(" :: ");
String event = lineSplit[1];
if (!status.containsKey(event)) continue; String cur = lineSplit[0];
Date currentTime = parseTime(cur.substring(1, cur.length()-1)); int eventID = status.get(event);
if (eventID > 0) {
if (!isConnected)
lastConnectMoment = currentTime;
isConnected = true;
}
else if (eventID < 0) {
if (isConnected)
connectTime += currentTime.getTime() - lastConnectMoment.getTime();
isConnected = false;
}
if (eventID == 0) startMoment = currentTime;
if (eventID == -2) shutMoment = currentTime;
}
totalTime = shutMoment.getTime() - startMoment.getTime(); double ratio = (double)connectTime/totalTime * 100;
return String.format("%d%s", (int)ratio, "%");
} static Date parseTime(String timeStr) {
Date time = new Date();
DateFormat dft = new SimpleDateFormat("MM/dd/yyyy-hh:mm:ss");
try {
time = dft.parse(timeStr);
}catch (ParseException ignored) {}
return time;
}
}

Pocket Gem OA: Log Parser的更多相关文章

  1. Pocket Gem OA: Path Finder

    1. 有向图 找所有start node到end node之间的路径 输入是一个txt 形式如下: A E A : B C D. B : C C : E D : B. 输出一个List<Stri ...

  2. Log Parser 2.2 分析 IIS 日志

    1,安装Log Parser 2.2 https://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=24659 ...

  3. 用Log Parser Studio分析IIS日志

    发现一个强大的图形化IIS日志分析工具——Log Parser Studio,下面分享一个实际操作案例. 1. 安装Log Parser Studio a) 需要先安装Log Parser,下载地址: ...

  4. 云计算之路-阿里云上:借助IIS Log Parser Studio分析“黑色30秒”问题

    今天下午15:11-15:13间出现了类似“黑色30秒”的状况,我们用强大的IIS日志分析工具——Log Parser Studio进行了进一步的分析. 分析情况如下—— 先看一下Windows性能监 ...

  5. Log Parser 2.2

    Log Parser 2.2 是一个功能强大的通用工具,它可对基于文本的数据(如日志文件.XML 文件和 CSV 文件)以及 Windows 操作系统上的重要数据源(如事件日志.注册表.文件系统和 A ...

  6. Log Parser 微软强大的日志分析工具

    Log Parser(微软网站下载)是微软公司出品的日志分析工具,它功能强大,使用简单,可以分析基于文本的日志文件.XML 文件.CSV(逗号分隔符)文件,以及操作系统的事件日志.注册表.文件系统.A ...

  7. 日志分析工具Log Parser介绍

    摘要: 微软动态CRM专家罗勇 ,回复321或者20190322可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 分析Dynamics 365 Customer Enga ...

  8. Log Parser Studio 分析 IIS 日志

    Log Parser Studio 分析 IIS 日志 来源 https://www.cnblogs.com/lonelyxmas/p/8671336.html 软件下载地址: Log Parser ...

  9. IIS 日志分析工具:Log Parser Studio

    1.安装Log Parser,下载地址:http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=24659 ...

随机推荐

  1. fastadmin模态框(弹出框)

    用法: 在html页面新建一个按钮用来触发事件 <a href="javascript:;" class="btn btn-success btn-add &quo ...

  2. Round#534 div.2-C Grid game

    http://codeforces.com/contest/1104/problem/C 好厉害的题~ 只要把竖着的放在第一第二行,横着的放在第三/第四行就行. 哦吼,大半夜脑子迷糊地看英文的脑筋急转 ...

  3. Showstopper [POJ3484] [二分] [思维]

    Description 给你n个数列,问哪一个数字在所有的数列中出现了奇数次(最多一个). Sample Input 1 10 1 2 10 1 1 10 1 1 10 1 1 10 1 4 4 1 ...

  4. nginx/php的redis模块扩展

    redis模块介绍 redis2-nginx-module 可以实现 Nginx 以非阻塞方式直接防问远方的 Redis 服务,可以启用强大的 Redis 连接池功能,进而实现更多的连接与更快速的访问 ...

  5. Winform 关闭按钮

    问题:我希望树形导航目录窗体在打开一条记录后自动隐藏,然后再次点击主页面打开按钮的时候在自动显示,这样就能保证树形目录仍旧显示隐藏前的展开状态.这里遇到一个问题,就是点击窗体右上角的关闭按钮时,默认情 ...

  6. JDBC的理解

    import java.sql.*;//倒入java.sql包 public class JDBC { //封装没有返回值的jdbc函数(Update) --适用于增 删 改 public stati ...

  7. reference to 'map' is ambiguous|

    reference to 'map' is ambiguous| c++编译出现此错误    表明定义的变量名字map和库函数map冲突而产生歧义

  8. Web Api使用Swagger提供在线文档

    1.添加Swashbuckle引用 2.生成XML文件 3.添加XML解析,在接口添加注释信息 4.运行项目输入地址   http://localhost:58254/swagger

  9. windows redis 自动启动

    start.bat D: D:\dev\redis- redis-server.exe redis.conf redis.vbs createobject( 之后,把 start.bat 放在redi ...

  10. superset安装配置

    1.安装操作系统依赖 yum -y install vim net-tools yum upgrade python-setuptools yum -y install gcc gcc-c++ lib ...