Уведомления

Группа в Telegram: @pythonsu

#1 Май 11, 2016 15:45:19

Ahmasoft
Зарегистрирован: 2016-05-10
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Распределить данные в ячейках массива

Есть массив в котором 36 элементов, при чем некоторые из них схожи (количество различных элементов разное). Элементы упорядочены: A A B B B C…N N. Как сделать так чтобы в вот этих диапазонах: (0,5)(6,11)(12,17)(18,23)(24,29)(30,35) не было схожих элементов ? Обломался с random.shuffle)

Отредактировано Ahmasoft (Май 13, 2016 16:53:51)

Офлайн

#2 Май 11, 2016 18:43:01

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Распределить данные в ячейках массива

Замешивать уникальные и неуникальные отдельно, а затем компоновать?

Офлайн

#3 Май 12, 2016 00:42:37

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Распределить данные в ячейках массива

Shaman
Замешивать уникальные и неуникальные
Круто, вы просто экстрасенс 100 Уровня. У меня даже гипотез нет о том какой смысл в поставленном вопросе.



Офлайн

#4 Май 12, 2016 08:15:18

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Распределить данные в ячейках массива

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

Офлайн

#5 Май 12, 2016 16:14:32

Ahmasoft
Зарегистрирован: 2016-05-10
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Распределить данные в ячейках массива

Короче вот весь код:

#составитель расписания
#в день 6 уроков
#36 уроков в неделю 
# -*- coding:utf8 -*-
import random
g = int(input("Введите кол-во предметов в неделю: "))
a = []
week = []
pn = []; vt = []; sr = []; ct = []; pt = []; sb = []
b = c = d = 0
while b < g :
    a.append(raw_input("Введите название предмета: "))
    a.append(int(input("Сколько раз он должен быть в неделю ?: ")))
    b = b + 1
b = 0
while b <= g:
    d = 0
    while d < a[c + 1]:
        week.append(a[c])
        d += 1
    if c + 1 == g * 2 - 1:
        break
    else:
        c += 2
    b += 1
b = d = 0
c = 5
while b < 6:
    while d < c:
        if week[d] == week[d+1]:
            random.shuffle(week)
            if week[d] == week[d-5]:
                random.shuffle(week)
        elif week[d] == week[d+2]:
            random.shuffle(week)
            if week[d] == week[d-4]:
                random.shuffle(week)
        elif week[d] == week[d+3]:
            random.shuffle(week)
            if week[d] == week[d-3]:
                random.shuffle(week)
        elif week[d] == week[d+4]:
            random.shuffle(week)
            if week[d] == week[d-2]:
                random.shuffle(week)
        elif week[d] == week[d+5]:
            random.shuffle(week)
            if week[d] == week[d-1]:
                random.shuffle(week)
        d += 1
    c = c + 5
    b += 1
b = d = 35
def days(l):
    global b
    global d
    while b > d-6:
        l.append(week[b-1])
        b -= 1
        if b < 0:
            break
    d = d - 6
days(pn); days(vt); days(sr); days(ct); days(pt); days(sb)
print(pn)
print(vt)
print(sr)    
print(ct)
print(pt)
print(sb)
Не ругайте за нерациональное использование переменных, скоро исправлю.
Вот этот вот фрагмент почти работает:
while o < 6:
    while d < m:
        if week[d] == week[d+1]:
            random.shuffle(week)
            if week[d] == week[d-5]:
                random.shuffle(week)
        elif week[d] == week[d+2]:
            random.shuffle(week)
            if week[d] == week[d-4]:
                random.shuffle(week)
        elif week[d] == week[d+3]:
            random.shuffle(week)
            if week[d] == week[d-3]:
                random.shuffle(week)
        elif week[d] == week[d+4]:
            random.shuffle(week)
            if week[d] == week[d-2]:
                random.shuffle(week)
        elif week[d] == week[d+5]:
            random.shuffle(week)
            if week[d] == week[d-1]:
                random.shuffle(week)
        d += 1
    m = m+5
    o += 1
Но обязательно в одном диапазоне найдутся хотя бы 2 одинаковых элемента, и я уже заведомо думал что он будет работать даже хуже. Но думаю если вот здесь правильно пошаманить, то все будет прекрасно:
while b < g :
    a.append(raw_input("Введите название предмета: "))
    a.append(int(input("Сколько раз он должен быть в неделю ?: ")))
    b = b + 1
b = 0
И ещё племянница подала идею хD. Заносить к примеру не 3 сразу подряд, а сначала 1 элемент, потом другой (отличающийся) и т.д пока 1 элемент не занесется 3 раза.

Отредактировано Ahmasoft (Май 12, 2016 16:48:53)

Офлайн

#6 Май 12, 2016 18:00:24

Ahmasoft
Зарегистрирован: 2016-05-10
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Распределить данные в ячейках массива

Надумал такое, переименовываем все массивы с названиями дней недели на l, m, n, o, p, q. А потом:

# -*- coding:utf8 -*-
import random
g = int(input("Введите кол-во предметов в неделю: "))
a = []
week = []
l = []; m = []; n = []; o = []; p = []; q = []
b = c = d = 0
while b < g :
    a.append(raw_input("Введите название предмета: "))
    a.append(int(input("Сколько раз он должен быть в неделю ?: ")))
    b = b + 1
b = 0
while b <= g: 
    d = 0 
    while d < a[c + 1]: 
        k = random.randint(1,6)
        if k == 1:
            k = l
        if k == 2:
            k = m 
        if k == 3:
            k = n
        if k == 4:
            k = o 
        if k == 5:
            k = p
        if k == 6:
            k = q 
        k.append(a[c]) 
        d += 1 
        if c + 1 == g * 2 - 1: 
            break 
        else: 
            c += 2 
    b += 1 
print(l)
print(m)
print(n)    
print(o)
print(p)
print(q)
Но вот этому фрагменту нужна доработка:
while b <= g: 
    d = 0 
    while d < a[c + 1]: 
        k = random.randint(1,6)
        if k == 1:
            k = l
        if k == 2:
            k = m 
        if k == 3:
            k = n
        if k == 4:
            k = o 
        if k == 5:
            k = p
        if k == 6:
            k = q 
        k.append(a[c]) 
        d += 1 
        if c + 1 == g * 2 - 1: 
            break 
        else: 
            c += 2 
    b += 1 

Отредактировано Ahmasoft (Май 12, 2016 18:03:50)

Офлайн

#7 Май 12, 2016 20:47:55

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Распределить данные в ячейках массива

Да зачем нам ваш код, который наверное не работает. Судя по тому что нет откликов никто не понимает что вы хотите сделать. Вы это по русски опишите.



Отредактировано doza_and (Май 12, 2016 20:49:06)

Офлайн

#8 Май 12, 2016 22:22:42

Ahmasoft
Зарегистрирован: 2016-05-10
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Распределить данные в ячейках массива

Обижаете, работает. И я его не просто так показываю, а говорю что нужно доработать. Создаю составитель расписания. Пользователь сначала вводит количество различных предметов. Затем поочередно название предмета, и сколько раз он должен быть в неделю. Программа раскидывает эти значения по 6 дням, при чем в каждом дне не более 6 элементов. И кажется я уже понял как это сделать.

Отредактировано Ahmasoft (Май 12, 2016 22:24:38)

Офлайн

#9 Май 12, 2016 23:11:11

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Распределить данные в ячейках массива

# -*- coding:utf8 -*-
 
import random
 
days = [[] for _ in range(6)]
subjects = {'физика' : 12, 'химия' : 12, 'алгебра' : 12}
 
assert(sum(subjects.values()) <= len(days) * 6)
 
cursor = 0
for subj, count in subjects.items():
    for _ in range(count):
        days[cursor].append(subj)
        cursor = (cursor + 1) % len(days)
 
# опционально
for day in days:
    random.shuffle(day)
 
print(days)

Офлайн

#10 Май 13, 2016 16:54:47

Ahmasoft
Зарегистрирован: 2016-05-10
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Распределить данные в ячейках массива

Shaman, спасибо за попытку, но мне нужно было расскинуть не 3 предмета. А то количество кое введет пользователь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version