Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.12.14;
Скачать: CL | DM;

Вниз

Задачка для разминки мозга   Найти похожие ветки 

 
тупой компилятор   (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;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.022 c
3-1301462832
vlgrig1961
2011-03-30 09:27
2014.12.14
HELP!!!Странная сортировка при GROUP BY


15-1400013003
Юрий
2014-05-14 00:30
2014.12.14
С днем рождения ! 14 мая 2014 среда


3-1301760583
worldmen
2011-04-02 20:09
2014.12.14
Запрос списка уволенных


15-1397669855
Rouse_
2014-04-16 21:37
2014.12.14
Задачка для разминки мозга


6-1270567992
Zoom
2010-04-06 19:33
2014.12.14
Indy 9 IdTCPServer, как узнать IP адрес клиента ?