Text processing/Max licenses in use: Difference between revisions
m (→{{header|APL}}) |
(→{{header|Python}}: Shorter Python version) |
||
Line 83: | Line 83: | ||
=={{header|Python}}== |
=={{header|Python}}== |
||
Python 2.6 |
Python 2.6 |
||
<python> |
<python>import re |
||
maxout = 0 |
|||
data = file('licenses.txt').read() |
|||
maxouttimes = [] |
|||
out, maxout, maxtimes = 0, -1, [] |
|||
out = 0 |
|||
for type, time in re.findall(r'License (IN |OUT) @ (\S+)', data): |
|||
for line in logfile: |
|||
out += (1 if type=='OUT' else -1) |
|||
if out > maxout: |
|||
maxout, maxtimes = out, [] |
|||
if out == maxout: |
|||
maxtimes.append(time) |
|||
⚫ | |||
maxout = out |
|||
⚫ | |||
maxouttimes = [time] |
|||
</python> |
|||
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() |
|||
⚫ | |||
⚫ | |||
Example output: |
Example output: |
||
<pre>Maximum simultaneous license use is 99 at the following times: |
<pre>Maximum simultaneous license use is 99 at the following times: |
Revision as of 14:35, 10 October 2008
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.
APL
⍝ Copy/paste file's contents into TXT (easiest), or TXT ← ⎕NREAD I ← TXT[;8+⎕IO] D ← TXT[;⎕IO+14+⍳19] lu ← +\ ¯1 * 'OI' ⍳ I mx ← (⎕IO+⍳⍴lu)/⍨lu= max ← ⌈/ lu ⎕ ← 'Maximum simultaneous license use is ' , ' at the following times:' ,⍨ ⍕max ⋄ ⎕←D[mx;] Maximum simultaneous license use is 99 at the following times: 2008/10/03_08:39:34 2008/10/03_08:40:40
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>import re
data = file('licenses.txt').read() out, maxout, maxtimes = 0, -1, [] for type, time in re.findall(r'License (IN |OUT) @ (\S+)', data):
out += (1 if type=='OUT' else -1) if out > maxout: maxout, maxtimes = out, [] if out == maxout: maxtimes.append(time)
print 'Maximum simultaneous license use is %i at the following times:\n %s' % (
maxout, '\n '.join(maxtimes))
</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