Re: Как закодировать?
- From
- Andrew Ezhguroff ()
- To
- Pavel P
- Date
- 2002-10-09T14:05:23Z
- Area
- RU.ALGORITHMS
From: "Andrew Ezhguroff" <eandr@com2com.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))
И тут же сам начинаешь меряться... :-) К тому же это твои слова из прошлого
письма:
=========Beginning of the citation==============
Хотя многие до сих пор думают
что на нем самая краткая запись :) Люди не пишите на С :) Пишите вот так :)
=========The end of the citation================
А где ты до этого у меня слова о длине программы видел? Но если так желаешь,
то, насколько я помню, на Forth эта программа будет в несколько раз короче
твоего варианта. :-)
PP> И как говорится STL-ные извращения меня не интересуют. :)
STL-это часть стандарта C++ (в отличии от shr в Паскале).
PP> Это раз Количество символов ты уже сравнил? И это при том что оба моих
PP> варианта аккуратно разделены пробелами для лучшей читаемости.
А зачем мне это? Я закодировал твой алгоритм один в один на стандартном C++
и все...
>> И на порядок медленнее (язык больше похож на интерпретируемый)? :-)
PP> Не получишь ты супер приз :) Не медленее. Он компилируемый :)
Basic тоже компиляторы имеет (помнится был такой на СМ-1800, :-) да и QB до
сих пор используют).
Заглянул сейчас на http://haskell.org - он имеет как компиляторы, так и
интерпретаторы. И ИМХО, я не думаю, что это чисто компилируемый язык (скорее
всего без элементов интерпретации обойтись невозможно).
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;
}
>> Но вот преимуществ я не вижу: дополнительная функция, лишняя рекурсия
PP> Дополнительная функция только у тебя c STL. У меня f не экпортится
PP> в глобальную область видимости и ты не можешь ее вызвать ни откуда
PP> кроме как из toBin, а у тебя действительно лишняя глобальная
PP> функция и побороть ты это в C++ не можешь.
Если я поставлю "static", то функция перестанет быть глобальной. Но от этого
она не перестанет быть функцией. Так что независимо от области видимости,
функций у тебя две.
>> (проверка выполняется после рекурсивного вызова), серьезные накладные
PP> Меньше чем в STL :) На порядок, ибо это не класс, а просто массив :)
Судя по всему, динамический массив. Т.е. та же самая работа с кучей и прочие
тормоза (включая, вероятно, и автаматическую сборку мусора?). Только в 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;
}
PP> С пока не смог отстоят позицию краткого и понятного языка :)
PP> пригодного для _прозрачного описания алгоритмов_ :)
А зачем ему это надо? Си - это очень удобный рабочий инструмент.
Если понадобится предельная краткость записи, то я возьму APL, или Forth...
Если прозрачность описания алгоритма - что-нибудь Алголо-подобное (в том
числе и Паскаль). Но если мне надо написать реальную программу, то в
большинстве случаев это будет C/C++.
С уважением, Андрей.
--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
* Origin: Talk.Mail.Ru (2:5020/400)