21

Re: e-olymp #9543 Басейн

Та людина, випадково, я :)

22

Re: e-olymp #9543 Басейн

koala написав:

У мене теж лише 3 тести. Умова надто нечітка. Код із тестами, можна закоментувати непотрібне:

Прихований текст
def solution(swimmers, sportsman):
    """
    Solve e-olymp #9543
    swimmers : list of "sportsman result"
    sportsman: str, target swimmer

    returns: (swim, lane)
    """
    swimmers = (line.split() for line in swimmers)
    swimmers = {swimmer: float(result) for swimmer,result in swimmers}
    try:
        number = sum(1 for result in swimmers.values() if result<swimmers[sportsman])
    except KeyError:
        return "Missing"
    n = len(swimmers)
    if number<n-3 or n%6 not in [1,2]:
        swim = number//6 + 1
        index = number%6
    else:
        swim = n//6+1
        index = 3+number-n
    return "{} {}".format(swim, "342516"[index])

size = int(input())
data = [input() for _ in range(size)]
sportsman = input()
print(solution(data, sportsman))

def test():
    data = '''petrov 12.3
sidorov 11.3
tkachov 11.1
koss 10.8
kolos 10.5
bas 9.7
oskol 12.1
ivanov 12.0
sych 11.55
lol 11.6'''
    assert solution(data.splitlines(), 'sidorov') == "1 1"
    assert solution(data.splitlines(), 'koss') == "1 2"
    assert solution(data.splitlines(), 'bas') == "1 3"
    assert solution(data.splitlines(), 'kolos') == "1 4"
    assert solution(data.splitlines(), 'tkachov') == "1 5"
    assert solution(data.splitlines(), 'sych') == "1 6"
    assert solution(data.splitlines(), 'lol') == "2 3"
    assert solution(data.splitlines(), 'ivanov') == "2 4"
    assert solution(data.splitlines(), 'oskol') == "2 2"
    assert solution(data.splitlines(), 'petrov') == "2 5"
    assert solution(data.splitlines(), 'mugabe') == "Missing"
    data = '''petrov 12.3
sidorov 11.3
koss 10.8
kolos 10.5
bas 9.7
ivanov 12.0
sych 11.55'''
    assert solution(data.splitlines(), 'koss') == "1 2"
    assert solution(data.splitlines(), 'bas') == "1 3"
    assert solution(data.splitlines(), 'kolos') == "1 4"
    assert solution(data.splitlines(), 'sidorov') == "1 5"
    assert solution(data.splitlines(), 'sych') == "2 3"
    assert solution(data.splitlines(), 'ivanov') == "2 4"
    assert solution(data.splitlines(), 'petrov') == "2 2"
    assert solution(data.splitlines(), 'mugabe') == "Missing"
    print('All tests passed')

test()

І на завершення цієї задачі
Е-Оlymp надає можливість встановити опцію:   Розв'язок використовує файли для читання та запису
В такому разі зручно тестувати програму використовуючі зовнішні файли

f = open('input.txt','r')
f1 = open('output.txt','w')
n=int(f.readline())
data = [f.readline().strip().upper() for _ in range(n)] # <- UPPER!
pairs = [line.split() for line in data] #generator
swimmers = {surname:float(time) for surname, time in pairs} #still generator
value = sorted(list(swimmers.values()))
name = f.readline().strip().upper() # <- UPPER!
try:
    result=swimmers.get(name)  #Пошук результату за імям плавця 
    mod=n%6
    tail=value[n-3:n]
    if mod in [1,2] and result in tail:#чи попадає плавець у "хвіст"
        swim=n//6+1
        walk=tail.index(result)+1        
    else:
        number_swimmers=value.index(result)+1 # його номер
        swim,walk=divmod(number_swimmers,6) #заплив та доріжка
        if walk!=0: swim+=1        
    print('{} {}'.format(swim,'634251'[walk]),file=f1)
except ValueError:
    print("Missing",file=f1)
f.close()
f1.close()

23

Re: e-olymp #9543 Басейн

sys.stdin = open('input.txt','r')
sys.stdout = open('output.txt','w')

А далі звичайні input/print.

Подякували: hvv051