Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/322: Рейтинг темы: голосов - 322, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 15.02.2019
Сообщений: 8
1

Выбор тайного друга

22.02.2019, 11:01. Показов 60769. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вам даётся список учеников.
Напишите программу для игры в «тайного друга».
Она должна случайным образом назначить каждому ученику тайного друга, который будет незаметно делать для этого ученика что-то хорошее.

Обратите внимание, что нельзя быть тайным другом самому себе и нельзя быть тайным другом для нескольких учеников.
Формат ввода
Имена и фамилии, по одной на каждой строке.

Иван Иванов
Саша Самойлов
Юля Северная
Формат вывода
На каждой строчке имя и фамилия ученика и имя и фамилия его тайного друга, разделённые дефисом.

Иван Иванов - Юля Северная
Юля Северная - Саша Самойлов
Саша Самойлов - Иван Иванов
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.02.2019, 11:01
Ответы с готовыми решениями:

Выбор тайного друга
Условие Вам даётся список учеников. Напишите программу для игры в «тайного друга». Она должна...

Выбор алгоритма электронного тайного голосования
Перед до мной стоит задача разработки простой системы электронного анонимного голосования для...

Выбор друга
Ребята помогите купить ноут! Цель в основнм работа с фото, видео,сайты и в этом роде. Ну и поиграть...

Трактовка тайного писания на с++
Хоть я и учусь на факультете истории и культуры (на кафедре теологии) у меня почему-то на...

Определить, как расположены относительно друга друга прямая и отрезок
Буду очень признателен, если поможете безрукому... 2. Заданы прямая ax+by+c=0 и отрезок своими...

14
3572 / 2173 / 570
Регистрация: 02.09.2015
Сообщений: 5,490
22.02.2019, 23:33 2
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from sys import stdin
from random import shuffle
 
def foo(fullNames):
    shuffled = fullNames.copy()
    while fullNames == shuffled:
        shuffle(shuffled)
    return zip(fullNames, shuffled)
 
if __name__ == "__main__":
    fullNames = stdin.read().splitlines()
    print(len(fullNames))
    for pupil, friend in foo(fullNames):
        print(pupil + " - " + friend)
0
1 / 1 / 0
Регистрация: 02.01.2019
Сообщений: 12
20.04.2019, 20:50 3
Не работает(
0
10 / 6 / 6
Регистрация: 05.11.2018
Сообщений: 32
21.04.2019, 10:08 4
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
group = []
x1 = 1
countStudents = int(input("Write count students: "))
 
for times in range(0, countStudents):
    students = input("Write Surname and Name student:")
    group.append(students)
 
for main in range(0, len(group)):
    if main == len(group)-1:
        print(group[main], ' - ', group[0])
    else:
        print(group[main], ' - ', group[x1])
        x1 += 1
Сначала пишите кол-во учеников, после вводите ФИ
0
2 / 2 / 0
Регистрация: 11.02.2020
Сообщений: 5
18.02.2020, 16:51 5
Vladislav1ADM,
дополнила твою прогу, работает, но без использования рандома не очень это выглядит
Python
1
2
3
4
5
6
7
8
9
10
11
import sys
 
 
x1 = 1
group = list(map(str.strip, sys.stdin))
for main in range(0, len(group)):
    if main == len(group) - 1:
        print(group[main], ' - ', group[0])
    else:
        print(group[main], ' - ', group[x1])
        x1 += 1
0
60 / 57 / 3
Регистрация: 02.11.2019
Сообщений: 227
20.02.2020, 12:28 6
Python
1
2
3
4
5
6
7
8
9
10
11
12
import sys
import random
 
x1 = 1
group = list(map(str.strip, sys.stdin))
random.shuffle(group)
for main in range(0, len(group)):
    if main == len(group) - 1:
        print(group[main], ' - ', group[0])
    else:
        print(group[main], ' - ', group[x1])
        x1 += 1
7
4921 / 2674 / 550
Регистрация: 07.11.2019
Сообщений: 4,396
20.02.2020, 13:00 7
Можно еще как-то так:
1. Перемешать список
2. Создать его копию.
3. Циклически сдвинуть в первом списке элементы.
Python
1
group.insert(0, group.pop())
4. Объединить списки zip или просто печатать в цикле элементы первого и второго списка.
2
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
20.02.2020, 17:04 8
Надо сгенерировать все возможные перестановки, а потом случайным образом выбирать из числа сгенерированных. В Питоне есть функция генерации всех перестановок множества, но самому-то интереснее...

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def all_perms(arr):
    n=len(arr)
    if (n==1):
        return [arr]
    else:
        tmp=all_perms(arr[1:])
        a=arr[0]
        res=[]
        for b in tmp:
            for i in range(n):
                z=b
                res=res+[z[0:i]+[a]+z[i:]]
        return res
        
def check(lst):
    for pair in lst:
        if pair[0]==pair[1]:
            return False
    return True        
        
def all_sec_friends(s):
    perms=all_perms(s)
    raw=list(map(lambda p: list(zip(s,p)),perms))
    return list(filter(check,raw))
        
print(all_sec_friends(["Иван Иванов","Саша Самойлов","Юля Северная"]))
Вывод:

[[('Иван Иванов', 'Саша Самойлов'), ('Саша Самойлов', 'Юля Северная'), ('Юля Северная', 'Иван Иванов')],
[('Иван Иванов', 'Юля Северная'), ('Саша Самойлов', 'Иван Иванов'), ('Юля Северная', 'Саша Самойлов')]]

Выбирайте
3
Status 418
Эксперт Python
4577 / 2344 / 602
Регистрация: 26.11.2017
Сообщений: 5,265
Записей в блоге: 3
20.02.2020, 18:00 9
Зачем такие сложности?!
Ответ циклический сдвиг на 1 влево или вправо.
Или я задачу не понял
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
20.02.2020, 19:34 10
eaa, я решил найти все возможные варианты. Мне кажется, что циклические перестановки их не покрывают.
0
60 / 57 / 3
Регистрация: 02.11.2019
Сообщений: 227
21.02.2020, 08:46 11
Я думаю самый простой вариант - мой, учитывая что использование random обязательно
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
21.02.2020, 11:26 12
geargoose, да, безусловно. Лично я решал другую задачу - найти все варианты
0
3 / 2 / 1
Регистрация: 20.01.2020
Сообщений: 17
22.02.2020, 15:27 13
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from random import choice
def chooseFriend(People):
    Left = []
    Right = []
 
    while True:
        Friend_1 = choice(People)
        Friend_2 = choice(People)
 
        if Friend_1 == Friend_2:
            continue
 
        if Friend_1 not in Left:
            Left.append(Friend_1)
            
        if Friend_2 not in Right: 
            Right.append(Friend_2)
 
        if len(Left) == len(People) and len(Right) == len(People):
            break
 
    for i in range(len(People)):
        print(Left[i], '-', Right[i])
Решение не из быстрых, но рабочее
Если я правильно понял задачу, то решение верное
1
3 / 3 / 0
Регистрация: 27.11.2021
Сообщений: 28
07.03.2022, 09:40 14
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from random import choice
import sys
pupils = []
for line in sys.stdin:
    pupils.append(line.rstrip(' \n'))
choices = list()
for i in range(len(pupils)):
    list1 = pupils[:]
    del list1[i]
    a = choice(list1)
    if a not in choices:
        print(pupils[i], '-', a)
        choices.append(a)
    else:
        while a in choices:
            a = choice(list1)
        print(pupils[i], '-', a)
        choices.append(a)
Работает ))))))))
1
0 / 0 / 0
Регистрация: 15.02.2024
Сообщений: 1
15.02.2024, 14:33 15
Python
1
2
3
4
5
6
7
8
9
10
import sys
from random import shuffle
data = list(map(str.strip, sys.stdin))
res = data[:]
while True:
    shuffle(res)
    if all(list(map(lambda x: data[x] != res[x], [i for i in range(len(data))]))):
        for j in range(len(data)):
            print(f'{data[j]} - {res[j]}')
        break
В яндекс зашло)
0
15.02.2024, 14:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2024, 14:33
Помогаю со студенческими работами здесь

Найти две наиболее удаленные друга от друга точки в заданном множестве точек
Координаты n точек на плоскости заданы в виде двумерного массива K. Найти номера двух точек,...

Плохо ли делать зависящие друга от друга классы, в которых присутствуют указатели на обьекты других классов?
Тру девелоперы,расскажите,почему говорят,что плохо делать зависящие друга классы,в которых...

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

Как в PHP отделить элементы друг от друга, чтобы не ругались друг на друга?
<?php $chitat = fopen('yoo.txt', 'r'); if (!$chitat) { echo 'Ошибка при открытии файла...

Выбор видюхи GeForce GTX 1050 2GB (выбор точнее производителя)
хочу обновить "железо" своего пк, хватает на GeForce GTX 1050 2GB видюху, однако какую лучше...

Как сделать выбор цвета и выбор толщины кисти в MDI приложении?
Работаю с mdi приложениями в виде Paint, но не знаю кода что бы присваивать mdi приложению такие ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru