Saturday, December 3, 2022

Updating with Python conversion XLSX to CSV K.U.Polyakov code for #22 USE INFORMATICS 2023

Добавление Python преобразования XLSX в CSV к коду на сайте К.Ю.Полякова (ege22.doc) для #22 КЕГЭ 2023

Предполагается, что Openpyxl устанавливается через pip в конкретную виртуальную среду Python.

Можно установить как пакет на Ubuntu 22.04.1/20.04.5

$ sudo apt install python3-openpyxl

Пример №22 КЕГЭ 2023

В файле 22_6.xlsx содержится информация о совокупности N вычислительных процессов, которые могут выполняться параллельно или последовательно. Будем говорить, что процесс B зависит от процесса A, если для выполнения процесса B необходимы результаты выполнения процесса A. В этом случае процессы могут выполняться только последовательно.

Информация о процессах представлена в файле в виде таблицы. В первой строке таблицы указан идентификатор процесса (ID), во второй строке таблицы  — время его выполнения в миллисекундах, в третьей строке перечислены с разделителем «;» ID процессов, от которых зависит данный процесс. Если процесс является независимым, то в таблице указано значение 0.

Определите минимальное время, через которое завершится выполнение всей совокупности процессов, при условии, что все независимые друг от друга процессы могут выполняться параллельно.

Типовой пример организации данных в файле:





(.env)boris@UbuntuLTS:~/TEST22/V12$ cat kpcodeXls.py

# Update started

import openpyxl

import csv

# input excel file path

inputExcel = '22_6.xlsx'

newWorkbook = openpyxl.load_workbook(inputExcel)

# getting the active workbook sheet(Bydefault-->Sheet1)

worksheet = newWorkbook.active

# Opening a output csv file in write mode

F = open("result.csv", 'w') 

OutCsv = csv.writer(F,delimiter=";")

for eachrow in worksheet.rows:

     OutCsv.writerow([cell.value for cell in eachrow])

F.close()

# update done

# Код ниже из ege22.pdf сайт К.Ю.Полякова

from csv import reader

with open( "result.csv", encoding="utf-8" ) as F:

 rdr = reader( F, delimiter=';', quotechar='"' )

 next( rdr ) # читаем заголовки и пропускаем их

 data = {}

 finalTime = {}

 for s in rdr:

      id, t = int(s[0]), int(s[1])

      dependsOn = list( map( int, s[2].split(';') ) )

      if dependsOn == [0]:

          finalTime[id] = t # известно время окончания

      else:

          data[id] = ( t, dependsOn ) # неизвестно время окончания

while data:

 ids = list(data.keys())

 for id in ids:

     t, dependsOn = data[id]

     if all( (x in finalTime) for x in dependsOn ):

          startId = max( finalTime[x] for x in dependsOn )

          finalTime[id] = startId + t

          del data[id]

print( "Ответ:", max(finalTime.values()) )































Версия для "Решу ЕГЭ Информатика"
Предполагается, что Openpyxl предустанавливается через pip в конкретную виртуальную среду Python.

(.env) boris@UbuntuLTS:~/USE2023$ cat djs22.py
#Update started
import openpyxl
import csv
# input excel file path
inputExcel = '22_20.xlsx'
newWorkbook = openpyxl.load_workbook(inputExcel)
# getting the active workbook sheet(Bydefault-->Sheet1)
worksheet = newWorkbook.active
# Opening a output csv file in write mode
F = open("result.csv", 'w')
OutCsv = csv.writer(F,delimiter=";")
for eachrow in worksheet.rows:
     OutCsv.writerow([cell.value for cell in eachrow])
F.close()
# update done

def f(d):
    if d[2] == [0]:
        return d[1]
    else:
        maxx = 0
        for i in d[2]:
            if maxx < f(index[i - 1]):
                maxx = f(index[i - 1])
        return maxx + d[1]
 
from csv import reader
with open("result.csv") as F:
    s = reader(F, delimiter=';', quotechar='"')
    next(s)
    index = []
    for i in s:
        index.append([int(i[0]), int(i[1]), list(map(int, str(i[2]).split(';')))])
    for i in range(len(index)):
        print(i + 1, f(index[i]))
(.env) boris@UbuntuLTS:~/USE2023$ python3 djs22.py
1 5
2 9
3 12
4 4
5 16
6 11
7 3
8 20
9 13
10 22
11 24
12 3
13 12
14 6
15 28