Определить букву на основе строки и столбца - python

Поэтому я очень расстроен, что не могу понять что-то такое, казалось бы, тривиальное, поскольку я довольно хорошо разбираюсь в Java, но в любом случае мой профессор для введения в Python назначил нам лабораторию, где мы должны создать шаблон с буквами на основе строки и положение столбца. Никаких циклов или итераций, только условные операторы.

Например, эта функция:

def letter(row, col):
   if row>col:
      return 'T'
   else:
      return 'W'

даст:

WWWWWWWWWWWWWWWWWWWW
TWWWWWWWWWWWWWWWWWWW
TTWWWWWWWWWWWWWWWWWW
TTTWWWWWWWWWWWWWWWWW
TTTTWWWWWWWWWWWWWWWW
TTTTTWWWWWWWWWWWWWWW
TTTTTTWWWWWWWWWWWWWW
TTTTTTTWWWWWWWWWWWWW
TTTTTTTTWWWWWWWWWWWW
TTTTTTTTTWWWWWWWWWWW
TTTTTTTTTTWWWWWWWWWW
TTTTTTTTTTTWWWWWWWWW
TTTTTTTTTTTTWWWWWWWW
TTTTTTTTTTTTTWWWWWWW
TTTTTTTTTTTTTTWWWWWW
TTTTTTTTTTTTTTTWWWWW
TTTTTTTTTTTTTTTTWWWW
TTTTTTTTTTTTTTTTTWWW
TTTTTTTTTTTTTTTTTTWW
TTTTTTTTTTTTTTTTTTTW

если запустить его файл драйвера со строкой и столбцом, равными 20.

Тот, с которым я застрял, создает функцию для шаблона:

XOOOOOX
OXOOOXO
OOXOXOO
OOOXOOO
OOXOXOO
OXOOOXO
XOOOOOX

Пожалуйста, НЕ кормите меня ответом с ложки, а скорее укажите мне правильное направление.

Пока я знаю, что X для левой-> правой диагонали можно определить, когда row==col. У меня проблемы с диагональю вправо->влево.

Большое спасибо.


person Sam Nayerman    schedule 18.04.2015    source источник
comment
Можете ли вы пояснить, как данная функция производит данный вывод, т. е. что такое файл драйвера и как его запустить?   -  person TigerhawkT3    schedule 18.04.2015
comment
Для того, чтобы сделать диагонали справа вверху -> слева внизу, вам нужно знать ширину (или высоту, так как она квадратная). В вашем примере это 7. Этого может быть достаточно для начала.   -  person jedwards    schedule 18.04.2015
comment
О, а ваш профессор считает, что рекурсия относится к той же категории, что и циклы? :П   -  person TigerhawkT3    schedule 18.04.2015
comment
@TigerhawkT3: Это в значительной степени должно быть эквивалентно print('\n'.join(''.join(letter(row, col) for col in range(colcount)) for row in range(rowcount))) (за исключением, возможно, перетасовки итераций, чтобы поймать программы, которые случайно или намеренно мошенничают с состоянием…).   -  person abarnert    schedule 18.04.2015
comment
@ TigerhawkT3 - К сожалению, у меня нет доступа к исходному коду драйвера. @jedwards - Спасибо! Я фактически решил это, заявив, что if row==col or row+col==6 then return 'X'. Я не особенно доволен этим, потому что я не хочу полагаться на использование константы. Но общая формула: строка+столбец=n+1.   -  person Sam Nayerman    schedule 18.04.2015
comment
На самом деле, говоря о чите с состоянием… Я не уверен, как еще вы делаете получение ширины/высоты? Либо ваша программа должна передать его драйверу, и вы помещаете его в глобальный файл, чтобы letter мог его найти, либо letter отслеживает то, что он видел до сих пор, и делает предположение о порядке итерации. Так что, по-видимому, одно из этих двух не считается мошенничеством.   -  person abarnert    schedule 18.04.2015
comment
@abarnert Я предполагаю, что вы выбираете это, поэтому вы сообщаете драйверу rowcount/colcount и пишете свой код с этим предположением. По крайней мере, это то, что я получил, если запустить его файл драйвера, где строка и столбец равны 20.   -  person jedwards    schedule 18.04.2015
comment
И последнее: если вам действительно удобнее работать с Java, напишите реализацию public static char letter(int row, int col), а затем попробуйте перенести ее на Python. Как правило, это плохой способ написания кода, но когда вы застряли, это может быть способом выйти из затруднительного положения. (Я часто писал код Ruby или JS, написав его на хорошем Python, портировав его как плохой Ruby/JS, а затем, как только я его получил, выбросил и переписал как идиоматический Ruby/JS…)   -  person abarnert    schedule 18.04.2015
comment
@jedwards: О, да, ты прав, ответ прямо здесь, в том, как сформулирован вопрос; Я слишком усложнял вещи…   -  person abarnert    schedule 18.04.2015
comment
@abarnert, это было бы введением в курс Python следующего уровня :)   -  person jedwards    schedule 18.04.2015
comment
@jedwards: вы не можете использовать глобальные переменные. Подсказка: см. inspect.getsourcefile и ast.parse. :)   -  person abarnert    schedule 18.04.2015


Ответы (1)


Посмотрите на взаимосвязь между строкой и столбцом каждой позиции X. Затем разделите эту задачу на две части: один ее аспект — это линия, идущая из верхнего левого угла в нижний правый, а другой аспект — линия, идущая из нижнего левого угла в верхний правый.

Давайте посмотрим на X от верхнего левого до нижнего правого:

row: column:
1    1
2    2
3    3
4    4
5    5
6    6
7    7

Я думаю, вы можете определить связь между строкой и столбцом на основе этого.

А теперь как насчет другой строки, снизу-слева вверх-вправо:

row: column:
1    7
2    6
3    5
4    4
5    3
6    2
7    1

Ваш нежный намек здесь - "+".

Таким образом, если строка и столбец элемента имеют первую указанную связь or со второй, вы помещаете туда X.

Я надеюсь, что это была надлежащая помощь.

person TigerhawkT3    schedule 18.04.2015
comment
Отличное объяснение. Но я подозреваю, что row и col основаны на 0, а не на 1. (Хотя ОП может чему-то научиться, решив, что его код будет делать неправильно, если он угадает неправильно в каждом случае, а затем запустив его для проверки…) - person abarnert; 18.04.2015
comment
Эй, большое спасибо! Это был отличный ответ, и я ценю мягкий намек, ха-ха! - person Sam Nayerman; 18.04.2015
comment
Я думаю, что в этом случае объяснение не зависит от индекса — это могли быть n, n+1 и т. д. Кроме того, я протестировал функцию, использующую этот алгоритм, запустив ее через драйвер, который вы указали в этом комментарии, и она вела себя так, как ожидалось. . :) - person TigerhawkT3; 18.04.2015
comment
@TigerhawkT3: Ну, код, который вы должны написать для 0 и 1, здесь будет отличаться. Но я думаю, вы правы; для тех, кто уже понимает разницу между 0 и 1, ваше объяснение расскажет им все, что им нужно знать, чтобы написать это в любом случае. - person abarnert; 18.04.2015
comment
Это была идея. :) - person TigerhawkT3; 18.04.2015