Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 15, 2015 15:08:51

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

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

Есть матрица NxN где 4<=N<=10. Как проверить есть ли в ней последовательность 4х одинаковых чисел по горизонтали, вертикали и в главных и дополнительных диагоналях?
Например матрица:

 a=([
    [7, 1, 1, 8, 1, 1],
    [1, 1, 7, 3, 1, 5],
    [2, 3, 1, 2, 5, 1],
    [1, 1, 1, 5, 1, 4],
    [4, 6, 5, 1, 3, 1],
    [1, 1, 9, 1, 2, 1]
    ]) == True
Полагаю, что как то нужно определить последовательность и пробегать по строкам, столбцам и диагоналям. Решать не нужно просто натолкнуть на мысль с чего начать построение алгоритма, чтобы мне не громоздить огромный говнокод.



Отредактировано Silentium (Апрель 15, 2015 15:12:36)

Офлайн

#2 Апрель 15, 2015 15:33:16

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

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

а это зачем?

 == True
Silentium
просто натолкнуть на мысль с чего начать построение алгоритма
Silentium
пробегать по строкам, столбцам и диагоналям
по-простому делаете 4 цикла и просматриваете по горизонтали и т.д.
Silentium
главных и дополнительных
главная и дополнительная они по одной!
Silentium
чтобы мне не громоздить огромный говнокод
ну вы напишите свой код, пото подуайте как его оптимизировать и покажите нам, а мы что-то исправим, что-то подскажем или напишем как будет лучше



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Апрель 15, 2015 23:52:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

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

Silentium
Как проверить есть ли в ней последовательность 4х одинаковых чисел по горизонтали, вертикали и в главных и дополнительных диагоналях?
Нужно написать одну функцию поиска 4-х одинаковых элементов в последовательности и передавать в неё сначала каждую строку, потом каждый столбец, а потом каждую диагональ.



Отредактировано py.user.next (Апрель 15, 2015 23:52:24)

Офлайн

#4 Апрель 16, 2015 15:03:28

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

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

Нужно написать одну функцию поиска 4-х одинаковых элементов в последовательности и передавать в неё сначала каждую строку, потом каждый столбец, а потом каждую диагональ.

Попробовал что-то типа:
def matrix(a):
    x = 0
    
    n=len(a)
    m=len(a[x])
    fl=0
    # compare rows
    for x in range(n-1):
        for a1,a2 in [(a[x][i],a[x][i+1]) for i in range(m-1)]:
            if a1==a2:
                fl+=1
            if fl==3:
                return True
        fl=0 
     # compare cols   
    for x in range(n-1):
        for a1,a2 in [(a[i][x],a[i+1][x]) for i in range(m-1)]:
            if a1==a2:
                fl+=1
            if fl==3:
                return True
        fl=0 
    #compare general diag
    for x in range(n-1):
        for a1,a2 in [(a[i][i],a[i+1][i+1]) for i in range(m-1)]:
            if a1==a2:
                fl+=1
            if fl==3:
                return True
        break
        fl=0 
return False
if __name__ == '__main__':
    assert matrix([[7, 1, 1, 8, 1, 1],
    [1, 1, 7, 3, 1, 5],
    [2, 3, 1, 2, 5, 1],
    [1, 1, 1, 5, 1, 4],
    [4, 6, 5, 1, 3, 1],
    [1, 1, 9, 1, 2, 1]
    ])==True 

Всю голову сломал с обратной диагональю. Можете подсказать как осуществить row+1 и col-1 за один проход? Я понимаю что все крутится около range, но всеже как осуществить проверку в дополнительных диагоналях? Прошу сильно не ругать, я только осваиваюсь. Ну и возможно есть более простой и короткий способ решения?!



Отредактировано Silentium (Май 5, 2015 16:22:00)

Офлайн

#5 Апрель 17, 2015 03:57:33

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

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

def f(a):
    for i in a:
        for j, k in enumerate(i[:-3]):
            if all(l == k for l in i[j+1: j+4]):
                return True
def d(a):
    return [[a[i][i] for i in range(len(a))]]
def matrix(a):
    return f(a) or f(zip(*a)) or f(d(a)) or f(d(a[::-1])) or False
по вашему коду:
1) он даже не запускается!
2)
if a1==a2:
    fl+=1
if fl==3:
    return True
это неправильно
если будет строка
[1, 1, 1, 7, 1, 1, 1]
ваш код выдаст True

а что вы подразумеваете под “главных диагоналях”? диагонали две
главная и дополнительная!
ОДНА главная и ОДНА дополнительная



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Апрель 17, 2015 04:02:18)

Офлайн

#6 Май 5, 2015 15:51:55

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

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

terabayt
по вашему коду:
1) он даже не запускается!
Сори, забыл объявить в коде x=0
terabayt
а что вы подразумеваете под “главных диагоналях”? диагонали две
главная и дополнительная!
ОДНА главная и ОДНА дополнительная
я имею ввиду что должно выполняться например условие
a= ([
    [7, 1, 1, 8, 1, 1] ,
    [1, 1, 7, 3, 1, 5],
    [2, 3, 1, 2, 5, 1],
    [1, 1, 1, 5, 1, 4],
    [4, 6, 5, 1, 3, 1],
    [1, 1, 9, 1, 2, 1]]) == True
где начиная со второго списка-элемента и до предпоследнего создается диагональ из пятерок
[1, 1, 7, 3, 1, 5],
[2, 3, 1, 2, 5, 1],
[1, 1, 1, 5, 1, 4],
[4, 6, 5, 1, 3, 1],

+ не могли бы Вы пояснить про функцию f(a) , новичку трудно представить что и как она делает.



Отредактировано Silentium (Май 5, 2015 16:19:23)

Офлайн

#7 Май 8, 2015 21:43:33

kampella
Зарегистрирован: 2014-11-21
Сообщения: 95
Репутация: +  1  -
Профиль   Отправить e-mail  

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

Вам нужно использовать numpy библиотеку для таких вычислений.

Офлайн

#8 Май 9, 2015 00:28:39

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

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

kampella
зачем numpy? потому что кто то где то слышал, что numpy может в матрицы?

Офлайн

#9 Май 9, 2015 09:57:49

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

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

sander
что numpy может в матрицы
Какая прелесть! Можно я это на литературный факультет МГУ отправлю?

В numpy будет проще указанные объекты выделить.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.diagonal.html
def chk(v):
     return 4 in dict(Counter(v)).values()
a=numpy.array(input_list)
for i in a:
    chk(i)
for i in a.T:
    chk(i)
chk(a.diagonal())
chk(numpy.flipud(a).diagonal())



Отредактировано doza_and (Май 9, 2015 10:18:55)

Офлайн

#10 Май 9, 2015 13:57:35

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

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

doza_and
задача с checkio, там нет numpy, все задачи решаются с помощью стандартной библиотеки

Отредактировано sander (Май 9, 2015 13:58:03)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version