bogo sort, как сделать короче?
От: Аноним  
Дата: 08.04.07 14:24
Оценка:
Изучаю nemerle(кстати как оно произноситься?),
делаю упражнение отсюда:

http://nemerle.org/Grok_Base_structure_of_programs

1.2. Implement bogo sort algorithm for an array of integers. (WARNING: you should not implement destroy the universe step). Test it by sorting the following array: [4242, 42, -42, 31415].

получился вот такой код:

module Utils {
    static public print_array(arr: array[int]): void {
        for (mutable i = 0; i < arr.Length; ++i)
            System.Console.WriteLine("{0}", arr[i]);
    }
}

module BogoSort {
    static public sort(arr: array[int]): void {
        def r = System.Random();
        mutable idx = array(arr.Length);
        mutable test_arr = array(arr.Length);

        def do_sort(): void {
            def is_sorted(arr: array[int]): bool {
                def check_is_sorted(arr: array[int], len: int): bool {
                    if (len < 2)
                        true
                    else
                        arr[len - 2] <= arr[len - 1] &&  check_is_sorted(arr, len - 1)
                }
                check_is_sorted(arr, arr.Length)
            }

            for (mutable i = 0; i < arr.Length; ++i) {
                def new_unique_indexes(): void {
                    idx[i] = r.Next(arr.Length);
                    for (mutable j = 0; j < i; ++j)
                        when (idx[i] == idx[j])
                            new_unique_indexes();
                }
                new_unique_indexes();
                test_arr[i] = arr[idx[i]];
            }

            if (!is_sorted(test_arr)) {
              //  System.Console.WriteLine("array not sorted, run do_sort again");
  //              Utils.print_array(test_arr);
                do_sort();
            } else {
                //System.Console.WriteLine("array sorted, we do it!!!");
//                Utils.print_array(test_arr);
            }
            for (mutable i = 0; i < arr.Length; ++i)
                arr[i] = test_arr[i];
        }
        do_sort();           
    }
}

module BogoSortTester {
    static public Main(): void {
        def arr = array[4242, 42, -42, 31415];
        System.Console.WriteLine("Input:");
        Utils.print_array(arr);
        BogoSort.sort(arr);
        System.Console.WriteLine("Output:");
        Utils.print_array(arr);
    }
}


почему-то уверен, что имея больший опыт в Nemrle, можно написать короче,
не могли бы вы подсказать как именно можно это сделать?
Re: bogo sort, как сделать короче?
От: Аноним  
Дата: 08.04.07 14:49
Оценка:
Здравствуйте, Аноним, Вы писали:

Да и можно ли вместо

def check_is_sorted(arr: array[int], len: int): bool {


вернее вместо "len: int" написать, что-нибудь типа len: typeof(arr.Length)?
Re: bogo sort, как сделать короче?
От: Иванков Дмитрий Россия  
Дата: 08.04.07 14:54
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Изучаю nemerle(кстати как оно произноситься?),

А>делаю упражнение отсюда:

А>http://nemerle.org/Grok_Base_structure_of_programs


А>1.2. Implement bogo sort algorithm for an array of integers. (WARNING: you should not implement destroy the universe step). Test it by sorting the following array: [4242, 42, -42, 31415].


А>получился вот такой код:

[skipped]

Во-первых случайную перестановку можно генерировать за O(n) и намного проще, например так:
for (mutable i = n - 1; i > 0; --i)
  arr[i] <-> arr[r.Next (i + 1)];

А во-вторых рекурсия как-то неаккуратно используется, надо хотя бы так:
            if (!is_sorted(test_arr)) {
              //  System.Console.WriteLine("array not sorted, run do_sort again");
  //              Utils.print_array(test_arr);
                do_sort();
            } else {
                //System.Console.WriteLine("array sorted, we do it!!!");
//                Utils.print_array(test_arr);
            for (mutable i = 0; i < arr.Length; ++i)
                arr[i] = test_arr[i];

            }

И та же ошибка (выполнение ненужных действий) была при генерации случайной перестановки.
Re[2]: bogo sort, как сделать короче?
От: Иванков Дмитрий Россия  
Дата: 08.04.07 14:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>Да и можно ли вместо


А>
А>def check_is_sorted(arr: array[int], len: int): bool {
А>


А>вернее вместо "len: int" написать, что-нибудь типа len: typeof(arr.Length)?


В данном коде можно вообще не писать типов нигде кроме как при объявлении методов (которых всего 3).
Re: bogo sort, как сделать короче?
От: ie Россия http://ziez.blogspot.com/
Дата: 08.04.07 15:07
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>получился вот такой код:


Выше уже дали правильные советы, дополню по поводу этого:

А>
А>    static public print_array(arr: array[int]): void {
А>        for (mutable i = 0; i < arr.Length; ++i)
А>            System.Console.WriteLine("{0}", arr[i]);
А>    }
А>


Так будет попроще:

WriteLine ($"..$(arr; "\n")");
... << RSDN@Home 1.2.0 alpha rev. 655>>
Превратим окружающую нас среду в воскресенье.
Re: bogo sort, как сделать короче?
От: GlebZ Россия  
Дата: 08.04.07 17:42
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>
А>module Utils {
А>    public print_array(arr: array[int]): void //static  - лишнее
А>

Eще одна поправочка. Модуль — эквивалентен стат. классу. Все методы являются static.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re: bogo sort, как сделать короче?
От: Vermicious Knid  
Дата: 08.04.07 22:00
Оценка: 34 (1)
Здравствуйте, Аноним, Вы писали:

А>почему-то уверен, что имея больший опыт в Nemrle, можно написать короче,

А>не могли бы вы подсказать как именно можно это сделать?
Например так:
using System;
using Nemerle.Utility;

module BogoSort
{
    public BogoSort[T](this arr : array[T]) : void where T : IComparable
    {
        def is_sorted()
        {
            foreach(i in [1..arr.Length-1])
                when (arr[i].CompareTo(arr[i-1]) < 0) Nemerle.Imperative.Return(false);
            true
            // slightly shorter variant
            // mutable m = arr[0];
            // arr.ForAll(x => { def r = x.CompareTo(m) >= 0; m = x; r })
        }

        def r = Random();

        while(!is_sorted())
            foreach(i in [0..arr.Length-1])
                arr[i] <-> arr[r.Next(arr.Length)];
    }
}

module BogoSortTest
{
    Main() : void
    {
        def r = array[4242, 42, -42, 31415];
        Console.WriteLine($"Input: $(arr.ToList())");
        arr.BogoSort();
        Console.WriteLine($"Output: $(arr.ToList())");
    }
}

А>(кстати как оно произносится?),

So how do you pronounce "Nemerle"? Does it rhyme with "M-perl"?
Actually it is not clear. We would have to ask Ursula Le Guin Most English-speaking people pronounce it like that. We, in Poland, tend to accent the last syllabe and pronounce the last e --Malekith 11:01, 1 Oct 2005 (CEST)

Re[2]: bogo sort, как сделать короче?
От: Иванков Дмитрий Россия  
Дата: 09.04.07 01:33
Оценка:
Здравствуйте, Vermicious Knid, Вы писали:
[skipped]
VK>            // slightly shorter variant
VK>            // mutable m = arr[0];
VK>            // arr.ForAll(x => { def r = x.CompareTo(m) >= 0; m = x; r })


Кстати, небольшой офф по поводу ForAll, Exists, Map и т.п., то что они применяются в прямом порядке не следует из названия.
А например для ForAll это критично, думаю стоит придумать эти именам синонимы для чёрных дел ForAllForward, LeftmostExists или как-то еще.
Re[2]: bogo sort, как сделать короче?
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.04.07 02:24
Оценка:
Здравствуйте, ie, Вы писали:

ie>Так будет попроще:


ie>
ie>WriteLine ($"..$(arr; "\n")");
ie>


Только вложенную строку надо слешами выделить:
WriteLine ($"..$(arr; \"\n\")");

Так же можно использовать @-строку и удвоение ковычек:
WriteLine ($@"..$(arr; ""\n"")");

или вообще объявить константу:
def LF = "\n";
WriteLine ($@"..$(arr; LF)");
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: bogo sort, как сделать короче?
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.04.07 02:24
Оценка:
Здравствуйте, Vermicious Knid, Вы писали:

VK>
VK>            foreach(i in [1..arr.Length-1])
VK>                when (arr[i].CompareTo(arr[i-1]) < 0) Nemerle.Imperative.Return(false);
VK>


Надо бы все же добавить макрос for (min <= i < max) ...
Тогда можно будет подобные кострукции прописывать более выразительно:
for (1 <= i < arr.Length)
    when (arr[i].CompareTo(arr[i - 1]) < 0)
        return false;


Можно так же сделать для IList метод-расшерение LowerBound().
Жаль, что свойство-расшерение сделать нельзя.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: bogo sort, как сделать короче?
От: Иванков Дмитрий Россия  
Дата: 09.04.07 02:34
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Надо бы все же добавить макрос for (min <= i < max) ...

VD>Тогда можно будет подобные кострукции прописывать более выразительно:
VD>
VD>for (1 <= i < arr.Length)
VD>    when (arr[i].CompareTo(arr[i - 1]) < 0)
VD>        return false;
VD>


+1, отрезки без правой границы часто более удобны, "[a,m), [m,b)" намного лучше чем "[a,m-1], [m,b-1]"
Re[4]: bogo sort, как сделать короче?
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.04.07 03:53
Оценка:
Здравствуйте, Иванков Дмитрий, Вы писали:

ИД>+1, отрезки без правой границы часто более удобны, "[a,m), [m,b)" намного лучше чем "[a,m-1], [m,b-1]"


В немерле нельзя использовать не парные скобки.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: bogo sort, как сделать короче?
От: Иванков Дмитрий Россия  
Дата: 09.04.07 04:02
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Иванков Дмитрий, Вы писали:


ИД>>+1, отрезки без правой границы часто более удобны, "[a,m), [m,b)" намного лучше чем "[a,m-1], [m,b-1]"


VD>В немерле нельзя использовать не парные скобки.


Ага, поэтому когда была мысль реализовать, смотрел в сторону какого-нибудь суффикса или префикса для интервала, или же другого имени макроса.
Но "0 <= i < n" вполне подходит
Re[3]: bogo sort, как сделать короче?
От: Алексей П Россия  
Дата: 09.04.07 06:25
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Надо бы все же добавить макрос for (min <= i < max) ...


Уже предлагал и давно сделал.
Расширения библиотеки макросов
Автор: Алексей П
Дата: 21.10.06
Re[2]: bogo sort, как сделать короче?
От: _FRED_ Черногория
Дата: 09.04.07 07:59
Оценка:
Здравствуйте, Vermicious Knid, Вы писали:

VK>def is_sorted() {
VK>  foreach(i in [1..arr.Length-1])
VK>    when (arr[i].CompareTo(arr[i-1]) < 0) Nemerle.Imperative.Return(false);
VK>    true
VK>}


А изящнее никак
Help will always be given at Hogwarts to those who ask for it.
Re[3]: bogo sort, как сделать короче?
От: ie Россия http://ziez.blogspot.com/
Дата: 09.04.07 09:34
Оценка: 14 (1)
Здравствуйте, _FRED_, Вы писали:

_FR>
VK>>def is_sorted() {
VK>>  foreach(i in [1..arr.Length-1])
VK>>    when (arr[i].CompareTo(arr[i-1]) < 0) Nemerle.Imperative.Return(false);
VK>>    true
VK>>}
_FR>


_FR>А изящнее никак


def is_sorted() {
  ret : {
    foreach(i in [1..arr.Length-1])
      when (arr[i].CompareTo(arr[i-1]) < 0) ret(false);
      true
    }
}


http://nemerle.org/Block
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[4]: bogo sort, как сделать короче?
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.04.07 17:51
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Здравствуйте, VladD2, Вы писали:


VD>>Надо бы все же добавить макрос for (min <= i < max) ...


АП>Уже предлагал и давно сделал.

АП>Расширения библиотеки макросов
Автор: Алексей П
Дата: 21.10.06


Вот как раз такие сложности совершенно излишни. Нужен именно
for (0 <= i < ary.Length)
  ...
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: bogo sort, как сделать короче?
От: Алексей П Россия  
Дата: 09.04.07 18:46
Оценка:
Здравствуйте, VladD2, Вы писали:

АП>>Уже предлагал и давно сделал.

АП>>Расширения библиотеки макросов
Автор: Алексей П
Дата: 21.10.06


VD>Вот как раз такие сложности совершенно излишни. Нужен именно

VD>
VD>for (0 <= i < ary.Length)
VD>  ...
VD>


Ну хотя бы так:
for(a <= i < b)
for(a <= i <= b)
for(i < b) // с нулем вместо a, ну эти два варианта не обязательно.
for(i <= b)


Кстати, а слово for разве получится использовать?
Re[6]: bogo sort, как сделать короче?
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.04.07 21:01
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Ну хотя бы так:

АП>
АП>for(a <= i < b)
АП>for(a <= i <= b)
АП>for(i < b) // с нулем вместо a, ну эти два варианта не обязательно.
АП>for(i <= b)
АП>


Подразумевается,ч то операторы могут в обоих местах выбираться произвольно из <= и <.

АП>Кстати, а слово for разве получится использовать?


Получится. Исходники макросов встроенных в компилятор доступны для изменения.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.