Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1399824452
Антоха
2014-05-11 20:07
2014.12.14
Прога для онлайн-магазина


6-1274251810
Dmitriy
2010-05-19 10:50
2014.12.14
контроль (учет) трафика WinInet


15-1400163635
RDen
2014-05-15 18:20
2014.12.14
firefox при запуске открывает http://trafmarket.ru/install


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


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский