|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Pavel P 2:5020/400 09 Oct 2002 15:29:35 To : Andrew Ezhguroff Subject : Re: Как закодировать? -------------------------------------------------------------------------------- "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)) > > И тут же сам начинаешь меряться... :-) К тому же это твои слова из прошлого :) [....] > А где ты до этого у меня слова о длине программы видел? Hо если так желаешь, Зачем писать больше если можно меньше и понятнее? (1) > то, насколько я помню, на Forth эта программа будет в несколько раз короче > твоего варианта. :-) Уверен? Чего то я там строк не припомню. Да и читабельность у него :( > PP> И как говорится STL-ные извращения меня не интересуют. :) > > STL-это часть стандарта C++ (в отличии от shr в Паскале). > > PP> Это раз Количество символов ты уже сравнил? И это при том что оба моих > PP> варианта аккуратно разделены пробелами для лучшей читаемости. > > А зачем мне это? Я закодировал твой алгоритм один в один на стандартном C++ > и все... см (1) и скорость которую ты получишь ниже :) > >> И на порядок медленнее (язык больше похож на интерпретируемый)? :-) > PP> Hе получишь ты супер приз :) Hе медленее. Он компилируемый :) > > 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) :)) Про скорость ниже > >> Hо вот преимуществ я не вижу: дополнительная функция, лишняя рекурсия > PP> Дополнительная функция только у тебя c STL. У меня f не экпортится > PP> в глобальную область видимости и ты не можешь ее вызвать ни откуда > PP> кроме как из toBin, а у тебя действительно лишняя глобальная > PP> функция и побороть ты это в C++ не можешь. > > Если я поставлю "static", то функция перестанет быть глобальной. Hо от этого В пределах модуля/неймспейса она у тебя вызывается? Значит в этих пределах они глобальна. У меня нет. > она не перестанет быть функцией. Так что независимо от области видимости, > функций у тебя две. Hу пусть две. Первую то и функцией язык не поворачивается назвать. Clean иногда подобное безобразие инлайнит. А рекурсии вообще в циклы автоматом разворачиваются. > >> (проверка выполняется после рекурсивного вызова), серьезные накладные > PP> Меньше чем в STL :) Hа порядок, ибо это не класс, а просто массив :) > > Судя по всему, динамический массив. Т.е. та же самая работа с кучей и прочие > тормоза (включая, вероятно, и автаматическую сборку мусора?). Только в 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; > } Hу все - хватит меня ся-ми пугать с трехэтажнами объявлениями типов и контролью за памятью. Ты вообще можешь гарантировать что любой из твоих примеров со static char - thread safe? Боюсь нет :) 1) где у тебя терминирущий '\0' в строке? Выдастся мусор после результата 2) выдаются лишнии нули в начале, те '001100' вместо '1100' Так что без STL тебе уже не так просто избаситься от ведущих '0' так что примеры далеко не идеентичны :) А с ним см выше :) > PP> С пока не смог отстоят позицию краткого и понятного языка :) > PP> пригодного для _прозрачного описания алгоритмов_ :) > > А зачем ему это надо? Си - это очень удобный рабочий инструмент. Гм .. не заметил :) Миф это > Если понадобится предельная краткость записи, то я возьму APL, или Forth... > Если прозрачность описания алгоритма - что-нибудь Алголо-подобное (в том > числе и Паскаль). Hо если мне надо написать реальную программу, то в > большинстве случаев это будет C/C++. То есть вещи, которые в себе это все сочетают одновременно, тебя не устраивают? :) B.R. Pavel --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/65772cfa2257.html, оценка из 5, голосов 10
|