Re: Как закодировать?

From
Pavel P ()
To
Andrew Ezhguroff
Date
2002-10-09T15:29:35Z
Area
RU.ALGORITHMS
From: "Pavel P" <vprin@indiainfo.com>


"Andrew Ezhguroff" <eandr@com2com.ru> wrote in message
news:ao0uvs$dd4$1@host.talk.ru...
> Привет! "Pavel P" <vprin@indiainfo.com>  сообщил(а):
>
>  >> алгоритм можно уложить в 2 строчки:
>  >> std::string f(int x){return x? f((x>>1)&INT_MAX)+char((x&1)+'0'): "";}
>  >> std::string toBin(int x){return x? f(x): "0";}
>  PP> Мериться п...... не будем ? Да ? :))
>  PP> toBin x = if (x == 0) "0" (f x)
>  PP> where
>  PP>     f x = if (x == 0) "" (f (x >> 1 bitand INT_MAX) +++ toString (x
>  PP> bitand 1))
>
> И тут же сам начинаешь меряться... :-) К тому же это твои слова из
прошлого

:)

[....]
> А где ты до этого у меня слова о длине программы видел? Но если так
желаешь,

Зачем писать больше если можно меньше и понятнее? (1)

> то, насколько я помню, на Forth эта программа будет в несколько раз короче
> твоего варианта. :-)

Уверен? Чего то я там строк не припомню. Да и читабельность у него :(

>  PP> И как говорится STL-ные извращения меня не интересуют. :)
>
> STL-это часть стандарта C++ (в отличии от shr в Паскале).
>
>  PP> Это раз Количество символов ты уже сравнил? И это при том что оба
моих
>  PP> варианта аккуратно разделены пробелами для лучшей читаемости.
>
> А зачем мне это? Я закодировал твой алгоритм один в один на стандартном
C++
> и все...

см (1) и скорость которую ты получишь ниже :)

>  >> И на порядок медленнее (язык больше похож на интерпретируемый)? :-)
>  PP> Не получишь ты супер приз :) Не медленее. Он компилируемый :)
>
> Basic тоже компиляторы имеет (помнится был такой на СМ-1800, :-) да и QB
до
> сих пор используют).
>
> Заглянул сейчас на http://haskell.org - он имеет как компиляторы, так и
> интерпретаторы. И ИМХО, я не думаю, что это чисто компилируемый язык
(скорее
> всего без элементов интерпретации обойтись невозможно).

Есть чисто. ghc например.

>  PP> Тем более когда ты ввел STL, я думаю что С++ будет даже тормознее.
>
> Вот тебе аналог (правда уже не такой буквальный) твоего алгоритма, но без
> STL:
>
> static char *Tmp;
>
> static void f(int val){
>   if(!val)return;
>   f((val>>1)&INT_MAX);
>   *Tmp++=(val&1)+'0';
> }
>
> char* toBin(int val){
>   static char Buf[CHAR_BIT*sizeof(int)+1];
>   Tmp=Buf;
>   if(!val){
>     *Tmp++='0';
>   }else{
>     f(val);
>   }
>   *Tmp='\0';
>   return Buf;
> }

Гм.... (1) :)) Про скорость ниже

>  >> Но вот преимуществ я не вижу: дополнительная функция, лишняя рекурсия
>  PP> Дополнительная функция только у тебя c STL. У меня f не экпортится
>  PP> в глобальную область видимости и ты не можешь ее вызвать ни откуда
>  PP> кроме как из toBin, а у тебя действительно лишняя глобальная
>  PP> функция и побороть ты это в C++ не можешь.
>
> Если я поставлю "static", то функция перестанет быть глобальной. Но от
этого


В пределах модуля/неймспейса она у тебя вызывается? Значит в этих
пределах они глобальна. У меня нет.

> она не перестанет быть функцией. Так что независимо от области видимости,
> функций у тебя две.

Ну пусть две. Первую то и функцией язык не поворачивается назвать.
Clean иногда подобное безобразие инлайнит.
А рекурсии вообще в циклы автоматом разворачиваются.

>  >> (проверка выполняется после рекурсивного вызова), серьезные накладные
>  PP> Меньше чем в STL :) На порядок, ибо это не класс, а просто массив :)
>
> Судя по всему, динамический массив. Т.е. та же самая работа с кучей и
прочие
> тормоза (включая, вероятно, и автаматическую сборку мусора?). Только в STL
> это все открыто, а у тебя остается "за кадром".

Во-во там все открыто, громоздко и тормозно, ибо надстройка на языком :)
А зачем мне открытая сборка мусора? Еще об этом голова не болела :)

http://dada.perl.it/shootout/strcat.html
Это про тормоза :)
ghc - Haskell, см также на gcc & VC.
gcc - делает вид что мусор убирает.
VC - STL использует.
Во сколь раз они там медленее ? :))))

>  PP> Это ты не сможешь доказать :) Сначала напиши итерационный вариант
>  PP> преобразования, а не печати строки :)
>
> Итерационный вариант без STL:
>
> char* toBin(int val){
>   static char  Buf[CHAR_BIT*sizeof(int)+1];
>          char *Tmp = Buf+(sizeof(Buf)-1);
>
>   do{
>     *--Tmp = '0'+(val&1);
>     val=(val>>1)&INT_MAX;
>   }while(val);
>   return Tmp;
> }

Ну все - хватит меня ся-ми пугать с трехэтажнами объявлениями
типов и контролью за памятью. Ты вообще можешь гарантировать
что любой из твоих примеров со static char - thread safe?
Боюсь нет :)
1) где у тебя терминирущий '\0' в строке? Выдастся мусор после результата
2) выдаются лишнии нули в начале, те '001100' вместо '1100'

Так что без STL тебе уже не так просто избаситься от ведущих '0'
так что примеры далеко не идеентичны :) А с ним см выше :)

>  PP> С пока не смог отстоят позицию краткого и понятного языка :)
>  PP> пригодного для _прозрачного описания алгоритмов_ :)
>
> А зачем ему это надо? Си - это очень удобный рабочий инструмент.

Гм .. не заметил :) Миф это

> Если понадобится предельная краткость записи, то я возьму APL, или
Forth...
> Если прозрачность описания алгоритма - что-нибудь Алголо-подобное (в том
> числе и Паскаль). Но если мне надо написать реальную программу, то в
> большинстве случаев это будет C/C++.

То есть вещи, которые в себе это все сочетают одновременно, тебя не
устраивают? :)

B.R.
Pavel



--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)