- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
program Project42;
{$APPTYPE CONSOLE}
uses
SysUtils, Math;
const
Radix = 10;
function čòũʼnť(N: Integer): Integer;
begin
Result := 0;
while N > 0 do
begin
N := N div Radix;
Inc(Result);
end;
end;
function count(N: Integer): Integer;
begin
// Result := Ceil(LogN(Radix, N)); { slow! }
Result := Ceil(Log10(N));
end;
function rdtsc: Int64;
asm
rdtsc
end;
var
I: Integer;
t0: Int64;
const
N = 100500;
begin
try
Assert((count(42) = čòũʼnť(42)) and (count(100500) = čòũʼnť(100500)));
t0 := rdtsc;
for I := 1 to N do
čòũʼnť(Random(MaxInt + 1));
Writeln('naïve: ', rdtsc - t0, ' ticks');
t0 := rdtsc;
for I := 1 to N do
count(Random(MaxInt + 1));
Writeln('prőper: ', rdtsc - t0, ' ticks');
Writeln(StringOfChar('-', 42));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
if DebugHook <> 0 then
begin
Write('any big key to exit...');
Readln;
end;
end.
{ http://imgs.xkcd.com/comics/haiku_proof.png :-P }
Govnocoder#0xFF 01.12.2010 20:51 # 0
WTF?
gegMOPO4 01.12.2010 21:16 # 0
К тому же, во-первых, не O(N), а O(log(N)) (можно сделать и O(log(log(N)))), во-вторых, иногда таки O(1) > O(log(N)).
bugmenot 02.12.2010 11:59 # −1
по копрометрической шкале Шайзе-Каковского в код попугайчик насрал, как минимум
здесь N -- кол-во [десятичных] разрядов, не абсолютная величина, чтобы не морочить себе голову с основанием логарифма
absolut 02.12.2010 12:59 # −3
Анонимус 02.12.2010 13:07 # +1
Потому что константное время лучше, чем время, зависящее от данных.
gegMOPO4 02.12.2010 13:20 # +1
absolut 02.12.2010 22:01 # 0
gegMOPO4 02.12.2010 13:12 # 0
Для 64 бит логарифм может просто не работать.
bugmenot 02.12.2010 15:06 # 0
bugmenot 02.12.2010 15:15 # 0
ORLY? После минимума правки оба варианта будут работать с 19 десятичными разрядами. Что значит "может"?
gegMOPO4 02.12.2010 17:07 # 0
bugmenot 02.12.2010 17:37 # +1
(как известно, дельфи прибит гвоздями к интелу)
gegMOPO4 02.12.2010 18:48 # 0
У log10 в сигнатуре real, double или extended (или как оно там обзываются)? Потеря точности тут.
Только что заметил грубую ошибку -- count(9)=1.
gegMOPO4 02.12.2010 18:49 # 0
bugmenot 02.12.2010 19:44 # 0
Extended, естественно, так что в мантиссу влезет
~1100 тактов занимает 19 раз 2^63-1 поделить на 10
gegMOPO4 02.12.2010 20:26 # +1
TarasB 03.12.2010 12:16 # 0
else if пишется на одной строке.
gegMOPO4 03.12.2010 15:43 # +1
Не ёлочка, а баобаб. ;) Почти сбалансированное дерево.
TarasB 03.12.2010 17:04 # 0
if( n < 1000)return 3
else if(n < 10000)return 4
else return 5;
gegMOPO4 04.12.2010 12:59 # 0
TarasB 06.12.2010 10:49 # −3
Oleg_quadro 04.12.2010 21:03 # 0
else if - это как в других языка готовая конструкция elsif!
TarasB 05.12.2010 13:24 # 0
absolut 01.12.2010 23:18 # 0
Lure Of Chaos 01.12.2010 23:26 # −1
absolut 01.12.2010 23:46 # 0
bugmenot 02.12.2010 12:00 # 0
Oleg_quadro 04.12.2010 21:04 # 0
Oleg_quadro 01.12.2010 23:37 # 0
Oleg_quadro 01.12.2010 23:45 # 0
почему Random(MaxInt + 1)? давайте, чтоб было одинаково.
bugmenot 02.12.2010 12:10 # 0
вот именно, ч.т.д. :-)
не понял, где неодинаково? +1 чтобы покрыть весь диапазон неотрицательных целых [0,MaxInt], а не [0,MaxInt)
gegMOPO4 02.12.2010 12:56 # 0
bugmenot 02.12.2010 13:01 # 0
gegMOPO4 02.12.2010 13:17 # 0
bugmenot 02.12.2010 13:53 # 0
Oleg_quadro 02.12.2010 14:32 # 0
в первом случае могут одни попасться, во втором — другие.
P.S Посмотрел щас, здесь 100500 вариантов, так что может и не надо.
Oleg_quadro 02.12.2010 14:35 # 0
bugmenot 02.12.2010 14:54 # 0
Govnoeb 02.12.2010 15:22 # +1
TarasB 02.12.2010 15:27 # 0
Да, мне этого в Дельфях не хватает иногда...
Govnoeb 02.12.2010 20:00 # +1
TarasB 03.12.2010 12:17 # 0
Анонимус 03.12.2010 13:51 # 0
можно пруф?
TarasB 03.12.2010 14:04 # −2
Только там не в 15, а в 16 раз.
Вообще, хороший пример - ТеХ, автор которого, в отличие от Билли сам ПЛАТИЛ пользователям за обнаруженные ошибки.
Да да да, я знаю, это всё упоротые пасквилянты по ссылке развлекаются.
Анонимус 03.12.2010 14:11 # 0
студентом, который пишет для журнала "хакер"?
я совершенно не паскалефоб (из всех языков я только VB и php нелюблю, может javascript еще), просто при таком количестве кода и написанных на нем операционках -- си смешно хоронить)
да и прикладная разработка (которая безусловно уходит от си) идет явно не к дельфи))
TarasB 03.12.2010 14:15 # −1
Но вообще лучше бы си не рождался - его распространение связано скорее с интеллектуальным онанизмом (зацените, на каком крутом языке я прогу написал), чем с практической полезностью.
Анонимус 03.12.2010 14:21 # 0
паскаль более жесток в типизации, а следовательно налажать в нем в сложнее.
распостранение си связано с тем, что на нем написаны самые популярные оси))
TarasB 03.12.2010 22:24 # −1
По надёжности уберСи сливает недоПаскалю, и ничего с этим не сделать.
Говноёбы вот вообще паскаль не осилили (у них до сих пор его упоминание вызывает боль), они любят си ебать. Логично.
Анонимус 03.12.2010 22:31 # 0
стройность и логичность паскаля дает ему плюсы при обучении (не даром он считается лучшим языком для обучения), но на практике эта стройность может быть и не нужна (Вам же не нужен GC). Человек, который 15 лет писал на сях скорее всего будет на них нормально писать, даже несмотря на все изъяны).
TarasB 04.12.2010 11:02 # 0
bugmenot 03.12.2010 15:36 # 0
> и опасная тенденция: распространение C-образных языков.
Ахаха, автора, автора на сцену!
Анонимус 03.12.2010 16:39 # 0
у него сегодня 5 уроков.
зы: хакер -- это правильный журнал для чтения конечно
eth0 03.12.2010 21:10 # 0
Верить серьёзному аналитическому журналу? Да, конечно, там ведь не обманывают своих малолетних читателей.
TarasB 03.12.2010 22:22 # 0
eth0 04.12.2010 12:32 # 0
Анонимус 03.12.2010 22:29 # 0
bugmenot 06.12.2010 16:28 # 0
Анонимус 02.12.2010 11:26 # 0
а паскаль -- что бы паскалефобов позлить?
Пока N махонькое -- O(N) может быть даже быстрее O(1). Потом N вырастет и сюрприз-сюрприз. Ваш КО.
bugmenot 02.12.2010 12:14 # 0
логарифм медленнее чем X делений, найти X, заморока же
inkanus-gray 02.12.2010 14:18 # +1
Анонимус 02.12.2010 14:23 # 0
я имел ввиду не ванильный паскаль, а тот, что делал борланд и называл его турбо паскалем (или борланд, в более полной версии).
>> В Паскале нет модулей — они взяты из языка Модула
погодите, в классическом паскале нет модулей? Тоесть вся программа -- один модуль?
зы: я имел ввиду -- зачем багминот свой пример именно на паскале написал
inkanus-gray 02.12.2010 14:38 # +1
Нету там ничего, кроме Program. Получается, что одна программа — один модуль.
В Турбо Паскале до четвёртой версии не было модулей (но, кажется, можно было прилинковывать обжи), зато можно было получать ортодоксальный com-файл. А для TP 4.0, в котором появились-таки модули, энтузиасты уже написали TPU2OBJ.
Анонимус 02.12.2010 14:56 # 0
а как же мне код реюзать?
иклудить его в момент компиляции и компилировать каждый раз?
и никакого аналога runtime lib нет?
а всякие writeln откуда берутся?
inkanus-gray 02.12.2010 17:08 # 0
типа того
Анонимус 02.12.2010 17:10 # 0
gegMOPO4 02.12.2010 17:28 # 0
writeln и проч. встроены в язык. Это у Си такое новшество было -- что все стандартные функции вынесены в библиотеки.
Анонимус 02.12.2010 17:32 # 0
мне казалось что линковка -- святое дело в любом языке
оказывается -- нет)))
спасибо.
gegMOPO4 02.12.2010 18:52 # 0
Анонимус 02.12.2010 18:54 # 0
gegMOPO4 02.12.2010 19:09 # 0
bugmenot 02.12.2010 17:47 # 0
inkanus-gray 02.12.2010 14:41 # 0
bugmenot 02.12.2010 14:59 # +1
Анонимус 02.12.2010 15:21 # 0
про стуктуры и алгоритмы
Govnoeb 02.12.2010 20:06 # −1
собственно Вирт и создал паскаль, и как бээ логично, что в своих книгах, он его юзает пропагандирует
TarasB 03.12.2010 12:20 # +1
== - обыкновенная халтура языка Си, которой нет среди математических обозначений и которая призвана что-то придумать для оператора сравнения, когда = уже занято.
Анонимус 03.12.2010 13:52 # 0
и словить варнинг
нет?
TarasB 03.12.2010 14:06 # 0
А если мне действительно надо написать if (i=j)?
Отрубать предупреждения?
Вот если я напишу if (i:=j) то тут всё понятно.
absolut 03.12.2010 15:09 # +1
Нефиг такое писать в if'е. А если и требуется присваивание, то и сравнение какое-то присутствует. Например:
TarasB 03.12.2010 15:28 # 0
То есть (i:=j) уже имеет булев типа.
> Нефиг такое писать в if'е.
Давно бы запретили.
absolut 03.12.2010 15:54 # −3
Тогда добавить явную булеву константу:
Вот тут уже ==true как бы и не ГК, как в большинстве случаев.
TarasB 03.12.2010 17:05 # 0
absolut 03.12.2010 22:52 # +1
Анонимус 03.12.2010 19:49 # 0
здраствуй похупэ со его $a === true
absolut 03.12.2010 22:57 # 0
Не нравится ==true ? напиши >false :)
gegMOPO4 04.12.2010 13:03 # 0
absolut 04.12.2010 13:52 # 0
bugmenot 04.12.2010 15:45 # 0
xXx_totalwar 03.12.2010 16:37 # 0
Oleg_quadro 04.12.2010 18:59 # +1
Читайте как делаются компиляторы.
Oleg_quadro 04.12.2010 19:02 # 0
= и ==
==============
Первый схалтурил, вторые — нет.
Офигенная разница.
inkanus-gray 05.12.2010 03:34 # 0
:= означает «присвоить», как и в Паскале.
= означает «решить уравнение», как в функциональных языках. Да, в метафонте есть специальное значение переменной «не определено», относительно такой переменной уравнение и решается.
bugmenot 02.12.2010 14:32 # 0
TarasB 02.12.2010 15:15 # 0
У меня логарифм оказался быстрее деления, в полтора раза.
bugmenot 02.12.2010 15:28 # 0
ага, примерно так и есть (сильно зависит от твиков при сборке, но добро матан всегда побеждает)
ctm 02.12.2010 15:51 # 0
для семизнаков быстрее деление, для восьмизнаков - логарифм.
кстати, для отрицательных чисел и 0 не работает, но, видимо, оно и не требуется.
TarasB 02.12.2010 15:55 # +1
А ещё рандом тоже время неплохо кушает.
bugmenot 02.12.2010 17:51 # 0
gegMOPO4 02.12.2010 18:55 # 0
Всё ждал, заметит ли кто.
bugmenot 02.12.2010 17:50 # 0
gegMOPO4 02.12.2010 18:58 # 0
Логарифм в 2-5 раз медленнее при полной оптимизации. Если вычесть время на рандом -- вообще на порядок.
Govnoeb 02.12.2010 20:07 # 0
хехе
gegMOPO4 02.12.2010 20:18 # +3