Text processing/Max licenses in use
Text processing/Max licenses in use
You are encouraged to solve this task according to the task description, using any language you may know.
You are encouraged to solve this task according to the task description, using any language you may know.
A company currently pays a fixed sum for the use of a particular licensed software package. In determining if it has a good deal it decides to calculate its maximum use of the software from its license management log file.
Assume the softwares file faithfully records a checkout event when a copy of the software starts and a checkin event when the software finishes. An example of checkout and checkin events are:
License OUT @ 2008/10/03_23:51:05 for job 4974 ... License IN @ 2008/10/04_00:18:22 for job 4974
Save the 10,000 line log file from here into a local file then write a program to scan the file extracting both the maximum licenses that were out at any time, and the time(s) at which this occurs.
Fortran
PROGRAM MAX_LICENSES IMPLICIT NONE INTEGER :: out=0, maxout=0, maxcount=0, err CHARACTER(50) :: line CHARACTER(19) :: maxtime(100) OPEN (UNIT=5, FILE="Licenses.txt", STATUS="OLD", IOSTAT=err) IF (err > 0) THEN WRITE(*,*) "Error opening file Licenses.txt" STOP END IF DO READ(5, "(A)", IOSTAT=err) line IF (err == -1) EXIT ! EOF detected IF (line(9:9) == "O") THEN out = out + 1 ELSE IF (line(9:9) == "I") THEN out = out - 1 END IF IF (out > maxout ) THEN maxout = maxout + 1 maxcount = 1 maxtime(maxcount) = line(15:33) ELSE IF (out == maxout) THEN maxcount = maxcount + 1 maxtime(maxcount) = line(15:33) END IF END DO CLOSE(5) WRITE(*,"(A,I4,A)") "Maximum simultaneous license use is", maxout, " at the following times:" WRITE(*,"(A)") maxtime(1:maxcount) END PROGRAM MAX_LICENSES
Output
Maximum simultaneous license use is 99 at the following times: 2008/10/03_08:39:34 2008/10/03_08:40:40
J
NB. Parse data, select columns 'I D' =: (8 ; 14+i.19) { ::]"1 L:0 ];._2 ] 1!:1 ::(''"_) <'licenses.txt' NB. Calculate number of licenses used at any given time lu =: +/\ _1 ^ 'OI' i. I NB. Find the maxima mx =: (I.@:= >./) lu NB. Output results (mx { D) ,~ 'Maximum simultaneous license use is ' , ' at the following times:' ,~ ": {. ,mx { lu Maximum simultaneous license use is 99 at the following times: 2008/10/03_08:39:34 2008/10/03_08:40:40
Python
Python 2.6 <python>def max_out(logfile):
maxout = 0 maxouttimes = [] out = 0 for line in logfile: direction = line[8] time = line[14:33] if direction == 'O': out += 1 if out > maxout: maxout = out maxouttimes = [time] elif out == maxout: maxouttimes.append(time) else: out -=1 return maxout, maxouttimes
if __name__ == '__main__':
log = file('license_example_log.txt') maxout, maxouttimes = max_out(log) log.close() print "Maximum simultaneous license use is %i at the following times:\n %s" % ( maxout, '\n '.join(maxouttimes))</python>
Example output:
Maximum simultaneous license use is 99 at the following times: 2008/10/03_08:39:34 2008/10/03_08:40:40