singlepost

"Разбить" последовательность << На главную или назад  

Разбить последовательность чисел от 1 до N^2 на N последовательностей так, чтобы все они состояли из N чисел и имели равные суммы. Результат вывести на экран, либо в текстовый файл.

24 ответов в теме “"Разбить" последовательность”

  1. 24
    Олег Андреев ответил:

    Видимо, я старомоден.

  2. 23
    Паша Галашин ответил:

    Вау, ирония.
    Не знаю как тебе, а мне было бы совершенно лень объяснять каким образом формула i+j*(N+1)-ord(j+i>N)*N задает числа, удовлетворяющие решению задачи. а так все просто: берем, создаем очевидным образом массив и выводим его диагонали–все! Вот тебя смущает мой логический переход, а зря.
    Когда читаешь сочинение первоклассника размышляешь всяко меньше чем над высказыванием Вольтера. Потому что Вольтер думал, а первоклассник нет(ну, может и думал, но…короче все понятно=).

    >Вообще, думать при решении алгоритмических задач — необязательно. Особенно, если это обучающие задачки в институте.

    этот сарказм слегка противоречит следующему заявлению:
    > Алгоритм же простой как три копейки.

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

  3. 22
    Олег Андреев ответил:

    Паша, все слова — в рамку.

    "Когда я писал первый код я вообще не думал. А значит и человек, который будет в моем коде разбираться, не обязан утруждать себя этим."

    Логический переход вызывает восхищение! Вообще, думать при решении алгоритмических задач — необязательно. Особенно, если это обучающие задачки в институте.

  4. 21
    Паша Галашин ответил:

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

    Во-во. Я к тому что, когда я писал второй код, мне пришлось думать, хоть и немного. Когда я писал первый код я вообще не думал. А значит и человек, который будет в моем коде разбираться, не обязан утруждать себя этим.
    Ну, это как, эээ… это как, если вы хотите узнать решение задачи, вам явно будет понятнее если вам покажут именно решение, а не формулу для вычисления ответа. вот так же и здесь.

  5. 20
    Олег Андреев ответил:

    Алексей, а ты все буквы прочитал в моем сообщении?

  6. 19
    Алексей Игнатьев ответил:

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

  7. 18
    Олег Андреев ответил:

    Просьба без наездов. Помощь была обеспечена на 3-х языках программирования со всевозможными пояснениями. Сожалеть о том, что не дали 100% готовый код на паскале может лишь ленивый болван, а не студент высшего учебного заведения. Плюс, нужно понять, что кое-кто вообще не умеет писать на паскале (например, я).

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

  8. 17
    Паша Галашин ответил:

    Блин, это была обучающая программа. вот ее более изящное решение:
    uses crt;

    var i,j,n:integer;

    begin

    readln(N);

    for i:=1 to n do begin
    for j:=0 to n-1 do
    write(i+j*(N+1)-ord(j+i>N)*N:4);

    writeln;
    end;

    end.

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

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

  9. 16
    Олег Андреев ответил:

    Код незачетный, товарищи. Во-первых, незачет за статическое объявление массива 10Kx10K. Во-вторых, этот массив вам вообще не нужен.

  10. 15
    Паша Галашин ответил:

    короче, вот код.

    uses crt;

    var i,j,n:integer;
    a:array[1..10000,1..10000] of integer;

    begin

    readln(N);
    for i:=1 to N do
    for j:=1 to N do begin
    a[j,i]:=(i-1)*N+j;{заполняем массив таким образом}
    a[j+n,i]:=(i-1)*N+j;
    end;

    for i:=1 to N do begin
    for j:=1 to 2*N do
    write(a[j,i]:4);
    writeln;{на всякий случай выведем его–он выглядит так}
    end;

    writeln;{пропустим строку}

    for i:=0 to N-1 do begin
    for j:=1 to n do
    write(a[j+i,j]:4); {а теперь просто выведем N его диагоналей}
    writeln;
    end;

    readln;

    end.

  11. 14
    Жека Кирпичев ответил:

    Блин, да ты скажи, что у тебя не получается-то. Алгоритм же простой как три копейки. i-й столбец циклически сдвинут на i, вот и все! Если есть проблема перевести это на паскаль, то тут я, боюсь, ничем не могу помочь.

  12. 13
    Жека Кирпичев ответил:

    Ну, раз пошла такая пьянка..
    Вот на J:
    |:(i.5)&(|."0 1) (5 5 $ i.25)

  13. 12
    Дмитрий Смелянец ответил:

    народ, уже не смешно ;)
    работа горит :(

  14. 11
    Дмитрий Смелянец ответил:

    > ((c+r)%n)

    да, руби, конечно, рулит, но вот как бы это преобразовать на паскаль :)

  15. 10
    Олег Андреев ответил:

    Wolfram Mathematica:

    RotateLeft~MapIndexed~Partition[Range[1, n^2], n]//Transpose //TableForm

  16. 9
    Олег Андреев ответил:

    #!/usr/bin/env ruby
    n = 5
    puts (0…n).map{|c|(0…n).map{|r|r*n+((c+r)%n)+1}*" "}*"\n"
    1 7 13 19 25
    2 8 14 20 21
    3 9 15 16 22
    4 10 11 17 23
    5 6 12 18 24

  17. 8
    Олег Андреев ответил:

    То же самое, но более развернуто:

    n.times do |c|
    n.times do |r|
    print(r*n + ((c+r)%n) + 1, " ")
    end
    print "\n"
    end

  18. 7
    Игорь Ру ответил:

    може это не оптимально, но можно заметить…
    что получить требуемые последовательности можно из матрицы элементов записанной попорядку по столбцам путем циклического сдвига элементов в каждом столбце на
    (номер столбца – 1) количество элементов.
    Тоесть, есть матрица
    15913
    26 1014
    37 1115
    48 1216
    1й столбец не сдвигается, 2ой циклически сдвигаем на (2 – 1) = 1 элемент:
    6
    7
    8
    5
    3ий столбец циклически сдвигаем на (3 – 1) = 2 элемента :
    11
    12
    9
    10
    4ый столбец циклически сдвигаем на (4-1)= 3 элемента :
    16
    13
    14
    15
    получили
    1 6 11 16
    2 7 12 13
    3 89 14
    4 5 10 15
    теперь осталось построчно вывести последовательности

  19. 6
    Дмитрий Смелянец ответил:

    нет, агоритм неправильный. надо что-то другое искать.
    пробовал вот так:
    var
    a,i,j,s: integer;
    begin
    readln(a);
    for i:=1 to a do
    begin
    for j:=0 to a-1 do
    begin
    s:= i + a*j + j;
    write(s:4);
    end;
    writeln;
    end;
    readln;
    end.
    но выводит правильно лишь первые строки.

  20. 5
    Жека Кирпичев ответил:

    Дело за малым – перевести его с русского в программу.
    Попробуй написать его по-русски еще более точно и близко к языку программирования, до уровня циклов, переменных итп.
    Если хочешь, чтобы помогли – напиши весь алгоритм на русском языке и уточни, что именно у тебя не получается перевести в код.

  21. 4
    Дмитрий Смелянец ответил:

    написал :) только компилятор Великий и Могучий русский язык не понимает))

  22. 3
    Жека Кирпичев ответил:

    Ну так и в чем проблема? Напиши алгоритм русским языком, а потом переведи в программу.

  23. 2
    Дмитрий Смелянец ответил:

    до этого я дошёл и сам..
    вот сейчас пытаюсь как раз воплотить программно.

  24. 1
    Deleted Deleted ответил:

    Посмотрите на примеры:
    N = 3
    1 2 3
    4 5 6
    7 8 9

    Три последовательности:
    1 5 9
    2 6 7
    3 4 8

    N = 4
    1 2 3 4
    5 6 7 8
    9 10 11 12
    13 14 15 16

    Четыре последовательности:
    1 6 11 16
    2 7 12 13
    3 8 9 14
    4 5 10 15

    P.S. Надеюсь стало понятно как выбирать последовательности.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.