1 Востаннє редагувалося Patron (14.09.2012 17:55:02)

Тема: Задачка на трієчку

Хочу поділитися невеличкою задачкою котру мені недавно запропонували вирішити. Отже є квадратна матриця (може бути і не квадратна):

<?php 
    $matrix = array(
    array(1,2,3),
    array(4,5,6),
    array(7,8,9)
    );
?>

Потрібно написати функцію яка конвертує матрицю так, щоб у вихідній матриці усі діагональні елементи (діагональ - top left to bottom right) були сумою усіх інших елементів поточного ряду матриці. Іншими словами, попередня матриця повинна стати такою:

<?php 
    $newMatrix = array(
    array(5,2,3),
    array(4,10,6),
    array(7,8,15)
    );
?>
Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }
Подякували: Replace1

2

Re: Задачка на трієчку

Нагадує задачі по СДА :)

3

Re: Задачка на трієчку

мало програмістів на форумі( активних десь 3-5 людей(

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

4

Re: Задачка на трієчку

Програмісти ліниві.. =)

5

Re: Задачка на трієчку

Python-програмісти супер-ліниві:

def sdiag(x):
    def cs(p, r):
        r[p] = sum(r)
    [cs(*a) for a in enumerate(x)]
Подякували: Replace1

6 Востаннє редагувалося Patron (14.09.2012 21:15:47)

Re: Задачка на трієчку

bunyk написав:

Python-програмісти супер-ліниві:

def sdiag(x):
    def cs(p, r):
        r[p] = sum(r)
    [cs(*a) for a in enumerate(x)]

Пітон якийсь надто високорівневий, так навіть не цікаво))) А в пітоні немає функції типу createSite або makeMoney?)
п.с. Я не наїжджаю на пітон, просто він мені здається дивним через те що я його не знаю

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }
Подякували: Replace1

7

Re: Задачка на трієчку

Patron написав:

А в пітоні немає функції типу createSite або makeMoney?)

В цих функцій забагато параметрів, що складно. А складно - це не Python-way, тому їх і не включили в стандартну бібліотеку. :)

А то що я там написав - нормальні люди не пишуть. Без збочень воно виглядатиме десь так:

def diagonal_sum(x):
    def compute_sum(pos, row):
        row[pos] = sum(row)

    for num, row in enumerate(x):
        compute_sum(num, row)

8

Re: Задачка на трієчку

Але я дибіл. От до чого доводить бажання ви*бнутись.

Найбільш прямолінійний варіант - найбільш простий:

def diagonal_sum(x):
    for num, row in enumerate(x):
        row[num] = sum(row)

9

Re: Задачка на трієчку

Якраз хотів написати, що compute_sum є заявою :)

10 Востаннє редагувалося Replace (14.09.2012 23:09:38)

Re: Задачка на трієчку

Новачкам не дивитись :)

Код на php

function diagonal_sum(&$m) {
   for ($i = 0; $i < count($m); $i++)
      $m[$i][$i] = array_sum($m[$i]) - $m[$i][$i];
}


bunyk, більш правильно так:

def diagonal_sum(x):
    for num, row in enumerate(x):
        row[num] = sum(row) - row[num]
Подякували: Patron, Чайник2

11

Re: Задачка на трієчку

Я б так написав:

function diagonal_sum(&$m) {
   for ($i = 0; $i < count($m); $i++)
   {
       $m[$i][$i]=0;
       $m[$i][$i] = array_sum($m[$i]);
   }
}
Подякували: Patron1