БлогNot. 24: а теперь решение

24: а теперь решение

Ладно, в прошлую субботу была игра в 24, значит, в эту логично, чтоб было решение.

В коде ничего особенно любопытного, разве что, как сделать список в теге <select> без полос прокрутки (см. в стиле класс .bloc, конечно, костыль). Кнопки тоже нет, просто по выборе 4 чисел скрипт ищет решение и выдаёт его под списками или честно говорит "Не знаю" :)

Вот скрипт в работе и код на момент написания (без обрамляющих тегов HTML).

Извините, для работы приложения нужен включённый Javascript

<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 [5340 просмотров]


теги: игра javascript html

К этой статье пока нет комментариев, Ваш будет первым