+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
Govnocoder#0xFF 07.05.2011 18:20 # +14
guest 07.05.2011 18:24 # 0
...
try x[c].t
catch ...
ну ты понел
Govnocoder#0xFF 07.05.2011 18:26 # +1
guest 07.05.2011 18:44 # +2
max = |avg-x|+avg
guest 07.05.2011 18:53 # 0
Govnocoder#0xFF 07.05.2011 20:47 # 0
guest 07.05.2011 21:30 # +2
guest 07.05.2011 21:44 # 0
ctm 10.05.2011 07:00 # +7
TarasB 10.05.2011 09:49 # +3
eth0 11.05.2011 20:53 # +2
guest 07.05.2011 19:01 # +6
burdakovd 07.05.2011 19:56 # 0
Реализация минимума и максимума с помощью abs вполне так себе разминка для закостенелого мозга.
Также можете подумать как поменять местами значения двух целочисленных переменных, без использования временной переменной.
Govnocoder#0xFF 07.05.2011 20:46 # 0
ASM
xchg eax, ebx
END;
Ну естественно, в EAX и EBX должны быть эти два числа.
> с помощью abs
Где вы в ответе увидели ABS?
guest 07.05.2011 21:31 # 0
Govnocoder#0xFF 07.05.2011 21:35 # 0
guest 07.05.2011 21:41 # +8
y=x-y
x=x-y
Вы зря удалили книжку.
Vindicar 08.05.2011 11:28 # −3
Govnocoder#0xFF 08.05.2011 20:15 # 0
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)
В итоге эти два числа поменялись местами. Это всё?
Vindicar 08.05.2011 22:21 # 0
Govnocoder#0xFF 09.05.2011 08:02 # 0
Vindicar 09.05.2011 11:55 # 0
guest 09.05.2011 12:23 # +3
bugmenot 09.05.2011 13:17 # 0
guest 09.05.2011 13:53 # 0
guest 09.05.2011 13:54 # 0
Vindicar 09.05.2011 17:02 # 0
guest 09.05.2011 17:05 # +2
guest 10.05.2011 00:54 # +3
TarasB 10.05.2011 09:50 # 0
popoffka 07.05.2011 21:37 # +5
b = a - b
a = a - b
burdakovd 07.05.2011 21:40 # 0
(есть языки, где maxvalue+1==maxvalue)
Govnocoder#0xFF 07.05.2011 21:40 # 0
guest 25.05.2011 18:13 # +1
Вот вам действительно гениальное решение без условий. В одну строку.
const
symbols:Array[0..1] of char=('a','b');
var
a,b:integer;
begin
writeln(symbols[byte(a>b)]);
end;
Ещё можно через указатели и через двоичные операции.
ctm 27.05.2011 06:46 # 0
bugmenot 07.05.2011 20:03 # +19
конструкция try..except
является ветвлением
Govnocoder#0xFF 07.05.2011 20:46 # +2
Wait... OH SHI~
guest 07.05.2011 21:28 # −18
вантузятник, да ещё проводником виндовс пользуется... фу таким быть. хоть бы Total Commander использовал...
Govnocoder#0xFF 07.05.2011 21:30 # 0
telnet 08.05.2011 05:51 # 0
Irdis 08.05.2011 13:16 # +2
guest 08.05.2011 13:41 # −3
guest 08.05.2011 13:42 # −2
telnet 08.05.2011 14:43 # +12
guest 08.05.2011 15:47 # −13
telnet 08.05.2011 16:39 # +14
guest 08.05.2011 20:21 # −14
telnet 08.05.2011 22:25 # +14
guest 08.05.2011 23:07 # −15
guest 09.08.2011 16:35 # +3
guest 12.05.2011 12:51 # −15
TheHamstertamer 18.05.2011 18:31 # −13
koodeer 08.05.2011 16:44 # +14
SmackMyBitchUp 08.05.2011 17:50 # 0
guest 08.05.2011 19:33 # −12
guest 10.05.2011 12:13 # −8
guest 10.05.2011 12:10 # −2
Lure Of Chaos 08.05.2011 14:50 # +1
istem 08.05.2011 20:27 # +1
Stertor 23.06.2013 11:51 # 0
ctm 10.05.2011 06:59 # +1
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
понятно, что платформо-зависимо - но тут и задача та еще.
TarasB 10.05.2011 09:55 # −3
> // все биты OR-ом в младший
На асме и то, и то делается одной командой. Но если совсем без презренного асма, то да, только так.
И не =, блять, а :=!!!
И в строчках 2-6 не нужен and $xxxxxxxx.
ctm 10.05.2011 13:37 # 0
> И в строчках 2-6 не нужен and $xxxxxxxx.
да, конечно не нужно - с утра спал по ходу...
TarasB 10.05.2011 15:47 # 0
Это принципиально важно: использовать нормальное математическое обозначение := вместо блядского сокращённого =.
guest 10.05.2011 15:48 # 0
TarasB 10.05.2011 15:58 # 0
guest 10.05.2011 18:18 # 0
ctm 11.05.2011 06:33 # 0
"Пусть a равно бе + це". напишут "a = b + c"
Другое дело что если они напишут a = a + b, то у них будет b = 0 :)
Предлагаю не холиварить - стандарты введены давно - ничего с этим не поделаешь.
TarasB 11.05.2011 08:45 # +2
a=b+c - это уравнение.
А определения пишутся через :=
"определим a как b+c" пишется именно так: a:=b+c
guest 11.05.2011 12:52 # 0
ctm 12.05.2011 06:36 # 0
чтобы не холиварить, можно ссылку на конкретный пример серьезной математической статьи?
мой пример вот: http://ru.wikipedia.org/wiki/Числа_Фибоначчи
куча присваиваний и все с "=".
guest 12.05.2011 06:46 # −2
>ru.wikipedia.org
>математической
>ru.wikipedia.org
>статьи
>ru.wikipedia.org
0/0/0/.../0
TarasB 12.05.2011 09:44 # 0
То есть "пусть a такое, что a=b+c" - это уравнение (вырожденное, правда), которое надо решать, с тем же успехом можно сказать "пусть a такое, что a-b=c". А если сразу сказать "определим a:=b+c", то это сразу готовое определение.
ctm 12.05.2011 09:53 # 0
TarasB 12.05.2011 11:04 # 0
ctm 12.05.2011 14:59 # 0
возьмите к примеру справочник по элементарной математике. там написано:
ch(x) = ... но не как ни ":=". В доказательствах теорем также используется только "=" как для уравнения, так и для новых определений.
TarasB 12.05.2011 16:43 # +2
eth0 12.05.2011 11:00 # +2
ctm 12.05.2011 15:01 # 0
guest 12.05.2011 15:03 # +3
Хоар сказал: «В Алгол нужно добавить ссылки с нуллами»
А Вирт сказал: «Мы с Хоаром считаем, что в Алгол нужно добавит ссылки, да с такими-то нуллами»
Потом Хоар сказал: «Алгол 68 сосет»
И Вирт, конечно, сказал: «Мы с Хоаром ваш Алгол 68 в рот ебали, пидоры комитетские!!111»
А потом Хоар внезапно сказал: «Анаморфизм, катаморфизм, иломорфизм, параморфизм, наконец»
И Вирт сказал:«Ана-што? Иломорфизм? Хуе-мое! Так, падажжи, ебана, Карри же был моим научруком, параморфизм? Ах тыж ебаный ты нахуй!
АЛГОЛ 68 СОСЕТ!!!111 ССЫЛКИ ДА С ТАКИМИ-ТО НУЛЛАМИ!!!111 АЛГОЛ 68 СОСЕТ!! СОСЕТ АЛГОЛ 68 !!11111»
Ну, так с тех пор и повторяет.
TarasB 12.05.2011 21:30 # 0
Тогда можно писать так:
Заодно избавляемся от бейсиковской проблемы, когда опечатка в идентификаторе заводила новый, а не меняла старый.
guest 12.05.2011 21:49 # 0
= - присвоение
== - сравнение на рвенство
TarasB 12.05.2011 21:53 # +4
<- - присвоение
= - сравнение на рвенство
Так заодно опечататься сложнее.
А двойное равно в качестве сравнения - это высер ритчи, который надо закопать нахер.
guest 12.05.2011 23:10 # −1
bugmenot 13.05.2011 00:53 # +1
> = - сравнение на рвенство
бойлерплейт детектед
ctm 13.05.2011 06:49 # +1
если разделять символы операторов - то менять лучше тот, который реже используется:)
==, != тоже не очевидно и поэтому не гуд.
ctm 13.05.2011 06:38 # +3
TarasB 13.05.2011 09:16 # 0
Блин, что делать...
guest 13.05.2011 11:32 # −1
guest 14.05.2011 10:33 # −1
guest 14.05.2011 13:51 # 0
guest 14.05.2011 14:14 # 0
guest 18.05.2011 20:16 # 0
пздц какая разница
guest 18.05.2011 21:26 # 0
eth0 13.05.2011 18:45 # +1
guest 13.05.2011 18:49 # 0
Что имеется ввиду: получать свойство something, которое содержит другое x или сравнивать, равен ли x x.something?
eth0 13.05.2011 20:51 # 0
Govnocoder#0xFF 10.05.2011 14:05 # 0
guest 10.05.2011 13:53 # −2
TarasB 10.05.2011 15:49 # +2
guest 10.05.2011 16:00 # −1
Lure Of Chaos 10.05.2011 16:19 # −2
и каждый по-своему прав.
bugmenot 10.05.2011 18:16 # 0
фрикционно-копулятивненько!
eth0 11.05.2011 20:56 # −1
guest 10.05.2011 15:49 # 0
TarasB 10.05.2011 15:57 # 0
guest 10.05.2011 15:59 # 0
TarasB 10.05.2011 16:04 # 0
guest 10.05.2011 16:14 # +1
TarasB 10.05.2011 16:18 # 0
guest 10.05.2011 16:20 # +2
TarasB 10.05.2011 17:13 # 0
guest 10.05.2011 17:36 # 0
TarasB 10.05.2011 18:19 # 0
guest 14.05.2011 10:34 # −1
guest 25.05.2011 22:56 # 0
Lure Of Chaos 10.05.2011 16:20 # 0
TarasB 10.05.2011 17:13 # 0
Govnocoder#0xFF 11.05.2011 21:02 # 0
bugmenot 11.05.2011 21:05 # +4
guest 13.05.2011 08:06 # +1
вот вам и ответ на вопрос
guest 13.05.2011 11:34 # −2
Govnocoder#0xFF 19.05.2011 14:04 # 0
guest 25.05.2011 22:57 # 0
adli__82 27.05.2011 12:10 # +2
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
bugmenot 27.05.2011 14:14 # 0
для 8087, к коему гвоздями приколочены дельфи
а вообще интринсик можно рассматривать как непрозрачную атомарную операцию
guest 28.05.2011 10:53 # −2
Можно апредставить ввиде
dos 22.06.2011 21:35 # +16
dosGovno 22.06.2011 21:53 # 0
Нашёл себе сайтик для решения "алгоритмических" задачек?
guest 22.06.2011 21:56 # +13
dos 24.06.2011 22:18 # +16
guest 25.06.2011 01:45 # +2
У Вас компилятора, что-б проверить нет?
guest 27.06.2011 20:04 # +12
Остальные варианты прямо или косвенно используют или могут использовать на некоторых платформах.
Govnocoder#0xFF 12.11.2012 20:08 # 0
KATAJIU3ATOP 27.06.2011 18:05 # +1
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.
bugmenot 27.06.2011 19:02 # +10
dos 28.06.2011 14:52 # +14
guest 28.06.2011 15:12 # −1
dos 03.07.2011 22:35 # +13
guest 04.07.2011 01:27 # +11
dos 03.07.2011 22:36 # +13
inkanus-gray 09.08.2011 20:15 # +6
guest8 08.04.2019 21:19 # −999
guest8 08.04.2019 21:22 # −999
guest8 08.04.2019 22:04 # −999
guest8 08.04.2019 22:09 # −999
guest8 09.04.2019 10:35 # −999
guest8 09.04.2019 17:51 # −999