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)