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)