Форум: "Прочее";
Текущий архив: 2014.12.14;
Скачать: [xml.tar.bz2];
ВнизЗадачка для разминки мозга Найти похожие ветки
← →
тупой компилятор (2014-04-17 00:27) [40]> Dimka Maslov © (16.04.14 23:34) [28]
> А ещё забавно, что подобное прокатывает не для всех пар чисел...
//прокатывает для всех пар
Result:=(A*B-(77*90)) or ((A+B)-(77+90))<>0;
← →
int64 © (2014-04-17 00:34) [41]Решение на уровне пятиклассника:
Result := ((A - 90) * (B - 90) + (B - 77) * (A - 77) + 1) * (A + B - 77 - 90 + 1) = 1
← →
Hidden (2014-04-17 09:47) [42]
function T(A, B: Byte): Boolean;
begin
Result:=A*B+(A xor B)<>6953;
end;
← →
SergP © (2014-04-17 09:55) [43]const Arr:array[0..255,0..255] of boolean = ......
function T(A, B: Byte): Boolean;
begin
Result:=Arr[A,B];
end;
)))
← →
SergP © (2014-04-17 09:57) [44]> Важный нюанс, код функции не должен содержать логических переходов.
А разве они не создаются при использовании сравнения =, <> ?
← →
Hidden (2014-04-17 10:01) [45]Нет
← →
Юрий Зотов © (2014-04-17 10:20) [46]> Задачка для разминки мозга
Описание задачи заказчиком.
X и Y должны суммироваться. Но если сегодня среда, то они должны вычитаться. А если позавчера был дождь, то должны умножаться. А если завтра выходной, то надо X делить на Y. А если грачи уже прилетели, то Y надо обнулить. А если оператор - блондинка, то ее надо перекрасить в брюнетку, причем считать, что брюнеткой она стала еще неделю назад. И т.п.
Вот это - действительно задачка для разминки мозга. При том, что, решая ее, надо еще учитывать, что через неделю добавятся новые требования типа "а если хочу неизвестно чего, то надо сделать неизвестно что".
:o)
← →
junglecat (2014-04-17 10:56) [47]> [46] Юрий Зотов © (17.04.14 10:20)
это из реального проекта? o)
← →
Dimka Maslov © (2014-04-17 11:09) [48]
> тупой компилятор (17.04.14 00:27) [40]
or по условию задачи применять нельзя для сравнения логических значений.
← →
Hidden (2014-04-17 11:28) [49]> Dimka Maslov ©
там битовая операция
← →
Дмитрий СС (2014-04-17 11:45) [50]Ну вот, все задачи решили пока я спал :)
← →
Rouse_ © (2014-04-17 11:45) [51]
> Dimka Maslov © (17.04.14 11:09) [48]
В данном случае все нормально, JXX не генерируется:Project1.dpr.51: Result:=(A*B-(77*90)) or ((A+B)-(77+90))<>0;
0041886A 33C0 xor eax,eax
0041886C 8A45FF mov al,[ebp-$01]
0041886F 33D2 xor edx,edx
00418871 8A55FE mov dl,[ebp-$02]
00418874 F7EA imul edx
00418876 2D121B0000 sub eax,$00001b12
0041887B 33D2 xor edx,edx
0041887D 8A55FF mov dl,[ebp-$01]
00418880 33C9 xor ecx,ecx
00418882 8A4DFE mov cl,[ebp-$02]
00418885 03D1 add edx,ecx
00418887 81EAA7000000 sub edx,$000000a7
0041888D 0BC2 or eax,edx
0041888F 0F9545FD setnz byte ptr [ebp-$03]
← →
Rouse_ © (2014-04-17 11:47) [52]А вот мой вариант решения:
function T(A, B: Byte): Boolean;
asm
and eax, $FF
and edx, $FF
mov ecx, eax
xor ecx, edx
sub ecx, $17
imul edx
lea ecx, [eax + ecx - $1B12]
cmp ecx, 0
setnz al
end;
← →
ТНЕ картман (2014-04-17 12:01) [53]... должен пригодиться для парсинга больших хмл))
← →
Sapersky (2014-04-17 12:06) [54]setXX можно использовать и в варианте [2], другое дело что компилятор не соображает это сделать. Он похоже умеет их применять только в простых выражениях, в одно действие.
Или если пнуть особым пинком:
Result:=Boolean( (Byte(a=77) and Byte(b=90)) or (Byte(a=90) and Byte(b=77)) );
(как я понимаю, Byte(a=77) и т.д. - простые выражения, and/or делается уже между числами и поэтому не в счёт)
← →
Sha © (2014-04-17 12:19) [55][24] и [52] можно упростить, если использовать одну константу 6953 вместо двух
← →
Rouse_ © (2014-04-17 12:20) [56]
> ТНЕ картман (17.04.14 12:01) [53]
> ... должен пригодиться для парсинга больших хмл))
Ты меня ни с кем не путаешь? :)
← →
ТНЕ картман (2014-04-17 12:23) [57]
> Rouse_ © (17.04.14 12:20) [56]
> Ты меня ни с кем не путаешь? :)
надо ж мне в угоду нику поязвить))
← →
Rouse_ © (2014-04-17 12:25) [58]
> Sha © (17.04.14 12:19) [55]
> [24] и [52] можно упростить, если использовать одну константу
> 6953 вместо двух
Кстати да, тогда:function T(A, B: Byte): Boolean;
asm
and edx, $FF
mov ecx, eax
xor ecx, edx
imul edx
lea ecx, [eax + ecx - $1B29]
cmp ecx, 0
setnz al
end;
← →
Юрий Зотов © (2014-04-17 12:49) [59]> junglecat (17.04.14 10:56) [47]
Практически да. Причем на вполне резонный вопрос "а что делать, если сегодня среда, позавчера был дождь, завтра выходной, а грачи уже прилетели?" получить вразумительный ответ не удается.
← →
Дмитрий СС (2014-04-17 13:05) [60]
> Юрий Зотов © (17.04.14 12:49) [59]
Сложить, вычесть, поделить и умножить, понятно же:))
← →
Sha © (2014-04-17 13:34) [61]еще вариант
Result:=i*i+j*j<>(77*77)+(90*90);
← →
Inovet © (2014-04-17 14:17) [62]> [52] Rouse_ © (17.04.14 11:47)
> А вот мой вариант решения:
А чё короткий? Надо же длинный и запутанный.
← →
Rouse_ © (2014-04-17 14:25) [63]
> Inovet © (17.04.14 14:17) [62]
> А чё короткий? Надо же длинный и запутанный.
А зачем? :)
← →
Inovet © (2014-04-17 14:31) [64]> [63] Rouse_ © (17.04.14 14:25)
> А зачем? :)
> [0] Rouse_ © (16.04.14 21:37)
> Победит тот кто напишет наименее краткий и понятный код.
← →
Rouse_ © (2014-04-17 14:36) [65]
> Inovet © (17.04.14 14:31) [64]
Ну у меня всяко не самый краткий и не самый понятный :))))
← →
Дмитрий СС (2014-04-17 15:11) [66]
function T(A, B: Byte): Boolean;
asm
mov dh, al
xor eax, eax
cmp dx, $5a4d
setz al
cmp dx, $4d5a
setz ah
or al, ah
end;
← →
Дмитрий СС (2014-04-17 15:18) [67]Обнуление eax можно стереть, получаем 6 строк
function T(A, B: Byte): Boolean;
asm
mov dh, al
cmp dx, $5a4d
setz al
cmp dx, $4d5a
setz ah
or al, ah
end;
← →
Mystic © (2014-04-17 15:32) [68]Непонятно, неужели тупой прямой метод настолько плох по производительности?
leal -90(%rdi), %edx
leal -77(%rsi), %eax
orl %eax, %edx
sete %al
subl $77, %edi
subl $90, %esi
orl %esi, %edi
sete %dl
orl %edx, %eax
ret
← →
Hidden (2014-04-17 15:45) [69]> Дмитрий СС (17.04.14 15:18) [67]
к сожалению по условию задачи ещё нужно будет инвентировать бит
а вообще даёшь ЯВУ и integer. Возможно кстати данный вариант сработает быстрее, чем твой на такт-другойfunction T(A, B: integer): Boolean;
begin
B := B shl 8;
inc(B, A);
Result := Boolean((byte(B=$5a4d) or byte(B=$4d5a)) xor 1);
end;
← →
Hidden (2014-04-17 16:26) [70]7 команд, 2 регистра
function T(A, B: integer): Boolean;
begin
B := B shl 8;
inc(B, A);
Result := (B<>$634d);
dec(byte(Result), byte(B=$4d63));
end;
← →
Sha © (2014-04-17 17:42) [71]function F(A, B: integer): boolean;
asm
mov ecx,eax
imul ecx,edx
xor eax,edx
xor eax,$ffffe4fa
xor eax,ecx
inc eax
shr eax,31
end;
← →
Hidden (2014-04-17 17:58) [72]> Sha © (17.04.14 17:42) [71]
минимум 8 тактов
вариант [70] ориентировочно 6 тактов
← →
Дмитрий СС (2014-04-17 18:26) [73]
> к сожалению по условию задачи ещё нужно будет инвентировать
> бит
Невнимательно прочел, тогда так
function T2(A, B: Byte): Boolean;
asm
mov dh, al
cmp dx, $5a4d
setnz al
cmp dx, $4d5a
setnz ah
and al, ah
end;
Реально 6 команд и два регистра.
В твоем случае, компилятор со включенной оптимизацией превратил твой код примерно в то, что я написал ранее + инверсия бита
← →
Дмитрий СС (2014-04-17 18:29) [74]
> Hidden (17.04.14 16:26) [70]
P.S.
И если привести параметры функции к тем, что указаны в условиях:
function T(A, B:Byte
): Boolean;, то дельфи генерирует больше строк
Project1.dpr.12: B := B shl 8;
00419A88 0FB6D2 movzx edx,dl
00419A8B C1E208 shl edx,$08
Project1.dpr.13: inc(B, A);
00419A8E 02D0 add dl,al
Project1.dpr.14: Result := Boolean((byte(B=$5a4d) or byte(B=$4d5a)) xor 1);
00419A90 0FB6C2 movzx eax,dl
00419A93 663D4D5A cmp ax,$5a4d
00419A97 0F94C1 setz cl
00419A9A 663D5A4D cmp ax,$4d5a
00419A9E 0F94C0 setz al
00419AA1 0AC8 or cl,al
00419AA3 80F101 xor cl,$01
00419AA6 8BC1 mov eax,ecx
← →
Rouse_ © (2014-04-17 18:31) [75]
> Дмитрий СС (17.04.14 18:26) [73]
Ну да, тож вариант, или вот мой, если рассматриваем 6 строк.function T(A, B: Byte): Boolean;
asm
movzx ecx, dl
xor cl, al
imul dl
lea ecx, [eax + ecx - $1B29]
or ecx, ecx
setтz al
end;
← →
Rouse_ © (2014-04-17 19:19) [76]О!! Получилось до 5 свернуть :))
function T1(A, B: Byte): Boolean;
asm
movzx ecx, dl
xor cl, al
imul dl
lea eax, [eax + ecx - $1B29]
or al, ah
end;
← →
Rouse_ © (2014-04-17 19:24) [77]Технически наверное можно выйти на 4 строки ASM, но по всей видимости нужно придумать другой вариант получения хэша, в три уже ИМХО не реально.
← →
тупой компилятор (2014-04-17 20:00) [78]> Rouse_ © (17.04.14 19:19) [76]
так то ж не boolean :)function f076(A, B: Byte): Boolean;
asm
movzx ecx, dl
xor cl, al
imul dl
lea eax, [eax + ecx - $1B29]
or al, ah
end;
procedure TForm1.Button1Click(Sender: TObject);
var
b1, b2: byte;
begin;
for b1:=0 to 255 do
for b2:=0 to 255 do
if f076(b1, b2) xor true
then Memo1.Lines.Add(Format("%d %d",[b1, b2]));
end;
← →
Rouse_ © (2014-04-17 20:06) [79]
> тупой компилятор (17.04.14 20:00) [78]
Компилятор не тупой и работает по принципу False = 0, True = not False.
Т.о. он никогда не делает проверку с единицей, а делает прверку с нулем.
Впрочем шанс выстрелить себе в ногу он оставляет.
← →
Rouse_ © (2014-04-17 20:09) [80]Точнее "False = 0, True <> False".
Таким образом данный вариант решения полностью совпадает с изначальной постановкой, а именно - вернуть False в случае 90 и 77.
Страницы: 1 2 3 4 5 6 7 вся ветка
Форум: "Прочее";
Текущий архив: 2014.12.14;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.013 c