LINUX.ORG.RU
ФорумTalks

[python] оптимальный цикл

 


0

0

необходимо поле 19х15 клеток замостить блоками по схеме:

###################
# # # # # # # # # #
#                 #
# # # # # # # # # #
#                 #
# # # # # # # # # #
#                 #
# # # # # # # # # #
#                 #
# # # # # # # # # #
#                 #
# # # # # # # # # #
#                 #
# # # # # # # # # #
#                 #
###################

как это сделать оптимальней? У меня на уме только 3 цикла: 1. верхняя и нижняя горизонтальные «границы» 2. Левая и правая вертикальные «границы» 3. вся внутренняя «часть»

но, кажется, это как-то криво? О_о

★★

# # # # # # # # # #
#                 #

Сохрани строку со значениями типа "1,0,1,0...", и читай по одному символу за цикл. Ну и 7 раз пусти это дело. Ессно, 20-м символом должен стоять переход на новую строку.

wyldrodney
()

узор регулярный... можно подобрать mod (остатки по модулю), другое дело, что это будет не очень читаемым :)

n01r ★★
()
Ответ на: комментарий от wyldrodney

Крайние строки сам догадаешься как заполнить :)

//Зачем цикл, если можно самому показать что делать?

wyldrodney
()
Ответ на: комментарий от phasma

>>не проще тогда сразу # или пробел ?

не проще. дело в том, что это схема всего лишь. реально есть окно (1026, 810) px. А размер "блоков" 54x54 px.

vitroot ★★
() автор топика
Ответ на: комментарий от vitroot

Может тебе покопать движки какого-нить рендерера, или доки по OGL? Там такое точно заоптимизированно по самое нехочу.

wyldrodney
()
Ответ на: комментарий от vitroot

>размер "блоков" 54x54 px

Контент динамический? То место, где пробелы должно оставаться пустым?

Если второе верно, то почему не переходить к следующему элементу цикла, в случае "пустышки"?

wyldrodney
()
Ответ на: комментарий от wyldrodney

нет, пустым оно не будет. потом. там будут другие объекты. Но конкретно ЭТИ будут жестко фиксированы на своих позициях)

vitroot ★★
() автор топика

Для каждой строки:
{
Если(первая или последняя строка)
"###################"
ИначеЕсли( Строка четная )
"# # # # # # # # # #"
Иначе
"# #"
}

xorik ★★★★★
()
Ответ на: комментарий от xorik

черт
Для каждой строки:
{
    Если(первая или последняя строка)
        "###################"
    ИначеЕсли( Строка четная )
        "# # # # # # # # # #"
    Иначе
        "#                 #"
}

xorik ★★★★★
()

<индусо_моде>
сделать статический массив 19х15 и его просто тупо выводить когда надо
</индусо_моде>

isden ★★★★★
()
Ответ на: комментарий от vitroot

>Но конкретно ЭТИ будут жестко фиксированы на своих позициях)

Если пробелы, коих больше, но _не_пробелы_ тоже будут на своих позициях. Так?

//Ага, плохо понимаю возможные отклонения и форму контента. Представь к это выглядит, и расскажи :) Так проще.

wyldrodney
()

for($q=0;$q<19*15;$q++){print "".($q%19==0 && $q>0?"\n":"").($q<=19 || $q>=19*15-19 || $q%19==0 || $q%19==18 || (int($q/19)%2==1 && $q%2==1)?"#":" ");}

simple_best_world_web_master
()
Ответ на: комментарий от vitroot

Как-то так:

a = 19
b = 15

for x in range(a):
    s = ''
    for y in range(b):
        if (x == 0 or x == a - 1) or (y == 0 or y == b - 1):
            z = '#'
        else:
            if x % 2 == 0  and y % 2 == 0:
                z = '#'
            else:
                z = ' '
        s = s + z
    print s

Это совсем неоптимизированный пример, чтобы логику понять.

Turbid ★★★★★
()
Ответ на: комментарий от simple_best_world_web_master

> Это скорее high perfomance full optimize. Я только учусь так писать.

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

isden ★★★★★
()
Ответ на: комментарий от isden

> а если серьезно - только в некоторых случаях будет оправданно использование подобных решений с массивами.

А что может быть быстрее? Это же банальный memcpy в нужном месте и все готово.

simple_best_world_web_master
()
Ответ на: комментарий от simple_best_world_web_master

Я, наверное, говорил про пару дней? Ну и да, я никогда, НИКОГДА-НИКОГДА не лгу.

wyldrodney
()
Ответ на: комментарий от simple_best_world_web_master

> А что может быть быстрее?

а если не стоит вопрос такой жесткой оптимизации? массивами особенно увлекаться не стоит имхо. в случае ТСа, алгоритм заполнения не такой уж и сложный - ресурсов не особо захавает..

isden ★★★★★
()
Ответ на: комментарий от wyldrodney

> 4 гига видеопамяти, 32 - оперативы и 12 ядер с процов?!

когда все это щастье будет стоить баксов 100 в сумме

isden ★★★★★
()
Ответ на: комментарий от vitroot

> не проще. дело в том, что это схема всего лишь. реально есть окно (1026, 810) px. А размер "блоков" 54x54 px.

Вариант с готовой матрицей не подходит, я про это и говорю.

phasma ★☆
()
Ответ на: комментарий от smh

в питоне точно так же, только заменить puts на print ;)

val-amart ★★★★★
()
Ответ на: комментарий от vitroot

> это само собой, но вот Turbid предложил, имхо, отличный вариант. не?

возможно, я уже не помню. На олимпиадах часто подобные задачки дают :)

phasma ★☆
()
Ответ на: комментарий от vitroot

> это само собой, но вот Turbid предложил, имхо, отличный вариант. не?

А чем плох вариант в одну строку? :-) Хотя, я подозреваю, что тебе надо в массив какой-то писать, а не просто ascii-art. :-)

smh ★★★
()
Ответ на: комментарий от smh

А впрочем, можно и массивы. :-) Примерно так:

m = [["#"]*19] + ([["#", " "]*9 + ["#"]] + [["#"] + [" "]*17 + ["#"]])*7 + [["#"]*19]

for i in range(0, 16):
    print m[i]

smh ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.