for(a=1; a<10; a++)
for(b=1; b<10; b++)
if(b==a) continue;
else
for(c=1; c<10; c++)
if(c==b || c==a) continue;
else
for(d=1; d<10; d++)
if(d==c || d==b || d==a) continue;
else
for(e=1; e<10; e++)
if(e==d || e==c || e==b || e==a) continue;
else
for(f=1; f<10; f++)
if(f==e || f==d || f==c || f==b || f==a) continue;
else
for(g=1; g<10; g++)
if(g==f || g==e || g==d || g==c || g==b || g==a) continue;
else
for(h=1; h<10; h++)
if(h==g || h==f || h==e || h==d || h==c || h==b || h==a) continue;
else
for(j=1; j<10; j++)
if(j==h || j==g || j==f || j==e || j==d || j==c || j==b || j==a) continue;
else
if( 100*d+10*g+j + 100*j+10*a+e + 100*b+10*h+f == 1000*d+100*d+10*a+b &&
f*c/j == 10*g+a)
alert( " a="+a+
" b="+b+
" c="+c+
" d="+d+
" e="+e+
" f="+f+
" g="+g+
" h="+h+
" j="+j);
<?php
for($a=1; $a<10; $a++)
for($b=1; $b<10; $b++)
if($b==$a) continue;
else
for($c=1; $c<10; $c++)
if($c==$b || $c==$a) continue;
else
for($d=1; $d<10; $d++)
if($d==$c || $d==$b || $d==$a) continue;
else
for($e=1; $e<10; $e++)
if($e==$d || $e==$c || $e==$b || $e==$a) continue;
else
for($f=1; $f<10; $f++)
if($f==$e || $f==$d || $f==$c || $f==$b || $f==$a) continue;
else
for($g=1; $g<10; $g++)
if($g==$f || $g==$e || $g==$d || $g==$c || $g==$b || $g==$a) continue;
else
for($h=1; $h<10; $h++)
if($h==$g || $h==$f || $h==$e || $h==$d || $h==$c || $h==$b || $h==$a) continue;
else
for($j=1; $j<10; $j++)
if($j==$h || $j==$g || $j==$f || $j==$e || $j==$d || $j==$c || $j==$b || $j==$a) continue;
else
if( 100*$d+10*$g+$j + 100*$j+10*$a+$e + 100*$b+10*$h+$f == 1000*$d+100*$d+10*$a+$b &&
$f*$c/$j == 10*$g+$a)
echo " a=",$a,
" b=",$b,
" c=",$c,
" d=",$d,
" e=",$e,
" f=",$f,
" g=",$g,
" h=",$h,
" j=",$j;
?>
Когда-то мне нужно было узнать ответ на одну задачку.
Я его узнал.
Цель кода была выполниться один раз и не больше, он с ней на тот момент успешно справился.
А тут подвернулся php, захотелось потренироваться, вспомнил старую задачку.
Учитывая, что поменял только синтаксис, а не логику сильно удивился, такому падению производительности вот и задал вопрос.
Я думаю мы уже нашли на него ответ, что дело в том, что
v8 перед выполнением производит оптимизации, а php нет.
В оправдание того, что изначальный вариант кода не оптимизирован, хочу сказать, что когда писал, следовал логике не столько программирования, сколько самой задачи, то есть:
перебор вариантов, проверка условия, вывод ответа.
Уже в процессе решения заметил, что ответов было много,
понял, что дело в том, что разные буквы могли принимать одинаковые числовые значения,
что хоть явно и не запрещено в условиях, но очевидно не верно.
Тогда и добавилось условие, что разные буквы не равны между собой.
Я думал, что можно будет сделать эту проверку как-то лаконично в роде:
a!=b!=c!=d!=e!=f!=..
Но так не сработало, понял, что придётся разбивать на кучу сравнений между друг другом,
так и родился тот монстр с проверкой на несколько строк..
Выглядело конечно страшно, но ответ оно нашло за пару секунд, поэтому дальнейшая работа над кодом и не имела смысла.
Всё-таки это был просто тест на досуге, а не стратегический проект! ;-)
Если бы ему было суждено выполняться где-либо тысячи раз, конечно бы Я его так не оставил.
Впрочем,
Вариант кода с вынесением сравнения за циклы Я уже сам переписал в комментариях.
До вынесения вычислений конечно дело не дошло, но прирост производительности ощутился в обоих языках.
На самом деле, если заморочиться, то можно выяснить какое из выражений быстрее выполняется с кучей сложений или с одним делением, и провести сначала только циклы, которые используют только их буквы.
(то есть вложить циклы не по алфавиту a,b,c.. а по использованию например f,j,g,a)
А насчёт введения отдельных переменных типа $a10 у меня вопрос в их оправданности,
они конечно позволяют сэкономить на умножении, если оно будет несколько раз, но ведь занимает память, плюс может до использования этой переменной в этом цикле может и не дойдёт (то есть может просто так бы нам не нужно было это умножение, а так оно у нас 100% есть).
И ещё хочу спросить, а === быстрее, чем ==?
И идти с 9 до 1, а не от 1 до 9, это тоже какая-то оптимизация или просто стиль?