2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Можно ли еще сократить код?
Сообщение18.06.2014, 06:12 


17/05/13
149
Дан двумерный массив (матрица) размером NxN.Преобразовать матрицу, заполнив главную диагональ значениями минимальных элементов ее строк.Можно ли еще уменьшить код?
Код F#
Код:
// Учебный шаблон для матричных типов
type Matrix<'T>(N: int, M: int) =
    let internalArray = Array2D.zeroCreate<'T> N M

    member this.Item
        with get(a: int, b: int) = internalArray.[a, b]
        and set(a: int, b: int) (value:'T) = internalArray.[a, b] <- value

    member this.GetSlice(rowStart: int option, rowFinish : int option,
                         colStart: int option, colFinish : int option) =
           let rowStart = match rowStart with
                          | Some(v) -> v
                          | None -> 0
           let rowFinish = match rowFinish with
                           | Some(v) -> v
                           | None -> internalArray.GetLength(0) - 1
           let colStart = match colStart with
                          | Some(v) -> v
                          | None -> 0
           let colFinish = match colFinish with
                           | Some(v) -> v
                           | None -> internalArray.GetLength(1) - 1
           internalArray.[rowStart..rowFinish, colStart..colFinish]

    member this.GetSlice(row: int, colStart: int option, colFinish: int option) =
           let colStart = match colStart with
                          | Some(v) -> v
                          | None -> 0
           let colFinish = match colFinish with
                           | Some(v) -> v
                           | None -> internalArray.GetLength(1) - 1
           internalArray.[row, colStart..colFinish]

    member this.GetSlice(rowStart: int option, rowFinish: int option, col: int) =
           let rowStart = match rowStart with
                          | Some(v) -> v
                          | None -> 0
           let rowFinish = match rowFinish with
                           | Some(v) -> v
                           | None -> internalArray.GetLength(0) - 1
           internalArray.[rowStart..rowFinish, col]
//Дан двумерный массив (матрица) размером NxN.Преобразовать матрицу, заполнив главную диагональ значениями минимальных элементов ее строк.
open System
let n = Int32.Parse <<System.Console.ReadLine
let getN =
     n ()
System.Console.Write("n=")
System.Console.WriteLine(getN)
System.Console.WriteLine("Генерация матрицы");
//=======================================================================================

module test =

    let generateTestMatrix =
        let rnd = System.Random()
        let matrix = new Matrix<float>(getN+1, getN+1);
        for i in 0..getN do
           for j in 0..getN do
               matrix.[i, j] <-Math.Round(rnd.NextDouble()*100.0,2)
        matrix

   
    printfn "%A" generateTestMatrix.[0..getN,0..getN];
    System.Console.WriteLine("Преобразованная матрица");
     
   
     let generateTestMatrix1 =
        let rnd = System.Random()
        let matrix = new Matrix<float>(getN+1, getN+1);
        for i in 0..getN do
           for j in 0..getN do
               matrix.[i, j] <-Array.min generateTestMatrix.[i,*]
        matrix


      let generateTestMatrix2 =
        let matrix = new Matrix<float>(getN+1, getN+1);
        for i in 0..getN do
           for j in 0..getN do
               matrix.[i, j] <-if (i = j) then generateTestMatrix1.[i,j] else generateTestMatrix.[i,j]
        matrix
         
   
               module test2 =

                       printfn "%A" generateTestMatrix2.[0..getN,0..getN]

 Профиль  
                  
 
 Re: Можно ли еще сократить код?
Сообщение18.06.2014, 10:42 
Заслуженный участник


09/05/12
25179

(Оффтоп)

Если это учебная задача, то как-то нехорошо... А если не учебная, то выбор инструмента для ее решения явно неудачен.

 Профиль  
                  
 
 Re: Можно ли еще сократить код?
Сообщение18.06.2014, 12:06 


17/05/13
149
Pphantom в сообщении #876703 писал(а):
Если это учебная задача, то как-то нехорошо

Это учебная задача для ознакомления. Нехорошие там возникает в преобразовании матрицы.

 Профиль  
                  
 
 Re: Можно ли еще сократить код?
Сообщение18.06.2014, 12:39 
Заслуженный участник
Аватара пользователя


28/07/09
1178
hassword в сообщении #876672 писал(а):
Дан двумерный массив (матрица) размером NxN.Преобразовать матрицу, заполнив главную диагональ значениями минимальных элементов ее строк.
hassword в сообщении #876672 писал(а):
Можно ли еще уменьшить код?
Согласено википедии
Статья F_Sharp писал(а):
F# — это мультипарадигмальный язык программирования из семейства языков .NET Framework, поддерживающий функциональное программирование в дополнение к императивному (процедурному) и объектно-ориентированному программированию.
Тогда ничего вам не мешает написать примерно так:
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 20
int main()
{
    int a[N][N], i, j, min;
    srand(time(NULL));
    for(i=0; i<N; ++i) for(j=0; j<N; ++j) a[i][j]=rand()%42;
    for(i=0; i<N; ++i)
    {
        min=a[i][0];
        for(j=0; j<N; ++j) if(a[i][j]<min) min=a[i][j];
        a[i][i]=min;
    }
    for(i=0; i<N; ++i)
    {
        for(j=0; j<N; ++j) printf("%.2d ", a[i][j]);
        printf("\n");
    }
    return 0;
}
 

 Профиль  
                  
 
 Re: Можно ли еще сократить код?
Сообщение18.06.2014, 13:03 
Заслуженный участник


09/08/09
3438
С.Петербург
hassword,
если не копировать пример из MSDN, не понимая, что и зачем надо, а разобраться с модулем Array2D, то весь код занимает меньше 10 строк (вместе с вводом/выводом).

Legioner93,
F# - в первую очередь функциональный язык, и программировать на нем в императивном стиле нет никакого смысла. Тогда уж лучше C# брать.

 Профиль  
                  
 
 Re: Можно ли еще сократить код?
Сообщение18.06.2014, 13:18 


17/05/13
149
Maslov в сообщении #876731 писал(а):
а разобраться с модулем Array2D

Я тоже подумал о Array2D.

 Профиль  
                  
 
 Re: Можно ли еще сократить код?
Сообщение18.06.2014, 13:44 
Заслуженный участник
Аватара пользователя


28/07/09
1178
Maslov в сообщении #876731 писал(а):
Legioner93,
F# - в первую очередь функциональный язык, и программировать на нем в императивном стиле нет никакого смысла. Тогда уж лучше C# брать.
Спасибо, буду знать, но вы явно не по адресу написали :-) .
Мне нет никакого дела до F#, какой он в первую очередь, а какой в последнюю.
Автор весьма предметно и конкретно спросил, можно ли сократить код. Без контекста "оставив его в каком-то определённом (функциональном или другом) стиле", что важно.
Я, предварительно убедившись, что этот язык имеет в том числе и императивный синтаксис, дал ему короткий код для его задачи в императивном стиле. Не больше и не меньше. Что с ним делать - пусть решает сам.

 Профиль  
                  
 
 Re: Можно ли еще сократить код?
Сообщение19.06.2014, 15:11 


17/05/13
149
Maslov в сообщении #876731 писал(а):
hassword,
если не копировать пример из MSDN
, не понимая, что и зачем надо, а разобраться с модулем Array2D, то весь код занимает меньше 10 строк (вместе с вводом/выводом).

Чуть чуть подкорректировал.В принципе проясняется.
F#
Код:
module test2 =

    let generateTestMatrix =
        let rnd = System.Random()
        let matrix = new Matrix<float>(getN+1, getN+1);
        for i in 0..getN do
           for j in 0..getN do
               matrix.[i, j] <- Math.Round(rnd.NextDouble()*100.0,2)
        matrix

    printfn "Генерация матрицы:\n%A" generateTestMatrix.[0..getN,0..getN];
    printfn "Преобразованная матрица:\n%A" (Array2D.mapi (fun i j x -> if (i=j)then Array.min generateTestMatrix.[i,*] else x) generateTestMatrix.[0..getN,0..getN])

 Профиль  
                  
 
 Re: Можно ли еще сократить код?
Сообщение19.06.2014, 15:28 
Заслуженный участник


09/08/09
3438
С.Петербург
Я бы использовал все-таки Array2D, а не мьютабельные матрицы.

Примерно так:
Код:
    // Инициализация
    let rnd = System.Random()
    let m = Array2D.init getN+1 getN+1 (fun i j -> System.Math.Round(rnd.NextDouble()*100., 2))
    printfn "%A" m
   
    // Функция, вычисляющая минимальный элемент строки
    let rowMin (a: float[,]) (i: int) = a.[i..i, 0..] |> Seq.cast<float> |> Seq.toArray |> Array.min

    // Преобразование исходной матрицы
    let m1 = m |> Array2D.mapi (fun i j x -> if i=j then rowMin m i else x)
    printfn "%A" m1

 Профиль  
                  
 
 Re: Можно ли еще сократить код?
Сообщение19.06.2014, 18:32 


17/05/13
149
Maslov в сообщении #877272 писал(а):
Я бы использовал все-таки Array2D, а не мьютабельные матрицы.


Непонятно, а почему вместо Array.min стоит rowMin.
или так нужно?

 Профиль  
                  
 
 Re: Можно ли еще сократить код?
Сообщение19.06.2014, 19:12 
Заслуженный участник


09/08/09
3438
С.Петербург
rowMin - это функция, определенная строчкой выше.

Попробуйте вместо нее вызвать просто Array.min, откомпилируйте, доложите о результатах.

Да, можно просто Array.min - перемудрил.

Итого - 2 содержательных строки на всю задачу, одна из которых - инициализация.

 Профиль  
                  
 
 Re: Можно ли еще сократить код?
Сообщение19.06.2014, 19:14 


17/05/13
149
Maslov в сообщении #877348 писал(а):
rowMin - это функция, определенная строчкой выше.

Попробуйте вместо нее вызвать просто Array.min, откомпилируйте, доложите о результатах.

Код:

open System
let n = Int32.Parse <<System.Console.ReadLine
let getN =
     n ()
System.Console.Write("n=")
System.Console.WriteLine(getN);
// Инициализация
    let rnd = System.Random()
    let m = Array2D.init (getN+1) (getN+1) (fun i j -> System.Math.Round(rnd.NextDouble()*100., 2))
// Преобразование исходной матрицы
        module test = 
               printfn "Генерация матрицы:\n%A" m
               printfn "Преобразованная матрица:\n%A" (Array2D.mapi (fun i j x -> if (i=j)then Array.min m.[i,*] else x)m)

 Профиль  
                  
 
 Re: Можно ли еще сократить код?
Сообщение19.06.2014, 19:16 
Заслуженный участник


09/08/09
3438
С.Петербург
Да, Вы правы. Поправил свой пост.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: mihaild


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group