24: а теперь решение
Ладно, в прошлую субботу была игра в 24, значит, в эту логично, чтоб было решение.
В коде ничего особенно любопытного, разве что, как сделать список в теге <select>
без
полос прокрутки (см. в стиле класс .bloc
, конечно, костыль). Кнопки тоже нет, просто по выборе 4 чисел скрипт ищет решение и выдаёт его под списками или честно говорит "Не знаю" :)
Вот скрипт в работе и код на момент написания (без обрамляющих тегов HTML).
<script type="text/javascript"> var ar=[], order=[0,1,2], op=[], val=[]; var NOVAL=1e9, oper="+-*/", out; function rnd(n) { return Math.floor(Math.random()*n) } function getvalue (x,dir) { var r=NOVAL; if(dir>0) x++; while (1) { if (val[x]!=NOVAL) { r=val[x]; val[x]=NOVAL; break; } x+=dir; } return r*1; } function calc () { var l,r,x; val=ar.join('/').split('/'); for (var c=0; c<3; c++) { x=order[c]; l=getvalue (x,-1); r=getvalue (x, 1); switch(op[x]){ case 0: val[x]=l+r; break; case 1: val[x]=l-r; break; case 2: val[x]=l*r; break; case 3: if (!r||l%r) return 0; val[x]=l/r; break; } } return getvalue(-1,1); } function tasovka (s,n) { var x=n,p=eval(s),r,t; while (x--) { r=rnd(n); t=p[x]; p[x]=p[r]; p[r]=t; } } function skobka (n) { while(n>0) { n--; out+='('; } while(n<0) { n++; out+=')'; } } function prioritet (x) { for (var z=3; z>-1; z--) if (order[z]==x) return 3-z; return 0; } function showsolution () { var x=0,p=0,lp=0,v=0; while(x<4){ if(x<3){ lp=p; p=prioritet (x); v=p-lp; if(v>0) skobka(v); } out+=ar[x]; if(x<3){ if(v<0) skobka(v); out+=oper.charAt(op[x]); } ++x; } skobka(-p); document.getElementById('res24res').innerHTML = out; } function solve24(s) { var z=4,r; while(z--)ar[z]=s.charCodeAt(z)-48; document.getElementById('res24res').innerHTML = 'Думаю...'; out=""; for (z=1e5; z>-1; z--) { r=rnd(256); op[0]=r&3; op[1]=(r>>2)&3; op[2]=(r>>4)&3; tasovka ("ar",4); tasovka ("order",3); if(calc()!=24) continue; showsolution(); break; } if (z<0) document.getElementById('res24res').innerHTML = 'Не знаю :('; } function solveMe() { if (document.res24.n1.selectedIndex==-1 || document.res24.n2.selectedIndex==-1 || document.res24.n3.selectedIndex==-1 || document.res24.n4.selectedIndex==-1) return; var n1 = document.res24.n1.options[document.res24.n1.selectedIndex].value; var n2 = document.res24.n1.options[document.res24.n2.selectedIndex].value; var n3 = document.res24.n1.options[document.res24.n3.selectedIndex].value; var n4 = document.res24.n1.options[document.res24.n4.selectedIndex].value; solve24 (''+n1+n2+n3+n4); } function printItems(divId) { var s=''; for (var i=1; i<10; i++) s+= '<option value="'+i+'">'+i; document.writeln(s); } </script> <noscript><p>Извините, для работы приложения нужен включённый Javascript</p></noscript> <style> .bloc { display:inline-block; vertical-align:top; overflow:hidden; border:solid grey 1px; } .bloc select { padding:10px; margin:-5px -18px -5px -5px; } </style> <div class="bloc"> <form name="res24" method="post" onsubmit="return false;"> <select name="n1" size="9" tabindex="1" onchange="solveMe();"> <script type="text/javascript">printItems();</script> </select> <select name="n2" size="9" tabindex="2" onchange="solveMe();"> <script type="text/javascript">printItems();</script> </select> <select name="n3" size="9" tabindex="3" onchange="solveMe();"> <script type="text/javascript">printItems();</script> </select> <select name="n4" size="9" tabindex="4" onchange="solveMe();"> <script type="text/javascript">printItems();</script> </select> </form> </div> <div id="res24res"></div>
30.04.2016, 14:34 [5415 просмотров]