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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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