1

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

Коли відбуваються змагання з плавання у закритій воді (басейні), для кращого візуального сприйняття сильніших плавців ставлять на середні доріжки, а слабших по краям. Наприклад, у басейні з 6 доріжками найкращий спортсмен буде плисти по 3-й доріжці, другий по 4-ій, 3-й учасник по 2-й, 4-й учасник по 5-й доріжці, 5-й по 1-й доріжці, 6-й по 6-й доріжці. І ще намагаються, щоб у кожному запливі були заповнені усі доріжки, але щоб у запливі були заповнені не менш ніж половина усіх доріжок басейну. І ще, кожен спортсмен хоче плисти з найсильнішими, тому без потреби опускати в слабший заплив не треба.
В нашому випадку будемо розглядати басейн на 6 доріжок. Є попередні результати запливів з певної дистанції у вигляді списку прізвищ та результатів (дійсне число). Вам необхідно створити довідкову систему, яка за попередніми результатами визначає за прізвищем спортсмена в якому запливі і по якій доріжці він буде пливти.
Вхідні дані:
В першому рядку вхідних даних одне ціле К, кількість спортсменів (3 ≤ K ≤ 50) . Наступні К рядків містять прізвище спортсмена та його попередній результат (рядок та дійсне число). Зазначимо, що однакові прізвища та однакові результати відсутні. І останній рядок – прізвище спортсмена, для якого треба визначити номер запливу та номер доріжки.
Вихідні дані:
Вивести два цілих числа номер запливу та номер доріжки через пробіл або повідомлення "Missing", як що такий спортсмен відсутній у запливі.
Пояснення до прикладу
Перший заплив 1 – sidorov, 2 – koss, 3 – bas, 4 – kolos, 5 – tkachov, 6 – sych.
Другий заплив 1 – вільна, 2 – oskol, 3 – lol, 4 – іvanov, 5 – petrov, 6 – вільн
Вхідні дані #1            Вихідні дані #1
10                        2 4
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
ivanov

Мій код проходить 3 тести
Чи правильно я зрозумів, що при 7 спортсменах розміщення буде наступним
4 в першому запливі та 3 в другому
Перший заплив 1 – вільна, 2 – koss, 3 – bas, 4 – kolos, 5 – sidorov, 6 – вільна.
Другий заплив 1 – вільна, 2 – petrov, 3 – sych, 4 – іvanov, 5 – вільна, 6 – вільн
Вхідні дані #1            Вихідні дані #1
7                          2 4
petrov 12.3
sidorov 11.3
koss 10.8
kolos 10.5
bas 9.7
ivanov 12.0
sych 11.55
ivanov

2

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

Умова недостатня - наприклад, не сказано, що сильні спортсмени мають плисти раніше за слабших. Якщо це виправити, то так, виглядає, що саме так - сортуємо, якщо залишок не 1 чи 2 - ділимо на групи по 6 і "хвіст", інакше в останній групі буде 3, а в передостанній - менше за 6.

3

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

Мій код

d='342516'
n=int(input())
x={}
for i in range(n):
        p=list(map(str,input().split()))
        x.update({p[0]:float(p[1])})
pr=input()
if pr in x:
    rez=x.get(pr)
    k1=list(x.values())
    k=sorted(k1) 
    y1=len(k)
    y=y1%6
    m=k.index(rez)+1
    z,os=divmod(m,6)
    if os!=0: z+=1
    k2=k[y1-3:y1]
    if (y==1 or y==2) and (rez in k2):
        if (y==1) and (rez!=k2[-1]): z+=1
        if (y==2) and rez==k2[-3]: z+=1
        print(z,d[k2.index(rez)])        
    else: print(z,d[os-1])
else: print("Missing")

4 Востаннє редагувалося koala (05.01.2020 10:22:22)

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

1. Теги code додайте
2. Ви навмисно такі страшні назви змінних використовуєте?
3. Нащо вам узагалі словник? Вам потрібен впорядкований за часом список прізвищ - то

pairs = (input().split() for _ in range(n)) #generator
swimmers = [(float(time),surname) for surname, time in pairs]
sorted_swimmers = sorted(swimmers)
surnames = [swimmer[1] for swimmer in sorted_swimmers]

або навіть

pairs = (input().split() for _ in range(n)) #generator
swimmers = ((float(time),surname) for surname, time in pairs) #still generator
surnames = [swimmer[1] for swimmer in sorted(swimmers)]

ну і

try:
    index = surnames.index(input())
    ...
except ValueError:
    print("Missing")

трохи краще, як на мене.
4. Значення y1 відрізняється від n? Як саме?

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

5

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

1. Теги code додайте     
          ? не зрозумів
2. Ви навмисно такі страшні назви змінних використовуєте?   
          Намагався виправити
3 Нащо вам узагалі словник? Вам потрібен впорядкований за часом список прізвищ - то
          Задано пари ім'я:значення    Тому скористався порадами і згенерував список
4. Значення y1 відрізняється від n? Як саме?
          Ніяк, виправив
Сам виправлений код , який так і проходить 3 тести

walkway='634251'
n=int(input())
pairs = [input().split() for _ in range(n)] #generator
swimmers = {surname:float(time) for surname, time in pairs} #still generator
value = sorted(list(swimmers.values()))
name = input()
print(swimmers)
print(value)
if name in swimmers:
    result=swimmers.get(name)  #Пошук результату за ім'ям плавця 
    number_swimmers=value.index(result)+1 # його номер
    swim,walk=divmod(number_swimmers,6) #заплив та доріжка
    if walk!=0: swim+=1
    mod=n%6
    tail=value[n-3:n]
    if (mod==1 or mod==2) and (result in tail):#чи попадає плавець у "хвіст"
        if (mod==1) and (result!=tail[-1]): swim+=1
        if (mod==2) and result==tail[-3]: swim+=1
        print(swim,walkway[tail.index(result)+1])        
    else: print(swim,walkway[walk])
else: print("Missing")

6

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

Тег code - кнопка <> над полем редагування.

Дозволяє писати ось таке.

Ну і ви весь час намагаєтеся в колекціях щось шукати. Насправді нас цікавлять кількість плавців та номер потрібного плавця, а далі задача суто математична.

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

7

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

А ще - нам не потрібен увесь сортований список, нам потрібна кількість менших. І тут певний сенс у словнику є, хоча й невеликий:
swimmers = {surname:float(time) ...}
pivot = swimmers[input()]
number = sum(1 for time in swimmers.vales() if time<pivot)

8

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

Так без словника можна обійтись. Я використав його для визначення результату за прізвищем. Далі працюю з упорядкованим списком результатів value, визначаю розміщення result  в списку +1. Визначивши цілу частину та остачу від поділу number_swimmers на 6 маю номер запливу(swim) та індекс рядка walkway='634251' тобто номер доріжки(walk) 
Задача була б розв’язана, якби не умова (але щоб у запливі були заповнені не менш ніж половина усіх доріжок басейну)
    mod=n%6   остача від на 6 загальної кількості плавців(чи буде «хвіст»)
    tail=value[n-3:n]  Беру три останні елементи списку value
if (mod==1 or mod==2) and (result in tail):#чи є "хвіст", чи попадає плавець у "хвіст"
Роблю відповідне коригування із запливом та номером доріжки та вивожу результат.

9

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

walkway='634251'
n=int(input())
pairs = [input().split() for _ in range(n)] #generator
swimmers = {surname:float(time) for surname, time in pairs} #still generator
value = sorted(list(swimmers.values()))
name = input()
if name in swimmers:
    result=swimmers.get(name)  #Пошук результату за імям плавця 
    number_swimmers=value.index(result)+1 # його номер
    swim,walk=divmod(number_swimmers,6) #заплив та доріжка
    if walk!=0: swim+=1
    print(swim,walkway[walk])
else: print("Missing")

Такий варіант  проходить  2 тести

10 Востаннє редагувалося koala (07.01.2020 09:53:02)

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

У мене теж лише 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()
Подякували: hvv051

11

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

walkway='634251'
n=int(input())
pairs = [input().split() for _ in range(n)] #generator
swimmers = {surname:float(time) for surname, time in pairs} #still generator
value = sorted(list(swimmers.values()))
#print(value)
name = input()
if name in swimmers:
    result=swimmers.get(name)  #Пошук результату за імям плавця 
    number_swimmers=value.index(result)+1 # його номер
    swim,walk=divmod(number_swimmers,6) #заплив та доріжка
    if walk!=0: swim+=1
    mod=n%6
    tail=value[n-3:n]
    #print(tail)
    if (mod==1 or mod==2) and (result in tail):#чи попадає плавець у "хвіст"
        swim=n//6+1
        if (result==tail[-1]): walk=3
        if (result==tail[-2]): walk=2
        if (result==tail[-3]): walk=1
        #print(swim,walk)
    print(swim,walkway[walk])
else: print("Missing")

Тут прописано все очевидно. Схиляюсь до думки, що не коректні тести.
Треба зв'язуватися з автором

12

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

Там є коментар з підказкою.

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

13 Востаннє редагувалося koala (07.01.2020 15:21:13)

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

виправлений варіант, проходить усі тести
def solution(swimmers, sportsman):
    """
    Solve e-olymp #9543
    swimmers : ["{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().strip().upper() for _ in range(size)] # <- UPPER!
sportsman = input().strip().upper() # <- UPPER!
print(solution(data, sportsman))
Подякували: hvv051

14

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

Чому повідомлення з форуму у мене потрапляють в спам?

15

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

hvv05 написав:

Чому повідомлення з форуму у мене потрапляють в спам?

Ви гадаєте, на цьому форумі є адміністратори вашого поштовика?

16

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

koala написав:

Там є коментар з підказкою.

Де саме?

Мій варіант, що пройшов всі тести

walkway='634251'
n=int(input())
data = [input().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()))
#print(value)
name = input().strip().upper() # <- UPPER!
if name in swimmers:
    result=swimmers.get(name)  #Пошук результату за імям плавця 
    mod=n%6
    tail=value[n-3:n]
    #print(tail)
    if (mod==1 or mod==2) and (result in tail):#чи попадає плавець у "хвіст"
        swim=n//6+1
        if (result==tail[0]): walk=1
        if (result==tail[1]): walk=2
        if (result==tail[2]): walk=3
        #print(swim,walk)
    else:
        number_swimmers=value.index(result)+1 # його номер
        swim,walk=divmod(number_swimmers,6) #заплив та доріжка
        if walk!=0: swim+=1        
    print('{} {}'.format(swim,walkway[walk]))
else: print("Missing")


Тобто сам алгоритм був правильним з початку  вся справа в зчитуванні даних(.strip().upper())

17 Востаннє редагувалося koala (09.01.2020 17:59:51)

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

В "обговоренні", звісно.
Справа ніби в upper, але про всяк випадок я й strip додав. Біс їх зна.

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

18

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

koala написав:

В "обговоренні", звісно.

Де обговорюють, кинь посилання

19

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

Та перейдіть за своїм, з першого допису.

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

20

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

Дійшло!!!
Людина також обурюється