+117
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
Var
a,b : Integer;
c : Extended;
BEGIN
readln(a,b);
TRY
c := sqrt(a-b);
WriteLn('A > B');
EXCEPT
WriteLn('A < B');
END;
ReadLn;
END.
Дело было вечером, делать было нечего, решил just for education порешать пару задач по программированию. Залез значит в Зултрк, ищу. На глаза сразу попалась небольшая книжица с названием "128 Задач по началам программирования." В.В Пупырышева. Скачал, начал решать. И вот какая задачка мне попалась:
"II-15*. Максимум из двух
Напишите программу, которая запрашивает джва числа и сообщает, какое из них больше другого."
Вроде бы ничего сложного, но ВНЕЗАПНО у задачи обнаружилось примечание: "Эта задача должна быть решена без использования ветвления." Первая мысль, пришедшая в голову, была использовать функции, но ведь и они подразумевали ветвление. Так что начался мозговой штурм. После получаса раздумий, высралось ЭТО. В конце, посмотрев в ответы, я просто охренел. Спойлер: "Эта задача представляет собой подготовку к следующей ступени (задачи с ветвлением). Но решить её можно и без использования ветвлений, если придумать две формулы для вычилсения максимума и минимума из двух чисел. Тогда если обозначить исходные числа как Х и Y, а упомянутые формулы - как MAX(x,y) и MIN(x,y) соответственно, то для получения правильного ответа достаточно будет вывести строку типа: "Число-", MAX(x,y), "-не меньше числа -", MIN(x,y)." После этого я книгу с компа удалил, не помещая в корзину.
Запостил:
Govnocoder#0xFF,
07 Мая 2011
...
try x[c].t
catch ...
ну ты понел
max = |avg-x|+avg
Реализация минимума и максимума с помощью abs вполне так себе разминка для закостенелого мозга.
Также можете подумать как поменять местами значения двух целочисленных переменных, без использования временной переменной.
ASM
xchg eax, ebx
END;
Ну естественно, в EAX и EBX должны быть эти два числа.
> с помощью abs
Где вы в ответе увидели ABS?
y=x-y
x=x-y
Вы зря удалили книжку.
y = ((2^32-1) + (2^32 - 2)) - (2^32 -2) -> (2^32 - 1)
x = ((2^32-1) + (2^32 - 2)) - (2^32 -1) -> (2^32 - 2)
В итоге эти два числа поменялись местами. Это всё?
b = a - b
a = a - b
(есть языки, где maxvalue+1==maxvalue)
Вот вам действительно гениальное решение без условий. В одну строку.
const
symbols:Array[0..1] of char=('a','b');
var
a,b:integer;
begin
writeln(symbols[byte(a>b)]);
end;
Ещё можно через указатели и через двоичные операции.
конструкция try..except
является ветвлением
Wait... OH SHI~
вантузятник, да ещё проводником виндовс пользуется... фу таким быть. хоть бы Total Commander использовал...
tneg = a - b;
// старший бит копируем во все остальные
tneg = (tneg and $80000000) or (tneg shr 1);
tneg = (tneg and $C0000000) or (tneg shr 2);
tneg = (tneg and $F0000000) or (tneg shr 4);
tneg = (tneg and $FF000000) or (tneg shr 8);
tneg = (tneg and $FFFF0000) or (tneg shr 16);
tpos = a - b;
// все биты OR-ом в младший
tpos = tpos or (tpos shr 16);
tpos = tpos or (tpos shr 8);
tpos = tpos or (tpos shr 4);
tpos = tpos or (tpos shr 2);
tpos = (tpos or (tpos shr 1)) and 1;
t = tpos or tneg; // t = 1, если a>b; 0, если a=b; -1, если a<b
понятно, что платформо-зависимо - но тут и задача та еще.
> // все биты OR-ом в младший
На асме и то, и то делается одной командой. Но если совсем без презренного асма, то да, только так.
И не =, блять, а :=!!!
И в строчках 2-6 не нужен and $xxxxxxxx.
> И в строчках 2-6 не нужен and $xxxxxxxx.
да, конечно не нужно - с утра спал по ходу...
Это принципиально важно: использовать нормальное математическое обозначение := вместо блядского сокращённого =.
"Пусть a равно бе + це". напишут "a = b + c"
Другое дело что если они напишут a = a + b, то у них будет b = 0 :)
Предлагаю не холиварить - стандарты введены давно - ничего с этим не поделаешь.
a=b+c - это уравнение.
А определения пишутся через :=
"определим a как b+c" пишется именно так: a:=b+c
чтобы не холиварить, можно ссылку на конкретный пример серьезной математической статьи?
мой пример вот: http://ru.wikipedia.org/wiki/Числа_Фибоначчи
куча присваиваний и все с "=".
>ru.wikipedia.org
>математической
>ru.wikipedia.org
>статьи
>ru.wikipedia.org
0/0/0/.../0
То есть "пусть a такое, что a=b+c" - это уравнение (вырожденное, правда), которое надо решать, с тем же успехом можно сказать "пусть a такое, что a-b=c". А если сразу сказать "определим a:=b+c", то это сразу готовое определение.
возьмите к примеру справочник по элементарной математике. там написано:
ch(x) = ... но не как ни ":=". В доказательствах теорем также используется только "=" как для уравнения, так и для новых определений.
Хоар сказал: «В Алгол нужно добавить ссылки с нуллами»
А Вирт сказал: «Мы с Хоаром считаем, что в Алгол нужно добавит ссылки, да с такими-то нуллами»
Потом Хоар сказал: «Алгол 68 сосет»
И Вирт, конечно, сказал: «Мы с Хоаром ваш Алгол 68 в рот ебали, пидоры комитетские!!111»
А потом Хоар внезапно сказал: «Анаморфизм, катаморфизм, иломорфизм, параморфизм, наконец»
И Вирт сказал:«Ана-што? Иломорфизм? Хуе-мое! Так, падажжи, ебана, Карри же был моим научруком, параморфизм? Ах тыж ебаный ты нахуй!
АЛГОЛ 68 СОСЕТ!!!111 ССЫЛКИ ДА С ТАКИМИ-ТО НУЛЛАМИ!!!111 АЛГОЛ 68 СОСЕТ!! СОСЕТ АЛГОЛ 68 !!11111»
Ну, так с тех пор и повторяет.
Тогда можно писать так:
Заодно избавляемся от бейсиковской проблемы, когда опечатка в идентификаторе заводила новый, а не меняла старый.
= - присвоение
== - сравнение на рвенство
<- - присвоение
= - сравнение на рвенство
Так заодно опечататься сложнее.
А двойное равно в качестве сравнения - это высер ритчи, который надо закопать нахер.
> = - сравнение на рвенство
бойлерплейт детектед
если разделять символы операторов - то менять лучше тот, который реже используется:)
==, != тоже не очевидно и поэтому не гуд.
Блин, что делать...
пздц какая разница
Что имеется ввиду: получать свойство something, которое содержит другое x или сравнивать, равен ли x x.something?
и каждый по-своему прав.
фрикционно-копулятивненько!
вот вам и ответ на вопрос
WriteLn(((a+b)/2)+Abs((a-b)/2));
0040E1B9 8BC3 mov eax,ebx
0040E1BB 2BC6 sub eax,esi
0040E1BD 8945EC mov [ebp-$14],eax
0040E1C0 DB45EC fild dword ptr [ebp-$14]
0040E1C3 D83518E24000 fdiv dword ptr [$0040e218]
0040E1C9 D9E1 fabs
0040E1CB 03F3 add esi,ebx
0040E1CD 8975E8 mov [ebp-$18],esi
0040E1D0 DB45E8 fild dword ptr [ebp-$18]
0040E1D3 D83518E24000 fdiv dword ptr [$0040e218]
0040E1D9 DEC1 faddp st(1)
0040E1DB 83C4F4 add esp,-$0c
0040E1DE DB3C24 fstp tbyte ptr [esp]
0040E1E1 9B wait
0040E1E2 A1D42B4100 mov eax,[$00412bd4]
0040E1E7 E8D055FFFF call @Write0Ext
0040E1EC E8DB55FFFF call @WriteLn
для 8087, к коему гвоздями приколочены дельфи
а вообще интринсик можно рассматривать как непрозрачную атомарную операцию
Можно апредставить ввиде
Нашёл себе сайтик для решения "алгоритмических" задачек?
У Вас компилятора, что-б проверить нет?
Остальные варианты прямо или косвенно используют или могут использовать на некоторых платформах.
A,b,c,d,e:integer;
Begin
Read(a,b);
C:=a; d:=b;
While c>b do
Begin
Writeln('a>b');
C:=c+1;
End;
While a<d do
Begin
Writeln('b>a');
B:=b+1;
End;
End.