Sei sulla pagina 1di 143

<!

DOCTYPE html>
<html lang="en" dir="ltr" class="client-nojs">
<head>
<title>24 game/Solve - Rosetta Code</title>
<meta charset="UTF-8"/>
<meta name="generator" content="MediaWiki 1.20.3"/>
<script type="text/javascript">
//<![CDATA[
try{if (!window.CloudFlare) {var CloudFlare=[{verbose:0,p:0,byc:0,owlid:"cf",bag
2:1,mirage2:0,oracle:0,paths:{cloudflare:"/cdn-cgi/nexp/dok3v=1613a3a185/"},atok
:"1d41b6e8edcbbca654dbf2320c50ff5c",petok:"84b867db920efc7777e89c4b0e97a6ec18990
0a9-1444512962-1800",zone:"rosettacode.org",rocket:"a",apps:{"ga_key":{"ua":"UA1219419-1","ga_bs":"2"}}}];document.write('<script type="text/javascript" src="/
/ajax.cloudflare.com/cdn-cgi/nexp/dok3v=e9627cd26a/cloudflare.min.js"><'+'\/scri
pt>');}}catch(e){};
//]]>
</script>
<link rel="alternate" type="application/x-wiki" title="Edit" href="/mw/index.php
?title=24_game/Solve&amp;action=edit"/>
<link rel="edit" title="Edit" href="/mw/index.php?title=24_game/Solve&amp;action
=edit"/>
<link rel="shortcut icon" href="/favicon.ico"/>
<link rel="search" type="application/opensearchdescription+xml" href="/mw/opense
arch_desc.php" title="Rosetta Code (en)"/>
<link rel="EditURI" type="application/rsd+xml" href="http://rosettacode.org/mw/a
pi.php?action=rsd"/>
<link rel="copyright" href="http://www.gnu.org/licenses/fdl-1.2.html"/>
<link rel="alternate" type="application/atom+xml" title="Rosetta Code Atom feed"
href="/mw/index.php?title=Special:RecentChanges&amp;feed=atom"/>
<link rel="stylesheet" href="http://rosettacode.org/mw/load.php?debug=false&amp;
lang=en&amp;modules=mediawiki.legacy.commonPrint%2Cshared%7Cskins.vector&amp;onl
y=styles&amp;skin=vector&amp;*"/>
<meta name="ResourceLoaderDynamicStyles" content=""/>
<link rel="stylesheet" href="http://rosettacode.org/mw/load.php?debug=false&amp;
lang=en&amp;modules=site&amp;only=styles&amp;skin=vector&amp;*"/>
<style>a:lang(ar),a:lang(ckb),a:lang(fa),a:lang(kk-arab),a:lang(mzn),a:lang(ps),
a:lang(ur){text-decoration:none}</style>
<script data-rocketsrc="http://rosettacode.org/mw/load.php?debug=false&amp;lang=
en&amp;modules=startup&amp;only=scripts&amp;skin=vector&amp;*" type="text/rocket
script"></script>
<script type="text/rocketscript">if(window.mw){
mw.config.set({"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgN
amespaceNumber":0,"wgPageName":"24_game/Solve","wgTitle":"24 game/Solve","wgCurR
evisionId":210398,"wgArticleId":4940,"wgIsArticle":true,"wgAction":"view","wgUse
rName":null,"wgUserGroups":["*"],"wgCategories":["Programming Tasks","Solutions
by Programming Task","ABAP","Argile","AutoHotkey","BBC BASIC","C","C++","Clojure
","CoffeeScript","Common Lisp","D","ERRE","Euler Math Toolbox","F Sharp","Fortra
n","GAP","Go","Gosu","Haskell","Icon","Unicon","Icon Programming Library","J","J
ava","JavaScript","Jq","Julia","Liberty BASIC","Lua","Mathematica","Wolfram Lang
uage","OCaml","Perl","Perl 6","Phix","PicoLisp","ProDOS","Prolog","Python","R","
Racket","REXX","Ruby","Scala","Sidef","Swift","Tcl","Tcllib","Ursala","Zkl","GUI
SS/Omit","ML/I/Omit"],"wgBreakFrames":false,"wgPageContentLanguage":"en","wgSepa
ratorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateForma
t":"dmy","wgMonthNames":["","January","February","March","April","May","June","J
uly","August","September","October","November","December"],"wgMonthNamesShort":[
"","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"wgR
elevantPageName":"24_game/Solve","wgRestrictionEdit":[],"wgRestrictionMove":[],"
sfgRemoveText":"Remove","sfgAutocompleteOnAllChars":false,"sfgAutocompleteValues
":{},"sfgShowOnSelect":{},"sfgFormErrorsHeader":"There were errors with your for

m input; see below","sfgBlankErrorStr":"cannot be blank","sfgBadURLErrorStr":"mu


st have the correct URL format, starting with \"http\"","sfgBadEmailErrorStr":"m
ust have a valid email address format","sfgBadNumberErrorStr":"must be a valid n
umber","sfgBadDateErrorStr":"must be a valid date","sfgAnonEditWarning":"Warning
: You are not logged in. Your IP address will be recorded in this page\'s edit h
istory."});
}</script><script type="text/rocketscript">if(window.mw){
mw.loader.implement("user.options",function(){mw.user.options.set({"ccmeonemails
":0,"cols":80,"date":"default","diffonly":0,"disablemail":0,"disablesuggest":0,"
editfont":"default","editondblclick":0,"editsection":1,"editsectiononrightclick"
:0,"enotifminoredits":0,"enotifrevealaddr":0,"enotifusertalkpages":1,"enotifwatc
hlistpages":0,"extendwatchlist":0,"externaldiff":0,"externaleditor":0,"fancysig"
:0,"forceeditsummary":0,"gender":"unknown","hideminor":0,"hidepatrolled":0,"imag
esize":2,"justify":0,"math":1,"minordefault":0,"newpageshidepatrolled":0,"nocach
e":0,"noconvertlink":0,"norollbackdiff":0,"numberheadings":0,"previewonfirst":0,
"previewontop":1,"quickbar":5,"rcdays":7,"rclimit":50,"rememberpassword":0,"rows
":25,"searchlimit":20,"showhiddencats":0,"showjumplinks":1,"shownumberswatching"
:1,"showtoc":1,"showtoolbar":1,"skin":"vector","stubthreshold":0,"thumbsize":2,"
underline":2,"uselivepreview":0,"usenewrc":0,"watchcreations":0,"watchdefault":0
,"watchdeletion":0,"watchlistdays":3,
"watchlisthideanons":0,"watchlisthidebots":0,"watchlisthideliu":0,"watchlisthide
minor":0,"watchlisthideown":0,"watchlisthidepatrolled":0,"watchmoves":0,"wllimit
":250,"variant":"en","language":"en","searchNs0":true,"searchNs1":false,"searchN
s2":false,"searchNs3":false,"searchNs4":false,"searchNs5":false,"searchNs6":fals
e,"searchNs7":false,"searchNs8":false,"searchNs9":false,"searchNs10":false,"sear
chNs11":false,"searchNs12":false,"searchNs13":false,"searchNs14":false,"searchNs
15":false,"searchNs102":false,"searchNs103":false,"searchNs106":false,"searchNs1
07":false,"searchNs108":false,"searchNs109":false,"searchNs110":false,"searchNs1
11":false,"searchNs112":false,"searchNs113":false,"searchNs114":false,"searchNs1
15":false,"searchNs170":false,"searchNs171":false,"searchNs274":false,"searchNs2
75":false});;},{},{});mw.loader.implement("user.tokens",function(){mw.user.token
s.set({"editToken":"+\\","watchToken":false});;},{},{});
/* cache key: rosettacode:resourceloader:filter:minify-js:7:2ce58c77cc7227488637
c1087f1776c6 */
}</script>
<script type="text/rocketscript">if(window.mw){
mw.loader.load(["mediawiki.page.startup","mediawiki.legacy.wikibits","mediawiki.
legacy.ajax"]);
}</script>
<link rel="alternate" type="application/rdf+xml" title="24 game/Solve" href="/mw
/index.php?title=Special:ExportRDF/24_game/Solve&amp;xmlmime=rdf"/>
<!--[if lt IE 7]><style type="text/css">body{behavior:url("/mw/skins/vector/cssh
over.min.htc")}</style><![endif]--><script type="text/javascript">
/* <![CDATA[ */
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-1219419-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async
= true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www')
+ '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga
, s);
})();
(function(b){(function(a){"__CF"in b&&"DJS"in b.__CF?b.__CF.DJS.push(a):"addEven
tListener"in b?b.addEventListener("load",a,!1):b.attachEvent("onload",a)})(funct
ion(){"FB"in b&&"Event"in FB&&"subscribe"in FB.Event&&(FB.Event.subscribe("edge.

create",function(a){_gaq.push(["_trackSocial","facebook","like",a])}),FB.Event.s
ubscribe("edge.remove",function(a){_gaq.push(["_trackSocial","facebook","unlike"
,a])}),FB.Event.subscribe("message.send",function(a){_gaq.push(["_trackSocial","
facebook","send",a])}));"twttr"in b&&"events"in twttr&&"bind"in twttr.events&&tw
ttr.events.bind("tweet",function(a){if(a){var b;if(a.target&&a.target.nodeName==
"IFRAME")a:{if(a=a.target.src){a=a.split("#")[0].match(/[^?=&]+=([^&]*)?/g);b=0;
for(var c;c=a[b];++b)if(c.indexOf("url")===0){b=unescape(c.split("=")[1]);break
a}}b=void 0}_gaq.push(["_trackSocial","twitter","tweet",b])}})})})(window);
/* ]]> */
</script>
</head>
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-24_game_Solve skin-v
ector action-view vector-animateLayout">
<div id="mw-page-base" class="noprint"></div>
<div id="mw-head-base" class="noprint"></div>
<div id="content" class="mw-body">
<a id="top"></a>
<div id="mw-js-message" style="display:none;"></div>
<h1 id="firstHeading" class="firstHeading"><span dir="auto">24 game/Solve</span>
</h1>
<div id="bodyContent">
<div id="siteSub">From Rosetta Code</div>
<div id="contentSub"><span class="subpages">&lt; <a href="/wiki/24_game" title="
24 game">24 game</a></span></div>
<div id="jump-to-nav" class="mw-jump">
Jump to: <a href="#mw-head">navigation</a>, <a href="#p-search">search</a>
</div>
<div id="mw-content-text" lang="en" dir="ltr" class="mw-content-ltr"><div class=
"infobox" style="width: 2in"><div class="floatleft"><a href="/wiki/Category:Solu
tions_by_Programming_Task" title="Category:Solutions by Programming Task"><img a
lt="Task" src="/mw/images/b/ba/Rcode-button-task-crushed.png" width="64" height=
"64"/></a></div><b>24 game/Solve</b><br/>
You are encouraged to <a href="/wiki/Rosetta_Code:Solve_a_Task" title="Rosetta C
ode:Solve a Task">solve this task</a> according to the task description, using a
ny language you may know.</div>
<p>Write a program that takes four digits, either from user input or by random g
eneration, and computes arithmetic expressions following the rules of the <a hre
f="/wiki/24_game" title="24 game">24 game</a>.
</p><p>Show examples of solutions generated by the program.
</p><p>C.F: <a href="/wiki/Arithmetic_Evaluator" title="Arithmetic Evaluator" cl
ass="mw-redirect">Arithmetic Evaluator</a>
</p>
<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#ABAP"><span class="tocnumber">1</s
pan> <span class="toctext">ABAP</span></a></li>
<li class="toclevel-1 tocsection-2"><a href="#Argile"><span class="tocnumber">2<
/span> <span class="toctext">Argile</span></a></li>
<li class="toclevel-1 tocsection-3"><a href="#AutoHotkey"><span class="tocnumber

">3</span> <span class="toctext">AutoHotkey</span></a></li>


<li class="toclevel-1 tocsection-4"><a href="#BBC_BASIC"><span class="tocnumber"
>4</span> <span class="toctext">BBC BASIC</span></a></li>
<li class="toclevel-1 tocsection-5"><a href="#C"><span class="tocnumber">5</span
> <span class="toctext">C</span></a></li>
<li class="toclevel-1 tocsection-6"><a href="#C.2B.2B"><span class="tocnumber">6
</span> <span class="toctext">C++</span></a></li>
<li class="toclevel-1 tocsection-7"><a href="#Clojure"><span class="tocnumber">7
</span> <span class="toctext">Clojure</span></a></li>
<li class="toclevel-1 tocsection-8"><a href="#CoffeeScript"><span class="tocnumb
er">8</span> <span class="toctext">CoffeeScript</span></a></li>
<li class="toclevel-1 tocsection-9"><a href="#Common_Lisp"><span class="tocnumbe
r">9</span> <span class="toctext">Common Lisp</span></a></li>
<li class="toclevel-1 tocsection-10"><a href="#D"><span class="tocnumber">10</sp
an> <span class="toctext">D</span></a></li>
<li class="toclevel-1 tocsection-11"><a href="#ERRE"><span class="tocnumber">11<
/span> <span class="toctext">ERRE</span></a></li>
<li class="toclevel-1 tocsection-12"><a href="#Euler_Math_Toolbox"><span class="
tocnumber">12</span> <span class="toctext">Euler Math Toolbox</span></a></li>
<li class="toclevel-1 tocsection-13"><a href="#F.23"><span class="tocnumber">13<
/span> <span class="toctext">F#</span></a></li>
<li class="toclevel-1 tocsection-14"><a href="#Fortran"><span class="tocnumber">
14</span> <span class="toctext">Fortran</span></a></li>
<li class="toclevel-1 tocsection-15"><a href="#GAP"><span class="tocnumber">15</
span> <span class="toctext">GAP</span></a></li>
<li class="toclevel-1 tocsection-16"><a href="#Go"><span class="tocnumber">16</s
pan> <span class="toctext">Go</span></a></li>
<li class="toclevel-1 tocsection-17"><a href="#Gosu"><span class="tocnumber">17<
/span> <span class="toctext">Gosu</span></a></li>
<li class="toclevel-1 tocsection-18"><a href="#Haskell"><span class="tocnumber">
18</span> <span class="toctext">Haskell</span></a>
<ul>
<li class="toclevel-2 tocsection-19"><a href="#Alternative_version"><span class=
"tocnumber">18.1</span> <span class="toctext">Alternative version</span></a></li
>
</ul>
</li>
<li class="toclevel-1 tocsection-20"><a href="#Icon_and_Unicon"><span class="toc
number">19</span> <span class="toctext">Icon and Unicon</span></a></li>
<li class="toclevel-1 tocsection-21"><a href="#J"><span class="tocnumber">20</sp
an> <span class="toctext">J</span></a></li>
<li class="toclevel-1 tocsection-22"><a href="#Java"><span class="tocnumber">21<
/span> <span class="toctext">Java</span></a></li>
<li class="toclevel-1 tocsection-23"><a href="#JavaScript"><span class="tocnumbe
r">22</span> <span class="toctext">JavaScript</span></a></li>
<li class="toclevel-1 tocsection-24"><a href="#jq"><span class="tocnumber">23</s
pan> <span class="toctext">jq</span></a></li>
<li class="toclevel-1 tocsection-25"><a href="#Julia"><span class="tocnumber">24
</span> <span class="toctext">Julia</span></a></li>
<li class="toclevel-1 tocsection-26"><a href="#Liberty_BASIC"><span class="tocnu
mber">25</span> <span class="toctext">Liberty BASIC</span></a></li>
<li class="toclevel-1 tocsection-27"><a href="#Lua"><span class="tocnumber">26</
span> <span class="toctext">Lua</span></a></li>
<li class="toclevel-1 tocsection-28"><a href="#Mathematica_.2F_Wolfram_Language"
><span class="tocnumber">27</span> <span class="toctext">Mathematica / Wolfram L
anguage</span></a></li>
<li class="toclevel-1 tocsection-29"><a href="#OCaml"><span class="tocnumber">28
</span> <span class="toctext">OCaml</span></a></li>
<li class="toclevel-1 tocsection-30"><a href="#Perl"><span class="tocnumber">29<
/span> <span class="toctext">Perl</span></a></li>

<li class="toclevel-1 tocsection-31"><a href="#Perl_6"><span class="tocnumber">3


0</span> <span class="toctext">Perl 6</span></a></li>
<li class="toclevel-1 tocsection-32"><a href="#Phix"><span class="tocnumber">31<
/span> <span class="toctext">Phix</span></a></li>
<li class="toclevel-1 tocsection-33"><a href="#PicoLisp"><span class="tocnumber"
>32</span> <span class="toctext">PicoLisp</span></a></li>
<li class="toclevel-1 tocsection-34"><a href="#ProDOS"><span class="tocnumber">3
3</span> <span class="toctext">ProDOS</span></a></li>
<li class="toclevel-1 tocsection-35"><a href="#Prolog"><span class="tocnumber">3
4</span> <span class="toctext">Prolog</span></a>
<ul>
<li class="toclevel-2 tocsection-36"><a href="#Minimal_version"><span class="toc
number">34.1</span> <span class="toctext">Minimal version</span></a></li>
</ul>
</li>
<li class="toclevel-1 tocsection-37"><a href="#Python"><span class="tocnumber">3
5</span> <span class="toctext">Python</span></a>
<ul>
<li class="toclevel-2 tocsection-38"><a href="#Difficult_case_requiring_precise_
division"><span class="tocnumber">35.1</span> <span class="toctext">Difficult ca
se requiring precise division</span></a></li>
</ul>
</li>
<li class="toclevel-1 tocsection-39"><a href="#R"><span class="tocnumber">36</sp
an> <span class="toctext">R</span></a></li>
<li class="toclevel-1 tocsection-40"><a href="#Racket"><span class="tocnumber">3
7</span> <span class="toctext">Racket</span></a></li>
<li class="toclevel-1 tocsection-41"><a href="#REXX"><span class="tocnumber">38<
/span> <span class="toctext">REXX</span></a></li>
<li class="toclevel-1 tocsection-42"><a href="#Ruby"><span class="tocnumber">39<
/span> <span class="toctext">Ruby</span></a></li>
<li class="toclevel-1 tocsection-43"><a href="#Scala"><span class="tocnumber">40
</span> <span class="toctext">Scala</span></a></li>
<li class="toclevel-1 tocsection-44"><a href="#Sidef"><span class="tocnumber">41
</span> <span class="toctext">Sidef</span></a></li>
<li class="toclevel-1 tocsection-45"><a href="#Swift"><span class="tocnumber">42
</span> <span class="toctext">Swift</span></a></li>
<li class="toclevel-1 tocsection-46"><a href="#Tcl"><span class="tocnumber">43</
span> <span class="toctext">Tcl</span></a></li>
<li class="toclevel-1 tocsection-47"><a href="#Ursala"><span class="tocnumber">4
4</span> <span class="toctext">Ursala</span></a></li>
<li class="toclevel-1 tocsection-48"><a href="#zkl"><span class="tocnumber">45</
span> <span class="toctext">zkl</span></a></li>
</ul>
</td></tr></table>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=1" title="Edit section: ABAP">edit</a>]</span> <span class
="mw-headline" id="ABAP"><a href="/wiki/Category:ABAP" title="Category:ABAP">ABA
P</a></span></h2>
<p>Will generate all possible solutions of any given four numbers according to t
he rules of the 24 game.
</p><p>Note: the permute function was locally from <a href="/wiki/Permutations#A
BAP" title="Permutations">here</a>
</p>
<pre class="abap highlighted_source"><a href="http://help.sap.com/abapdocu/en/AB
APDATA.htm"><span class="kw2">data</span></a><span class="sy0">:</span> lv_flag
<span class="kw4">type</span> c<span class="sy0">,</span><br/>
lv_number <s
pan class="kw4">type</span> i<span class="sy0">,</span><br/>
lt_numbers <sp
an class="kw4">type</span> <span class="kw9"><span class="kw4">table</span> of</
span> i<span class="sy0">.</span><br/>&#160;<br/><a href="http://help.sap.com/ab

apdocu/en/ABAPCONSTANTS.htm"><span class="kw2">constants</span></a><span class="


sy0">:</span> c_no_val <span class="kw4">type</span> i <span class="kw4">value</
span> <span class="nu0">9999</span><span class="sy0">.</span><br/>&#160;<br/><a
href="http://help.sap.com/abapdocu/en/ABAPAPPEND.htm"><span class="kw3">append</
span></a> <span class="nu0">1</span> <span class="kw4">to</span> lt_numbers<span
class="sy0">.</span><br/><a href="http://help.sap.com/abapdocu/en/ABAPAPPEND.ht
m"><span class="kw3">append</span></a> <span class="nu0">1</span> <span class="k
w4">to</span> lt_numbers<span class="sy0">.</span><br/><a href="http://help.sap.
com/abapdocu/en/ABAPAPPEND.htm"><span class="kw3">append</span></a> <span class=
"nu0">2</span> <span class="kw4">to</span> lt_numbers<span class="sy0">.</span><
br/><a href="http://help.sap.com/abapdocu/en/ABAPAPPEND.htm"><span class="kw3">a
ppend</span></a> <span class="nu0">7</span> <span class="kw4">to</span> lt_numbe
rs<span class="sy0">.</span><br/>&#160;<br/><a href="http://help.sap.com/abapdoc
u/en/ABAPWRITE.htm"><span class="kw3">write</span></a> <span class="st0">'Evalua
ting 24 with the following input: '</span><span class="sy0">.</span><br/><span c
lass="kw7"><a href="http://help.sap.com/abapdocu/en/ABAPLOOP.htm"><span class="k
w1">loop</span></a> at</span> lt_numbers <span class="kw4">into</span> lv_number
<span class="sy0">.</span><br/> <a href="http://help.sap.com/abapdocu/en/ABAPWR
ITE.htm"><span class="kw3">write</span></a> lv_number<span class="sy0">.</span><
br/><a href="http://help.sap.com/abapdocu/en/ABAPENDLOOP.htm"><span class="kw1">
endloop</span></a><span class="sy0">.</span> <br/><a href="http://help.sap.com/
abapdocu/en/ABAPPERFORM.htm"><span class="kw3">perform</span></a> solve_24 <span
class="kw4">using</span> lt_numbers<span class="sy0">.</span><br/>&#160;<br/><a
href="http://help.sap.com/abapdocu/en/ABAPFORM.htm"><span class="kw3">form</spa
n></a> eval_formula <span class="kw4">using</span> iv_eval <span class="kw4">typ
e</span> <span class="kw4">string</span> <span class="kw4">changing</span> ev_ou
t <span class="kw4">type</span> i<span class="sy0">.</span><br/> <span class="k
w8">call function</span> <span class="st0">'EVAL_FORMULA'</span> <span class="co
1">&quot;analysis of a syntactically correct formula</span><br/>
<span class=
"kw4">exporting</span><br/>
formula <span class="sy1">=</span> iv_eval<br/>
<span class="kw4">importing</span><br/>
<span class="kw4">value</span>
<span class="sy1">=</span> ev_out<br/>
<span class="kw4">exceptions</span><
br/> <span class="kw4">others</span>
<span class="sy1">=</span> <span clas
s="nu0">1</span><span class="sy0">.</span><br/>&#160;<br/> <a href="http://help
.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> sy<span class="
sy0">-</span>subrc <span class="sy1">&lt;&gt;</span> <span class="nu0">0</span><
span class="sy0">.</span><br/>
ev_out <span class="sy1">=</span> <span class=
"sy0">-</span><span class="nu0">1</span><span class="sy0">.</span><br/> <a href
="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span><
/a><span class="sy0">.</span><br/><a href="http://help.sap.com/abapdocu/en/ABAPE
NDFORM.htm"><span class="kw3">endform</span></a><span class="sy0">.</span><br/>&
#160;<br/><span class="co1">&quot; Solve a 24 puzzle.</span><br/><a href="http:/
/help.sap.com/abapdocu/en/ABAPFORM.htm"><span class="kw3">form</span></a> solve_
24 <span class="kw4">using</span> it_numbers <span class="kw4">like</span> lt_nu
mbers<span class="sy0">.</span><br/> <a href="http://help.sap.com/abapdocu/en/A
BAPDATA.htm"><span class="kw2">data</span></a><span class="sy0">:</span> lv_flag
<span class="kw4">type</span> c<span class="sy0">,</span><br/>
lv_op1
<span class="kw4">type</span> c<span class="sy0">,</span><br/>
lv_op2
<span class="kw4">type</span> c<span class="sy0">,</span><br/>
lv_op3
<span class="kw4">type</span> c<span class="sy0">,</span><br/>
lv_var1
<span class="kw4">type</span> c<span class="sy0">,</span><br/>
lv_var2
<span class="kw4">type</span> c<span class="sy0">,</span><br/>
lv_var3
<span class="kw4">type</span> c<span class="sy0">,</span><br/>
lv_var4
<span class="kw4">type</span> c<span class="sy0">,</span><br/>
lv_eval
<span class="kw4">type</span> <span class="kw4">string</span><span class="sy0
">,</span><br/>
lv_result <span class="kw4">type</span> i<span class="sy0
">,</span><br/>
lv_var
<span class="kw4">type</span> i<span class="sy
0">.</span><br/>&#160;<br/> <a href="http://help.sap.com/abapdocu/en/ABAPDEFINE
.htm"><span class="kw3">define</span></a> retrieve_var<span class="sy0">.</span>
<br/>
<span class="kw8">read table</span> it_numbers <span class="kw4">index<

/span> <span class="sy0">&amp;</span><span class="nu0">1</span> <span class="kw4


">into</span> lv_var<span class="sy0">.</span><br/>
<span class="sy0">&amp;</
span><span class="nu0">2</span> <span class="sy1">=</span> lv_var<span class="sy
0">.</span><br/> <a href="http://help.sap.com/abapdocu/en/ABAPEND-OF-DEFINITION
.htm"><span class="kw3">end-of-definition</span></a><span class="sy0">.</span><b
r/>&#160;<br/> <a href="http://help.sap.com/abapdocu/en/ABAPDEFINE.htm"><span c
lass="kw3">define</span></a> retrieve_val<span class="sy0">.</span><br/>
<a h
ref="http://help.sap.com/abapdocu/en/ABAPPERFORM.htm"><span class="kw3">perform<
/span></a> eval_formula <span class="kw4">using</span> lv_eval <span class="kw4"
>changing</span> lv_result<span class="sy0">.</span><br/>
<a href="http://hel
p.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> lv_result <spa
n class="sy1">=</span> <span class="nu0">24</span><span class="sy0">.</span><br/
>
<a href="http://help.sap.com/abapdocu/en/ABAPWRITE.htm"><span class="kw
3">write</span></a> <span class="sy0">/</span> lv_eval<span class="sy0">.</span>
<br/>
<a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw
1">endif</span></a><span class="sy0">.</span><br/> <a href="http://help.sap.com
/abapdocu/en/ABAPEND-OF-DEFINITION.htm"><span class="kw3">end-of-definition</spa
n></a><span class="sy0">.</span><br/> <span class="co1">&quot; Loop through all
the possible number permutations.</span><br/> <a href="http://help.sap.com/aba
pdocu/en/ABAPDO.htm"><span class="kw1">do</span></a><span class="sy0">.</span><b
r/>
<span class="co1">&quot; Init. the operations table.</span><br/>&#160;<br
/>
retrieve_var<span class="sy0">:</span> <span class="nu0">1</span> lv_var1<
span class="sy0">,</span> <span class="nu0">2</span> lv_var2<span class="sy0">,<
/span> <span class="nu0">3</span> lv_var3<span class="sy0">,</span> <span class=
"nu0">4</span> lv_var4<span class="sy0">.</span><br/>
<a href="http://help.sa
p.com/abapdocu/en/ABAPDO.htm"><span class="kw1">do</span></a> <span class="nu0">
4</span> <span class="kw4">times</span><span class="sy0">.</span><br/>
<a h
ref="http://help.sap.com/abapdocu/en/ABAPCASE.htm"><span class="kw1">case</span>
</a> sy<span class="sy0">-</span><span class="kw4">index</span><span class="sy0"
>.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPWHEN.htm"><sp
an class="kw1">when</span></a> <span class="nu0">1</span><span class="sy0">.</sp
an><br/>
lv_op1 <span class="sy1">=</span> <span class="st0">'+'</span>
<span class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/
ABAPWHEN.htm"><span class="kw1">when</span></a> <span class="nu0">2</span><span
class="sy0">.</span><br/>
lv_op1 <span class="sy1">=</span> <span class
="st0">'*'</span><span class="sy0">.</span><br/>
<a href="http://help.sap
.com/abapdocu/en/ABAPWHEN.htm"><span class="kw1">when</span></a> <span class="nu
0">3</span><span class="sy0">.</span><br/>
lv_op1 <span class="sy1">=</
span> <span class="st0">'-'</span><span class="sy0">.</span><br/>
<a href
="http://help.sap.com/abapdocu/en/ABAPWHEN.htm"><span class="kw1">when</span></a
> <span class="nu0">4</span><span class="sy0">.</span><br/>
lv_op1 <spa
n class="sy1">=</span> <span class="st0">'/'</span><span class="sy0">.</span><br
/>
<a href="http://help.sap.com/abapdocu/en/ABAPENDCASE.htm"><span class="k
w1">endcase</span></a><span class="sy0">.</span><br/>
<a href="http://help.
sap.com/abapdocu/en/ABAPDO.htm"><span class="kw1">do</span></a> <span class="nu0
">4</span> <span class="kw4">times</span><span class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPCASE.htm"><span class="kw1">case</s
pan></a> sy<span class="sy0">-</span><span class="kw4">index</span><span class="
sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPWHEN.htm"
><span class="kw1">when</span></a> <span class="nu0">1</span><span class="sy0">.
</span><br/>
lv_op2 <span class="sy1">=</span> <span class="st0">'+'</s
pan><span class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu
/en/ABAPWHEN.htm"><span class="kw1">when</span></a> <span class="nu0">2</span><s
pan class="sy0">.</span><br/>
lv_op2 <span class="sy1">=</span> <span c
lass="st0">'*'</span><span class="sy0">.</span><br/>
<a href="http://help
.sap.com/abapdocu/en/ABAPWHEN.htm"><span class="kw1">when</span></a> <span class
="nu0">3</span><span class="sy0">.</span><br/>
lv_op2 <span class="sy1"
>=</span> <span class="st0">'-'</span><span class="sy0">.</span><br/>
<a
href="http://help.sap.com/abapdocu/en/ABAPWHEN.htm"><span class="kw1">when</span
></a> <span class="nu0">4</span><span class="sy0">.</span><br/>
lv_op2

<span class="sy1">=</span> <span class="st0">'/'</span><span class="sy0">.</span


><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPENDCASE.htm"><span cl
ass="kw1">endcase</span></a><span class="sy0">.</span><br/>
<a href="http
://help.sap.com/abapdocu/en/ABAPDO.htm"><span class="kw1">do</span></a> <span cl
ass="nu0">4</span> <span class="kw4">times</span><span class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPCASE.htm"><span class="kw
1">case</span></a> sy<span class="sy0">-</span><span class="kw4">index</span><sp
an class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/A
BAPWHEN.htm"><span class="kw1">when</span></a> <span class="nu0">1</span><span c
lass="sy0">.</span><br/>
lv_op3 <span class="sy1">=</span> <span clas
s="st0">'+'</span><span class="sy0">.</span><br/>
<a href="http://help.
sap.com/abapdocu/en/ABAPWHEN.htm"><span class="kw1">when</span></a> <span class=
"nu0">2</span><span class="sy0">.</span><br/>
lv_op3 <span class="sy1
">=</span> <span class="st0">'*'</span><span class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPWHEN.htm"><span class="kw1">when</s
pan></a> <span class="nu0">3</span><span class="sy0">.</span><br/>
lv
_op3 <span class="sy1">=</span> <span class="st0">'-'</span><span class="sy0">.<
/span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPWHEN.htm"><spa
n class="kw1">when</span></a> <span class="nu0">4</span><span class="sy0">.</spa
n><br/>
lv_op3 <span class="sy1">=</span> <span class="st0">'/'</span
><span class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/
en/ABAPENDCASE.htm"><span class="kw1">endcase</span></a><span class="sy0">.</spa
n><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPCONCATENATE.htm"><
span class="kw3">concatenate</span></a> <span class="st0">'('</span> <span class
="st0">'('</span> lv_var1 lv_op1 lv_var2 <span class="st0">')'</span> lv_op2 lv_
var3 <span class="st0">')'</span> lv_op3 lv_var4 <span class="kw4">into</span>
lv_eval <span class="kw9">separated by</span> <span class="kw4">space</span><spa
n class="sy0">.</span><br/>
retrieve_val<span class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPCONCATENATE.htm"><span cl
ass="kw3">concatenate</span></a> <span class="st0">'('</span> lv_var1 lv_op1 lv_
var2 <span class="st0">')'</span> lv_op2 <span class="st0">'('</span> lv_var3 lv
_op3 lv_var4 <span class="st0">')'</span> <span class="kw4">into</span> lv_eval
<span class="kw9">separated by</span> <span class="kw4">space</span><span class
="sy0">.</span><br/>
retrieve_val<span class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPCONCATENATE.htm"><span class="kw
3">concatenate</span></a> <span class="st0">'('</span> lv_var1 lv_op1 <span clas
s="st0">'('</span> lv_var2 lv_op2 lv_var3 <span class="st0">')'</span> <span cla
ss="st0">')'</span> lv_op3 lv_var4 <span class="kw4">into</span> lv_eval <span
class="kw9">separated by</span> <span class="kw4">space</span><span class="sy0">
.</span><br/>
retrieve_val<span class="sy0">.</span><br/>
<a h
ref="http://help.sap.com/abapdocu/en/ABAPCONCATENATE.htm"><span class="kw3">conc
atenate</span></a> lv_var1 lv_op1 <span class="st0">'('</span> <span class="st0"
>'('</span> lv_var2 lv_op2 lv_var3 <span class="st0">')'</span> lv_op3 lv_var4 <
span class="st0">')'</span> <span class="kw4">into</span> lv_eval <span class="
kw9">separated by</span> <span class="kw4">space</span><span class="sy0">.</span
><br/>
retrieve_val<span class="sy0">.</span><br/>
<a href="ht
tp://help.sap.com/abapdocu/en/ABAPCONCATENATE.htm"><span class="kw3">concatenate
</span></a> lv_var1 lv_op1 <span class="st0">'('</span> lv_var2 lv_op2 <span cla
ss="st0">'('</span> lv_var3 lv_op3 lv_var4 <span class="st0">')'</span> <span cl
ass="st0">')'</span> <span class="kw4">into</span> lv_eval <span class="kw9">se
parated by</span> <span class="kw4">space</span><span class="sy0">.</span><br/>
retrieve_val<span class="sy0">.</span><br/>
<a href="http://help
.sap.com/abapdocu/en/ABAPENDDO.htm"><span class="kw1">enddo</span></a><span clas
s="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPENDDO.ht
m"><span class="kw1">enddo</span></a><span class="sy0">.</span><br/>
<a href=
"http://help.sap.com/abapdocu/en/ABAPENDDO.htm"><span class="kw1">enddo</span></
a><span class="sy0">.</span><br/>&#160;<br/>
<span class="co1">&quot; Once we
've reached the last permutation -&gt; Exit.</span><br/>
<a href="http://help
.sap.com/abapdocu/en/ABAPPERFORM.htm"><span class="kw3">perform</span></a> permu
te <span class="kw4">using</span> it_numbers <span class="kw4">changing</span> l

v_flag<span class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/e
n/ABAPIF.htm"><span class="kw1">if</span></a> lv_flag <span class="sy1">=</span>
<span class="st0">'X'</span><span class="sy0">.</span><br/>
<a href="http:
//help.sap.com/abapdocu/en/ABAPEXIT.htm"><span class="kw1">exit</span></a><span
class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPENDIF.
htm"><span class="kw1">endif</span></a><span class="sy0">.</span><br/> <a href=
"http://help.sap.com/abapdocu/en/ABAPENDDO.htm"><span class="kw1">enddo</span></
a><span class="sy0">.</span><br/><a href="http://help.sap.com/abapdocu/en/ABAPEN
DFORM.htm"><span class="kw3">endform</span></a><span class="sy0">.</span><br/>&#
160;<br/>&#160;<br/><span class="co1">&quot; Permutation function - this is used
to permute:</span><br/><span class="co1">&quot; A = {A1...AN} -&gt; Set of supp
lied variables.</span><br/><span class="co1">&quot; B = {B1...BN - 1} -&gt; Set
of operators.</span><br/><span class="co1">&quot; Can be used for an unbounded s
ize set. Relies</span><br/><span class="co1">&quot; on lexicographic ordering of
the set.</span><br/><a href="http://help.sap.com/abapdocu/en/ABAPFORM.htm"><spa
n class="kw3">form</span></a> permute <span class="kw4">using</span> iv_set <spa
n class="kw4">like</span> lt_numbers<br/>
<span class="kw4">changing
</span> ev_last <span class="kw4">type</span> c<span class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPDATA.htm"><span class="kw2">data</s
pan></a><span class="sy0">:</span> lv_len
<span class="kw4">type</span> i<sp
an class="sy0">,</span><br/>
lv_first <span class="kw4">type</span> i<s
pan class="sy0">,</span><br/>
lv_third <span class="kw4">type</span> i<
span class="sy0">,</span><br/>
lv_count <span class="kw4">type</span> i
<span class="sy0">,</span><br/>
lv_temp
<span class="kw4">type</span>
i<span class="sy0">,</span><br/>
lv_temp_2 <span class="kw4">type</span>
i<span class="sy0">,</span><br/>
lv_second <span class="kw4">type</span
> i<span class="sy0">,</span><br/>
lv_changed <span class="kw4">type</spa
n> c<span class="sy0">,</span><br/>
lv_perm
<span class="kw4">type</sp
an> i<span class="sy0">.</span><br/> <span class="kw8">describe table</span> iv
_set <span class="kw4">lines</span> lv_len<span class="sy0">.</span><br/>&#160;<
br/> lv_perm <span class="sy1">=</span> lv_len <span class="sy0">-</span> <span
class="nu0">1</span><span class="sy0">.</span><br/> lv_changed <span class="sy
1">=</span> <span class="st0">' '</span><span class="sy0">.</span><br/> <span c
lass="co1">&quot; Loop backwards through the table, attempting to find elements
which</span><br/> <span class="co1">&quot; can be permuted. If we find one, bre
ak out of the table and set the</span><br/> <span class="co1">&quot; flag indic
ating a switch.</span><br/> <a href="http://help.sap.com/abapdocu/en/ABAPDO.htm
"><span class="kw1">do</span></a><span class="sy0">.</span><br/>
<a href="htt
p://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> lv_perm
<span class="sy1">&lt;=</span> <span class="nu0">0</span><span class="sy0">.</s
pan><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPEXIT.htm"><span clas
s="kw1">exit</span></a><span class="sy0">.</span><br/>
<a href="http://help.s
ap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class=
"sy0">.</span><br/>
<span class="co1">&quot; Read the elements.</span><br/>
<span class="kw8">read table</span> iv_set <span class="kw4">index</span> lv_p
erm <span class="kw4">into</span> lv_first<span class="sy0">.</span><br/>
<a
href="http://help.sap.com/abapdocu/en/ABAPADD.htm"><span class="kw3">add</span><
/a> <span class="nu0">1</span> <span class="kw4">to</span> lv_perm<span class="s
y0">.</span><br/>
<span class="kw8">read table</span> iv_set <span class="kw4
">index</span> lv_perm <span class="kw4">into</span> lv_second<span class="sy0">
.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPSUBTRACT.htm"><spa
n class="kw3">subtract</span></a> <span class="nu0">1</span> <span class="kw4">f
rom</span> lv_perm<span class="sy0">.</span><br/>
<a href="http://help.sap.co
m/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> lv_first <span class="
sy1">&lt;</span> lv_second<span class="sy0">.</span><br/>
lv_changed <span
class="sy1">=</span> <span class="st0">'X'</span><span class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPEXIT.htm"><span class="kw1">e
xit</span></a><span class="sy0">.</span><br/>
<a href="http://help.sap.com/ab
apdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</
span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPSUBTRACT.htm"><span c

lass="kw3">subtract</span></a> <span class="nu0">1</span> <span class="kw4">from


</span> lv_perm<span class="sy0">.</span><br/> <a href="http://help.sap.com/aba
pdocu/en/ABAPENDDO.htm"><span class="kw1">enddo</span></a><span class="sy0">.</s
pan><br/>&#160;<br/> <span class="co1">&quot; Last permutation.</span><br/> <a
href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></
a> lv_changed <span class="sy1">&lt;&gt;</span> <span class="st0">'X'</span><spa
n class="sy0">.</span><br/>
ev_last <span class="sy1">=</span> <span class="s
t0">'X'</span><span class="sy0">.</span><br/>
<a href="http://help.sap.com/ab
apdocu/en/ABAPEXIT.htm"><span class="kw1">exit</span></a><span class="sy0">.</sp
an><br/> <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="k
w1">endif</span></a><span class="sy0">.</span><br/>&#160;<br/> <span class="co1
">&quot; Swap tail decresing to get a tail increasing.</span><br/> lv_count <sp
an class="sy1">=</span> lv_perm <span class="sy0">+</span> <span class="nu0">1</
span><span class="sy0">.</span><br/> <a href="http://help.sap.com/abapdocu/en/A
BAPDO.htm"><span class="kw1">do</span></a><span class="sy0">.</span><br/>
lv_
first <span class="sy1">=</span> lv_len <span class="sy0">+</span> lv_perm <span
class="sy0">-</span> lv_count <span class="sy0">+</span> <span class="nu0">1</s
pan><span class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/
ABAPIF.htm"><span class="kw1">if</span></a> lv_count <span class="sy1">&gt;=</sp
an> lv_first<span class="sy0">.</span><br/>
<a href="http://help.sap.com/ab
apdocu/en/ABAPEXIT.htm"><span class="kw1">exit</span></a><span class="sy0">.</sp
an><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class=
"kw1">endif</span></a><span class="sy0">.</span><br/>&#160;<br/>
<span class=
"kw8">read table</span> iv_set <span class="kw4">index</span> lv_count <span cla
ss="kw4">into</span> lv_temp<span class="sy0">.</span><br/>
<span class="kw8"
>read table</span> iv_set <span class="kw4">index</span> lv_first <span class="k
w4">into</span> lv_temp_2<span class="sy0">.</span><br/>
<a href="http://help
.sap.com/abapdocu/en/ABAPMODIFY.htm"><span class="kw3">modify</span></a> iv_set
<span class="kw4">index</span> lv_count <span class="kw4">from</span> lv_temp_2<
span class="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPM
ODIFY.htm"><span class="kw3">modify</span></a> iv_set <span class="kw4">index</s
pan> lv_first <span class="kw4">from</span> lv_temp<span class="sy0">.</span><br
/>
<a href="http://help.sap.com/abapdocu/en/ABAPADD.htm"><span class="kw3">ad
d</span></a> <span class="nu0">1</span> <span class="kw4">to</span> lv_count<spa
n class="sy0">.</span><br/> <a href="http://help.sap.com/abapdocu/en/ABAPENDDO.
htm"><span class="kw1">enddo</span></a><span class="sy0">.</span><br/>&#160;<br/
> lv_count <span class="sy1">=</span> lv_len <span class="sy0">-</span> <span c
lass="nu0">1</span><span class="sy0">.</span><br/> <a href="http://help.sap.com
/abapdocu/en/ABAPDO.htm"><span class="kw1">do</span></a><span class="sy0">.</spa
n><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1
">if</span></a> lv_count <span class="sy1">&lt;=</span> lv_perm<span class="sy0"
>.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPEXIT.htm"><span
class="kw1">exit</span></a><span class="sy0">.</span><br/>
<a href="http://h
elp.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span c
lass="sy0">.</span><br/>&#160;<br/>
<span class="kw8">read table</span> iv_se
t <span class="kw4">index</span> lv_count <span class="kw4">into</span> lv_first
<span class="sy0">.</span><br/>
<span class="kw8">read table</span> iv_set <s
pan class="kw4">index</span> lv_perm <span class="kw4">into</span> lv_second<spa
n class="sy0">.</span><br/>
<span class="kw8">read table</span> iv_set <span
class="kw4">index</span> lv_len <span class="kw4">into</span> lv_third<span clas
s="sy0">.</span><br/>
<a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><s
pan class="kw1">if</span></a> <span class="br0">&#40;</span> lv_first <span clas
s="sy1">&lt;</span> lv_third <span class="br0">&#41;</span> <span class="kw4">an
d</span> <span class="br0">&#40;</span> lv_first <span class="sy1">&gt;</span> l
v_second <span class="br0">&#41;</span><span class="sy0">.</span><br/>
lv_l
en <span class="sy1">=</span> lv_count<span class="sy0">.</span><br/>
<a href
="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span><
/a><span class="sy0">.</span><br/>&#160;<br/>
<a href="http://help.sap.com/ab
apdocu/en/ABAPSUBTRACT.htm"><span class="kw3">subtract</span></a> <span class="n
u0">1</span> <span class="kw4">from</span> lv_count<span class="sy0">.</span><br

/> <a href="http://help.sap.com/abapdocu/en/ABAPENDDO.htm"><span class="kw1">en


ddo</span></a><span class="sy0">.</span><br/>&#160;<br/> <span class="kw8">read
table</span> iv_set <span class="kw4">index</span> lv_perm <span class="kw4">in
to</span> lv_temp<span class="sy0">.</span><br/> <span class="kw8">read table</
span> iv_set <span class="kw4">index</span> lv_len <span class="kw4">into</span>
lv_temp_2<span class="sy0">.</span><br/> <a href="http://help.sap.com/abapdocu
/en/ABAPMODIFY.htm"><span class="kw3">modify</span></a> iv_set <span class="kw4"
>index</span> lv_perm <span class="kw4">from</span> lv_temp_2<span class="sy0">.
</span><br/> <a href="http://help.sap.com/abapdocu/en/ABAPMODIFY.htm"><span cla
ss="kw3">modify</span></a> iv_set <span class="kw4">index</span> lv_len <span cl
ass="kw4">from</span> lv_temp<span class="sy0">.</span><br/><a href="http://help
.sap.com/abapdocu/en/ABAPENDFORM.htm"><span class="kw3">endform</span></a><span
class="sy0">.</span></pre>
<p>Sample Runs:
</p>
<pre style="height:30ex;overflow:scroll">
Evaluating 24 with the following input: 1 1 2 7
( 1 + 2 ) * ( 1 + 7 )
( 1 + 2 ) * ( 7 + 1 )
( 1 + 7 ) * ( 1 + 2 )
( 1 + 7 ) * ( 2 + 1 )
( 2 + 1 ) * ( 1 + 7 )
( 2 + 1 ) * ( 7 + 1 )
( 7 + 1 ) * ( 1 + 2 )
( 7 + 1 ) * ( 2 + 1 )
Evaluating 24
( ( 1 + 2 ) +
( 1 + ( 2 + 3
( ( 1 * 2 ) *
( 1 * 2 ) * (
( 1 * ( 2 * 3
1 * ( ( 2 * 3
1 * ( 2 * ( 3
( ( 1 * 2 ) *
( 1 * 2 ) * (
( 1 * ( 2 * 4
1 * ( ( 2 * 4
1 * ( 2 * ( 4
( ( 1 + 3 ) +
( 1 + ( 3 + 2
( 1 + 3 ) * (
( ( 1 * 3 ) *
( 1 * 3 ) * (
( 1 * ( 3 * 2
1 * ( ( 3 * 2
1 * ( 3 * ( 2
( 1 + 3 ) * (
( ( 1 * 3 ) *
( 1 * 3 ) * (
( 1 * ( 3 * 4
1 * ( ( 3 * 4
1 * ( 3 * ( 4
( ( 1 * 4 ) *
( 1 * 4 ) * (
( 1 * ( 4 * 2
1 * ( ( 4 * 2
1 * ( 4 * ( 2
( ( 1 * 4 ) *
( 1 * 4 ) * (

with the following input: 1


3 ) * 4
) ) * 4
3 ) * 4
3 * 4 )
) ) * 4
) * 4 )
* 4 ) )
4 ) * 3
4 * 3 )
) ) * 3
) * 3 )
* 3 ) )
2 ) * 4
) ) * 4
2 + 4 )
2 ) * 4
2 * 4 )
) ) * 4
) * 4 )
* 4 ) )
4 + 2 )
4 ) * 2
4 * 2 )
) ) * 2
) * 2 )
* 2 ) )
2 ) * 3
2 * 3 )
) ) * 3
) * 3 )
* 3 ) )
3 ) * 2
3 * 2 )

(
1
1
(
(
(
(
(
2
2
(
(
(
2
2
(
(
(
2
2
(
(
(
2
2
(
(
(
(
(
2
2
(
(
2
(
2
(
(
(
2
2
(
(
(
2
2
(
(
(
(
2
2
(
(
2
(
2
(
(

1
*
*
(
2
(
2
2
*
*
(
2
2
/
/
(
2
2
*
*
(
2
2
/
/
(
2
(
2
2
*
*
(
2
*
2
*
(
2
2
*
*
(
2
2
*
*
2
(
2
2
*
*
(
2
*
2
*
2
(

*
(
(
2
+
2
*
*
(
(
2
/
/
(
(
2
*
*
(
(
2
/
/
(
(
2
+
2
*
*
(
(
2
*
(
*
(
2
*
*
(
(
2
*
*
(
(
+
2
*
*
(
(
2
*
(
*
(
+
2

(
(
4
+
(
*
1
(
(
1
/
1
(
1
(
*
1
(
(
1
/
1
(
1
(
+
(
*
3
(
(
3
*
(
(
3
3
*
3
(
(
3
*
3
(
(
3
4
*
4
(
(
4
*
(
(
4
4
4
*

4
4
*
1
1
1
)
1
1
*
1
)
1
/
1
1
)
1
1
*
1
)
1
/
1
3
3
3
)
3
3
*
3
3
3
)
/
3
)
3
3
*
3
)
3
3
*
)
4
)
4
4
*
4
4
4
)
/
)
4

*
*
(
)
+
)
*
*
*
(
)
*
/
(
/
)
*
*
*
(
)
*
/
(
/
)
+
)
*
*
*
(
)
/
/
/
(
)
*
*
*
(
)
*
*
*
(
*
)
*
*
*
(
)
/
/
/
(
*
)

3
3
3
+
3
*
(
3
3
3
*
(
3
3
3
*
(
4
4
4
*
(
4
4
4
+
1
*
(
1
1
1
/
1
1
(
1
*
(
4
4
4
*
(
4
4
4
(
*
(
1
1
1
/
1
1
(
1
(
*

)
)
*
3
)
3
3
)
)
*
3
3
)
*
)
4
4
)
)
*
4
4
)
*
)
1
)
1
1
)
)
*
1
)
)
1
/
4
4
)
)
*
4
4
)
)
/
1
1
1
)
)
*
1
)
)
1
/
3
3

)
*
2
)
)
)
*
)
*
4
)
*
)
4
/
)
*
)
*
3
)
*
)
3
/
)
)
)
*
)
*
4
)
)
*
/
4
)
*
)
*
1
)
/
)
/
1
+
)
*
)
*
3
)
)
*
/
3
+
)

*
2
)
*
*
*
4
*
4
)
*
4
*
)
4
*
3
*
3
)
*
3
*
)
3
*
*
*
4
*
4
)
*
*
4
4
)
*
1
*
1
)
/
1
/
1
)
3
*
3
*
3
)
*
*
3
3
)
1
*

2
)
)
4
4
4
)
4
)
)
4
)
4
)
)
3
)
3
)
)
3
)
3
)
)
4
4
4
)
4
)
)
4
4
)
)
)
1
)
1
)
)
1
)
1
)
)
)
3
)
3
)
)
3
3
)
)
)
)
1

(
(
2
2
(
(
(
2
2
(
(
(
(
(
(
3
3
(
(
(
3
3
(
(
(
(
3
3
(
(
(
3
3
(
(
(
(
(
3
3
(
(
3
(
3
(
(
(
3
3
(
(
(
3
3
(
(
(
3
3

2
2
*
*
(
2
2
*
*
(
3
3
(
3
3
*
*
(
3
3
/
/
3
(
3
3
*
*
(
3
3
/
/
(
3
(
3
3
*
*
(
3
*
3
*
(
3
3
*
*
(
3
3
*
*
(
3
3
*
*

*
*
(
(
2
*
*
(
(
3
+
+
3
*
*
(
(
3
/
/
(
(
+
3
*
*
(
(
3
/
/
(
(
3
+
3
*
*
(
(
3
*
(
*
(
3
*
*
(
(
3
*
*
(
(
3
*
*
(
(

4
(
(
4
*
4
(
(
4
+
(
1
*
1
(
(
1
/
1
(
1
(
1
*
1
(
(
1
/
1
(
1
(
+
(
*
2
(
(
2
*
(
(
2
2
*
2
(
(
2
*
2
(
(
2
*
4
(
(
4

)
4
4
*
4
)
4
4
*
1
1
)
1
)
1
1
*
1
)
1
/
1
)
1
)
1
1
*
1
)
1
/
1
2
2
2
)
2
2
*
2
2
2
)
/
2
)
2
2
*
2
)
2
2
*
4
)
4
4
*

*
*
*
(
)
*
*
*
(
)
+
*
)
*
*
*
(
)
*
/
(
/
*
)
*
*
*
(
)
*
/
(
/
)
+
)
*
*
*
(
)
/
/
/
(
)
*
*
*
(
)
*
*
*
(
)
*
*
*
(

(
3
3
3
*
(
3
3
3
+
2
(
*
(
2
2
2
*
(
2
2
2
(
*
(
4
4
4
*
(
4
4
4
+
1
*
(
1
1
1
/
1
1
(
1
*
(
4
4
4
*
(
4
4
4
*
(
1
1
1

3
)
)
*
3
3
)
)
/
2
)
2
2
2
)
)
*
2
2
)
*
)
4
4
4
)
)
*
4
4
)
*
)
1
)
1
1
)
)
*
1
)
)
1
/
4
4
)
)
*
4
4
)
)
/
1
1
)
)
*

*
)
*
1
)
/
)
/
1
)
)
+
)
*
)
*
4
)
*
)
4
/
+
)
*
)
*
2
)
*
)
2
/
)
)
)
*
)
*
4
)
)
*
/
4
)
*
)
*
1
)
/
)
/
1
)
*
)
*
2

1
*
1
)
/
1
/
1
)
*
*
4
*
4
*
4
)
*
4
*
)
4
2
*
2
*
2
)
*
2
*
)
2
*
*
*
4
*
4
)
*
*
4
4
)
*
1
*
1
)
/
1
/
1
)
*
2
*
2
)

)
1
)
)
1
)
1
)
)
4
4
)
4
)
4
)
)
4
)
4
)
)
)
2
)
2
)
)
2
)
2
)
)
4
4
4
)
4
)
)
4
4
)
)
)
1
)
1
)
)
1
)
1
)
)
2
)
2
)
)

(
(
3
(
3
(
(
(
3
3
(
(
(
3
3
4
4
(
(
(
4
4
(
(
(
4
4
4
4
(
(
(
4
4
(
(
(
4
4
(
4
4
(
(
(
4
4
(
(
4
(
4
(
4
4
(
(
(
4
4

(
3
*
3
*
(
3
3
*
*
(
3
3
*
*
*
*
(
4
4
*
*
(
4
4
/
/
*
*
(
4
4
*
*
(
4
4
/
/
4
*
*
(
4
4
*
*
(
4
*
4
*
4
*
*
(
4
4
*
*

3
*
(
*
(
3
*
*
(
(
3
*
*
(
(
(
(
4
*
*
(
(
4
/
/
(
(
(
(
4
*
*
(
(
4
/
/
(
(
+
(
(
4
*
*
(
(
4
*
(
*
(
+
(
(
4
*
*
(
(

*
(
(
4
4
*
4
(
(
4
*
4
(
(
4
(
1
*
1
(
(
1
/
1
(
1
(
(
1
*
1
(
(
1
/
1
(
1
(
2
(
2
*
2
(
(
2
*
(
(
2
2
2
(
2
*
2
(
(
2

4
4
4
)
/
4
)
4
4
*
4
)
4
4
*
1
+
1
)
1
1
*
1
)
1
/
1
1
+
1
)
1
1
*
1
)
1
/
1
)
2
+
2
)
2
2
*
2
2
2
)
/
)
2
+
2
)
2
2
*

)
/
/
/
(
)
*
*
*
(
)
*
*
*
(
+
(
)
*
*
*
(
)
*
/
(
/
+
(
)
*
*
*
(
)
*
/
(
/
*
+
(
)
*
*
*
(
)
/
/
/
(
*
+
(
)
*
*
*
(

/
1
1
(
1
*
(
2
2
2
*
(
2
2
2
2
2
*
(
2
2
2
*
(
2
2
2
3
3
*
(
3
3
3
*
(
3
3
3
(
1
1
*
(
1
1
1
/
1
1
(
1
(
3
3
*
(
3
3
3

1
)
)
1
/
2
2
)
)
*
2
2
)
)
/
)
+
2
2
)
)
*
2
2
)
*
)
)
+
3
3
)
)
*
3
3
)
*
)
1
)
+
1
1
)
)
*
1
)
)
1
/
3
)
+
3
3
)
)
*

)
)
*
/
2
)
*
)
*
1
)
/
)
/
1
+
3
)
*
)
*
3
)
*
)
3
/
+
2
)
*
)
*
2
)
*
)
2
/
+
+
3
)
*
)
*
3
)
)
*
/
3
+
+
1
)
*
)
*
1

*
*
2
2
)
*
1
*
1
)
/
1
/
1
)
3
)
*
3
*
3
)
*
3
*
)
3
2
)
*
2
*
2
)
*
2
*
)
2
3
3
)
*
3
*
3
)
*
*
3
3
)
1
1
)
*
1
*
1
)

2
2
)
)
)
1
)
1
)
)
1
)
1
)
)
)
)
3
)
3
)
)
3
)
3
)
)
)
)
2
)
2
)
)
2
)
2
)
)
)
)
)
3
)
3
)
)
3
3
)
)
)
)
)
)
1
)
1
)
)

(
(
(
4
4
4
4
(
(
(
4
4
(
(
4
(
4
4
4
(
(
(
4
4
(
(
(
4
4

(
4
4
*
*
*
*
(
4
4
*
*
(
4
*
4
*
*
*
(
4
4
*
*
(
4
4
*
*

4
*
*
(
(
(
(
4
*
*
(
(
4
*
(
*
(
(
(
4
*
*
(
(
4
*
*
(
(

*
2
(
(
2
(
3
*
3
(
(
3
*
(
(
3
3
(
3
*
3
(
(
3
*
3
(
(
3

2
)
2
2
*
3
+
3
)
3
3
*
3
3
3
)
/
3
+
3
)
3
3
*
3
)
3
3
*

)
*
*
*
(
+
(
)
*
*
*
(
)
/
/
/
(
+
(
)
*
*
*
(
)
*
*
*
(

*
(
3
3
3
1
1
*
(
1
1
1
/
1
1
(
1
2
2
*
(
2
2
2
*
(
2
2
2

Evaluating 24
5 * ( 6 - ( 8
( 5 + 7 ) * (
( ( 5 + 7 ) ( 5 + ( 7 - 8
( ( 5 - 8 ) +
( 5 - ( 8 - 7
6 * ( ( 5 + 7
6 * ( 5 + ( 7
6 * ( ( 5 - 8
6 * ( 5 - ( 8
6 * ( ( 7 + 5
6 * ( 7 + ( 5
( 6 / ( 7 - 5
6 / ( ( 7 - 5
6 * ( ( 7 - 8
6 * ( 7 - ( 8
( 6 * 8 ) / (
6 * ( 8 / ( 7
( 6 - ( 8 / 7
( 7 + 5 ) * (
( ( 7 + 5 ) ( 7 + ( 5 - 8
( ( 7 - 8 ) +
( 7 - ( 8 - 5
( 8 - 6 ) * (
( 8 * 6 ) / (
8 * ( 6 / ( 7
( 8 - 6 ) * (
( 8 / ( 7 - 5

3
3
)
)
/
)
+
1
1
)
)
*
1
)
)
1
/
)
+
2
2
)
)
*
2
2
)
)
/

)
/
)
/
1
+
2
)
*
)
*
2
)
)
*
/
2
+
1
)
*
)
*
1
)
/
)
/
1

/
1
/
1
)
2
)
*
2
*
2
)
*
*
2
2
)
1
)
*
1
*
1
)
/
1
/
1
)

1
)
1
)
)
)
)
2
)
2
)
)
2
2
)
)
)
)
)
1
)
1
)
)
1
)
1
)
)

with the following input: 5 6 7 8


/ 7 ) )
8 - 6 )
8 ) * 6
) ) * 6
7 ) * 6
) ) * 6
) - 8 )
- 8 ) )
) + 7 )
- 7 ) )
) - 8 )
- 8 ) )
) ) * 8
) / 8 )
) + 5 )
- 5 ) )
7 - 5 )
- 5 ) )
) ) * 5
8 - 6 )
8 ) * 6
) ) * 6
5 ) * 6
) ) * 6
5 + 7 )
7 - 5 )
- 5 ) )
7 + 5 )
) ) * 6

8 / ( ( 7 - 5 ) / 6 )
</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=2" title="Edit section: Argile">edit</a>]</span> <span cla
ss="mw-headline" id="Argile"><a href="/wiki/Category:Argile" title="Category:Arg
ile">Argile</a></span></h2>
<div class="examplemeta workswith"><b>Works with</b>: <a href="/wiki/Argile" tit
le="Argile" class="mw-redirect">Argile</a> version 1.0.0</div>
<pre class="text highlighted_source">die &quot;Please give 4 digits as argument
1\n&quot; if argc &lt; 2<br/>&#160;<br/>print a function that given four digits
argv[1] subject to the rules of \<br/>the _24_ game, computes an expression to s
olve the game if possible.<br/>&#160;<br/>use std, array<br/>&#160;<br/>let digi
ts
be an array of 4 byte<br/>let operators be an array of 4 byte<br/>(: reord
ered arrays&#160;:)<br/>let (type of digits)
rdigits<br/>let (type of operato
rs) roperators<br/>&#160;<br/>.: a function that given four digits &lt;text digi
ts&gt; subject to<br/> the rules of the _24_ game, computes an expression to s
olve<br/> the game if possible.
&#160;:.
-&gt; text<br/> if #digits&#160;!= 4 {return &quot;[error: need exactly 4 digit
s]&quot;}<br/> operators[0] = '+'&#160;; operators[1] = '-'<br/> operators[2]
= '*'&#160;; operators[3] = '/'<br/> for each (val int d) from 0 to 3<br/>
i
f (digits[d] &lt; '1') || (digits[d] &gt; '9')<br/>
return &quot;[error: no
n-digit character given]&quot;<br/>
(super digits)[d] = digits[d]<br/> let e
xpr = for each operand order stuff<br/> return &quot;&quot; if expr is nil<br/>
expr<br/>&#160;<br/>.:for each operand order stuff:. -&gt; text<br/> for each
(val int a) from 0 to 3<br/>
for each (val int b) from 0 to 3<br/>
next
if (b == a)<br/>
for each (val int c) from 0 to 3<br/>
next if (c =
= b) or (c == a)<br/> for each (val int d) from 0 to 3<br/>
next if (d ==
c) or (d == b) or (d == a)<br/> rdigits[0] = digits[a]&#160;; rdigits[1] = dig
its[b]<br/>
rdigits[2] = digits[c]&#160;; rdigits[3] = digits[d]<br/>
let found = for each operator order stuff<br/>
return found unless fo
und is nil<br/> nil<br/>&#160;<br/>.:for each operator order stuff:. -&gt; text
<br/> for each (val int i) from 0 to 3<br/>
for each (val int j) from 0 to 3
<br/>
for each (val int k) from 0 to 3<br/>
roperators[0] = operator
s[i]<br/>
roperators[1] = operators[j]<br/>
roperators[2] = operator
s[k]<br/>
let found = for each RPN pattern stuff<br/>
return found if
found isn't nil<br/> nil<br/>&#160;<br/>our (raw array of text) RPN_patterns =
Cdata<br/> &quot;xx.x.x.&quot;<br/> &quot;xx.xx..&quot;<br/> &quot;xxx..x.&qu
ot;<br/> &quot;xxx.x..&quot;<br/> &quot;xxxx...&quot;<br/>our (raw array of te
xt) formats = Cdata<br/> &quot;((%c%c%c)%c%c)%c%c&quot;<br/> &quot;(%c%c%c)%c(
%c%c%c)&quot;<br/> &quot;(%c%c(%c%c%c))%c%c&quot;<br/> &quot;%c%c((%c%c%c)%c%c
)&quot;<br/> &quot;%c%c(%c%c(%c%c%c))&quot;<br/>our (raw array of array of 3 in
t) rrop = Cdata<br/> {0;1;2}; {0;2;1}; {1;0;2}; {2;0;1}; {2;1;0}<br/>&#160;<br/
>.:for each RPN pattern stuff:. -&gt; text<br/> let RPN_stack be an array of 4
real<br/> for each (val int rpn) from 0 to 4<br/>
let (nat) sp=0, op=0, dg=0
.<br/>
let text p<br/>
for (p = RPN_patterns[rpn]) (*p&#160;!= 0) (p++)<br
/>
if *p == 'x'<br/>
if sp &gt;= 4 {die &quot;RPN stack overflow\n&q
uot;}<br/>
if dg &gt; 3 {die &quot;RPN digits overflow\n&quot;}<br/>
RPN_stack[sp++] = (rdigits[dg++] - '0') as real<br/>
if *p == '.'<br/>
if sp &lt; 2 {die &quot;RPN stack underflow\n&quot;}<br/>
if op &gt; 2 {di
e &quot;RPN operators overflow\n&quot;}<br/>
sp -= 2<br/>
let x = RPN_stac
k[sp]<br/>
let y = RPN_stack[sp + 1]<br/> switch roperators[op++]<br/>
case '+' {x += y}<br/>
case '-' {x -= y}<br/>
case '*' {x *=
y}<br/>
case '/' {x /= y}<br/>
default {die &quot;RPN operat
or unknown\n&quot;}<br/>
RPN_stack[sp++] = x<br/>
if RPN_stack[0] == 2
4.0<br/>
our array of 12 byte buffer (: 4 paren + 3 ops + 4 digits + null&#
160;:)<br/>
snprintf (buffer as text) (size of buffer) (formats[rpn])
\<br/>
(rdigits[0]) (roperators[(rrop[rpn][0])]) (rdigits[1])
\<br/>
(roperators[(rrop[rpn][1])]) (rdigits[2])
\<br/>
(roperators[(rrop[rpn][2])]) (rdigits[3]);<br/>
return buffer as text<br/> nil</pre>

<p>Examples:
</p>
<pre>$ arc 24_game_solve.arg -o 24_game_solve.c
$ gcc -Wall 24_game_solve.c -o 24_game_solve
$ ./24_game_solve 1234
((1+2)+3)*4
$ ./24_game_solve 9999
$ ./24_game_solve 5678
((5+7)-8)*6
$ ./24_game_solve 1127
(1+2)*(1+7)</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=3" title="Edit section: AutoHotkey">edit</a>]</span> <span
class="mw-headline" id="AutoHotkey"><a href="/wiki/Category:AutoHotkey" title="
Category:AutoHotkey">AutoHotkey</a></span></h2>
<div class="examplemeta workswith"><b>Works with</b>: <a href="/wiki/AutoHotkey_
L" title="AutoHotkey L" class="mw-redirect">AutoHotkey_L</a></div>
<p>Output is in RPN.
</p>
<pre class="ahk highlighted_source"><a href="http://www.autohotkey.com/docs/comm
ands/_NoEnv.htm"><span class="kw5">#NoEnv</span></a><br/><a href="http://www.aut
ohotkey.com/docs/commands/InputBox.htm"><span class="kw3">InputBox</span></a><sp
an class="sy0">,</span> NNNN
<span class="co1">; user input 4 digits</span
><br/>NNNN <span class="sy0">:=</span> <a href="http://www.autohotkey.com/docs/c
ommands/RegExReplace.htm"><span class="kw3">RegExReplace</span></a><span class="
br0">&#40;</span>NNNN<span class="sy0">,</span> <span class="st0">&quot;(\d)(?=\
d)&quot;</span><span class="sy0">,</span> <span class="st0">&quot;$1,&quot;</spa
n><span class="br0">&#41;</span> <span class="co1">; separate with commas for th
e sort command</span><br/><a href="http://www.autohotkey.com/docs/commands/Sort.
htm"><span class="kw3">sort</span></a> NNNN<span class="sy0">,</span> d`<span cl
ass="sy0">,</span> <span class="co1">; sort in ascending order for the permutati
ons to work</span><br/><a href="http://www.autohotkey.com/docs/commands/StringRe
place.htm"><span class="kw3">StringReplace</span></a> NNNN<span class="sy0">,</s
pan> NNNN<span class="sy0">,</span> `<span class="sy0">,,</span> <span class="sy
0">,</span> All <span class="co1">; remove comma separators after sorting</span>
<br/>&#160;<br/>ops <span class="sy0">:=</span> <span class="st0">&quot;+-*/&quo
t;</span><br/>patterns <span class="sy0">:=</span> <span class="br0">&#91;</span
>
<span class="st0">&quot;x x.x.x.&quot;</span><br/>
<span cl
ass="sy0">,</span><span class="st0">&quot;x x.x x..&quot;</span><br/>
<span class="sy0">,</span><span class="st0">&quot;x x x..x.&quot;</span><br/>
<span class="sy0">,</span><span class="st0">&quot;x x x.x..&quot;</span><br/>
<span class="sy0">,</span><span class="st0">&quot;x x x x...&quot;</span>
<span class="br0">&#93;</span><br/>&#160;<br/><span class="co1">; build brutefor
ce operator list (&quot;+++, ++-, ++* ... ///&quot;)</span><br/>a <span class="s
y0">:=</span> b <span class="sy0">:=</span> c <span class="sy0">:=</span> <span
class="nu0">0</span><br/><span class="kw1">While</span> <span class="br0">&#40;<
/span><span class="sy0">++</span>a<span class="sy0">&lt;</span><span class="nu0"
>5</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br/> <spa
n class="kw1">While</span> <span class="br0">&#40;</span><span class="sy0">++</s
pan>b<span class="sy0">&lt;</span><span class="nu0">5</span><span class="br0">&#
41;</span><span class="br0">&#123;</span><br/> <span class="kw1">While</span> <
span class="br0">&#40;</span><span class="sy0">++</span>c<span class="sy0">&lt;<
/span><span class="nu0">5</span><span class="br0">&#41;</span><span class="br0">
&#123;</span><br/> l <span class="sy0">:=</span> <a href="http://www.autohotke
y.com/docs/Functions.htm#BuiltIn"><span class="kw4">SubStr</span></a><span class
="br0">&#40;</span>ops<span class="sy0">,</span> a<span class="sy0">,</span> <sp
an class="nu0">1</span><span class="br0">&#41;</span> <span class="sy0">.</span>
<a href="http://www.autohotkey.com/docs/Functions.htm#BuiltIn"><span class="kw4
">SubStr</span></a><span class="br0">&#40;</span>ops<span class="sy0">,</span> b

<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</sp


an> <span class="sy0">.</span> <a href="http://www.autohotkey.com/docs/Functions
.htm#BuiltIn"><span class="kw4">SubStr</span></a><span class="br0">&#40;</span>o
ps<span class="sy0">,</span> c<span class="sy0">,</span> <span class="nu0">1</sp
an><span class="br0">&#41;</span><br/>&#160;<br/> <span class="co1">; build br
uteforce template (&quot;x x+x+x+, x x+x x++ ... x x x x///&quot;)</span><br/>
For each<span class="sy0">,</span> pattern in patterns<br/> <span class="br0"
>&#123;</span><br/>
<a href="http://www.autohotkey.com/docs/commands/Loop.h
tm"><span class="kw3">Loop</span></a> <span class="nu0">3</span><br/>
<a
href="http://www.autohotkey.com/docs/commands/StringReplace.htm"><span class="k
w3">StringReplace</span></a><span class="sy0">,</span> pattern<span class="sy0">
,</span> pattern<span class="sy0">,</span> <span class="sy0">.,</span>&#160;% <a
href="http://www.autohotkey.com/docs/Functions.htm#BuiltIn"><span class="kw4">S
ubStr</span></a><span class="br0">&#40;</span>l<span class="sy0">,</span> <a hre
f="http://www.autohotkey.com/docs/Variables.htm#A_Index"><span class="kw2">A_Ind
ex</span></a><span class="sy0">,</span> <span class="nu0">1</span><span class="b
r0">&#41;</span><br/>
pat <span class="sy0">.=</span> pattern <span class="
st0">&quot;`n&quot;</span><br/> <span class="br0">&#125;</span><br/> <span cl
ass="br0">&#125;</span>c <span class="sy0">:=</span> <span class="nu0">0</span><
br/> <span class="br0">&#125;</span>b <span class="sy0">:=</span> <span class="n
u0">0</span><br/><span class="br0">&#125;</span><br/><a href="http://www.autohot
key.com/docs/commands/StringTrimRight.htm"><span class="kw3">StringTrimRight</sp
an></a><span class="sy0">,</span> pat<span class="sy0">,</span> pat<span class="
sy0">,</span> <span class="nu0">1</span> <span class="co1">; remove trailing new
line</span><br/>&#160;<br/>&#160;<br/><span class="co1">; permutate input. As th
e lexicographic algorithm is used, each permutation generated is unique</span><b
r/><span class="kw1">While</span> NNNN<br/><span class="br0">&#123;</span><br/>
<a href="http://www.autohotkey.com/docs/commands/StringSplit.htm"><span class="k
w3">StringSplit</span></a><span class="sy0">,</span> N<span class="sy0">,</span>
NNNN<br/>
<span class="co1">; substitute numbers in for x's and evaluate</
span><br/>
<a href="http://www.autohotkey.com/docs/commands/Loop.htm"><span
class="kw3">Loop</span></a> Parse<span class="sy0">,</span> pat<span class="sy0
">,</span> `n<br/>
<span class="br0">&#123;</span><br/>
eval <sp
an class="sy0">:=</span> <a href="http://www.autohotkey.com/docs/Variables.htm#A
_LoopField"><span class="kw2">A_LoopField</span></a> <span class="co1">; current
line</span><br/>
<a href="http://www.autohotkey.com/docs/commands
/Loop.htm"><span class="kw3">Loop</span></a> <span class="nu0">4</span><br/>
<a href="http://www.autohotkey.com/docs/commands/StringReplace.htm"><span class=
"kw3">StringReplace</span></a><span class="sy0">,</span> eval<span class="sy0">,
</span> eval<span class="sy0">,</span> x<span class="sy0">,</span>&#160;% N<span
class="re0">%A_Index%</span> <span class="co1">; substitute number for &quot;x&
quot;</span><br/>
<span class="kw1">If</span> <a href="http://www.
autohotkey.com/docs/Functions.htm#BuiltIn"><span class="kw4">Round</span></a><sp
an class="br0">&#40;</span>evalRPN<span class="br0">&#40;</span>eval<span class=
"br0">&#41;</span><span class="sy0">,</span> <span class="nu0">4</span><span cla
ss="br0">&#41;</span> <span class="sy0">=</span> <span class="nu0">24</span><br/
>
final <span class="sy0">.=</span> eval <span class="st0"
>&quot;`n&quot;</span><br/>
<span class="br0">&#125;</span><br/>
NNNN <sp
an class="sy0">:=</span> perm_next<span class="br0">&#40;</span>NNNN<span class=
"br0">&#41;</span> <span class="co1">; next lexicographic permutation of user's
digits</span><br/><span class="br0">&#125;</span><br/><a href="http://www.autoho
tkey.com/docs/commands/MsgBox.htm"><span class="kw3">MsgBox</span></a>&#160;% fi
nal&#160;? <a href="http://www.autohotkey.com/docs/Variables.htm#Clipboard"><spa
n class="kw2">clipboard</span></a> <span class="sy0">:=</span> final&#160;: <spa
n class="st0">&quot;No solution&quot;</span><br/>&#160;<br/><span class="co1">;
simple stack-based evaluation. Integers only. Whitespace is used to push a value
.</span><br/>evalRPN<span class="br0">&#40;</span>s<span class="br0">&#41;</span
><span class="br0">&#123;</span><br/> stack <span class="sy0">:=</span> <span
class="br0">&#91;</span><span class="br0">&#93;</span><br/>
<a href="http://
www.autohotkey.com/docs/commands/Loop.htm"><span class="kw3">Loop</span></a> Par

se<span class="sy0">,</span> s<br/>


<span class="kw1">If</span> <a h
ref="http://www.autohotkey.com/docs/Variables.htm#A_LoopField"><span class="kw2"
>A_LoopField</span></a> is number<br/>
t <span class="sy0">.=</
span> <a href="http://www.autohotkey.com/docs/Variables.htm#A_LoopField"><span c
lass="kw2">A_LoopField</span></a><br/>
<span class="kw1">else</span><br
/>
<span class="br0">&#123;</span><br/>
<span cl
ass="kw1">If</span> t<br/>
stack<span class="sy0">.
</span><span class="kw6">Insert</span><span class="br0">&#40;</span>t<span class
="br0">&#41;</span><span class="sy0">,</span> t <span class="sy0">:=</span> <spa
n class="st0">&quot;&quot;</span><br/>
<span class="kw1">If</sp
an> <a href="http://www.autohotkey.com/docs/Functions.htm#BuiltIn"><span class="
kw4">InStr</span></a><span class="br0">&#40;</span><span class="st0">&quot;+-/*&
quot;</span><span class="sy0">,</span> l <span class="sy0">:=</span> <a href="ht
tp://www.autohotkey.com/docs/Variables.htm#A_LoopField"><span class="kw2">A_Loop
Field</span></a><span class="br0">&#41;</span><br/>
<span cl
ass="br0">&#123;</span><br/>
a <span class="sy0">:=</
span> stack<span class="sy0">.</span>Remove<span class="br0">&#40;</span><span c
lass="br0">&#41;</span><span class="sy0">,</span> b <span class="sy0">:=</span>
stack<span class="sy0">.</span>Remove<span class="br0">&#40;</span><span class="
br0">&#41;</span><br/>
stack<span class="sy0">.</span><
span class="kw6">Insert</span><span class="br0">&#40;</span>
l <span class="
sy0">=</span> <span class="st0">&quot;+&quot;</span>&#160;? b <span class="sy0">
+</span> a<br/>
:l <span class="sy0">=</
span> <span class="st0">&quot;-&quot;</span>&#160;? b <span class="sy0">-</span>
a<br/>
:l <span class="sy0">=</span> <s
pan class="st0">&quot;*&quot;</span>&#160;? b <span class="sy0">*</span> a<br/>
:l <span class="sy0">=</span> <span class="st0">&quot;/&quot;</span>&#160;? b <s
pan class="sy0">/</span> a<br/>
:<span c
lass="nu0">0</span>
<span class="br0">&#41;</span><br/>
<span class="br0">&#125;</span><br/>
<span class="br0">&#125;</span><
br/>
<span class="kw1">return</span> stack<span class="sy0">.</span>Remove<sp
an class="br0">&#40;</span><span class="br0">&#41;</span><br/><span class="br0">
&#125;</span><br/>&#160;<br/>&#160;<br/>&#160;<br/>perm_Next<span class="br0">&#
40;</span>str<span class="br0">&#41;</span><span class="br0">&#123;</span><br/>
p <span class="sy0">:=</span> <span class="nu0">0</span><span class="sy0">,</spa
n> sLen <span class="sy0">:=</span> <a href="http://www.autohotkey.com/docs/Func
tions.htm#BuiltIn"><span class="kw4">StrLen</span></a><span class="br0">&#40;</s
pan>str<span class="br0">&#41;</span><br/>
<a href="http://www.autohotkey.c
om/docs/commands/Loop.htm"><span class="kw3">Loop</span></a>&#160;% sLen<br/>
<span class="br0">&#123;</span><br/>
<span class="kw1">If</span> <a h
ref="http://www.autohotkey.com/docs/Variables.htm#A_Index"><span class="kw2">A_I
ndex</span></a><span class="sy0">=</span><span class="nu0">1</span><br/>
<a href="http://www.autohotkey.com/docs/commands/Continue.htm"><span class="kw3"
>continue</span></a><br/>
t <span class="sy0">:=</span> <a href="h
ttp://www.autohotkey.com/docs/Functions.htm#BuiltIn"><span class="kw4">SubStr</s
pan></a><span class="br0">&#40;</span>str<span class="sy0">,</span> sLen<span cl
ass="sy0">+</span><span class="nu0">1</span><span class="sy0">-</span><a href="h
ttp://www.autohotkey.com/docs/Variables.htm#A_Index"><span class="kw2">A_Index</
span></a><span class="sy0">,</span> <span class="nu0">1</span><span class="br0">
&#41;</span><br/>
n <span class="sy0">:=</span> <a href="http://ww
w.autohotkey.com/docs/Functions.htm#BuiltIn"><span class="kw4">SubStr</span></a>
<span class="br0">&#40;</span>str<span class="sy0">,</span> sLen<span class="sy0
">+</span><span class="nu0">2</span><span class="sy0">-</span><a href="http://ww
w.autohotkey.com/docs/Variables.htm#A_Index"><span class="kw2">A_Index</span></a
><span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</s
pan><br/>
<span class="kw1">If</span> <span class="br0">&#40;</spa
n> t <span class="sy0">&lt;</span> n <span class="br0">&#41;</span><br/>
<span class="br0">&#123;</span><br/>
p <span class="sy0">:=</
span> sLen<span class="sy0">+</span><span class="nu0">1</span><span class="sy0">
-</span><a href="http://www.autohotkey.com/docs/Variables.htm#A_Index"><span cla

ss="kw2">A_Index</span></a><span class="sy0">,</span> pC <span class="sy0">:=</s


pan> <a href="http://www.autohotkey.com/docs/Functions.htm#BuiltIn"><span class=
"kw4">SubStr</span></a><span class="br0">&#40;</span>str<span class="sy0">,</spa
n> p<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;
</span><br/>
<a href="http://www.autohotkey.com/docs/commands
/Break.htm"><span class="kw3">break</span></a><br/>
<span class="br0
">&#125;</span><br/>
<span class="br0">&#125;</span><br/>
<span class="kw1
">If</span>&#160;!p<br/>
<span class="kw1">return</span> false<br
/>
<a href="http://www.autohotkey.com/docs/commands/Loop.htm"><span class="
kw3">Loop</span></a><br/>
<span class="br0">&#123;</span><br/>
t <span class="sy0">:=</span> <a href="http://www.autohotkey.com/docs/Functions.
htm#BuiltIn"><span class="kw4">SubStr</span></a><span class="br0">&#40;</span>st
r<span class="sy0">,</span> sLen<span class="sy0">+</span><span class="nu0">1</s
pan><span class="sy0">-</span><a href="http://www.autohotkey.com/docs/Variables.
htm#A_Index"><span class="kw2">A_Index</span></a><span class="sy0">,</span> <spa
n class="nu0">1</span><span class="br0">&#41;</span><br/>
<span cl
ass="kw1">If</span> <span class="br0">&#40;</span> t <span class="sy0">&gt;</spa
n> pC <span class="br0">&#41;</span><br/>
<span class="br0">&#123;
</span><br/>
n <span class="sy0">:=</span> sLen<span class="s
y0">+</span><span class="nu0">1</span><span class="sy0">-</span><a href="http://
www.autohotkey.com/docs/Variables.htm#A_Index"><span class="kw2">A_Index</span><
/a><span class="sy0">,</span> nC <span class="sy0">:=</span> <a href="http://www
.autohotkey.com/docs/Functions.htm#BuiltIn"><span class="kw4">SubStr</span></a><
span class="br0">&#40;</span>str<span class="sy0">,</span> n<span class="sy0">,<
/span> <span class="nu0">1</span><span class="br0">&#41;</span><br/>
<a href="http://www.autohotkey.com/docs/commands/Break.htm"><span class="kw3">br
eak</span></a><br/>
<span class="br0">&#125;</span><br/>
<span cl
ass="br0">&#125;</span><br/>
<span class="kw1">return</span> <a href="http://
www.autohotkey.com/docs/Functions.htm#BuiltIn"><span class="kw4">SubStr</span></
a><span class="br0">&#40;</span>str<span class="sy0">,</span> <span class="nu0">
1</span><span class="sy0">,</span> p<span class="sy0">-</span><span class="nu0">
1</span><span class="br0">&#41;</span> <span class="sy0">.</span> nC <span class
="sy0">.</span> Reverse<span class="br0">&#40;</span><a href="http://www.autohot
key.com/docs/Functions.htm#BuiltIn"><span class="kw4">SubStr</span></a><span cla
ss="br0">&#40;</span>str<span class="sy0">,</span> p<span class="sy0">+</span><s
pan class="nu0">1</span><span class="sy0">,</span> n<span class="sy0">-</span>p<
span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span
> <span class="sy0">.</span> pC <span class="sy0">.</span> <a href="http://www.
autohotkey.com/docs/Functions.htm#BuiltIn"><span class="kw4">SubStr</span></a><s
pan class="br0">&#40;</span>str<span class="sy0">,</span> n<span class="sy0">+</
span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&
#41;</span><br/><span class="br0">&#125;</span><br/>&#160;<br/>Reverse<span clas
s="br0">&#40;</span>s<span class="br0">&#41;</span><span class="br0">&#123;</spa
n><br/> <a href="http://www.autohotkey.com/docs/commands/Loop.htm"><span class="
kw3">Loop</span></a> Parse<span class="sy0">,</span> s<br/>
o <span
class="sy0">:=</span> <a href="http://www.autohotkey.com/docs/Variables.htm#A_Lo
opField"><span class="kw2">A_LoopField</span></a> o<br/>
<span class="kw1
">return</span> o<br/><span class="br0">&#125;</span></pre>
<div>
<dl><dt>Output:</div>for 1127:
</dt></dl>
<pre>
1 2+1 7+*
1 2+7 1+*
1 7+1 2+*
1 7+2 1+*
2 1+1 7+*
2 1+7 1+*
7 1+1 2+*
7 1+2 1+*</pre>

<p>And for 8338:


</p>
<pre>8 3 8 3/-/</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=4" title="Edit section: BBC BASIC">edit</a>]</span> <span
class="mw-headline" id="BBC_BASIC"><a href="/wiki/Category:BBC_BASIC" title="Cat
egory:BBC BASIC">BBC BASIC</a></span></h2>
<pre class="text highlighted_source">&#160;<br/>
PROCsolve24(&quot;1234&quo
t;)<br/>
PROCsolve24(&quot;6789&quot;)<br/>
PROCsolve24(&quot;1127&quo
t;)<br/>
PROCsolve24(&quot;5566&quot;)<br/>
END<br/>&#160;<br/>
D
EF PROCsolve24(s$)<br/>
LOCAL F%, I%, J%, K%, L%, P%, T%, X$, o$(), p$(), t
$()<br/>
DIM o$(4), p$(24,4), t$(11)<br/>
o$() = &quot;&quot;, &quot;+
&quot;, &quot;-&quot;, &quot;*&quot;, &quot;/&quot;<br/>
RESTORE<br/>
FOR T% = 1 TO 11<br/>
READ t$(T%)<br/>
NEXT<br/>
DATA &quot;abc
defg&quot;, &quot;(abc)defg&quot;, &quot;ab(cde)fg&quot;, &quot;abcd(efg)&quot;,
&quot;(abc)d(efg)&quot;, &quot;(abcde)fg&quot;<br/>
DATA &quot;ab(cdefg)&q
uot;, &quot;((abc)de)fg&quot;, &quot;(ab(cde))fg&quot;, &quot;ab((cde)fg)&quot;,
&quot;ab(cd(efg))&quot;<br/>&#160;<br/>
FOR I% = 1 TO 4<br/>
FOR J%
= 1 TO 4<br/>
FOR K% = 1 TO 4<br/>
FOR L% = 1 TO 4<br/>
IF I%&lt;&gt;J% IF J%&lt;&gt;K% IF K%&lt;&gt;L% IF I%&lt;&gt;K% IF J%&
lt;&gt;L% IF I%&lt;&gt;L% THEN<br/>
P% += 1<br/>
p
$(P%,1) = MID$(s$,I%,1)<br/>
p$(P%,2) = MID$(s$,J%,1)<br/>
p$(P%,3) = MID$(s$,K%,1)<br/>
p$(P%,4) = MID$(s$,L%,1)<b
r/>
ENDIF<br/>
NEXT<br/>
NEXT<br/>
NEXT<
br/>
NEXT<br/>&#160;<br/>
FOR I% = 1 TO 4<br/>
FOR J% = 1 TO 4<
br/>
FOR K% = 1 TO 4<br/>
FOR T% = 1 TO 11<br/>
FOR P% = 1 TO 24<br/>
X$ = t$(T%)<br/>
MID$(X$, I
NSTR(X$,&quot;a&quot;), 1) = p$(P%,1)<br/>
MID$(X$, INSTR(X$,&quo
t;b&quot;), 1) = o$(I%)<br/>
MID$(X$, INSTR(X$,&quot;c&quot;), 1)
= p$(P%,2)<br/>
MID$(X$, INSTR(X$,&quot;d&quot;), 1) = o$(J%)<br
/>
MID$(X$, INSTR(X$,&quot;e&quot;), 1) = p$(P%,3)<br/>
MID$(X$, INSTR(X$,&quot;f&quot;), 1) = o$(K%)<br/>
MID$(X$,
INSTR(X$,&quot;g&quot;), 1) = p$(P%,4)<br/>
F% = TRUE&#160;: ON
ERROR LOCAL F% = FALSE<br/>
IF F% IF EVAL(X$) = 24 THEN PRINT X$&
#160;: EXIT FOR I%<br/>
RESTORE ERROR<br/>
NEXT<br/>
NEXT<br/>
NEXT<br/>
NEXT<br/>
NEXT<br/>
IF
I% &gt; 4 PRINT &quot;No solution found&quot;<br/>
ENDPROC<br/>&#160;</pre
>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>
(1+2+3)*4
6*8/(9-7)
(1+2)*(1+7)
(5+5-6)*6
</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=5" title="Edit section: C">edit</a>]</span> <span class="m
w-headline" id="C"><a href="/wiki/Category:C" title="Category:C">C</a></span></h
2>
<p>This is a solver that's generic enough to deal with more than 4 numbers,
goals other than 24, or different digit ranges.
It guarantees a solution if there is one.
Its output format is reasonably good looking, though not necessarily optimal.
</p>
<pre class="c highlighted_source"><span class="co2">#include &lt;stdio.h&gt;</sp
an><br/><span class="co2">#include &lt;stdlib.h&gt;</span><br/><span class="co2"
>#include &lt;time.h&gt;</span><br/>&#160;<br/><span class="co2">#define n_cards
4</span><br/><span class="co2">#define solve_goal 24</span><br/><span class="co

2">#define max_digit 9</span><br/>&#160;<br/><span class="kw4">typedef</span> <s


pan class="kw4">struct</span> <span class="br0">&#123;</span> <span class="kw4">
int</span> num<span class="sy0">,</span> denom<span class="sy0">;</span> <span c
lass="br0">&#125;</span> frac_t<span class="sy0">,</span> <span class="sy0">*</s
pan>frac<span class="sy0">;</span><br/><span class="kw4">typedef</span> <span cl
ass="kw2">enum</span> <span class="br0">&#123;</span> C_NUM <span class="sy0">=<
/span> <span class="nu0">0</span><span class="sy0">,</span> C_ADD<span class="sy
0">,</span> C_SUB<span class="sy0">,</span> C_MUL<span class="sy0">,</span> C_DI
V <span class="br0">&#125;</span> op_type<span class="sy0">;</span><br/>&#160;<b
r/><span class="kw4">typedef</span> <span class="kw4">struct</span> expr_t <span
class="sy0">*</span>expr<span class="sy0">;</span><br/><span class="kw4">typede
f</span> <span class="kw4">struct</span> expr_t <span class="br0">&#123;</span><
br/>
op_type op<span class="sy0">;</span><br/>
expr left<span clas
s="sy0">,</span> right<span class="sy0">;</span><br/>
<span class="kw4">i
nt</span> value<span class="sy0">;</span><br/><span class="br0">&#125;</span> ex
pr_t<span class="sy0">;</span><br/>&#160;<br/><span class="kw4">void</span> show
_expr<span class="br0">&#40;</span>expr e<span class="sy0">,</span> op_type prec
<span class="sy0">,</span> <span class="kw4">int</span> is_right<span class="br0
">&#41;</span><br/><span class="br0">&#123;</span><br/>
<span class="kw4"
>const</span> <span class="kw4">char</span> <span class="sy0">*</span> op<span c
lass="sy0">;</span><br/>
<span class="kw1">switch</span><span class="br0"
>&#40;</span>e<span class="sy0">-&gt;</span>op<span class="br0">&#41;</span> <sp
an class="br0">&#123;</span><br/>
<span class="kw1">case</span> C_NUM<spa
n class="sy0">:</span>
<a href="http://www.opengroup.org/onlinepubs/00969539
9/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#
40;</span><span class="st0">&quot;%d&quot;</span><span class="sy0">,</span> e<sp
an class="sy0">-&gt;</span>value<span class="br0">&#41;</span><span class="sy0">
;</span><br/>
<span class="kw1">return</span><span class=
"sy0">;</span><br/>
<span class="kw1">case</span> C_ADD<span class="sy0">
:</span>
op <span class="sy0">=</span> <span class="st0">&quot; + &quot;</sp
an><span class="sy0">;</span> <span class="kw2">break</span><span class="sy0">;<
/span><br/>
<span class="kw1">case</span> C_SUB<span class="sy0">:</span>
op <span class="sy0">=</span> <span class="st0">&quot; - &quot;</span><span
class="sy0">;</span> <span class="kw2">break</span><span class="sy0">;</span><b
r/>
<span class="kw1">case</span> C_MUL<span class="sy0">:</span>
op
<span class="sy0">=</span> <span class="st0">&quot; x &quot;</span><span class="
sy0">;</span> <span class="kw2">break</span><span class="sy0">;</span><br/>
<span class="kw1">case</span> C_DIV<span class="sy0">:</span>
op <span cl
ass="sy0">=</span> <span class="st0">&quot; / &quot;</span><span class="sy0">;</
span> <span class="kw2">break</span><span class="sy0">;</span><br/>
<span
class="br0">&#125;</span><br/>&#160;<br/>
<span class="kw1">if</span> <s
pan class="br0">&#40;</span><span class="br0">&#40;</span>e<span class="sy0">-&g
t;</span>op <span class="sy0">==</span> prec <span class="sy0">&amp;&amp;</span>
is_right<span class="br0">&#41;</span> <span class="sy0">||</span> e<span class
="sy0">-&gt;</span>op <span class="sy0">&lt;</span> prec<span class="br0">&#41;<
/span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.h
tml"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span clas
s="st0">&quot;(&quot;</span><span class="br0">&#41;</span><span class="sy0">;</s
pan><br/>
show_expr<span class="br0">&#40;</span>e<span class="sy0">-&gt;
</span>left<span class="sy0">,</span> e<span class="sy0">-&gt;</span>op<span cla
ss="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span
class="sy0">;</span><br/>
<a href="http://www.opengroup.org/onlinepubs/00
9695399/functions/printf.html"><span class="kw3">printf</span></a><span class="b
r0">&#40;</span><span class="st0">&quot;%s&quot;</span><span class="sy0">,</span
> op<span class="br0">&#41;</span><span class="sy0">;</span><br/>
show_ex
pr<span class="br0">&#40;</span>e<span class="sy0">-&gt;</span>right<span class=
"sy0">,</span> e<span class="sy0">-&gt;</span>op<span class="sy0">,</span> <span
class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br
/>
<span class="kw1">if</span> <span class="br0">&#40;</span><span class=
"br0">&#40;</span>e<span class="sy0">-&gt;</span>op <span class="sy0">==</span>

prec <span class="sy0">&amp;&amp;</span> is_right<span class="br0">&#41;</span>


<span class="sy0">||</span> e<span class="sy0">-&gt;</span>op <span class="sy0">
&lt;</span> prec<span class="br0">&#41;</span> <a href="http://www.opengroup.org
/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a>
<span class="br0">&#40;</span><span class="st0">&quot;)&quot;</span><span class=
"br0">&#41;</span><span class="sy0">;</span><br/><span class="br0">&#125;</span>
<br/>&#160;<br/><span class="kw4">void</span> eval_expr<span class="br0">&#40;</
span>expr e<span class="sy0">,</span> frac f<span class="br0">&#41;</span><br/><
span class="br0">&#123;</span><br/>
frac_t left<span class="sy0">,</span>
right<span class="sy0">;</span><br/>
<span class="kw1">if</span> <span c
lass="br0">&#40;</span>e<span class="sy0">-&gt;</span>op <span class="sy0">==</s
pan> C_NUM<span class="br0">&#41;</span> <span class="br0">&#123;</span><br/>
f<span class="sy0">-&gt;</span>num <span class="sy0">=</span> e<spa
n class="sy0">-&gt;</span>value<span class="sy0">;</span><br/>
f<
span class="sy0">-&gt;</span>denom <span class="sy0">=</span> <span class="nu0">
1</span><span class="sy0">;</span><br/>
<span class="kw1">return<
/span><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/
>
eval_expr<span class="br0">&#40;</span>e<span class="sy0">-&gt;</span>l
eft<span class="sy0">,</span> <span class="sy0">&amp;</span>left<span class="br0
">&#41;</span><span class="sy0">;</span><br/>
eval_expr<span class="br0">
&#40;</span>e<span class="sy0">-&gt;</span>right<span class="sy0">,</span> <span
class="sy0">&amp;</span>right<span class="br0">&#41;</span><span class="sy0">;<
/span><br/>
<span class="kw1">switch</span> <span class="br0">&#40;</span
>e<span class="sy0">-&gt;</span>op<span class="br0">&#41;</span> <span class="br
0">&#123;</span><br/>
<span class="kw1">case</span> C_ADD<span class="sy0
">:</span><br/>
f<span class="sy0">-&gt;</span>num <span class="s
y0">=</span> left.<span class="me1">num</span> <span class="sy0">*</span> right.
<span class="me1">denom</span> <span class="sy0">+</span> left.<span class="me1"
>denom</span> <span class="sy0">*</span> right.<span class="me1">num</span><span
class="sy0">;</span><br/>
f<span class="sy0">-&gt;</span>denom <
span class="sy0">=</span> left.<span class="me1">denom</span> <span class="sy0">
*</span> right.<span class="me1">denom</span><span class="sy0">;</span><br/>
<span class="kw1">return</span><span class="sy0">;</span><br/>
<span class="kw1">case</span> C_SUB<span class="sy0">:</span><br/>
f<span class="sy0">-&gt;</span>num <span class="sy0">=</span> left.<span cla
ss="me1">num</span> <span class="sy0">*</span> right.<span class="me1">denom</sp
an> <span class="sy0">-</span> left.<span class="me1">denom</span> <span class="
sy0">*</span> right.<span class="me1">num</span><span class="sy0">;</span><br/>
f<span class="sy0">-&gt;</span>denom <span class="sy0">=</span> l
eft.<span class="me1">denom</span> <span class="sy0">*</span> right.<span class=
"me1">denom</span><span class="sy0">;</span><br/>
<span class="kw
1">return</span><span class="sy0">;</span><br/>
<span class="kw1">case</s
pan> C_MUL<span class="sy0">:</span><br/>
f<span class="sy0">-&gt
;</span>num <span class="sy0">=</span> left.<span class="me1">num</span> <span c
lass="sy0">*</span> right.<span class="me1">num</span><span class="sy0">;</span>
<br/>
f<span class="sy0">-&gt;</span>denom <span class="sy0">=</s
pan> left.<span class="me1">denom</span> <span class="sy0">*</span> right.<span
class="me1">denom</span><span class="sy0">;</span><br/>
<span cla
ss="kw1">return</span><span class="sy0">;</span><br/>
<span class="kw1">c
ase</span> C_DIV<span class="sy0">:</span><br/>
f<span class="sy0
">-&gt;</span>num <span class="sy0">=</span> left.<span class="me1">num</span> <
span class="sy0">*</span> right.<span class="me1">denom</span><span class="sy0">
;</span><br/>
f<span class="sy0">-&gt;</span>denom <span class="s
y0">=</span> left.<span class="me1">denom</span> <span class="sy0">*</span> righ
t.<span class="me1">num</span><span class="sy0">;</span><br/>
<sp
an class="kw1">return</span><span class="sy0">;</span><br/>
<span class="
kw1">default</span><span class="sy0">:</span><br/>
<a href="http:
//www.opengroup.org/onlinepubs/009695399/functions/fprintf.html"><span class="kw
3">fprintf</span></a><span class="br0">&#40;</span>stderr<span class="sy0">,</sp
an> <span class="st0">&quot;Unknown op:&#160;%d<span class="es1">\n</span>&quot;

</span><span class="sy0">,</span> e<span class="sy0">-&gt;</span>op<span class="


br0">&#41;</span><span class="sy0">;</span><br/>
<span class="kw1
">return</span><span class="sy0">;</span><br/>
<span class="br0">&#125;</
span><br/><span class="br0">&#125;</span><br/><span class="kw4">int</span> solve
<span class="br0">&#40;</span>expr ex_in<span class="br0">&#91;</span><span clas
s="br0">&#93;</span><span class="sy0">,</span> <span class="kw4">int</span> len<
span class="br0">&#41;</span><br/><span class="br0">&#123;</span><br/>
<s
pan class="kw4">int</span> i<span class="sy0">,</span> j<span class="sy0">;</spa
n><br/>
expr_t node<span class="sy0">;</span><br/>
expr ex<span cl
ass="br0">&#91;</span>n_cards<span class="br0">&#93;</span><span class="sy0">;</
span><br/>
frac_t final<span class="sy0">;</span><br/>&#160;<br/>
<span class="kw1">if</span> <span class="br0">&#40;</span>len <span class="sy0">
==</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="
br0">&#123;</span><br/>
eval_expr<span class="br0">&#40;</span>ex
_in<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#9
3;</span><span class="sy0">,</span> <span class="sy0">&amp;</span>final<span cla
ss="br0">&#41;</span><span class="sy0">;</span><br/>
<span class=
"kw1">if</span> <span class="br0">&#40;</span>final.<span class="me1">num</span>
<span class="sy0">==</span> final.<span class="me1">denom</span> <span class="s
y0">*</span> solve_goal <span class="sy0">&amp;&amp;</span> final.<span class="m
e1">denom</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><b
r/>
show_expr<span class="br0">&#40;</span>ex_in<span cla
ss="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><sp
an class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <sp
an class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span><
br/>
<span class="kw1">return</span> <span class="nu0">1<
/span><span class="sy0">;</span><br/>
<span class="br0">&#125;</s
pan><br/>
<span class="kw1">return</span> <span class="nu0">0</sp
an><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>&#
160;<br/>
<span class="kw1">for</span> <span class="br0">&#40;</span>i <s
pan class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i
<span class="sy0">&lt;</span> len <span class="sy0">-</span> <span class="nu0">1
</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">
&#41;</span> <span class="br0">&#123;</span><br/>
<span class="kw
1">for</span> <span class="br0">&#40;</span>j <span class="sy0">=</span> i <span
class="sy0">+</span> <span class="nu0">1</span><span class="sy0">;</span> j <sp
an class="sy0">&lt;</span> len<span class="sy0">;</span> j<span class="sy0">++</
span><span class="br0">&#41;</span><br/>
ex<span class="b
r0">&#91;</span>j <span class="sy0">-</span> <span class="nu0">1</span><span cla
ss="br0">&#93;</span> <span class="sy0">=</span> ex_in<span class="br0">&#91;</s
pan>j<span class="br0">&#93;</span><span class="sy0">;</span><br/>
ex<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="s
y0">=</span> <span class="sy0">&amp;</span>node<span class="sy0">;</span><br/>
<span class="kw1">for</span> <span class="br0">&#40;</span>j <span
class="sy0">=</span> i <span class="sy0">+</span> <span class="nu0">1</span><sp
an class="sy0">;</span> j <span class="sy0">&lt;</span> len<span class="sy0">;</
span> j<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br
0">&#123;</span><br/>
node.<span class="me1">left</span>
<span class="sy0">=</span> ex_in<span class="br0">&#91;</span>i<span class="br0"
>&#93;</span><span class="sy0">;</span><br/>
node.<span c
lass="me1">right</span> <span class="sy0">=</span> ex_in<span class="br0">&#91;<
/span>j<span class="br0">&#93;</span><span class="sy0">;</span><br/>
<span class="kw1">for</span> <span class="br0">&#40;</span>node.<spa
n class="me1">op</span> <span class="sy0">=</span> C_ADD<span class="sy0">;</spa
n> node.<span class="me1">op</span> <span class="sy0">&lt;=</span> C_DIV<span cl
ass="sy0">;</span> node.<span class="me1">op</span><span class="sy0">++</span><s
pan class="br0">&#41;</span><br/>
<span class="kw
1">if</span> <span class="br0">&#40;</span>solve<span class="br0">&#40;</span>ex
<span class="sy0">,</span> len <span class="sy0">-</span> <span class="nu0">1</s
pan><span class="br0">&#41;</span><span class="br0">&#41;</span><br/>

<span class="kw1">return</span> <span class="nu0">1


</span><span class="sy0">;</span><br/>&#160;<br/>
node.<s
pan class="me1">left</span> <span class="sy0">=</span> ex_in<span class="br0">&#
91;</span>j<span class="br0">&#93;</span><span class="sy0">;</span><br/>
node.<span class="me1">right</span> <span class="sy0">=</span> e
x_in<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy
0">;</span><br/>
node.<span class="me1">op</span> <span c
lass="sy0">=</span> C_SUB<span class="sy0">;</span><br/>
<span class="kw1">if</span> <span class="br0">&#40;</span>solve<span class="br0"
>&#40;</span>ex<span class="sy0">,</span> len <span class="sy0">-</span> <span c
lass="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="kw1">return</span> <span class="nu0">1</span><span class="sy0">;</s
pan><br/>
node.<span class="me1">op</span> <span class="s
y0">=</span> C_DIV<span class="sy0">;</span><br/>
<span c
lass="kw1">if</span> <span class="br0">&#40;</span>solve<span class="br0">&#40;<
/span>ex<span class="sy0">,</span> len <span class="sy0">-</span> <span class="n
u0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span c
lass="kw1">return</span> <span class="nu0">1</span><span class="sy0">;</span><br
/>&#160;<br/>
ex<span class="br0">&#91;</span>j<span clas
s="br0">&#93;</span> <span class="sy0">=</span> ex_in<span class="br0">&#91;</sp
an>j<span class="br0">&#93;</span><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>
ex<span class="br0">&#91;</
span>i<span class="br0">&#93;</span> <span class="sy0">=</span> ex_in<span class
="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">;</span><br/
>
<span class="br0">&#125;</span><br/>&#160;<br/>
<span class="kw1
">return</span> <span class="nu0">0</span><span class="sy0">;</span><br/><span c
lass="br0">&#125;</span><br/>&#160;<br/><span class="kw4">int</span> solve24<spa
n class="br0">&#40;</span><span class="kw4">int</span> n<span class="br0">&#91;<
/span><span class="br0">&#93;</span><span class="br0">&#41;</span><br/><span cla
ss="br0">&#123;</span><br/>
<span class="kw4">int</span> i<span class="sy
0">;</span><br/>
expr_t ex<span class="br0">&#91;</span>n_cards<span clas
s="br0">&#93;</span><span class="sy0">;</span><br/>
expr e<span class="
br0">&#91;</span>n_cards<span class="br0">&#93;</span><span class="sy0">;</span>
<br/>
<span class="kw1">for</span> <span class="br0">&#40;</span>i <span
class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <spa
n class="sy0">&lt;</span> n_cards<span class="sy0">;</span> i<span class="sy0">+
+</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br/>
e<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span
class="sy0">=</span> ex <span class="sy0">+</span> i<span class="sy0">;</span><b
r/>
ex<span class="br0">&#91;</span>i<span class="br0">&#93;</spa
n>.<span class="me1">op</span> <span class="sy0">=</span> C_NUM<span class="sy0"
>;</span><br/>
ex<span class="br0">&#91;</span>i<span class="br0"
>&#93;</span>.<span class="me1">left</span> <span class="sy0">=</span> ex<span c
lass="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">right</
span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</
span><br/>
ex<span class="br0">&#91;</span>i<span class="br0">&#9
3;</span>.<span class="me1">value</span> <span class="sy0">=</span> n<span class
="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">;</span><br/
>
<span class="br0">&#125;</span><br/>
<span class="kw1">return</s
pan> solve<span class="br0">&#40;</span>e<span class="sy0">,</span> n_cards<span
class="br0">&#41;</span><span class="sy0">;</span><br/><span class="br0">&#125;
</span><br/>&#160;<br/><span class="kw4">int</span> main<span class="br0">&#40;<
/span><span class="br0">&#41;</span><br/><span class="br0">&#123;</span><br/>
<span class="kw4">int</span> i<span class="sy0">,</span> j<span class="sy0"
>,</span> n<span class="br0">&#91;</span><span class="br0">&#93;</span> <span cl
ass="sy0">=</span> <span class="br0">&#123;</span> <span class="nu0">3</span><sp
an class="sy0">,</span> <span class="nu0">3</span><span class="sy0">,</span> <sp
an class="nu0">8</span><span class="sy0">,</span> <span class="nu0">8</span><spa
n class="sy0">,</span> <span class="nu0">9</span> <span class="br0">&#125;</span
><span class="sy0">;</span><br/>
<a href="http://www.opengroup.org/online

pubs/009695399/functions/srand.html"><span class="kw3">srand</span></a><span cla


ss="br0">&#40;</span><a href="http://www.opengroup.org/onlinepubs/009695399/func
tions/time.html"><span class="kw3">time</span></a><span class="br0">&#40;</span>
<span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;<
/span><span class="sy0">;</span><br/>&#160;<br/>
<span class="kw1">for</s
pan> <span class="br0">&#40;</span>j <span class="sy0">=</span> <span class="nu0
">0</span><span class="sy0">;</span> j <span class="sy0">&lt;</span> <span class
="nu0">10</span><span class="sy0">;</span> j<span class="sy0">++</span><span cla
ss="br0">&#41;</span> <span class="br0">&#123;</span><br/>
<span
class="kw1">for</span> <span class="br0">&#40;</span>i <span class="sy0">=</span
> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;<
/span> n_cards<span class="sy0">;</span> i<span class="sy0">++</span><span class
="br0">&#41;</span> <span class="br0">&#123;</span><br/>
n<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy0"
>=</span> <span class="nu0">1</span> <span class="sy0">+</span> <span class="br0
">&#40;</span><span class="kw4">double</span><span class="br0">&#41;</span> <a h
ref="http://www.opengroup.org/onlinepubs/009695399/functions/rand.html"><span cl
ass="kw3">rand</span></a><span class="br0">&#40;</span><span class="br0">&#41;</
span> <span class="sy0">*</span> max_digit <span class="sy0">/</span> RAND_MAX<s
pan class="sy0">;</span><br/>
<a href="http://www.opengro
up.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</spa
n></a><span class="br0">&#40;</span><span class="st0">&quot;&#160;%d&quot;</span
><span class="sy0">,</span> n<span class="br0">&#91;</span>i<span class="br0">&#
93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>
<a href="http://www.o
pengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">print
f</span></a><span class="br0">&#40;</span><span class="st0">&quot;: &quot;</spa
n><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<
a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><sp
an class="kw3">printf</span></a><span class="br0">&#40;</span>solve24<span class
="br0">&#40;</span>n<span class="br0">&#41;</span> <span class="sy0">?</span> <s
pan class="st0">&quot;<span class="es1">\n</span>&quot;</span> <span class="sy0"
>:</span> <span class="st0">&quot;No solution<span class="es1">\n</span>&quot;</
span><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<span
class="br0">&#125;</span><br/>&#160;<br/>
<span class="kw1">return</span>
<span class="nu0">0</span><span class="sy0">;</span><br/><span class="br0">&#12
5;</span></pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre> 1 8 2 1: 1 x 8 x (2 + 1)
6 8 2 8: 6 + 8 + 2 + 8
4 2 8 1: (4 - 2 + 1) x 8
3 1 9 9: (9 - 1) / (3 / 9)
5 7 5 1: No solution
5 8 4 1: (5 + 1) x (8 - 4)
8 3 4 9: 8 + 3 + 4 + 9
3 7 4 4: ((3 + 7) - 4) x 4
5 6 4 1: 4 / (1 - 5 / 6)
5 5 9 8: 5 x 5 - 9 + 8</pre>
<p>For the heck of it, using seven numbers ranging from 0 to 99, trying to calcu
late 1:
</p>
<pre> 54 64 44 67 60 54 97: (54 + 64 + 44) / 54 + 60 / (67 - 97)
83 3 52 50 14 48 55: 55 - (((83 + 3 + 52) - 50 + 14) - 48)
70 14 26 6 4 50 19: ((70 + 14 + 26) / 4 - 19) x 6 - 50
75 29 61 95 1 6 73: 6 / (73 - ((75 + 29 + 61) - 95)) - 1
99 65 59 54 29 3 21: 3 - (99 + 65 + 54) / (59 + 29 + 21)
88 57 18 72 60 70 22: (72 - 70) x (60 + 22) - (88 + 57 + 18)
73 18 76 44 32 3 49: 32 / (49 - (44 + 3)) - ((73 + 18) - 76)

36 53 68 12 82 30 8: ((36 + 53 + 68) - 82) / 30 - 12 / 8


83 35 81 82 99 40 36: ((83 + 35) x 81 - 82 x 99) / 40 / 36
29 43 57 18 1 74 89: (1 + 74) / (((29 + 43) - 57) / 18) - 89</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=6" title="Edit section: C++">edit</a>]</span> <span class=
"mw-headline" id="C.2B.2B"><a href="/wiki/Category:C%2B%2B" title="Category:C++"
>C++</a></span></h2>
<div class="examplemeta workswith"><b>Works with</b>: <a href="/wiki/C%2B%2B11"
title="C++11" class="mw-redirect">C++11</a></div>
<div class="examplemeta workswith"><b>Works with</b>: <a href="/wiki/GCC" title=
"GCC" class="mw-redirect">GCC</a> version 4.8</div>
<p>This code may be extended to work with more than 4 numbers, goals other than
24, or different digit ranges. Operations have been manually determined for thes
e parameters, with the belief they are complete.
</p>
<pre class="cpp highlighted_source">&#160;<br/><span class="co2">#include &lt;io
stream&gt;</span><br/><span class="co2">#include &lt;ratio&gt;</span><br/><span
class="co2">#include &lt;array&gt;</span><br/><span class="co2">#include &lt;alg
orithm&gt;</span><br/><span class="co2">#include &lt;random&gt;</span><br/>&#160
;<br/><span class="kw4">typedef</span> <span class="kw4">short</span> <span clas
s="kw4">int</span> Digit<span class="sy4">;</span> <span class="co1">// Typedef
for the digits data type.</span><br/>&#160;<br/>constexpr Digit nDigits<span cl
ass="br0">&#123;</span><span class="nu0">4</span><span class="br0">&#125;</span>
<span class="sy4">;</span>
<span class="co1">// Amount of digits that are t
aken into the game.</span><br/>constexpr Digit maximumDigit<span class="br0">&#1
23;</span><span class="nu0">9</span><span class="br0">&#125;</span><span class="
sy4">;</span> <span class="co1">// Maximum digit that may be taken into the game
.</span><br/>constexpr <span class="kw4">short</span> <span class="kw4">int</spa
n> gameGoal<span class="br0">&#123;</span><span class="nu0">24</span><span class
="br0">&#125;</span><span class="sy4">;</span>
<span class="co1">// Desired r
esult.</span><br/>&#160;<br/><span class="kw4">typedef</span> std<span class="sy
4">::</span><span class="me2">array</span><span class="sy1">&lt;</span>Digit, nD
igits<span class="sy1">&gt;</span> digitSet<span class="sy4">;</span> <span clas
s="co1">// Typedef for the set of digits in the game.</span><br/>digitSet d<span
class="sy4">;</span><br/>&#160;<br/><span class="kw4">void</span> printTrivialO
peration<span class="br0">&#40;</span>std<span class="sy4">::</span><span class=
"me2">string</span> operation<span class="br0">&#41;</span> <span class="br0">&#
123;</span> <span class="co1">// Prints a commutative operation taking all the d
igits.</span><br/>
<span class="kw4">bool</span> printOperation<span class=
"br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span><s
pan class="sy4">;</span><br/> <span class="kw1">for</span><span class="br0">&#
40;</span><span class="kw4">const</span> Digit<span class="sy3">&amp;</span> num
ber <span class="sy4">:</span> d<span class="br0">&#41;</span> <span class="br0"
>&#123;</span><br/>
<span class="kw1">if</span><span class="br0">&#4
0;</span>printOperation<span class="br0">&#41;</span><br/>
std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&l
t;&lt;</span> operation<span class="sy4">;</span><br/>
<span class="kw1
">else</span><br/>
printOperation <span class="sy1">=</span
> <span class="kw2">true</span><span class="sy4">;</span><br/>
std<span
class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</
span> number<span class="sy4">;</span><br/>
<span class="br0">&#125;</span><
br/>
std<span class="sy4">::</span><span class="kw3">cout</span> <span class=
"sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span
><span class="sy4">;</span><br/><span class="br0">&#125;</span><br/>&#160;<br/><
span class="kw4">void</span> printOperation<span class="br0">&#40;</span>std<spa
n class="sy4">::</span><span class="me2">string</span> prefix, std<span class="s
y4">::</span><span class="me2">string</span> operation1, std<span class="sy4">::
</span><span class="me2">string</span> operation2, std<span class="sy4">::</span
><span class="me2">string</span> operation3, std<span class="sy4">::</span><span
class="me2">string</span> suffix <span class="sy1">=</span> <span class="st0">&

quot;&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>


<br/> std<span class="sy4">::</span><span class="kw3">cout</span> <span class=
"sy1">&lt;&lt;</span> prefix <span class="sy1">&lt;&lt;</span> d<span class="br0
">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span cla
ss="sy1">&lt;&lt;</span> operation1 <span class="sy1">&lt;&lt;</span> d<span cla
ss="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <s
pan class="sy1">&lt;&lt;</span> operation2 <span class="sy1">&lt;&lt;</span> d<s
pan class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</s
pan> <span class="sy1">&lt;&lt;</span> operation3 <span class="sy1">&lt;&lt;</sp
an> d<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&
#93;</span> <span class="sy1">&lt;&lt;</span> suffix <span class="sy1">&lt;&lt;<
/span> std<span class="sy4">::</span><span class="me2">endl</span><span class="s
y4">;</span><br/><span class="br0">&#125;</span><br/>&#160;<br/><span class="kw4
">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <s
pan class="br0">&#123;</span><br/>
std<span class="sy4">::</span><span clas
s="me2">mt19937_64</span> randomGenerator<span class="sy4">;</span><br/>
std<span class="sy4">::</span><span class="me2">uniform_int_distribution</span><
span class="sy1">&lt;</span>Digit<span class="sy1">&gt;</span> digitDistro<span
class="br0">&#123;</span><span class="nu0">1</span>, maximumDigit<span class="br
0">&#125;</span><span class="sy4">;</span><br/> <span class="co1">// Let us set
up a number of trials:</span><br/>
<span class="kw1">for</span><span class=
"br0">&#40;</span><span class="kw4">int</span> trial<span class="br0">&#123;</sp
an><span class="nu0">10</span><span class="br0">&#125;</span><span class="sy4">;
</span> trial<span class="sy4">;</span> <span class="sy2">--</span>trial<span cl
ass="br0">&#41;</span> <span class="br0">&#123;</span><br/>
<span cl
ass="kw1">for</span><span class="br0">&#40;</span>Digit<span class="sy3">&amp;</
span> digit <span class="sy4">:</span> d<span class="br0">&#41;</span> <span cla
ss="br0">&#123;</span><br/>
digit <span class="sy1">=</span>
digitDistro<span class="br0">&#40;</span>randomGenerator<span class="br0">&#41;
</span><span class="sy4">;</span><br/>
std<span class="sy4">::<
/span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> digit <spa
n class="sy1">&lt;&lt;</span> <span class="st0">&quot; &quot;</span><span class=
"sy4">;</span><br/>
<span class="br0">&#125;</span><br/>
std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&l
t;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span c
lass="sy4">;</span><br/>
std<span class="sy4">::</span><span clas
s="me2">sort</span><span class="br0">&#40;</span>d.<span class="me1">begin</span
><span class="br0">&#40;</span><span class="br0">&#41;</span>, d.<span class="me
1">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span c
lass="br0">&#41;</span><span class="sy4">;</span><br/>
<span class="co1
">// We start with the most trivial, commutative operations:</span><br/>
<span class="kw1">if</span><span class="br0">&#40;</span>std<span class="sy4">::
</span><span class="me2">accumulate</span><span class="br0">&#40;</span>d.<span
class="me1">cbegin</span><span class="br0">&#40;</span><span class="br0">&#41;</
span>, d.<span class="me1">cend</span><span class="br0">&#40;</span><span class=
"br0">&#41;</span>, <span class="nu0">0</span><span class="br0">&#41;</span> <sp
an class="sy1">==</span> gameGoal<span class="br0">&#41;</span><br/>
printTrivialOperation<span class="br0">&#40;</span><span class="st0">&quot; + &q
uot;</span><span class="br0">&#41;</span><span class="sy4">;</span><br/>
<span class="kw1">if</span><span class="br0">&#40;</span>std<span class="sy4">::
</span><span class="me2">accumulate</span><span class="br0">&#40;</span>d.<span
class="me1">cbegin</span><span class="br0">&#40;</span><span class="br0">&#41;</
span>, d.<span class="me1">cend</span><span class="br0">&#40;</span><span class=
"br0">&#41;</span>, <span class="nu0">1</span>, std<span class="sy4">::</span><s
pan class="me2">multiplies</span><span class="sy1">&lt;</span>Digit<span class="
sy1">&gt;</span><span class="br0">&#123;</span><span class="br0">&#125;</span><s
pan class="br0">&#41;</span> <span class="sy1">==</span> gameGoal<span class="br
0">&#41;</span><br/>
printTrivialOperation<span class="br0">&
#40;</span><span class="st0">&quot; * &quot;</span><span class="br0">&#41;</span
><span class="sy4">;</span><br/>
<span class="co1">// Now let's s

tart working on every permutation of the digits.</span><br/>


<span cl
ass="kw1">do</span> <span class="br0">&#123;</span><br/>
<span class="co1">// Operations with 2 symbols + and one symbol -:</span><br/>
<span class="kw1">if</span><span class="br0">&#40;</span>d<span class="br0">&#91
;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy
2">+</span> d<span class="br0">&#91;</span><span class="nu0">1</span><span class
="br0">&#93;</span> <span class="sy2">+</span> d<span class="br0">&#91;</span><s
pan class="nu0">2</span><span class="br0">&#93;</span> <span class="sy2">-</span
> d<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#9
3;</span> <span class="sy1">==</span> gameGoal<span class="br0">&#41;</span> pri
ntOperation<span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>,
<span class="st0">&quot; + &quot;</span>, <span class="st0">&quot; + &quot;</spa
n>, <span class="st0">&quot; - &quot;</span><span class="br0">&#41;</span><span
class="sy4">;</span> <span class="co1">// If gameGoal is ever changed to a small
er value, consider adding more operations in this category.</span><br/>
<span class="co1">// Operations with 2 symbols + and one symbol *:</span><br/>
<span class="kw1">if</span><span class="br0">&#40;</span>d<span class="br0">&#91
;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy
2">*</span> d<span class="br0">&#91;</span><span class="nu0">1</span><span class
="br0">&#93;</span> <span class="sy2">+</span> d<span class="br0">&#91;</span><s
pan class="nu0">2</span><span class="br0">&#93;</span> <span class="sy2">+</span
> d<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#9
3;</span> <span class="sy1">==</span> gameGoal<span class="br0">&#41;</span> pri
ntOperation<span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>,
<span class="st0">&quot; * &quot;</span>, <span class="st0">&quot; + &quot;</spa
n>, <span class="st0">&quot; + &quot;</span><span class="br0">&#41;</span><span
class="sy4">;</span><br/>
<span class="kw1">if</span><span
class="br0">&#40;</span>d<span class="br0">&#91;</span><span class="nu0">0</spa
n><span class="br0">&#93;</span> <span class="sy2">*</span> <span class="br0">&#
40;</span>d<span class="br0">&#91;</span><span class="nu0">1</span><span class="
br0">&#93;</span> <span class="sy2">+</span> d<span class="br0">&#91;</span><spa
n class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</spa
n> <span class="sy2">+</span> d<span class="br0">&#91;</span><span class="nu0">3
</span><span class="br0">&#93;</span> <span class="sy1">==</span> gameGoal<span
class="br0">&#41;</span> printOperation<span class="br0">&#40;</span><span class
="st0">&quot;&quot;</span>, <span class="st0">&quot; * ( &quot;</span>, <span cl
ass="st0">&quot; + &quot;</span>, <span class="st0">&quot; ) + &quot;</span><spa
n class="br0">&#41;</span><span class="sy4">;</span><br/>
<span class="kw1">if</span><span class="br0">&#40;</span>d<span class="br0">&#91
;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy
2">*</span> <span class="br0">&#40;</span>d<span class="br0">&#91;</span><span c
lass="nu0">1</span><span class="br0">&#93;</span> <span class="sy2">+</span> d<s
pan class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</s
pan> <span class="sy2">+</span> d<span class="br0">&#91;</span><span class="nu0"
>3</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span clas
s="sy1">==</span> gameGoal<span class="br0">&#41;</span> printOperation<span cla
ss="br0">&#40;</span><span class="st0">&quot;&quot;</span>, <span class="st0">&q
uot; * ( &quot;</span>, <span class="st0">&quot; + &quot;</span>, <span class="s
t0">&quot; + &quot;</span>, <span class="st0">&quot; )&quot;</span><span class="
br0">&#41;</span><span class="sy4">;</span><br/>
<span cl
ass="co1">// Operations with one symbol + and 2 symbols *:</span><br/>
<span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;
</span>d<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0
">&#93;</span> <span class="sy2">*</span> d<span class="br0">&#91;</span><span c
lass="nu0">1</span><span class="br0">&#93;</span> <span class="sy2">*</span> d<s
pan class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</s
pan><span class="br0">&#41;</span> <span class="sy2">+</span> d<span class="br0"
>&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span> <span clas
s="sy1">==</span> gameGoal<span class="br0">&#41;</span> printOperation<span cla
ss="br0">&#40;</span><span class="st0">&quot;( &quot;</span>, <span class="st0">

&quot; * &quot;</span>, <span class="st0">&quot; * &quot;</span>, <span class="s


t0">&quot; ) + &quot;</span><span class="br0">&#41;</span><span class="sy4">;</s
pan><br/>
<span class="kw1">if</span><span class="br0">&#4
0;</span>d<span class="br0">&#91;</span><span class="nu0">0</span><span class="b
r0">&#93;</span> <span class="sy2">*</span> d<span class="br0">&#91;</span><span
class="nu0">1</span><span class="br0">&#93;</span> <span class="sy2">*</span> <
span class="br0">&#40;</span>d<span class="br0">&#91;</span><span class="nu0">2<
/span><span class="br0">&#93;</span> <span class="sy2">+</span> d<span class="br
0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span cla
ss="br0">&#41;</span> <span class="sy1">==</span> gameGoal<span class="br0">&#41
;</span> printOperation<span class="br0">&#40;</span><span class="st0">&quot;( &
quot;</span>, <span class="st0">&quot; * &quot;</span>, <span class="st0">&quot;
* ( &quot;</span>, <span class="st0">&quot; + &quot;</span>, <span class="st0">
&quot; )&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span><br
/>
<span class="kw1">if</span><span class="br0">&#40;</span
><span class="br0">&#40;</span>d<span class="br0">&#91;</span><span class="nu0">
0</span><span class="br0">&#93;</span> <span class="sy2">*</span> d<span class="
br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span c
lass="br0">&#41;</span> <span class="sy2">+</span> <span class="br0">&#40;</span
>d<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93
;</span> <span class="sy2">*</span> d<span class="br0">&#91;</span><span class="
nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span
class="sy1">==</span> gameGoal<span class="br0">&#41;</span> printOperation<span
class="br0">&#40;</span><span class="st0">&quot;( &quot;</span>, <span class="s
t0">&quot; * &quot;</span>, <span class="st0">&quot; ) + ( &quot;</span>, <span
class="st0">&quot; * &quot;</span>, <span class="st0">&quot; )&quot;</span><span
class="br0">&#41;</span><span class="sy4">;</span><br/>
<span class="co1">// Operations with one symbol - and 2 symbols *:</span><br/>
<span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;
</span>d<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0
">&#93;</span> <span class="sy2">*</span> d<span class="br0">&#91;</span><span c
lass="nu0">1</span><span class="br0">&#93;</span> <span class="sy2">*</span> d<s
pan class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</s
pan><span class="br0">&#41;</span> <span class="sy2">-</span> d<span class="br0"
>&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span> <span clas
s="sy1">==</span> gameGoal<span class="br0">&#41;</span> printOperation<span cla
ss="br0">&#40;</span><span class="st0">&quot;( &quot;</span>, <span class="st0">
&quot; * &quot;</span>, <span class="st0">&quot; * &quot;</span>, <span class="s
t0">&quot; ) - &quot;</span><span class="br0">&#41;</span><span class="sy4">;</s
pan><br/>
<span class="kw1">if</span><span class="br0">&#4
0;</span>d<span class="br0">&#91;</span><span class="nu0">0</span><span class="b
r0">&#93;</span> <span class="sy2">*</span> d<span class="br0">&#91;</span><span
class="nu0">1</span><span class="br0">&#93;</span> <span class="sy2">*</span> <
span class="br0">&#40;</span>d<span class="br0">&#91;</span><span class="nu0">2<
/span><span class="br0">&#93;</span> <span class="sy2">-</span> d<span class="br
0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span cla
ss="br0">&#41;</span> <span class="sy1">==</span> gameGoal<span class="br0">&#41
;</span> printOperation<span class="br0">&#40;</span><span class="st0">&quot;( &
quot;</span>, <span class="st0">&quot; * &quot;</span>, <span class="st0">&quot;
* ( &quot;</span>, <span class="st0">&quot; - &quot;</span>, <span class="st0">
&quot; )&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span><br
/>
<span class="kw1">if</span><span class="br0">&#40;</span
><span class="br0">&#40;</span>d<span class="br0">&#91;</span><span class="nu0">
0</span><span class="br0">&#93;</span> <span class="sy2">*</span> d<span class="
br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span c
lass="br0">&#41;</span> <span class="sy2">-</span> <span class="br0">&#40;</span
>d<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93
;</span> <span class="sy2">*</span> d<span class="br0">&#91;</span><span class="
nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span
class="sy1">==</span> gameGoal<span class="br0">&#41;</span> printOperation<span

class="br0">&#40;</span><span class="st0">&quot;( &quot;</span>, <span class="s


t0">&quot; * &quot;</span>, <span class="st0">&quot; ) - ( &quotquot;</span>, <s
pan class="st0">&quot; * &quot;</span>, <span class="st0">&quot; )&quot;</span><
span class="br0">&#41;</span><span class="sy4">;</span><br/>
<span class="co1">// Operations with one symbol +, one symbol *, and one symbol
-:</span><br/>
<span class="kw1">if</span><span class="br0">&#4
0;</span>d<span class="br0">&#91;</span><span class="nu0">0</span><span class="b
r0">&#93;</span> <span class="sy2">*</span> d<span class="br0">&#91;</span><span
class="nu0">1</span><span class="br0">&#93;</span> <span class="sy2">+</span> d
<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;<
/span> <span class="sy2">-</span> d<span class="br0">&#91;</span><span class="nu
0">3</span><span class="br0">&#93;</span> <span class="sy1">==</span> gameGoal<s
pan class="br0">&#41;</span> printOperation<span class="br0">&#40;</span><span c
lass="st0">&quot;&quot;</span>, <span class="st0">&quot; * &quot;</span>, <span
class="st0">&quot; + &quot;</span>, <span class="st0">&quot; - &quot;</span><spa
n class="br0">&#41;</span><span class="sy4">;</span><br/>
<span class="kw1">if</span><span class="br0">&#40;</span>d<span class="br0">&#91
;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy
2">*</span> <span class="br0">&#40;</span>d<span class="br0">&#91;</span><span c
lass="nu0">1</span><span class="br0">&#93;</span> <span class="sy2">+</span> d<s
pan class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</s
pan><span class="br0">&#41;</span> <span class="sy2">-</span> d<span class="br0"
>&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span> <span clas
s="sy1">==</span> gameGoal<span class="br0">&#41;</span> printOperation<span cla
ss="br0">&#40;</span><span class="st0">&quot;&quot;</span>, <span class="st0">&q
uot; * ( &quot;</span>, <span class="st0">&quot; + &quot;</span>, <span class="s
t0">&quot; ) - &quot;</span><span class="br0">&#41;</span><span class="sy4">;</s
pan><br/>
<span class="kw1">if</span><span class="br0">&#4
0;</span>d<span class="br0">&#91;</span><span class="nu0">0</span><span class="b
r0">&#93;</span> <span class="sy2">*</span> <span class="br0">&#40;</span>d<span
class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span
> <span class="sy2">-</span> d<span class="br0">&#91;</span><span class="nu0">2<
/span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="
sy2">+</span> d<span class="br0">&#91;</span><span class="nu0">3</span><span cla
ss="br0">&#93;</span> <span class="sy1">==</span> gameGoal<span class="br0">&#41
;</span> printOperation<span class="br0">&#40;</span><span class="st0">&quot;&qu
ot;</span>, <span class="st0">&quot; * ( &quot;</span>, <span class="st0">&quot;
- &quot;</span>, <span class="st0">&quot; ) + &quot;</span><span class="br0">&#
41;</span><span class="sy4">;</span><br/>
<span class="kw1
">if</span><span class="br0">&#40;</span>d<span class="br0">&#91;</span><span cl
ass="nu0">0</span><span class="br0">&#93;</span> <span class="sy2">*</span> <spa
n class="br0">&#40;</span>d<span class="br0">&#91;</span><span class="nu0">1</sp
an><span class="br0">&#93;</span> <span class="sy2">+</span> d<span class="br0">
&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span> <span class
="sy2">-</span> d<span class="br0">&#91;</span><span class="nu0">3</span><span c
lass="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy1">==</span
> gameGoal<span class="br0">&#41;</span> printOperation<span class="br0">&#40;</
span><span class="st0">&quot;&quot;</span>, <span class="st0">&quot; * ( &quot;<
/span>, <span class="st0">&quot; + &quot;</span>, <span class="st0">&quot; - &qu
ot;</span>, <span class="st0">&quot; )&quot;</span><span class="br0">&#41;</span
><span class="sy4">;</span><br/>
<span class="kw1">if</sp
an><span class="br0">&#40;</span>d<span class="br0">&#91;</span><span class="nu0
">0</span><span class="br0">&#93;</span> <span class="sy2">*</span> d<span class
="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <spa
n class="sy2">-</span> <span class="br0">&#40;</span>d<span class="br0">&#91;</s
pan><span class="nu0">2</span><span class="br0">&#93;</span> <span class="sy2">+
</span> d<span class="br0">&#91;</span><span class="nu0">3</span><span class="br
0">&#93;</span><span class="br0">&#41;</span> <span class="sy1">==</span> gameGo
al<span class="br0">&#41;</span> printOperation<span class="br0">&#40;</span><sp
an class="st0">&quot;&quot;</span>, <span class="st0">&quot; * &quot;</span>, <s

pan class="st0">&quot; - ( &quot;</span>, <span class="st0">&quot; + &quot;</spa


n>, <span class="st0">&quot; )&quot;</span><span class="br0">&#41;</span><span c
lass="sy4">;</span><br/>
<span class="co1">// Operations
with one symbol *, one symbol /, one symbol +:</span><br/>
<span class="kw1">if</span><span class="br0">&#40;</span>d<span class="br0">&#91
;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy
2">*</span> d<span class="br0">&#91;</span><span class="nu0">1</span><span class
="br0">&#93;</span> <span class="sy1">==</span> <span class="br0">&#40;</span>ga
meGoal <span class="sy2">-</span> d<span class="br0">&#91;</span><span class="nu
0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span cl
ass="sy2">*</span> d<span class="br0">&#91;</span><span class="nu0">2</span><spa
n class="br0">&#93;</span><span class="br0">&#41;</span> printOperation<span cla
ss="br0">&#40;</span><span class="st0">&quot;( &quot;</span>, <span class="st0">
&quot; * &quot;</span>, <span class="st0">&quot; / &quot;</span>, <span class="s
t0">&quot; ) + &quot;</span><span class="br0">&#41;</span><span class="sy4">;</s
pan><br/>
<span class="kw1">if</span><span class="br0">&#4
0;</span><span class="br0">&#40;</span><span class="br0">&#40;</span>d<span clas
s="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <sp
an class="sy2">*</span> d<span class="br0">&#91;</span><span class="nu0">1</span
><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy2">
+</span> d<span class="br0">&#91;</span><span class="nu0">2</span><span class="b
r0">&#93;</span><span class="br0">&#41;</span> <span class="sy1">==</span> gameG
oal <span class="sy2">*</span> d<span class="br0">&#91;</span><span class="nu0">
3</span><span class="br0">&#93;</span><span class="br0">&#41;</span> printOperat
ion<span class="br0">&#40;</span><span class="st0">&quot;(( &quot;</span>, <span
class="st0">&quot; * &quot;</span>, <span class="st0">&quot; ) + &quot;</span>,
<span class="st0">&quot; ) / &quot;</span><span class="br0">&#41;</span><span c
lass="sy4">;</span><br/>
<span class="kw1">if</span><span
class="br0">&#40;</span><span class="br0">&#40;</span>d<span class="br0">&#91;<
/span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy2"
>+</span> d<span class="br0">&#91;</span><span class="nu0">1</span><span class="
br0">&#93;</span><span class="br0">&#41;</span> <span class="sy2">*</span> d<spa
n class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</spa
n> <span class="sy1">==</span> gameGoal <span class="sy2">*</span> d<span class=
"br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span
class="br0">&#41;</span> printOperation<span class="br0">&#40;</span><span class
="st0">&quot;(( &quot;</span>, <span class="st0">&quot; + &quot;</span>, <span c
lass="st0">&quot; ) * &quot;</span>, <span class="st0">&quot; ) / &quot;</span><
span class="br0">&#41;</span><span class="sy4">;</span><br/>
<span class="kw1">if</span><span class="br0">&#40;</span>d<span class="br0">&#91
;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy
2">*</span> d<span class="br0">&#91;</span><span class="nu0">1</span><span class
="br0">&#93;</span> <span class="sy1">==</span> gameGoal <span class="sy2">*</sp
an> <span class="br0">&#40;</span>d<span class="br0">&#91;</span><span class="nu
0">2</span><span class="br0">&#93;</span> <span class="sy2">+</span> d<span clas
s="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><spa
n class="br0">&#41;</span><span class="br0">&#41;</span> printOperation<span cla
ss="br0">&#40;</span><span class="st0">&quot;( &quot;</span>, <span class="st0">
&quot; * &quot;</span>, <span class="st0">&quot; ) / ( &quot;</span>, <span clas
s="st0">&quot; + &quot;</span>, <span class="st0">&quot; )&quot;</span><span cla
ss="br0">&#41;</span><span class="sy4">;</span><br/>
<span cl
ass="co1">// Operations with one symbol *, one symbol /, one symbol -:</span><br
/>
<span class="kw1">if</span><span class="br0">&#40;</span
>d<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93
;</span> <span class="sy2">*</span> d<span class="br0">&#91;</span><span class="
nu0">1</span><span class="br0">&#93;</span> <span class="sy1">==</span> <span cl
ass="br0">&#40;</span>gameGoal <span class="sy2">+</span> d<span class="br0">&#9
1;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br
0">&#41;</span> <span class="sy2">*</span> d<span class="br0">&#91;</span><span
class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span>

printOperation<span class="br0">&#40;</span><span class="st0">&quot;( &quot;</s


pan>, <span class="st0">&quot; * &quot;</span>, <span class="st0">&quot; / &quot
;</span>, <span class="st0">&quot; ) - &quot;</span><span class="br0">&#41;</spa
n><span class="sy4">;</span><br/>
<span class="kw1">if</sp
an><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0"
>&#40;</span>d<span class="br0">&#91;</span><span class="nu0">0</span><span clas
s="br0">&#93;</span> <span class="sy2">*</span> d<span class="br0">&#91;</span><
span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</
span> <span class="sy2">-</span> d<span class="br0">&#91;</span><span class="nu0
">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span cla
ss="sy1">==</span> gameGoal <span class="sy2">*</span> d<span class="br0">&#91;<
/span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">
&#41;</span> printOperation<span class="br0">&#40;</span><span class="st0">&quot
;(( &quot;</span>, <span class="st0">&quot; * &quot;</span>, <span class="st0">&
quot; ) - &quot;</span>, <span class="st0">&quot; ) / &quot;</span><span class="
br0">&#41;</span><span class="sy4">;</span><br/>
<span cl
ass="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>d
<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;<
/span> <span class="sy2">-</span> d<span class="br0">&#91;</span><span class="nu
0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span cl
ass="sy2">*</span> d<span class="br0">&#91;</span><span class="nu0">2</span><spa
n class="br0">&#93;</span> <span class="sy1">==</span> gameGoal <span class="sy2
">*</span> d<span class="br0">&#91;</span><span class="nu0">3</span><span class=
"br0">&#93;</span><span class="br0">&#41;</span> printOperation<span class="br0"
>&#40;</span><span class="st0">&quot;(( &quot;</span>, <span class="st0">&quot;
- &quot;</span>, <span class="st0">&quot; ) * &quot;</span>, <span class="st0">&
quot; ) / &quot;</span><span class="br0">&#41;</span><span class="sy4">;</span><
br/>
<span class="kw1">if</span><span class="br0">&#40;</span
>d<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93
;</span> <span class="sy2">*</span> d<span class="br0">&#91;</span><span class="
nu0">1</span><span class="br0">&#93;</span> <span class="sy1">==</span> gameGoal
<span class="sy2">*</span> <span class="br0">&#40;</span>d<span class="br0">&#9
1;</span><span class="nu0">2</span><span class="br0">&#93;</span> <span class="s
y2">-</span> d<span class="br0">&#91;</span><span class="nu0">3</span><span clas
s="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
printOperation<span class="br0">&#40;</span><span class="st0">&quot;( &quot;</s
pan>, <span class="st0">&quot; * &quot;</span>, <span class="st0">&quot; ) / ( &
quot;</span>, <span class="st0">&quot; - &quot;</span>, <span class="st0">&quot;
)&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span><br/>
<span class="co1">// Operations with 2 symbols *, one symbol /:</span><br/>
<span class="kw1">if</span><span class="br0">&#40;</span>d<span class="br0">&#91
;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy
2">*</span> d<span class="br0">&#91;</span><span class="nu0">1</span><span class
="br0">&#93;</span> <span class="sy2">*</span> d<span class="br0">&#91;</span><s
pan class="nu0">2</span><span class="br0">&#93;</span> <span class="sy1">==</spa
n> gameGoal <span class="sy2">*</span> d<span class="br0">&#91;</span><span clas
s="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span> pri
ntOperation<span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>,
<span class="st0">&quot; * &quot;</span>, <span class="st0">&quot; * &quot;</spa
n>, <span class="st0">&quot; / &quot;</span><span class="br0">&#41;</span><span
class="sy4">;</span><br/>
<span class="kw1">if</span><span
class="br0">&#40;</span>d<span class="br0">&#91;</span><span class="nu0">0</spa
n><span class="br0">&#93;</span> <span class="sy2">*</span> d<span class="br0">&
#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <span class=
"sy1">==</span> gameGoal <span class="sy2">*</span> d<span class="br0">&#91;</sp
an><span class="nu0">2</span><span class="br0">&#93;</span> <span class="sy2">*<
/span> d<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0
">&#93;</span><span class="br0">&#41;</span> printOperation<span class="br0">&#4
0;</span><span class="st0">&quot;&quot;</span>, <span class="st0">&quot; * &quot
;</span>, <span class="st0">&quot; / ( &quot;</span>, <span class="st0">&quot; *

&quot;</span>, <span class="st0">&quot; )&quot;</span><span class="br0">&#41;</


span><span class="sy4">;</span><br/>
<span class="co1">// Ope
rations with 2 symbols /, one symbol -:</span><br/>
<span cl
ass="kw1">if</span><span class="br0">&#40;</span>d<span class="br0">&#91;</span>
<span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy2">*</sp
an> d<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&
#93;</span> <span class="sy1">==</span> gameGoal <span class="sy2">*</span> <spa
n class="br0">&#40;</span>d<span class="br0">&#91;</span><span class="nu0">1</sp
an><span class="br0">&#93;</span> <span class="sy2">*</span> d<span class="br0">
&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span> <span class
="sy2">-</span> d<span class="br0">&#91;</span><span class="nu0">2</span><span c
lass="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</sp
an> printOperation<span class="br0">&#40;</span><span class="st0">&quot;&quot;</
span>, <span class="st0">&quot; / ( &quot;</span>, <span class="st0">&quot; - &q
uot;</span>, <span class="st0">&quot; / &quot;</span>, <span class="st0">&quot;
)&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span><br/>
<span class="co1">// Operations with 2 symbols /, one symbol *:</span><br/>
<span class="kw1">if</span><span class="br0">&#40;</span>d<span class="br0">&#91
;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy
2">*</span> d<span class="br0">&#91;</span><span class="nu0">1</span><span class
="br0">&#93;</span> <span class="sy1">==</span> gameGoal <span class="sy2">*</sp
an> d<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&
#93;</span> <span class="sy2">*</span> d<span class="br0">&#91;</span><span clas
s="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span> pri
ntOperation<span class="br0">&#40;</span><span class="st0">&quot;( &quot;</span>
, <span class="st0">&quot; * &quot;</span>, <span class="st0">&quot; / &quot;</s
pan>, <span class="st0">&quot; ) / &quot;</span>, <span class="st0">&quot;&quot;
</span><span class="br0">&#41;</span><span class="sy4">;</span><br/>
<span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">
&#40;</span>std<span class="sy4">::</span><span class="me2">next_permutation</sp
an><span class="br0">&#40;</span>d.<span class="me1">begin</span><span class="br
0">&#40;</span><span class="br0">&#41;</span>, d.<span class="me1">end</span><sp
an class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;
</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1
">// All operations are repeated for all possible permutations of the numbers.</
span><br/>
<span class="br0">&#125;</span><br/>
<span class="kw1">return
</span> <span class="nu0">0</span><span class="sy4">;</span><br/><span class="br
0">&#125;</span><br/>&#160;</pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>
8 3 7 9
3 * ( 7 + 9 - 8 )
3 * ( 9 + 7 - 8 )
1 4 3 1
( 3 * 4 * ( 1 + 1 )
( 4 * 3 * ( 1 + 1 )
5 4 3 6
6 * ( 3 + 5 - 4 )
6 * ( 5 + 3 - 4 )
2 5 5 8
5 4 7 3
3 * 4 + 5 + 7
3 * 4 + 7 + 5
( 3 * 4 * ( 7 - 5 )
3 * ( 5 + 7 - 4 )
3 * ( 7 + 5 - 4 )
4 * 3 + 5 + 7
4 * 3 + 7 + 5

( 4 * 3 * ( 7 - 5 )
4 * 5 + 7 - 3
5 * 4 + 7 - 3
5 * ( 7 - 3 ) + 4
3 3 9 2
2 * 9 + 3 + 3
3 * ( 2 + 3 ) + 9
3 * ( 2 + 9 - 3 )
3 * ( 3 + 2 ) + 9
3 * ( 9 - 2 ) + 3
3 * ( 9 + 2 - 3 )
9 * 2 + 3 + 3
3 2 7 9
3 * ( 7 - 2 ) + 9
(( 7 + 9 ) * 3 ) / 2
(( 9 + 7 ) * 3 ) / 2
7 1 5 3
7 6 9 4
(( 7 + 9 ) * 6 ) / 4
(( 9 + 7 ) * 6 ) / 4
3 5 3 1
( 1 * 3 * ( 3 + 5 )
( 1 * 3 * ( 5 + 3 )
( 3 * 1 * ( 3 + 5 )
( 3 * 1 * ( 5 + 3 )
(( 3 + 5 ) * 3 ) / 1
(( 5 + 3 ) * 3 ) / 1
</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=7" title="Edit section: Clojure">edit</a>]</span> <span cl
ass="mw-headline" id="Clojure"><a href="/wiki/Category:Clojure" title="Category:
Clojure">Clojure</a></span></h2>
<pre class="clojure highlighted_source"><span class="br0">&#40;</span><span clas
s="kw1">ns</span> rosettacode<span class="sy0">.</span>24game<span class="sy0">.
</span>solve<br/> <span class="br0">&#40;</span>:<span class="me1">require</spa
n> <span class="br0">&#91;</span>clojure<span class="sy0">.</span>math<span clas
s="sy0">.</span>combinatorics&#160;:<span class="me1">as</span> c<span class="br
0">&#93;</span><br/>
<span class="br0">&#91;</span>clojure<span class
="sy0">.</span>walk&#160;:<span class="me1">as</span> w<span class="br0">&#93;</
span><span class="br0">&#41;</span><span class="br0">&#41;</span><br/>&#160;<br/
><span class="br0">&#40;</span><span class="kw1">def</span> <span class="sy0">^<
/span>:<span class="me1">private</span> op<span class="sy0">-</span>maps<br/> <
span class="br0">&#40;</span><span class="kw1">map</span> #<span class="br0">&#4
0;</span><span class="kw1">zipmap</span> <span class="br0">&#91;</span>:<span cl
ass="me1">o1</span>&#160;:<span class="me1">o2</span>&#160;:<span class="me1">o3
</span><span class="br0">&#93;</span> <span class="sy0">%</span><span class="br0
">&#41;</span> <span class="br0">&#40;</span>c<span class="sy0">/</span>selectio
ns '<span class="br0">&#40;</span><span class="sy0">*</span> <span class="sy0">+
</span> <span class="sy0">-</span> <span class="sy0">/</span><span class="br0">&
#41;</span> <span class="nu0">3</span><span class="br0">&#41;</span><span class=
"br0">&#41;</span><span class="br0">&#41;</span><br/>&#160;<br/><span class="br0
">&#40;</span><span class="kw1">def</span> <span class="sy0">^</span>:<span clas
s="me1">private</span> patterns '<span class="br0">&#40;</span><br/> <span clas
s="br0">&#40;</span>:<span class="me1">o1</span> <span class="br0">&#40;</span>:
<span class="me1">o2</span>&#160;:<span class="me1">n1</span>&#160;:<span class=
"me1">n2</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>:<sp
an class="me1">o3</span>&#160;:<span class="me1">n3</span>&#160;:<span class="me
1">n4</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br/> <
span class="br0">&#40;</span>:<span class="me1">o1</span>&#160;:<span class="me1
">n1</span> <span class="br0">&#40;</span>:<span class="me1">o2</span>&#160;:<sp

an class="me1">n2</span> <span class="br0">&#40;</span>:<span class="me1">o3</sp


an>&#160;:<span class="me1">n3</span>&#160;:<span class="me1">n4</span><span cla
ss="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span
><br/> <span class="br0">&#40;</span>:<span class="me1">o1</span> <span class="
br0">&#40;</span>:<span class="me1">o2</span> <span class="br0">&#40;</span>:<sp
an class="me1">o3</span>&#160;:<span class="me1">n1</span>&#160;:<span class="me
1">n2</span><span class="br0">&#41;</span>&#160;:<span class="me1">n3</span><spa
n class="br0">&#41;</span>&#160;:<span class="me1">n4</span><span class="br0">&#
41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br/>&#160
;<br/><span class="br0">&#40;</span><span class="kw1">defn</span> play24 <span c
lass="br0">&#91;</span><span class="sy0">&amp;</span> digits<span class="br0">&#
93;</span><br/> <span class="br0">&#123;</span>:<span class="me1">pre</span> <s
pan class="br0">&#40;</span><span class="kw1">and</span> <span class="br0">&#40;
</span><span class="kw1">every?</span> #<span class="br0">&#40;</span><span clas
s="kw1">not</span><span class="sy0">=</span> <span class="nu0">0</span> <span cl
ass="sy0">%</span><span class="br0">&#41;</span> digits<span class="br0">&#41;</
span><br/>
<span class="br0">&#40;</span><span class="sy0">=</span>
<span class="br0">&#40;</span><span class="kw1">count</span> digits<span class="
br0">&#41;</span> <span class="nu0">4</span><span class="br0">&#41;</span><span
class="br0">&#41;</span><span class="br0">&#125;</span><br/> <span class="br0">
&#40;</span><span class="sy0">-&gt;&gt;</span> <span class="br0">&#40;</span><sp
an class="kw1">for</span> <span class="br0">&#91;</span>:<span class="kw1">let</
span> <span class="br0">&#91;</span>digit<span class="sy0">-</span>maps<br/>
<span class="br0">&#40;</span><span class="sy0">-&gt;&gt;</span
> digits <span class="kw1">sort</span> c<span class="sy0">/</span>permutations<b
r/>
<span class="br0">&#40;</span><span class="kw1">map
</span> #<span class="br0">&#40;</span><span class="kw1">zipmap</span> <span cla
ss="br0">&#91;</span>:<span class="me1">n1</span>&#160;:<span class="me1">n2</sp
an>&#160;:<span class="me1">n3</span>&#160;:<span class="me1">n4</span><span cla
ss="br0">&#93;</span> <span class="sy0">%</span><span class="br0">&#41;</span><s
pan class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93
;</span><br/>
om op<span class="sy0">-</span>maps, dm digit<span cla
ss="sy0">-</span>maps<span class="br0">&#93;</span><br/>
<span class="br
0">&#40;</span>w<span class="sy0">/</span>prewalk<span class="sy0">-</span>repla
ce dm <br/>
<span class="br0">&#40;</span>w<span class="sy0">/</span>p
rewalk<span class="sy0">-</span>replace om patterns<span class="br0">&#41;</span
><span class="br0">&#41;</span><span class="br0">&#41;</span><br/>
<span c
lass="br0">&#40;</span><span class="kw1">filter</span> #<span class="br0">&#40;<
/span><span class="sy0">=</span> <span class="br0">&#40;</span>eval <span class=
"sy0">%</span><span class="br0">&#41;</span> <span class="nu0">24</span><span cl
ass="br0">&#41;</span><span class="br0">&#41;</span><br/>
<span class="br0
">&#40;</span><span class="kw1">map</span> println<span class="br0">&#41;</span>
<br/>
<span class="kw1">doall</span><br/>
<span class="kw1">count</s
pan><span class="br0">&#41;</span><span class="br0">&#41;</span></pre>
<p>The function <code>play24</code> works by substituting the given digits and t
he four operations into the binary tree patterns (o (o n n) (o n n)), (o (o (o n
n) n) n), and (o n (o n (o n n))).
The substitution is the complex part of the program: two pairs of nested maps (t
he function) are used to substitute in operations and digits, which are replaced
into the tree patterns.
</p>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=8" title="Edit section: CoffeeScript">edit</a>]</span> <sp
an class="mw-headline" id="CoffeeScript"><a href="/wiki/Category:CoffeeScript" t
itle="Category:CoffeeScript">CoffeeScript</a></span></h2>
<pre class="coffeescript highlighted_source">&#160;<br/><span class="co1"># This
program tries to find some way to turn four digits into an arithmetic</span><br
/><span class="co1"># expression that adds up to 24. </span><br/><span class="c
o1">#</span><br/><span class="co1"># Example solution for 5, 7, 8, 8: </span><br
/><span class="co1">#
(((8 + 7) * 8) / 5)</span><br/>&#160;<br/>&#160;<br/>so

lve_24_game = <span class="br0">&#40;</span>digits...<span class="br0">&#41;</sp


an> <span class="sy0">-&gt;</span><br/> <span class="co1"># Create an array of
objects for our helper functions</span><br/> arr = <span class="kw1">for</span>
digit <span class="kw1">in</span> digits<br/>
<span class="br0">&#123;</span
><br/>
val<span class="sy0">:</span> digit<br/>
expr<span class="sy0">
:</span> digit<br/>
<span class="br0">&#125;</span><br/> combo4 arr...<br/>&
#160;<br/><span class="me1">combo4</span> = <span class="br0">&#40;</span>a<span
class="sy0">,</span> b<span class="sy0">,</span> c<span class="sy0">,</span> d<
span class="br0">&#41;</span> <span class="sy0">-&gt;</span><br/> arr = <span c
lass="br0">&#91;</span>a<span class="sy0">,</span> b<span class="sy0">,</span> c
<span class="sy0">,</span> d<span class="br0">&#93;</span><br/> <span class="co
1"># Reduce this to a three-node problem by combining two</span><br/> <span cla
ss="co1"># nodes from the array.</span><br/> permutations = <span class="br0">&
#91;</span><br/>
<span class="br0">&#91;</span><span class="nu0">0</span><spa
n class="sy0">,</span> <span class="nu0">1</span><span class="sy0">,</span> <spa
n class="nu0">2</span><span class="sy0">,</span> <span class="nu0">3</span><span
class="br0">&#93;</span><br/>
<span class="br0">&#91;</span><span class="nu0
">0</span><span class="sy0">,</span> <span class="nu0">2</span><span class="sy0"
>,</span> <span class="nu0">1</span><span class="sy0">,</span> <span class="nu0"
>3</span><span class="br0">&#93;</span><br/>
<span class="br0">&#91;</span><s
pan class="nu0">0</span><span class="sy0">,</span> <span class="nu0">3</span><sp
an class="sy0">,</span> <span class="nu0">1</span><span class="sy0">,</span> <sp
an class="nu0">2</span><span class="br0">&#93;</span><br/>
<span class="br0">
&#91;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="nu
0">2</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0
">,</span> <span class="nu0">3</span><span class="br0">&#93;</span><br/>
<spa
n class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span> <
span class="nu0">3</span><span class="sy0">,</span> <span class="nu0">0</span><s
pan class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#93;</span
><br/>
<span class="br0">&#91;</span><span class="nu0">2</span><span class="s
y0">,</span> <span class="nu0">3</span><span class="sy0">,</span> <span class="n
u0">0</span><span class="sy0">,</span> <span class="nu0">1</span><span class="br
0">&#93;</span><br/> <span class="br0">&#93;</span><br/> <span class="kw1">for
</span> permutation <span class="kw1">in</span> permutations<br/>
<span class
="br0">&#91;</span>i<span class="sy0">,</span> j<span class="sy0">,</span> k<spa
n class="sy0">,</span> m<span class="br0">&#93;</span> = permutation<br/>
<sp
an class="kw1">for</span> combo <span class="kw1">in</span> combos arr<span clas
s="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">,</span> ar
r<span class="br0">&#91;</span>j<span class="br0">&#93;</span><br/>
answer
= combo3 combo<span class="sy0">,</span> arr<span class="br0">&#91;</span>k<span
class="br0">&#93;</span><span class="sy0">,</span> arr<span class="br0">&#91;</
span>m<span class="br0">&#93;</span> <br/>
<span class="kw1">return</span>
answer <span class="kw1">if</span> answer<br/> <span class="kw4">null</span><b
r/>&#160;<br/>combo3 = <span class="br0">&#40;</span>a<span class="sy0">,</span>
b<span class="sy0">,</span> c<span class="br0">&#41;</span> <span class="sy0">&gt;</span><br/> arr = <span class="br0">&#91;</span>a<span class="sy0">,</span
> b<span class="sy0">,</span> c<span class="br0">&#93;</span><br/> permutations
= <span class="br0">&#91;</span><br/>
<span class="br0">&#91;</span><span cl
ass="nu0">0</span><span class="sy0">,</span> <span class="nu0">1</span><span cla
ss="sy0">,</span> <span class="nu0">2</span><span class="br0">&#93;</span><br/>
<span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">,</
span> <span class="nu0">2</span><span class="sy0">,</span> <span class="nu0">1</
span><span class="br0">&#93;</span><br/>
<span class="br0">&#91;</span><span
class="nu0">1</span><span class="sy0">,</span> <span class="nu0">2</span><span c
lass="sy0">,</span> <span class="nu0">0</span><span class="br0">&#93;</span><br/
> <span class="br0">&#93;</span><br/> <span class="kw1">for</span> permutation
<span class="kw1">in</span> permutations<br/>
<span class="br0">&#91;</span>
i<span class="sy0">,</span> j<span class="sy0">,</span> k<span class="br0">&#93;
</span> = permutation<br/>
<span class="kw1">for</span> combo <span class="kw
1">in</span> combos arr<span class="br0">&#91;</span>i<span class="br0">&#93;</s

pan><span class="sy0">,</span> arr<span class="br0">&#91;</span>j<span class="br


0">&#93;</span><br/>
answer = combo2 combo<span class="sy0">,</span> arr<sp
an class="br0">&#91;</span>k<span class="br0">&#93;</span><br/>
<span class
="kw1">return</span> answer <span class="kw1">if</span> answer<br/> <span class
="kw4">null</span><br/>&#160;<br/>combo2 = <span class="br0">&#40;</span>a<span
class="sy0">,</span> b<span class="br0">&#41;</span> <span class="sy0">-&gt;</sp
an><br/> <span class="kw1">for</span> combo <span class="kw1">in</span> combos
a<span class="sy0">,</span> b<br/>
<span class="kw1">return</span> combo.<spa
n class="me1">expr</span> <span class="kw1">if</span> combo.<span class="me1">va
l</span> == <span class="nu0">24</span><br/> <span class="kw4">null</span><br/>
&#160;<br/>combos = <span class="br0">&#40;</span>a<span class="sy0">,</span> b<
span class="br0">&#41;</span> <span class="sy0">-&gt;</span><br/> <span class="
br0">&#91;</span><br/>
val<span class="sy0">:</span> a.<span class="me1">val<
/span> <span class="sy0">+</span> b.<span class="me1">val</span><br/>
expr<sp
an class="sy0">:</span> <span class="st0">&quot;(#{a.expr} + #{b.expr})&quot;</s
pan><br/> <span class="sy0">,</span><br/>
val<span class="sy0">:</span> a.<s
pan class="me1">val</span> <span class="sy0">*</span> b.<span class="me1">val</s
pan><br/>
expr<span class="sy0">:</span> <span class="st0">&quot;(#{a.expr} *
#{b.expr})&quot;</span><br/> <span class="sy0">,</span><br/>
val<span class
="sy0">:</span> a.<span class="me1">val</span> <span class="sy0">-</span> b.<spa
n class="me1">val</span><br/>
expr<span class="sy0">:</span> <span class="st0
">&quot;(#{a.expr} - #{b.expr})&quot;</span><br/> <span class="sy0">,</span><br
/>
val<span class="sy0">:</span> b.<span class="me1">val</span> <span class="
sy0">-</span> a.<span class="me1">val</span><br/>
expr<span class="sy0">:</sp
an> <span class="st0">&quot;(#{b.expr} - #{a.expr})&quot;</span><br/> <span cla
ss="sy0">,</span><br/>
val<span class="sy0">:</span> a.<span class="me1">val<
/span> <span class="sy0">/</span> b.<span class="me1">val</span><br/>
expr<sp
an class="sy0">:</span> <span class="st0">&quot;(#{a.expr} / #{b.expr})&quot;</s
pan><br/> <span class="sy0">,</span><br/>
val<span class="sy0">:</span> b.<s
pan class="me1">val</span> <span class="sy0">/</span> a.<span class="me1">val</s
pan><br/>
expr<span class="sy0">:</span> <span class="st0">&quot;(#{b.expr} /
#{a.expr})&quot;</span><br/> <span class="sy0">,</span><br/> <span class="br0
">&#93;</span><br/>&#160;<br/><span class="co1"># test</span><br/>do <span class
="sy0">-&gt;</span><br/> rand_digit = <span class="sy0">-&gt;</span> <span clas
s="nu0">1</span> <span class="sy0">+</span> Math.<span class="me1">floor</span>
<span class="br0">&#40;</span><span class="nu0">9</span> <span class="sy0">*</sp
an> Math.<span class="me1">random</span><span class="br0">&#40;</span><span clas
s="br0">&#41;</span><span class="br0">&#41;</span><br/>&#160;<br/> <span class=
"kw1">for</span> i <span class="kw1">in</span> <span class="br0">&#91;</span><sp
an class="nu0">1</span>..<span class="nu0">15</span><span class="br0">&#93;</spa
n><br/>
a = rand_digit<span class="br0">&#40;</span><span class="br0">&#41;</
span><br/>
b = rand_digit<span class="br0">&#40;</span><span class="br0">&#41
;</span><br/>
c = rand_digit<span class="br0">&#40;</span><span class="br0">&
#41;</span><br/>
d = rand_digit<span class="br0">&#40;</span><span class="br0
">&#41;</span><br/>
solution = solve_24_game a<span class="sy0">,</span> b<sp
an class="sy0">,</span> c<span class="sy0">,</span> d<br/>
console.<span clas
s="me1">log</span> <span class="st0">&quot;Solution for #{[a,b,c,d]}: #{solution
&#160;? 'no solution'}&quot;</span><br/>&#160;</pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>
&gt; coffee 24_game.coffee
Solution for 8,3,1,8: ((1 + 8) * (8 / 3))
Solution for 6,9,5,7: (6 - ((5 - 7) * 9))
Solution for 4,2,1,1: no solution
Solution for 3,5,1,3: (((3 + 5) * 1) * 3)
Solution for 6,4,1,7: ((7 - (4 - 1)) * 6)
Solution for 8,1,3,1: (((8 + 1) - 1) * 3)
Solution for 6,1,3,3: (((6 + 1) * 3) + 3)

Solution for 7,1,5,6: (((7 - 1) * 5) - 6)


Solution for 4,2,3,1: ((3 + 1) * (4 + 2))
Solution for 8,8,5,8: ((5 * 8) - (8 + 8))
Solution for 3,8,4,1: ((1 - (3 - 8)) * 4)
Solution for 6,4,3,8: ((8 - (6 / 3)) * 4)
Solution for 2,1,8,7: (((2 * 8) + 1) + 7)
Solution for 5,2,7,5: ((2 * 7) + (5 + 5))
Solution for 2,4,8,9: ((9 - (2 + 4)) * 8)
</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=9" title="Edit section: Common Lisp">edit</a>]</span> <spa
n class="mw-headline" id="Common_Lisp"><a href="/wiki/Category:Common_Lisp" titl
e="Category:Common Lisp">Common Lisp</a></span></h2>
<pre class="lisp highlighted_source"><span class="br0">&#40;</span>defconstant +
ops+ '<span class="br0">&#40;</span>*<span class="sy0"> / </span>+ -<span class=
"br0">&#41;</span><span class="br0">&#41;</span><br/>&#160;<br/><span class="br0
">&#40;</span><span class="kw1">defun</span> digits <span class="br0">&#40;</spa
n><span class="br0">&#41;</span><br/> <span class="br0">&#40;</span>sort <span
class="br0">&#40;</span>loop repeat <span class="nu0">4</span> collect <span cla
ss="br0">&#40;</span><span class="nu0">1</span>+ <span class="br0">&#40;</span><
span class="kw1">random</span> <span class="nu0">9</span><span class="br0">&#41;
</span><span class="br0">&#41;</span><span class="br0">&#41;</span> #'<span clas
s="sy0">&lt;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><
br/>&#160;<br/><span class="br0">&#40;</span><span class="kw1">defun</span> expr
-<span class="kw1">value</span> <span class="br0">&#40;</span>expr<span class="b
r0">&#41;</span><br/> <span class="br0">&#40;</span><span class="kw1">eval</spa
n> expr<span class="br0">&#41;</span><span class="br0">&#41;</span><br/>&#160;<b
r/><span class="br0">&#40;</span><span class="kw1">defun</span> divides-by-zerop <span class="br0">&#40;</span>expr<span class="br0">&#41;</span><br/> <span c
lass="br0">&#40;</span><span class="kw1">when</span> <span class="br0">&#40;</sp
an><span class="kw1">consp</span> expr<span class="br0">&#41;</span><br/>
<sp
an class="br0">&#40;</span>destructuring-bind <span class="br0">&#40;</span>op <
span class="sy0">&amp;</span>rest args<span class="br0">&#41;</span> expr<br/>
<span class="br0">&#40;</span><span class="kw1">or</span> <span class="br0">
&#40;</span>divides-by-zero-p <span class="br0">&#40;</span><span class="kw1">ca
r</span> args<span class="br0">&#41;</span><span class="br0">&#41;</span><br/>
<span class="br0">&#40;</span><span class="kw1">and</span> <span class="
br0">&#40;</span><span class="kw1">eq</span> op '/<span class="br0">&#41;</span>
<br/>
<span class="br0">&#40;</span><span class="kw1">or</span> <s
pan class="br0">&#40;</span><span class="kw1">and</span> <span class="br0">&#40;
</span><span class="sy0">=</span> <span class="nu0">1</span> <span class="br0">&
#40;</span><span class="kw1">length</span> args<span class="br0">&#41;</span><sp
an class="br0">&#41;</span><br/>
<span class="br0">&#40;<
/span><span class="kw1">zerop</span> <span class="br0">&#40;</span>expr-<span cl
ass="kw1">value</span> <span class="br0">&#40;</span><span class="kw1">car</span
> args<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="b
r0">&#41;</span><span class="br0">&#41;</span><br/>
<span clas
s="br0">&#40;</span>some <span class="br0">&#40;</span><span class="kw1">lambda<
/span> <span class="br0">&#40;</span>arg<span class="br0">&#41;</span><br/>
<span class="br0">&#40;</span><span class="kw1">or</span>
<span class="br0">&#40;</span>divides-by-zero-p arg<span class="br0">&#41;</span
><br/>
<span class="br0">&#40;</span><span class="
kw1">zerop</span> <span class="br0">&#40;</span>expr-<span class="kw1">value</sp
an> arg<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="
br0">&#41;</span><span class="br0">&#41;</span><br/>
<sp
an class="br0">&#40;</span><span class="kw1">cdr</span> args<span class="br0">&#
41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span clas
s="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span><span class="br0">&#41;</span><br/>&#160;<br/><spa
n class="br0">&#40;</span><span class="kw1">defun</span> solvable-p <span class=

"br0">&#40;</span>digits <span class="sy0">&amp;</span>optional expr<span class=


"br0">&#41;</span><br/> <span class="br0">&#40;</span>unless <span class="br0">
&#40;</span>divides-by-zero-p expr<span class="br0">&#41;</span><br/>
<span c
lass="br0">&#40;</span><span class="kw1">if</span> digits<br/>
<span clas
s="br0">&#40;</span>destructuring-bind <span class="br0">&#40;</span>next <span
class="sy0">&amp;</span>rest rest<span class="br0">&#41;</span> digits<br/>
<span class="br0">&#40;</span><span class="kw1">if</span> expr<br/>
<span class="br0">&#40;</span>some <span class="br0">&#40;</span><span cla
ss="kw1">lambda</span> <span class="br0">&#40;</span>op<span class="br0">&#41;</
span><br/>
<span class="br0">&#40;</span>solvable-p rest <s
pan class="br0">&#40;</span><span class="kw1">cons</span> op <span class="br0">&
#40;</span><span class="kw1">list</span> next expr<span class="br0">&#41;</span>
<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#
41;</span><br/>
+ops+<span class="br0">&#41;</span><br/>
<span class="br0">&#40;</span>solvable-p rest <span class="br0">&#40;</sp
an><span class="kw1">list</span> <span class="br0">&#40;</span><span class="kw1"
>car</span> +ops+<span class="br0">&#41;</span> next<span class="br0">&#41;</spa
n><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">
&#41;</span><br/>
<span class="br0">&#40;</span><span class="kw1">when</spa
n> <span class="br0">&#40;</span><span class="kw1">and</span> expr<br/>
<span class="br0">&#40;</span><span class="kw1">eql</span> <span class="
nu0">24</span> <span class="br0">&#40;</span>expr-<span class="kw1">value</span>
expr<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br
0">&#41;</span><br/>
<span class="br0">&#40;</span>merge-exprs expr<span
class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</s
pan><span class="br0">&#41;</span><span class="br0">&#41;</span><br/>&#160;<br/>
<span class="br0">&#40;</span><span class="kw1">defun</span> merge-exprs <span c
lass="br0">&#40;</span>expr<span class="br0">&#41;</span><br/> <span class="br0
">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span cl
ass="kw1">atom</span> expr<span class="br0">&#41;</span><br/>
expr<br/>
<span class="br0">&#40;</span>destructuring-bind <span class="br0">&#40;</span>o
p <span class="sy0">&amp;</span>rest args<span class="br0">&#41;</span> expr<br/
>
<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br
0">&#40;</span><span class="kw1">and</span> <span class="br0">&#40;</span><span
class="kw1">member</span> op '<span class="br0">&#40;</span>* +<span class="br0"
>&#41;</span><span class="br0">&#41;</span><br/>
<span class="br0"
>&#40;</span><span class="sy0">=</span> <span class="nu0">1</span> <span class="
br0">&#40;</span><span class="kw1">length</span> args<span class="br0">&#41;</sp
an><span class="br0">&#41;</span><span class="br0">&#41;</span><br/>
<s
pan class="br0">&#40;</span><span class="kw1">car</span> args<span class="br0">&
#41;</span><br/>
<span class="br0">&#40;</span><span class="kw1">cons</sp
an> op<br/>
<span class="br0">&#40;</span><span class="kw1">case</s
pan> op<br/>
<span class="br0">&#40;</span><span class="br0">&#40
;</span>* +<span class="br0">&#41;</span><br/>
<span class="br0"
>&#40;</span>loop for arg in args<br/>
for merged <span cl
ass="sy0">=</span> <span class="br0">&#40;</span>merge-exprs arg<span class="br0
">&#41;</span><br/>
<span class="kw1">when</span> <span cl
ass="br0">&#40;</span><span class="kw1">and</span> <span class="br0">&#40;</span
><span class="kw1">consp</span> merged<span class="br0">&#41;</span><br/>
<span class="br0">&#40;</span><span class="kw1">eq</sp
an> op <span class="br0">&#40;</span><span class="kw1">car</span> merged<span cl
ass="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</spa
n><br/>
<span class="kw1">append</span> <span class="br0">
&#40;</span><span class="kw1">cdr</span> merged<span class="br0">&#41;</span><br
/>
else collect merged<span class="br0">&#41;</span><span
class="br0">&#41;</span><br/>
<span class="br0">&#40;</span>t <sp
an class="br0">&#40;</span><span class="kw1">mapcar</span> #'merge-exprs args<sp
an class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;
</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="
br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br

/>&#160;<br/><span class="br0">&#40;</span><span class="kw1">defun</span> solve<span class="nu0">24</span>-game <span class="br0">&#40;</span>digits<span class


="br0">&#41;</span><br/> <span class="st0">&quot;Generate a lisp form using the
operators in +ops+ and the given<br/>digits which evaluates to 24. The first f
orm found is returned, or<br/>NIL if there is no solution.&quot;</span><br/> <s
pan class="br0">&#40;</span>solvable-p digits<span class="br0">&#41;</span><span
class="br0">&#41;</span></pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>
CL-USER 138 &gt; (loop repeat 24 for soln = (solve-24-game (digits)) when soln d
o (pprint soln))
(+ 7 5 (* 4 3))
(* 6 4 (- 3 2))
(+ 9 8 4 3)
(* 8 (- 6 (* 3 1)))
(* 6 4 (/ 2 2))
(* 9 (/ 8 (- 8 5)))
NIL
</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=10" title="Edit section: D">edit</a>]</span> <span class="
mw-headline" id="D"><a href="/wiki/Category:D" title="Category:D">D</a></span></
h2>
<p>This uses the Rational struct and permutations functions of two other Rosetta
Code Tasks.
</p>
<div class="examplemeta translation"><b>Translation of</b>: <a href="/wiki/24_ga
me/Solve#Scala" title="24 game/Solve">Scala</a></div>
<pre class="d highlighted_source"><span class="kw2">import</span> std.<span clas
s="me1">stdio</span><span class="sy0">,</span> std.<span class="me1">algorithm</
span><span class="sy0">,</span> std.<span class="me1">range</span><span class="s
y0">,</span> std.<span class="me1">conv</span><span class="sy0">,</span> std.<sp
an class="kw4">string</span><span class="sy0">,</span><br/>
std.<span clas
s="me1">concurrency</span><span class="sy0">,</span> permutations2<span class="s
y0">,</span> arithmetic_rational<span class="sy0">;</span><br/>&#160;<br/><span
class="kw4">string</span> solve<span class="br0">&#40;</span><span class="kw2">i
n</span> <span class="kw4">int</span> target<span class="sy0">,</span> <span cla
ss="kw2">in</span> <span class="kw4">int</span><span class="br0">&#91;</span><sp
an class="br0">&#93;</span> problem<span class="br0">&#41;</span> <span class="b
r0">&#123;</span><br/>
<span class="kw4">static</span> <span class="kw4">stru
ct</span> T <span class="br0">&#123;</span> Rational r<span class="sy0">;</span>
<span class="kw4">string</span> e<span class="sy0">;</span> <span class="br0">&
#125;</span><br/>&#160;<br/>
Generator<span class="sy0">!</span>T computeAllO
perations<span class="br0">&#40;</span><span class="kw2">in</span> Rational<span
class="br0">&#91;</span><span class="br0">&#93;</span> L<span class="br0">&#41;
</span> <span class="br0">&#123;</span><br/>
<span class="kw1">return</sp
an> <span class="kw2">new</span> <span class="kw2">typeof</span><span class="br0
">&#40;</span><span class="kw1">return</span><span class="br0">&#41;</span><span
class="br0">&#40;</span><span class="br0">&#123;</span><br/>
<span c
lass="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>L.<
span class="me1">empty</span><span class="br0">&#41;</span> <span class="br0">&#
123;</span><br/>
<span class="kw4">immutable</span> x <span class
="sy0">=</span> L<span class="br0">&#91;</span><span class="nu0">0</span><span c
lass="br0">&#93;</span><span class="sy0">;</span><br/>
<span clas
s="kw1">if</span> <span class="br0">&#40;</span>L.<span class="me1">length</span
> <span class="sy0">==</span> <span class="nu0">1</span><span class="br0">&#41;<
/span> <span class="br0">&#123;</span><br/>
yield<span class=

"br0">&#40;</span>T<span class="br0">&#40;</span>x<span class="sy0">,</span> x.<


span class="me1">text</span><span class="br0">&#41;</span><span class="br0">&#41
;</span><span class="sy0">;</span><br/>
<span class="br0">&#125;<
/span> <span class="kw1">else</span> <span class="br0">&#123;</span><br/>
<span class="kw1">foreach</span> <span class="br0">&#40;</span><spa
n class="kw4">const</span> o<span class="sy0">;</span> computeAllOperations<span
class="br0">&#40;</span>L.<span class="me1">dropOne</span><span class="br0">&#4
1;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br/>
<span class="kw4">immutable</span> y <span class="sy0">=</sp
an> o.<span class="me1">r</span><span class="sy0">;</span><br/>
<span class="kw4">auto</span> sub <span class="sy0">=</span> <span class=
"br0">&#91;</span>T<span class="br0">&#40;</span>x <span class="sy0">*</span> y<
span class="sy0">,</span> <span class="st0">&quot;*&quot;</span><span class="br0
">&#41;</span><span class="sy0">,</span> T<span class="br0">&#40;</span>x <span
class="sy0">+</span> y<span class="sy0">,</span> <span class="st0">&quot;+&quot;
</span><span class="br0">&#41;</span><span class="sy0">,</span> T<span class="br
0">&#40;</span>x <span class="sy0">-</span> y<span class="sy0">,</span> <span cl
ass="st0">&quot;-&quot;</span><span class="br0">&#41;</span><span class="br0">&#
93;</span><span class="sy0">;</span><br/>
<span class="kw
1">if</span> <span class="br0">&#40;</span>y<span class="br0">&#41;</span> sub <
span class="sy0">~=</span> <span class="br0">&#91;</span>T<span class="br0">&#40
;</span>x <span class="sy0">/</span> y<span class="sy0">,</span> <span class="st
0">&quot;/&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</sp
an><span class="sy0">;</span><br/>
<span class="kw1">fore
ach</span> <span class="br0">&#40;</span><span class="kw4">const</span> e<span c
lass="sy0">;</span> sub<span class="br0">&#41;</span><br/>
yield<span class="br0">&#40;</span>T<span class="br0">&#40;</span>e.<span
class="me1">r</span><span class="sy0">,</span> format<span class="br0">&#40;</sp
an><span class="st0">&quot;(%s%s%s)&quot;</span><span class="sy0">,</span> x<spa
n class="sy0">,</span> e.<span class="me1">e</span><span class="sy0">,</span> o.
<span class="me1">e</span><span class="br0">&#41;</span><span class="br0">&#41;<
/span><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>
<span class="br0">&#1
25;</span><br/>
<span class="br0">&#125;</span><br/>
<span cla
ss="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><b
r/>
<span class="br0">&#125;</span><br/>&#160;<br/>
<span class="kw1">fore
ach</span> <span class="br0">&#40;</span><span class="kw4">const</span> p<span c
lass="sy0">;</span> problem.<span class="me1">map</span><span class="sy0">!</spa
n>Rational.<span class="me1">array</span>.<span class="me1">permutations</span><
span class="sy0">!</span><span class="kw2">false</span><span class="br0">&#41;</
span><br/>
<span class="kw1">foreach</span> <span class="br0">&#40;</span
><span class="kw4">const</span> sol<span class="sy0">;</span> computeAllOperatio
ns<span class="br0">&#40;</span>p<span class="br0">&#41;</span><span class="br0"
>&#41;</span><br/>
<span class="kw1">if</span> <span class="br0">&#40
;</span>sol.<span class="me1">r</span> <span class="sy0">==</span> target<span c
lass="br0">&#41;</span><br/>
<span class="kw1">return</span> sol.
<span class="me1">e</span><span class="sy0">;</span><br/>
<span class="kw1">r
eturn</span> <span class="st0">&quot;No solution&quot;</span><span class="sy0">;
</span><br/><span class="br0">&#125;</span><br/>&#160;<br/><span class="kw4">voi
d</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span
class="br0">&#123;</span><br/>
<span class="kw1">foreach</span> <span class="
br0">&#40;</span><span class="kw4">const</span> prob<span class="sy0">;</span> <
span class="br0">&#91;</span><span class="br0">&#91;</span><span class="nu0">6</
span><span class="sy0">,</span> <span class="nu0">7</span><span class="sy0">,</s
pan> <span class="nu0">9</span><span class="sy0">,</span> <span class="nu0">5</s
pan><span class="br0">&#93;</span><span class="sy0">,</span> <span class="br0">&
#91;</span><span class="nu0">3</span><span class="sy0">,</span> <span class="nu0
">3</span><span class="sy0">,</span> <span class="nu0">8</span><span class="sy0"
>,</span> <span class="nu0">8</span><span class="br0">&#93;</span><span class="s
y0">,</span> <span class="br0">&#91;</span><span class="nu0">1</span><span class

="sy0">,</span> <span class="nu0">1</span><span class="sy0">,</span> <span class


="nu0">1</span><span class="sy0">,</span> <span class="nu0">1</span><span class=
"br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><b
r/>
writeln<span class="br0">&#40;</span>prob<span class="sy0">,</span> <
span class="st0">&quot;: &quot;</span><span class="sy0">,</span> solve<span clas
s="br0">&#40;</span><span class="nu0">24</span><span class="sy0">,</span> prob<s
pan class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</s
pan><br/><span class="br0">&#125;</span></pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>[6, 7, 9, 5]: (6+(9*(7-5)))
[3, 3, 8, 8]: (8/(3-(8/3)))
[1, 1, 1, 1]: No solution</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=11" title="Edit section: ERRE">edit</a>]</span> <span clas
s="mw-headline" id="ERRE"><a href="/wiki/Category:ERRE" title="Category:ERRE">ER
RE</a></span></h2>
<p>ERRE hasn't an "EVAL" function so we must write an evaluation routine; this t
ask is solved via "brute-force".
</p>
<pre class="text highlighted_source">&#160;<br/>PROGRAM 24SOLVE<br/>&#160;<br/>L
ABEL 98,99,2540,2550,2560<br/>&#160;<br/>! possible brackets<br/>CONST NBRACKETS
=11,ST_CONST$=&quot;+-*/^(&quot;<br/>&#160;<br/>DIM D[4],PERM[24,4]<br/>DIM BRAK
ETS$[NBRACKETS]<br/>DIM OP$[3]<br/>DIM STACK$[50]<br/>&#160;<br/>PROCEDURE COMPA
TTA_STACK<br/> IF NS&gt;1 THEN<br/>
R=1<br/>
WHILE R&lt;NS DO<br/>
IF INSTR(ST_CONST$,STACK$[R])=0 AND INSTR(ST_CONST$,STACK$[R+1])=0 THEN<b
r/>
FOR R1=R TO NS-1 DO<br/>
STACK$[R1]=STACK$[R1+1]<br/
>
END FOR<br/>
NS=NS-1<br/>
END IF<br/>
R=
R+1<br/>
END WHILE<br/> END IF<br/>END PROCEDURE<br/>&#160;<br/>PROCEDURE
CALC_ARITM<br/>
L=NS1<br/>
WHILE L&lt;=NS2 DO<br/>
IF STACK$[L]=
&quot;^&quot; THEN<br/>
IF L&gt;=NS2 THEN GOTO 99 END IF<br/>
N1#=VAL(STACK$[L-1]) N2#=VAL(STACK$[L+1]) NOP=NOP-1<br/>
IF STACK
$[L]=&quot;^&quot; THEN<br/>
RI#=N1#^N2#<br/>
END IF<b
r/>
STACK$[L-1]=STR$(RI#)<br/>
N=L<br/>
WHILE N
&lt;=NS2-2 DO<br/>
STACK$[N]=STACK$[N+2]<br/>
N=N+1<
br/>
END WHILE<br/>
NS2=NS2-2<br/>
L=NS1-1<br/>
END IF<br/>
L=L+1<br/>
END WHILE<br/>&#160;<br/>
L=NS1<br
/>
WHILE L&lt;=NS2 DO<br/>
IF STACK$[L]=&quot;*&quot; OR STACK$[L]=&q
uot;/&quot; THEN<br/>
IF L&gt;=NS2 THEN GOTO 99 END IF<br/>
N1#=VAL(STACK$[L-1]) N2#=VAL(STACK$[L+1]) NOP=NOP-1<br/>
IF STACK$[
L]=&quot;*&quot; THEN<br/>
RI#=N1#*N2#<br/>
ELSE<br
/>
IF N2#&lt;&gt;0 THEN RI#=N1#/N2# ELSE NERR=6 RI#=0 END IF<br/
>
END IF<br/>
STACK$[L-1]=STR$(RI#)<br/>
N=L<br
/>
WHILE N&lt;=NS2-2 DO<br/>
STACK$[N]=STACK$[N+2]<br/>
N=N+1<br/>
END WHILE<br/>
NS2=NS2-2<br/>
L=NS1-1<br/>
END IF<br/>
L=L+1<br/>
END WHILE<br/>&#1
60;<br/>
L=NS1<br/>
WHILE L&lt;=NS2 DO<br/>
IF STACK$[L]=&quot;+&
quot; OR STACK$[L]=&quot;-&quot; THEN<br/>
EXIT IF L&gt;=NS2<br/>
N1#=VAL(STACK$[L-1]) N2#=VAL(STACK$[L+1]) NOP=NOP-1<br/>
IF
STACK$[L]=&quot;+&quot; THEN RI#=N1#+N2# ELSE RI#=N1#-N2# END IF<br/>
STACK$[L-1]=STR$(RI#)<br/>
N=L<br/>
WHILE N&lt;=NS2-2 DO<
br/>
STACK$[N]=STACK$[N+2]<br/>
N=N+1<br/>
END WHILE<br/>
NS2=NS2-2<br/>
L=NS1-1<br/>
END IF
<br/>
L=L+1<br/>
END WHILE<br/>99:<br/>
IF NOP&lt;2 THEN &#160;!
precedenza tra gli operatori<br/>
DB#=VAL(STACK$[NS1])<br/>
ELSE
<br/>
IF NOP&lt;3 THEN<br/>
DB#=VAL(STACK$[NS1+2])<br/>
ELSE<br/>
DB#=VAL(STACK$[NS1+4])<br/>
END IF<b
r/>
END IF<br/>END PROCEDURE<br/>&#160;<br/>PROCEDURE SVOLGI_PAR<br/> NPA=
NPA-1<br/> FOR J=NS TO 1 STEP -1 DO<br/>
EXIT IF STACK$[J]=&quot;(&quot;<

br/> END FOR<br/> IF J=0 THEN<br/>


NS1=1 NS2=NS CALC_ARITM NERR=7<br
/>
ELSE<br/>
FOR R=J TO NS-1 DO<br/>
STACK$[R]=STACK$[R+1]<br/
>
END FOR<br/>
NS1=J NS2=NS-1 CALC_ARITM<br/>
IF NS1=2 THEN<
br/>
NS1=1 STACK$[1]=STACK$[2]<br/>
END IF<br/>
NS=NS1<br/
>
COMPATTA_STACK<br/> END IF<br/>END PROCEDURE<br/>&#160;<br/>PROCEDURE
MYEVAL(EXPRESSION$,DB#,NERR-&gt;DB#,NERR)<br/>&#160;<br/>
NOP=0 NPA=0 NS=1 K
$=&quot;&quot; NERR=0<br/>
STACK$[1]=&quot;@&quot;
&#160;! init stac
k<br/>&#160;<br/>
FOR W=1 TO LEN(EXPRESSION$) DO<br/>
LOOP<br/>
CODE=ASC(MID$(EXPRESSION$,W,1))<br/>
IF (CODE&gt;=48 AND CODE&lt;
=57) OR CODE=46 THEN<br/>
K$=K$+CHR$(CODE)<br/>
W=
W+1 IF W&gt;LEN(EXPRESSION$) THEN GOTO 98 END IF<br/>
ELSE<br/>
EXIT IF K$=&quot;&quot;<br/>
IF NS&gt;1 OR (NS=1 AND
STACK$[1]&lt;&gt;&quot;@&quot;) THEN NS=NS+1 END IF<br/>
IF FLAG=
0 THEN<br/>
STACK$[NS]=K$<br/>
ELSE<br/>
STACK$[NS]=STR$(VAL(K$)*FLAG)<br/>
END IF<br
/>
K$=&quot;&quot; FLAG=0<br/>
EXIT<br/>
END IF<br/>
END LOOP<br/>
IF CODE=43 THEN K$=&quot;+&quot; END I
F<br/>
IF CODE=45 THEN K$=&quot;-&quot; END IF<br/>
IF CODE=42 THE
N K$=&quot;*&quot; END IF<br/>
IF CODE=47 THEN K$=&quot;/&quot; END IF<br
/>
IF CODE=94 THEN K$=&quot;^&quot; END IF<br/>&#160;<br/>
CASE CO
DE OF<br/>
43,45,42,47,94-&gt; &#160;! +-*/^<br/>
IF MID$(E
XPRESSION$,W+1,1)=&quot;-&quot; THEN FLAG=-1 W=W+1 END IF<br/>
IF I
NSTR(ST_CONST$,STACK$[NS])&lt;&gt;0 THEN<br/>
NERR=5<br/>
ELSE<br/>
NS=NS+1 STACK$[NS]=K$ NOP=NOP+1<br/>
IF NOP&gt;=2 THEN<br/>
FOR J=NS TO 1 STEP -1 DO<br/>
IF STACK$[J]&lt;&gt;&quot;(&quot; THEN GOTO 2540 END IF<br/
>
IF J&lt;NS-2 THEN GOTO 2550 ELSE GOTO 2560 END IF<br/>25
40:
END FOR<br/>2550:
NS1=J+1 NS2=NS CALC_ARITM<br/>
NS=NS2 STACK$[NS]=K$<br/>
REGISTRO_X#=VA
L(STACK$[NS-1])<br/>
END IF<br/>
END IF<br/>2560:
END -&gt;<br/>&#160;<br/>
40-&gt; &#160;! (<br/>
IF NS&gt
;1 OR (NS=1 AND STACK$[1]&lt;&gt;&quot;@&quot;) THEN NS=NS+1 END IF<br/>
STACK$[NS]=&quot;(&quot; NPA=NPA+1<br/>
IF MID$(EXPRESSION$,W+1
,1)=&quot;-&quot; THEN FLAG=-1 W=W+1 END IF<br/>
END -&gt;<br/>&#160;<b
r/>
41-&gt;&#160;! )<br/>
SVOLGI_PAR<br/>
IF NE
RR=7 THEN<br/>
NERR=0 NOP=0 NPA=0 NS=1<br/>
ELSE<
br/>
IF NERR=0 OR NERR=1 THEN<br/>
DB#=VAL
(STACK$[NS])<br/>
REGISTRO_X#=DB#<br/>
E
LSE<br/>
NOP=0 NPA=0 NS=1<br/>
END IF<br/>
END IF<br/>
END -&gt;<br/>&#160;<br/>
OTHERWISE<b
r/>
NERR=8<br/>
END CASE<br/>
K$=&quot;&quot;<br/> E
ND FOR<br/>98:<br/> IF K$&lt;&gt;&quot;&quot; THEN<br/>
IF NS&gt;1 OR (
NS=1 AND STACK$[1]&lt;&gt;&quot;@&quot;) THEN NS=NS+1 END IF<br/>
IF FLAG
=0 THEN STACK$[NS]=K$ ELSE STACK$[NS]=STR$(VAL(K$)*FLAG) END IF<br/> END IF<br
/>&#160;<br/> IF INSTR(ST_CONST$,STACK$[NS])&lt;&gt;0 THEN<br/>
NERR=6
<br/>
ELSE<br/>
WHILE NPA&lt;&gt;0 DO<br/>
SVOLGI_PAR<
br/>
END WHILE<br/>
IF NERR&lt;&gt;7 THEN NS1=1 NS2=NS CALCARIT
M END IF<br/>
END IF<br/>&#160;<br/>
NS=1 NOP=0 NPA=0<br/>&#160;<br/>END
PROCEDURE<br/>&#160;<br/>BEGIN<br/> PRINT(CHR$(12);)&#160;! CLS<br/>&#160;<br
/> &#160;! possible brackets<br/> DATA(&quot;4#4#4#4&quot;)<br/> DATA(&quot
;(4#4)#4#4&quot;)<br/> DATA(&quot;4#(4#4)#4&quot;)<br/> DATA(&quot;4#4#(4#4)
&quot;)<br/> DATA(&quot;(4#4)#(4#4)&quot;)<br/> DATA(&quot;(4#4#4)#4&quot;)<
br/> DATA(&quot;4#(4#4#4)&quot;)<br/> DATA(&quot;((4#4)#4)#4&quot;)<br/> D
ATA(&quot;(4#(4#4))#4&quot;)<br/> DATA(&quot;4#((4#4)#4)&quot;)<br/> DATA(&q
uot;4#(4#(4#4))&quot;)<br/> FOR I=1 TO NBRACKETS DO<br/>
READ(BRAKETS$[I])
<br/> END FOR<br/>&#160;<br/> INPUT(&quot;ENTER 4 DIGITS: &quot;,A$)<br/>
ND=0<br/> FOR I=1 TO LEN(A$) DO<br/>
C$=MID$(A$,I,1)<br/>
IF INSTR(&
quot;123456789&quot;,C$)&gt;0 THEN<br/>
ND=ND+1<br/>
D[ND]=VAL(C$)
<br/>
END IF<br/> END FOR<br/> &#160;! precompute permutations. dumb way
.<br/> NPERM=1*2*3*4<br/> N=0<br/> FOR I=1 TO 4 DO<br/>
FOR J=1 TO 4

DO<br/>
FOR K=1 TO 4 DO<br/>
FOR L=1 TO 4 DO<br/>
&#
160;! valid permutation (no dupes)<br/>
IF I&lt;&gt;J AND I&lt;&g
t;K AND I&lt;&gt;L AND J&lt;&gt;K AND J&lt;&gt;L AND K&lt;&gt;L THEN<br/>
N=N+1<br/>! actually,we can as well permute given digits<br/>
PERM[N,1]=D[I]<br/>
PERM[N,2]=D[J]<br/>
PERM[N,3]=D[K]<br/>
PERM[N,4]=D[L]<br/>
END IF<br/>
END FOR<br/>
END FOR<br/>
END FOR<br/>
END FOR<br/>&#160;<br/> &#160;! operations: full search<br/> COUNT=0<br/>
OPS$=&quot;+-*/&quot;<br/> FOR OP1=1 TO 4 DO<br/>
OP$[1]=MID$(OPS$,OP1,
1)<br/>
FOR OP2=1 TO 4 DO<br/>
OP$[2]=MID$(OPS$,OP2,1)<br/>
F
OR OP3=1 TO 4 DO<br/>
OP$[3]=MID$(OPS$,OP3,1)<br/>
&#160;!
substitute all brackets<br/>
FOR T=1 TO NBRACKETS DO<br/>
TMPL$=BRAKETS$[T]<br/>
&#160;! now,substitute all digits: perm
utations.<br/>
FOR P=1 TO NPERM DO<br/>
RES$=&
quot;&quot;<br/>
NOP=0<br/>
ND=0<br/>
FOR I=1 TO LEN(TMPL$) DO<br/>
C$=MID$(TMPL
$,I,1)<br/>
CASE C$ OF<br/>
&quot;
#&quot;-&gt;
&#160;! operations<br/>
NO
P=NOP+1<br/>
RES$=RES$+OP$[NOP]<br/>
END -&gt;<br/>
&quot;4&quot;-&gt;
&#
160;! digits<br/>
ND=NOP+1<br/>
RES$=RES$+MID$(STR$(PERM[P,ND]),2)<br/>
END -&gt;<b
r/>
OTHERWISE
&#160;! brackets goes here<br/>
RES$=RES$+C$<br/>
END CASE<br/>
END FOR<br/>
&#160;! eval here<br/>
MY_EVAL(RES$,DB#,NERR-&gt;DB#,NERR)<br/>
IF DB#=
24 AND NERR=0 THEN<br/>
PRINT(&quot;24=&quot;;RES$)<br/>
COUNT=COUNT+1<br/>
END IF<br/>
END FOR<br/>
END FOR<br/>
END FOR<br/>
END FOR<br
/>
END FOR<br/>&#160;<br/>
IF COUNT=0 THEN<br/>
PRINT(&quot;If you s
ee this, probably task cannot be solved with these digits&quot;)<br/>
ELSE<b
r/>
PRINT(&quot;Total=&quot;;COUNT)<br/>
END IF<br/>&#160;<br/>END PROG
RAM<br/>&#160;</pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>
ENTER 4 DIGITS:&#160;? 6759
24=6+(7-5)*9
24=6+((7-5)*9)
24=6+9*(7-5)
24=6+(9*(7-5))
24=6-(5-7)*9
24=6-((5-7)*9)
24=(7-5)*9+6
24=((7-5)*9)+6
24=6-9*(5-7)
24=6-(9*(5-7))
24=9*(7-5)+6
24=(9*(7-5))+6
Total= 12
</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=12" title="Edit section: Euler Math Toolbox">edit</a>]</sp
an> <span class="mw-headline" id="Euler_Math_Toolbox"><a href="/wiki/Category:Eu
ler_Math_Toolbox" title="Category:Euler Math Toolbox">Euler Math Toolbox</a></sp
an></h2>
<p>Via brute force.
</p>
<pre class="text highlighted_source">&#160;<br/>&gt;function try24 (v) ...<br/>$

n=cols(v);<br/>$if n==1 and v[1]~=24 then<br/>$ &quot;Solved the problem&quot;,


<br/>$ return 1;<br/>$endif<br/>$loop 1 to n<br/>$ w=tail(v,2);<br/>$ loop 1
to n-1<br/>$
h=w; a=v[1]; b=w[1];<br/>$
w[1]=a+b; if try24(w); &quot;&quot
;+a+&quot;+&quot;+b+&quot;=&quot;+(a+b), return 1; endif;<br/>$
w[1]=a-b; if
try24(w); &quot;&quot;+a+&quot;-&quot;+b+&quot;=&quot;+(a-b), return 1; endif;<b
r/>$
w[1]=a*b; if try24(w); &quot;&quot;+a+&quot;*&quot;+b+&quot;=&quot;+(a*b
), return 1; endif;<br/>$
if not b~=0 then <br/>$
w[1]=a/b; if try24(w)
; &quot;&quot;+a+&quot;/&quot;+b+&quot;=&quot;+(a/b), return 1; endif;<br/>$
endif;<br/>$
w=rotright(w);<br/>$ end;<br/>$ v=rotright(v);<br/>$end;<br/>$
return 0;<br/>$endfunction<br/>&#160;</pre>
<pre class="text highlighted_source">&#160;<br/>&gt;try24([1,2,3,4]);<br/> Solve
d the problem<br/> 6*4=24<br/> 3+3=6<br/> 1+2=3<br/>&gt;try24([8,7,7,1]);<br/> S
olved the problem<br/> 22+2=24<br/> 14+8=22<br/> 7+7=14<br/>&gt;try24([8,4,7,1])
;<br/> Solved the problem<br/> 6*4=24<br/> 7-1=6<br/> 8-4=4<br/>&gt;try24([3,4,5
,6]);<br/> Solved the problem<br/> 4*6=24<br/> -1+5=4<br/> 3-4=-1<br/>&#160;</pr
e>
<p><br/>
</p>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=13" title="Edit section: F#">edit</a>]</span> <span class=
"mw-headline" id="F.23"><span id="F_Sharp"><a href="/wiki/Category:F_Sharp" titl
e="Category:F Sharp">F#</a></span></span></h2>
<p>The program wants to give all solutions for a given set of 4 digits.
It eliminates all duplicate solutions which result from transposing equal digits
.
The basic solution is an adaption of the OCaml program.
</p>
<pre class="fsharp highlighted_source"><span class="kw1">open</span> System<br/>
&#160;<br/><span class="kw1">let</span> <span class="kw1">rec</span> gcd x y <sp
an class="sy0">=</span> <span class="kw1">if</span> x <span class="sy0">=</span>
y || x <span class="sy0">=</span> <span class="nu0">0</span> <span class="kw1">
then</span> y <span class="kw1">else</span> <span class="kw1">if</span> x <span
class="sy0">&lt;</span> y <span class="kw1">then</span> gcd y x <span class="kw1
">else</span> gcd y <span class="br0">&#40;</span>x<span class="sy0">-</span>y<s
pan class="br0">&#41;</span><br/><span class="kw1">let</span> <span class="kw3">
abs</span> <span class="br0">&#40;</span>x&#160;: <span class="kw4">int</span><s
pan class="br0">&#41;</span> <span class="sy0">=</span> Math.<span class="me1">A
bs</span> x<br/><span class="kw1">let</span> <span class="kw3">sign</span> <span
class="br0">&#40;</span>x: <span class="kw4">int</span><span class="br0">&#41;<
/span> <span class="sy0">=</span> Math.<span class="me1">Sign</span> x<br/><span
class="kw1">let</span> cint s <span class="sy0">=</span> Int32.<span class="me1
">Parse</span><span class="br0">&#40;</span>s<span class="br0">&#41;</span><br/>
&#160;<br/><span class="kw1">type</span> Rat<span class="br0">&#40;</span>x&#160
;: <span class="kw4">int</span>, y&#160;: <span class="kw4">int</span><span clas
s="br0">&#41;</span> <span class="sy0">=</span><br/>
<span class="kw1">let</s
pan> g <span class="sy0">=</span> <span class="kw1">if</span> y <span class="sy0
">=</span> <span class="nu0">0</span> <span class="kw1">then</span> <span class=
"nu0">0</span> <span class="kw1">else</span> gcd <span class="br0">&#40;</span><
span class="kw3">abs</span> x<span class="br0">&#41;</span> <span class="br0">&#
40;</span><span class="kw3">abs</span> y<span class="br0">&#41;</span><br/>
<
span class="kw1">member</span> this.<span class="me1">n</span> <span class="sy0"
>=</span> <span class="kw1">if</span> g <span class="sy0">=</span> <span class="
nu0">0</span> <span class="kw1">then</span> <span class="kw3">sign</span> y <spa
n class="sy0">*</span> <span class="kw3">sign</span> x <span class="kw1">else</s
pan> <span class="kw3">sign</span> y <span class="sy0">*</span> x <span class="s
y0">/</span> g <span class="co1">// store a minus sign in the numerator</span>
<br/>
<span class="kw1">member</span> this.<span class="me1">d</span> <span c
lass="sy0">=</span><br/>
<span class="kw1">if</span> y <span class="sy0">
=</span> <span class="nu0">0</span> <span class="kw1">then</span> <span class="n
u0">0</span> <span class="kw1">else</span> <span class="kw3">sign</span> y <span

class="sy0">*</span> y <span class="sy0">/</span> g<br/>


<span class="kw1">s
tatic</span> <span class="kw1">member</span> <span class="br0">&#40;</span><span
class="sy0">~-</span><span class="br0">&#41;</span> <span class="br0">&#40;</sp
an>x&#160;: Rat<span class="br0">&#41;</span> <span class="sy0">=</span> Rat<spa
n class="br0">&#40;</span><span class="sy0">-</span>x.<span class="me1">n</span>
, x.<span class="me1">d</span><span class="br0">&#41;</span><br/>
<span class
="kw1">static</span> <span class="kw1">member</span> <span class="br0">&#40;</sp
an><span class="sy0">+</span><span class="br0">&#41;</span> <span class="br0">&#
40;</span>x&#160;: Rat, y&#160;: Rat<span class="br0">&#41;</span> <span class="
sy0">=</span> Rat<span class="br0">&#40;</span>x.<span class="me1">n</span> <spa
n class="sy0">*</span> y.<span class="me1">d</span> <span class="sy0">+</span> y
.<span class="me1">n</span> <span class="sy0">*</span> x.<span class="me1">d</sp
an>, x.<span class="me1">d</span> <span class="sy0">*</span> y.<span class="me1"
>d</span><span class="br0">&#41;</span><br/>
<span class="kw1">static</span>
<span class="kw1">member</span> <span class="br0">&#40;</span><span class="sy0">
-</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>x&#160;: Ra
t, y&#160;: Rat<span class="br0">&#41;</span> <span class="sy0">=</span> x <span
class="sy0">+</span> Rat<span class="br0">&#40;</span><span class="sy0">-</span
>y.<span class="me1">n</span>, y.<span class="me1">d</span><span class="br0">&#4
1;</span><br/>
<span class="kw1">static</span> <span class="kw1">member</span
> <span class="br0">&#40;</span><span class="sy0">*</span><span class="br0">&#41
;</span> <span class="br0">&#40;</span>x&#160;: Rat, y&#160;: Rat<span class="br
0">&#41;</span> <span class="sy0">=</span> Rat<span class="br0">&#40;</span>x.<s
pan class="me1">n</span> <span class="sy0">*</span> y.<span class="me1">n</span>
, x.<span class="me1">d</span> <span class="sy0">*</span> y.<span class="me1">d<
/span><span class="br0">&#41;</span><br/>
<span class="kw1">static</span> <sp
an class="kw1">member</span> <span class="br0">&#40;</span><span class="sy0">/</
span><span class="br0">&#41;</span> <span class="br0">&#40;</span>x&#160;: Rat,
y&#160;: Rat<span class="br0">&#41;</span> <span class="sy0">=</span> x <span cl
ass="sy0">*</span> Rat<span class="br0">&#40;</span>y.<span class="me1">d</span>
, y.<span class="me1">n</span><span class="br0">&#41;</span><br/>
<span class
="kw1">interface</span> System.<span class="me1">IComparable</span> <span class=
"kw1">with</span><br/>
<span class="kw1">member</span> this.<span class="me
1">CompareTo</span> o <span class="sy0">=</span> <br/>
<span class="kw1">
match</span> o <span class="kw1">with</span><br/>
|&#160;:? Rat <span cla
ss="kw1">as</span> that <span class="sy0">-&gt;</span> compare <span class="br0"
>&#40;</span>this.<span class="me1">n</span> <span class="sy0">*</span> that.<sp
an class="me1">d</span><span class="br0">&#41;</span> <span class="br0">&#40;</s
pan>that.<span class="me1">n</span> <span class="sy0">*</span> this.<span class=
"me1">d</span><span class="br0">&#41;</span><br/>
| _ <span class="sy0">&gt;</span> <span class="kw5">invalidArg</span> <span class="st0">&quot;o&quot;<
/span> <span class="st0">&quot;cannot compare values of differnet types.&quot;</
span><br/>
<span class="kw1">override</span> this.<span class="me1">Equals</s
pan><span class="br0">&#40;</span>o<span class="br0">&#41;</span> <span class="s
y0">=</span><br/>
<span class="kw1">match</span> o <span class="kw1">with
</span><br/>
|&#160;:? Rat <span class="kw1">as</span> that <span class="
sy0">-&gt;</span> this.<span class="me1">n</span> <span class="sy0">=</span> tha
t.<span class="me1">n</span> &amp;&amp; this.<span class="me1">d</span> <span cl
ass="sy0">=</span> that.<span class="me1">d</span><br/>
| _ <span class="
sy0">-&gt;</span> <span class="kw1">false</span><br/>
<span class="kw1">overr
ide</span> this.<span class="me1">ToString</span><span class="br0">&#40;</span><
span class="br0">&#41;</span> <span class="sy0">=</span><br/>
<span class
="kw1">if</span> this.<span class="me1">d</span> <span class="sy0">=</span> <spa
n class="nu0">1</span> <span class="kw1">then</span> this.<span class="me1">n</s
pan>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class=
"br0">&#41;</span><br/>
<span class="kw1">else</span> sprintf <span class
="st_h">@&quot;&lt;%d,%d&gt;&quot;</span> this.<span class="me1">n</span> this.<
span class="me1">d</span><br/>
<span class="kw1">new</span><span class="br0">
&#40;</span>x&#160;: <span class="kw4">string</span>, y&#160;: <span class="kw4"
>string</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span cl

ass="kw1">if</span> y <span class="sy0">=</span> <span class="st0">&quot;&quot;<


/span> <span class="kw1">then</span> Rat<span class="br0">&#40;</span>cint x, <s
pan class="nu0">1</span><span class="br0">&#41;</span> <span class="kw1">else</s
pan> Rat<span class="br0">&#40;</span>cint x, cint y<span class="br0">&#41;</spa
n><br/>&#160;<br/><span class="kw1">type</span> expression <span class="sy0">=</
span><br/>
| Const <span class="kw1">of</span> Rat<br/>
| Sum <span class
="kw1">of</span> expression <span class="sy0">*</span> expression<br/>
| Diff
<span class="kw1">of</span> expression <span class="sy0">*</span> expression<br
/>
| Prod <span class="kw1">of</span> expression <span class="sy0">*</span> e
xpression<br/>
| Quot <span class="kw1">of</span> expression <span class="sy0
">*</span> expression<br/>&#160;<br/><span class="kw1">let</span> <span class="k
w1">rec</span> eval <span class="sy0">=</span> <span class="kw1">function</span>
<br/>
| Const c <span class="sy0">-&gt;</span> c<br/>
| Sum <span class="b
r0">&#40;</span>f, g<span class="br0">&#41;</span> <span class="sy0">-&gt;</span
> eval f <span class="sy0">+</span> eval g<br/>
| Diff<span class="br0">&#40;
</span>f, g<span class="br0">&#41;</span> <span class="sy0">-&gt;</span> eval f
<span class="sy0">-</span> eval g<br/>
| Prod<span class="br0">&#40;</span>f,
g<span class="br0">&#41;</span> <span class="sy0">-&gt;</span> eval f <span cla
ss="sy0">*</span> eval g<br/>
| Quot<span class="br0">&#40;</span>f, g<span c
lass="br0">&#41;</span> <span class="sy0">-&gt;</span> eval f <span class="sy0">
/</span> eval g<br/>&#160;<br/><span class="kw1">let</span> print_expr expr <spa
n class="sy0">=</span><br/>
<span class="kw1">let</span> concat <span class="
br0">&#40;</span>s&#160;: <span class="kw4">seq</span><span class="sy0">&lt;</sp
an><span class="kw4">string</span><span class="sy0">&gt;</span><span class="br0"
>&#41;</span> <span class="sy0">=</span> System.<a href="http://research.microso
ft.com/en-us/um/cambridge/projects/fsharp/manual/namespaces.html"><span class="k
w2">String</span></a>.<span class="me1">Concat</span> s<br/>
<span class="kw1
">let</span> paren p prec op_prec <span class="sy0">=</span> <span class="kw1">i
f</span> prec <span class="sy0">&gt;</span> op_prec <span class="kw1">then</span
> p <span class="kw1">else</span> <span class="st0">&quot;&quot;</span><br/>
<span class="kw1">let</span> <span class="kw1">rec</span> print prec <span class
="sy0">=</span> <span class="kw1">function</span><br/>
| Const c <span class=
"sy0">-&gt;</span> c.<span class="me1">ToString</span><span class="br0">&#40;</s
pan><span class="br0">&#41;</span><br/>
| Sum<span class="br0">&#40;</span>f,
g<span class="br0">&#41;</span> <span class="sy0">-&gt;</span><br/>
conc
at <span class="br0">&#91;</span> <span class="br0">&#40;</span>paren <span clas
s="st0">&quot;(&quot;</span> prec <span class="nu0">0</span><span class="br0">&#
41;</span><span class="sy0">;</span> <span class="br0">&#40;</span>print <span c
lass="nu0">0</span> f<span class="br0">&#41;</span><span class="sy0">;</span> <s
pan class="st0">&quot; + &quot;</span><span class="sy0">;</span> <span class="br
0">&#40;</span>print <span class="nu0">0</span> g<span class="br0">&#41;</span><
span class="sy0">;</span> <span class="br0">&#40;</span>paren <span class="st0">
&quot;)&quot;</span> prec <span class="nu0">0</span><span class="br0">&#41;</spa
n> <span class="br0">&#93;</span><br/>
| Diff<span class="br0">&#40;</span>f,
g<span class="br0">&#41;</span> <span class="sy0">-&gt;</span><br/>
conc
at <span class="br0">&#91;</span> <span class="br0">&#40;</span>paren <span clas
s="st0">&quot;(&quot;</span> prec <span class="nu0">0</span><span class="br0">&#
41;</span><span class="sy0">;</span> <span class="br0">&#40;</span>print <span c
lass="nu0">0</span> f<span class="br0">&#41;</span><span class="sy0">;</span> <s
pan class="st0">&quot; - &quot;</span><span class="sy0">;</span> <span class="br
0">&#40;</span>print <span class="nu0">1</span> g<span class="br0">&#41;</span><
span class="sy0">;</span> <span class="br0">&#40;</span>paren <span class="st0">
&quot;)&quot;</span> prec <span class="nu0">0</span><span class="br0">&#41;</spa
n> <span class="br0">&#93;</span><br/>
| Prod<span class="br0">&#40;</span>f,
g<span class="br0">&#41;</span> <span class="sy0">-&gt;</span><br/>
conc
at <span class="br0">&#91;</span> <span class="br0">&#40;</span>paren <span clas
s="st0">&quot;(&quot;</span> prec <span class="nu0">2</span><span class="br0">&#
41;</span><span class="sy0">;</span> <span class="br0">&#40;</span>print <span c
lass="nu0">2</span> f<span class="br0">&#41;</span><span class="sy0">;</span> <s
pan class="st0">&quot; * &quot;</span><span class="sy0">;</span> <span class="br

0">&#40;</span>print <span class="nu0">2</span> g<span class="br0">&#41;</span><


span class="sy0">;</span> <span class="br0">&#40;</span>paren <span class="st0">
&quot;)&quot;</span> prec <span class="nu0">2</span><span class="br0">&#41;</spa
n> <span class="br0">&#93;</span><br/>
| Quot<span class="br0">&#40;</span>f,
g<span class="br0">&#41;</span> <span class="sy0">-&gt;</span><br/>
conc
at <span class="br0">&#91;</span> <span class="br0">&#40;</span>paren <span clas
s="st0">&quot;(&quot;</span> prec <span class="nu0">2</span><span class="br0">&#
41;</span><span class="sy0">;</span> <span class="br0">&#40;</span>print <span c
lass="nu0">2</span> f<span class="br0">&#41;</span><span class="sy0">;</span> <s
pan class="st0">&quot; / &quot;</span><span class="sy0">;</span> <span class="br
0">&#40;</span>print <span class="nu0">3</span> g<span class="br0">&#41;</span><
span class="sy0">;</span> <span class="br0">&#40;</span>paren <span class="st0">
&quot;)&quot;</span> prec <span class="nu0">2</span><span class="br0">&#41;</spa
n> <span class="br0">&#93;</span><br/>
print <span class="nu0">0</span> expr<
br/>&#160;<br/><span class="kw1">let</span> <span class="kw1">rec</span> normal
expr <span class="sy0">=</span><br/>
<span class="kw1">let</span> norm epxr <
span class="sy0">=</span><br/>
<span class="kw1">match</span> expr <span
class="kw1">with</span><br/>
| Sum<span class="br0">&#40;</span>x, y<span
class="br0">&#41;</span> <span class="sy0">-&gt;</span> <span class="kw1">if</s
pan> eval x <span class="sy0">&lt;=</span> eval y <span class="kw1">then</span>
expr <span class="kw1">else</span> Sum<span class="br0">&#40;</span>normal y, no
rmal x<span class="br0">&#41;</span><br/>
| Prod<span class="br0">&#40;</
span>x, y<span class="br0">&#41;</span> <span class="sy0">-&gt;</span> <span cla
ss="kw1">if</span> eval x <span class="sy0">&lt;=</span> eval y <span class="kw1
">then</span> expr <span class="kw1">else</span> Prod<span class="br0">&#40;</sp
an>normal y, normal x<span class="br0">&#41;</span><br/>
| _ <span class=
"sy0">-&gt;</span> expr<br/>
<span class="kw1">match</span> expr <span class=
"kw1">with</span><br/>
| Const c <span class="sy0">-&gt;</span> expr<br/>
| Sum<span class="br0">&#40;</span>x, y<span class="br0">&#41;</span> <span clas
s="sy0">-&gt;</span> norm <span class="br0">&#40;</span>Sum<span class="br0">&#4
0;</span>normal x, normal y<span class="br0">&#41;</span><span class="br0">&#41;
</span><br/>
| Prod<span class="br0">&#40;</span>x, y<span class="br0">&#41;<
/span> <span class="sy0">-&gt;</span> norm <span class="br0">&#40;</span>Prod<sp
an class="br0">&#40;</span>normal x, normal y<span class="br0">&#41;</span><span
class="br0">&#41;</span><br/>
| Diff<span class="br0">&#40;</span>x, y<span
class="br0">&#41;</span> <span class="sy0">-&gt;</span> Diff<span class="br0">&#
40;</span>normal x, normal y<span class="br0">&#41;</span><br/>
| Quot<span c
lass="br0">&#40;</span>x, y<span class="br0">&#41;</span> <span class="sy0">-&gt
;</span> Quot<span class="br0">&#40;</span>normal x, normal y<span class="br0">&
#41;</span><br/>&#160;<br/><span class="kw1">let</span> <span class="kw1">rec</s
pan> insert v <span class="sy0">=</span> <span class="kw1">function</span><br/>
| <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="s
y0">-&gt;</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>v<s
pan class="br0">&#93;</span><span class="br0">&#93;</span><br/>
| x::xs <span
class="kw1">as</span> li <span class="sy0">-&gt;</span> <span class="br0">&#40;
</span>v::li<span class="br0">&#41;</span>&#160;:: <span class="br0">&#40;</span
><a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manua
l/namespaces.html"><span class="kw2">List</span></a>.<span class="me1">map</span
> <span class="br0">&#40;</span><span class="kw1">fun</span> y <span class="sy0"
>-&gt;</span> x::y<span class="br0">&#41;</span> <span class="br0">&#40;</span>i
nsert v xs<span class="br0">&#41;</span><span class="br0">&#41;</span><br/>&#160
;<br/><span class="kw1">let</span> permutations li <span class="sy0">=</span> <b
r/>
<a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp
/manual/namespaces.html"><span class="kw2">List</span></a>.<span class="me1">fol
dBack</span> <span class="br0">&#40;</span><span class="kw1">fun</span> x z <spa
n class="sy0">-&gt;</span> <a href="http://research.microsoft.com/en-us/um/cambr
idge/projects/fsharp/manual/namespaces.html"><span class="kw2">List</span></a>.<
span class="me1">concat</span> <span class="br0">&#40;</span><a href="http://res
earch.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/namespaces.html"><
span class="kw2">List</span></a>.<span class="me1">map</span> <span class="br0">

&#40;</span>insert x<span class="br0">&#41;</span> z<span class="br0">&#41;</spa


n><span class="br0">&#41;</span> li <span class="br0">&#91;</span><span class="b
r0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#93;</span><br/
>&#160;<br/><span class="kw1">let</span> <span class="kw1">rec</span> comp expr
rest <span class="sy0">=</span> <span class="kw4">seq</span> <span class="br0">&
#123;</span><br/>
<span class="kw1">match</span> rest <span class="kw1">with<
/span><br/>
| x::xs <span class="sy0">-&gt;</span><br/>
<span class="k
w1">yield!</span> comp <span class="br0">&#40;</span>Sum <span class="br0">&#40;
</span>expr, x<span class="br0">&#41;</span><span class="br0">&#41;</span> xs<sp
an class="sy0">;</span><br/>
<span class="kw1">yield!</span> comp <span c
lass="br0">&#40;</span>Diff<span class="br0">&#40;</span>x, expr<span class="br0
">&#41;</span><span class="br0">&#41;</span> xs<span class="sy0">;</span><br/>
<span class="kw1">yield!</span> comp <span class="br0">&#40;</span>Diff<sp
an class="br0">&#40;</span>expr, x<span class="br0">&#41;</span><span class="br0
">&#41;</span> xs<span class="sy0">;</span><br/>
<span class="kw1">yield!
</span> comp <span class="br0">&#40;</span>Prod<span class="br0">&#40;</span>exp
r, x<span class="br0">&#41;</span><span class="br0">&#41;</span> xs<span class="
sy0">;</span><br/>
<span class="kw1">yield!</span> comp <span class="br0"
>&#40;</span>Quot<span class="br0">&#40;</span>x, expr<span class="br0">&#41;</s
pan><span class="br0">&#41;</span> xs<span class="sy0">;</span><br/>
<spa
n class="kw1">yield!</span> comp <span class="br0">&#40;</span>Quot<span class="
br0">&#40;</span>expr, x<span class="br0">&#41;</span><span class="br0">&#41;</s
pan> xs<span class="sy0">;</span><br/>
| <span class="br0">&#91;</span><span
class="br0">&#93;</span> <span class="sy0">-&gt;</span> <span class="kw1">if</sp
an> eval expr <span class="sy0">=</span> Rat<span class="br0">&#40;</span><span
class="nu0">24</span>,<span class="nu0">1</span><span class="br0">&#41;</span> <
span class="kw1">then</span> <span class="kw1">yield</span> print_expr <span cla
ss="br0">&#40;</span>normal expr<span class="br0">&#41;</span><br/><span class="
br0">&#125;</span><br/>&#160;<br/><span class="br0">&#91;</span><span class="sy0
">&lt;</span>EntryPoint<span class="sy0">&gt;</span><span class="br0">&#93;</spa
n><br/><span class="kw1">let</span> main argv <span class="sy0">=</span><br/>
<span class="kw1">let</span> digits <span class="sy0">=</span> <a href="http://
research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/namespaces.html
"><span class="kw2">List</span></a>.<span class="me1">init</span> <span class="n
u0">4</span> <span class="br0">&#40;</span><span class="kw1">fun</span> i <span
class="sy0">-&gt;</span> Const <span class="br0">&#40;</span>Rat<span class="br0
">&#40;</span>argv.<span class="br0">&#91;</span>i<span class="br0">&#93;</span>
,<span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class=
"br0">&#41;</span><span class="br0">&#41;</span><br/>
<span class="kw1">let</
span> solutions <span class="sy0">=</span><br/>
permutations digits<br/>
<span class="sy0">|&gt;</span> <a href="http://research.microsoft.com/enus/um/cambridge/projects/fsharp/manual/namespaces.html"><span class="kw2">Seq</s
pan></a>.<span class="me1">groupBy</span> <span class="br0">&#40;</span>sprintf
<span class="st0">&quot;%A&quot;</span><span class="br0">&#41;</span><br/>
<span class="sy0">|&gt;</span> <a href="http://research.microsoft.com/en-us/um
/cambridge/projects/fsharp/manual/namespaces.html"><span class="kw2">Seq</span><
/a>.<span class="me1">map</span> <span class="kw3">snd</span> <span class="sy0">
|&gt;</span> <a href="http://research.microsoft.com/en-us/um/cambridge/projects/
fsharp/manual/namespaces.html"><span class="kw2">Seq</span></a>.<span class="me1
">map</span> <a href="http://research.microsoft.com/en-us/um/cambridge/projects/
fsharp/manual/namespaces.html"><span class="kw2">Seq</span></a>.<span class="me1
">head</span><br/>
<span class="sy0">|&gt;</span> <a href="http://researc
h.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/namespaces.html"><span
class="kw2">Seq</span></a>.<span class="me1">map</span> <span class="br0">&#40;
</span><span class="kw1">fun</span> x <span class="sy0">-&gt;</span> comp <span
class="br0">&#40;</span><a href="http://research.microsoft.com/en-us/um/cambridg
e/projects/fsharp/manual/namespaces.html"><span class="kw2">List</span></a>.<spa
n class="me1">head</span> x<span class="br0">&#41;</span> <span class="br0">&#40
;</span><a href="http://research.microsoft.com/en-us/um/cambridge/projects/fshar
p/manual/namespaces.html"><span class="kw2">List</span></a>.<span class="me1">ta

il</span> x<span class="br0">&#41;</span><span class="br0">&#41;</span><br/>


<span class="sy0">|&gt;</span> <a href="http://research.microsoft.com/en-us/
um/cambridge/projects/fsharp/manual/namespaces.html"><span class="kw2">Seq</span
></a>.<span class="me1">choose</span> <span class="br0">&#40;</span><span class=
"kw1">fun</span> x <span class="sy0">-&gt;</span> <span class="kw1">if</span> <a
href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/n
amespaces.html"><span class="kw2">Seq</span></a>.<span class="me1">isEmpty</span
> x <span class="kw1">then</span> None <span class="kw1">else</span> Some x<span
class="br0">&#41;</span><br/>
<span class="sy0">|&gt;</span> <a href="ht
tp://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/namespaces
.html"><span class="kw2">Seq</span></a>.<span class="me1">concat</span><br/>
<span class="kw1">if</span> <a href="http://research.microsoft.com/en-us/um/camb
ridge/projects/fsharp/manual/namespaces.html"><span class="kw2">Seq</span></a>.<
span class="me1">isEmpty</span> solutions <span class="kw1">then</span><br/>
printfn <span class="st0">&quot;No solutions.&quot;</span><br/>
<span cla
ss="kw1">else</span><br/>
solutions<br/>
<span class="sy0">|&gt;</
span> <a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/
manual/namespaces.html"><span class="kw2">Seq</span></a>.<span class="me1">group
By</span> id<br/>
<span class="sy0">|&gt;</span> <a href="http://research
.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/namespaces.html"><span
class="kw2">Seq</span></a>.<span class="me1">iter</span> <span class="br0">&#40;
</span><span class="kw1">fun</span> x <span class="sy0">-&gt;</span> printfn <sp
an class="st0">&quot;%s&quot;</span> <span class="br0">&#40;</span><span class="
kw3">fst</span> x<span class="br0">&#41;</span><span class="br0">&#41;</span><br
/>
<span class="nu0">0</span></pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>&gt;solve24 3 3 3 4
4 * (3 * 3 - 3)
3 + 3 * (3 + 4)
&gt;solve24 3 3 3 5
No solutions.
solve24 3 3 3 6
6 + 3 * (3 + 3)
(3 / 3 + 3) * 6
3 * (3 + 6) - 3
3 + 3 + 3 * 6
&gt;solve24 3 3 8 8
8 / (3 - 8 / 3)
&gt;solve24 3 8 8 9
3 * (9 - 8 / 8)
(9 - 8) * 3 * 8
3 / (9 - 8) * 8
8 / ((9 - 8) / 3)
3 * (9 - 8) * 8
3 * 8 / (9 - 8)
3 / ((9 - 8) / 8)</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=14" title="Edit section: Fortran">edit</a>]</span> <span c
lass="mw-headline" id="Fortran"><a href="/wiki/Category:Fortran" title="Category
:Fortran">Fortran</a></span></h2>
<pre class="fortran highlighted_source"><span class="kw1">program</span> solve_2
4<br/> <span class="kw3">use</span> helpers<br/> <span class="kw3">implicit</s
pan> <span class="kw3">none</span><br/> <span class="kw3">real</span>
<span class="sy0">::</span> <span class="me2">vector</span><span class="b

r0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span>, reals<


span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</
span>, p, q, r, s<br/> <span class="kw3">integer</span>
<span clas
s="sy0">::</span> <span class="me2">numbers</span><span class="br0">&#40;</span>
<span class="nu0">4</span><span class="br0">&#41;</span>, n, i, j, k, a, b, c, d
<br/> <span class="kw3">character</span>, <span class="kw3">parameter</span> <s
pan class="sy0">::</span> <span class="me2">ops</span><span class="br0">&#40;</s
pan><span class="nu0">4</span><span class="br0">&#41;</span> <span class="sy0">=
</span> <span class="br0">&#40;</span><span class="sy0">/</span> <span class="st
0">'+'</span>, <span class="st0">'-'</span>, <span class="st0">'*'</span>, <span
class="st0">'/'</span> <span class="sy0">/</span><span class="br0">&#41;</span>
<br/> <span class="kw3">logical</span>
<span class="sy0">::</span>
<span class="me2">last</span><br/> <span class="kw3">real</span>,<span class="
kw3">parameter</span>
<span class="sy0">::</span> <span class="me2">eps</s
pan> <span class="sy0">=</span> <span class="kw4">epsilon</span><span class="br0
">&#40;</span><span class="nu0">1.0</span><span class="br0">&#41;</span><br/>&#1
60;<br/> <span class="kw1">do</span> n<span class="sy0">=</span><span class="nu
0">1</span>,<span class="nu0">12</span><br/>
<span class="kw1">call</span> <s
pan class="kw4">random_number</span><span class="br0">&#40;</span>vector<span cl
ass="br0">&#41;</span><br/>
reals <span class="sy0">=</span> <span class="n
u0">9</span> <span class="sy0">*</span> vector <span class="sy0">+</span> <span
class="nu0">1</span><br/>
numbers <span class="sy0">=</span> <span class="kw4
">int</span><span class="br0">&#40;</span>reals<span class="br0">&#41;</span><br
/>
<span class="kw1">call</span> Insertion_Sort<span class="br0">&#40;</span>
numbers<span class="br0">&#41;</span><br/>&#160;<br/>
permutations<span class
="sy0">:</span> <span class="kw1">do</span><br/>
a <span class="sy0">=</spa
n> numbers<span class="br0">&#40;</span><span class="nu0">1</span><span class="b
r0">&#41;</span>; b <span class="sy0">=</span> numbers<span class="br0">&#40;</s
pan><span class="nu0">2</span><span class="br0">&#41;</span>; c <span class="sy0
">=</span> numbers<span class="br0">&#40;</span><span class="nu0">3</span><span
class="br0">&#41;</span>; d <span class="sy0">=</span> numbers<span class="br0">
&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span><br/>
r
eals <span class="sy0">=</span> <span class="kw3">real</span><span class="br0">&
#40;</span>numbers<span class="br0">&#41;</span><br/>
p <span class="sy0">=
</span> reals<span class="br0">&#40;</span><span class="nu0">1</span><span class
="br0">&#41;</span>; q <span class="sy0">=</span> reals<span class="br0">&#40;
</span><span class="nu0">2</span><span class="br0">&#41;</span>; r <span class
="sy0">=</span> reals<span class="br0">&#40;</span><span class="nu0">3</span><sp
an class="br0">&#41;</span>; s <span class="sy0">=</span> reals<span class="br
0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span><br/>
<span class="co1">! combinations of operators:</span><br/>
<span class="k
w1">do</span> i<span class="sy0">=</span><span class="nu0">1</span>,<span class=
"nu0">4</span><br/>
<span class="kw1">do</span> j<span class="sy0">=</spa
n><span class="nu0">1</span>,<span class="nu0">4</span><br/>
<span clas
s="kw1">do</span> k<span class="sy0">=</span><span class="nu0">1</span>,<span cl
ass="nu0">4</span><br/>
<span class="kw1">if</span>
<span class=
"br0">&#40;</span> <span class="kw4">abs</span><span class="br0">&#40;</span>op<
span class="br0">&#40;</span>op<span class="br0">&#40;</span>op<span class="br0"
>&#40;</span>p,i,q<span class="br0">&#41;</span>,j,r<span class="br0">&#41;</spa
n>,k,s<span class="br0">&#41;</span><span class="sy0">-</span><span class="nu0">
24.0</span><span class="br0">&#41;</span> &lt; eps <span class="br0">&#41;</span
> <span class="kw1">then</span><br/>
write <span class="br0">&#40;<
/span><span class="sy0">*</span>,<span class="sy0">*</span><span class="br0">&#4
1;</span> numbers, <span class="st0">'&#160;: '</span>, <span class="st0">'(('</
span>,a,ops<span class="br0">&#40;</span>i<span class="br0">&#41;</span>,b,<span
class="st0">')'</span>,ops<span class="br0">&#40;</span>j<span class="br0">&#41
;</span>,c,<span class="st0">')'</span>,ops<span class="br0">&#40;</span>k<span
class="br0">&#41;</span>,d<br/>
<span class="kw1">exit</span> permu
tations<br/>
<span class="kw1">else</span> <span class="kw1">if</span
> <span class="br0">&#40;</span> <span class="kw4">abs</span><span class="br0">&

#40;</span>op<span class="br0">&#40;</span>op<span class="br0">&#40;</span>p,i,o


p<span class="br0">&#40;</span>q,j,r<span class="br0">&#41;</span><span class="b
r0">&#41;</span>,k,s<span class="br0">&#41;</span><span class="sy0">-</span><spa
n class="nu0">24.0</span><span class="br0">&#41;</span> &lt; eps <span class="br
0">&#41;</span> <span class="kw1">then</span><br/>
write <span clas
s="br0">&#40;</span><span class="sy0">*</span>,<span class="sy0">*</span><span c
lass="br0">&#41;</span> numbers, <span class="st0">'&#160;: '</span>, <span clas
s="st0">'('</span>,a,ops<span class="br0">&#40;</span>i<span class="br0">&#41;</
span>,<span class="st0">'('</span>,b,ops<span class="br0">&#40;</span>j<span cla
ss="br0">&#41;</span>,c,<span class="st0">'))'</span>,ops<span class="br0">&#40;
</span>k<span class="br0">&#41;</span>,d<br/>
<span class="kw1">exi
t</span> permutations<br/>
<span class="kw1">else</span> <span class=
"kw1">if</span> <span class="br0">&#40;</span> <span class="kw4">abs</span><span
class="br0">&#40;</span>op<span class="br0">&#40;</span>p,i,op<span class="br0"
>&#40;</span>op<span class="br0">&#40;</span>q,j,r<span class="br0">&#41;</span>
,k,s<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0
">-</span><span class="nu0">24.0</span><span class="br0">&#41;</span> &lt; eps <
span class="br0">&#41;</span> <span class="kw1">then</span><br/>
wr
ite <span class="br0">&#40;</span><span class="sy0">*</span>,<span class="sy0">*
</span><span class="br0">&#41;</span> numbers, <span class="st0">'&#160;: '</spa
n>, a,ops<span class="br0">&#40;</span>i<span class="br0">&#41;</span>,<span cla
ss="st0">'(('</span>,b,ops<span class="br0">&#40;</span>j<span class="br0">&#41;
</span>,c,<span class="st0">')'</span>,ops<span class="br0">&#40;</span>k<span c
lass="br0">&#41;</span>,d,<span class="st0">')'</span><br/>
<span c
lass="kw1">exit</span> permutations<br/>
<span class="kw1">else</span
> <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw4">a
bs</span><span class="br0">&#40;</span>op<span class="br0">&#40;</span>p,i,op<sp
an class="br0">&#40;</span>q,j,op<span class="br0">&#40;</span>r,k,s<span class=
"br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><s
pan class="sy0">-</span><span class="nu0">24.0</span><span class="br0">&#41;</sp
an> &lt; eps <span class="br0">&#41;</span> <span class="kw1">then</span><br/>
write <span class="br0">&#40;</span><span class="sy0">*</span>,<span
class="sy0">*</span><span class="br0">&#41;</span> numbers, <span class="st0">'
&#160;: '</span>, a,ops<span class="br0">&#40;</span>i<span class="br0">&#41;</s
pan>,<span class="st0">'('</span>,b,ops<span class="br0">&#40;</span>j<span clas
s="br0">&#41;</span>,<span class="st0">'('</span>,c,ops<span class="br0">&#40;</
span>k<span class="br0">&#41;</span>,d,<span class="st0">'))'</span><br/>
<span class="kw1">exit</span> permutations<br/>
<span class="k
w1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span> <span
class="kw4">abs</span><span class="br0">&#40;</span>op<span class="br0">&#40;</
span>op<span class="br0">&#40;</span>p,i,q<span class="br0">&#41;</span>,j,op<sp
an class="br0">&#40;</span>r,k,s<span class="br0">&#41;</span><span class="br0">
&#41;</span><span class="sy0">-</span><span class="nu0">24.0</span><span class="
br0">&#41;</span> &lt; eps <span class="br0">&#41;</span> <span class="kw1">then
</span><br/>
write <span class="br0">&#40;</span><span class="sy0">
*</span>,<span class="sy0">*</span><span class="br0">&#41;</span> numbers, <span
class="st0">'&#160;: '</span>, <span class="st0">'('</span>,a,ops<span class="b
r0">&#40;</span>i<span class="br0">&#41;</span>,b,<span class="st0">')'</span>,o
ps<span class="br0">&#40;</span>j<span class="br0">&#41;</span>,<span class="st0
">'('</span>,c,ops<span class="br0">&#40;</span>k<span class="br0">&#41;</span>,
d,<span class="st0">')'</span><br/>
<span class="kw1">exit</span> p
ermutations<br/>
<span class="kw1">end</span> <span class="kw1">if</s
pan><br/>
<span class="kw1">end</span> <span class="kw1">do</span><br/>
<span class="kw1">end</span> <span class="kw1">do</span><br/>
<span
class="kw1">end</span> <span class="kw1">do</span><br/>
<span class="kw1">
call</span> nextpermutation<span class="br0">&#40;</span>numbers,last<span class
="br0">&#41;</span> <br/>
<span class="kw1">if</span> <span class="br0">&#
40;</span> last <span class="br0">&#41;</span> <span class="kw1">then</span><br/
>
write <span class="br0">&#40;</span><span class="sy0">*</span>,<span cl
ass="sy0">*</span><span class="br0">&#41;</span> numbers, <span class="st0">'&#1

60;: no solution.'</span><br/>
<span class="kw1">exit</span> permutations
<br/>
<span class="kw1">end</span> <span class="kw1">if</span><br/>
<spa
n class="kw1">end</span> <span class="kw1">do</span> permutations<br/>&#160;<br/
> <span class="kw1">end</span> <span class="kw1">do</span><br/>&#160;<br/><span
class="co1">contains</span><br/>&#160;<br/> pure <span class="kw3">real</span>
<span class="kw1">function</span> op<span class="br0">&#40;</span>x,c,y<span cl
ass="br0">&#41;</span><br/>
<span class="kw3">integer</span>, <span class="kw
3">intent</span><span class="br0">&#40;</span><span class="kw3">in</span><span c
lass="br0">&#41;</span> <span class="sy0">::</span> <span class="me2">c</span><b
r/>
<span class="kw3">real</span>, <span class="kw3">intent</span><span class
="br0">&#40;</span><span class="kw3">in</span><span class="br0">&#41;</span>
<span class="sy0">::</span> <span class="me2">x</span>,y<br/>
<span class="kw
1">select</span> <span class="kw1">case</span> <span class="br0">&#40;</span> op
s<span class="br0">&#40;</span>c<span class="br0">&#41;</span> <span class="br0"
>&#41;</span><br/>
<span class="kw1">case</span> <span class="br0">&#40;</s
pan><span class="st0">'+'</span><span class="br0">&#41;</span><br/>
op <s
pan class="sy0">=</span> x<span class="sy0">+</span>y<br/>
<span class="kw1
">case</span> <span class="br0">&#40;</span><span class="st0">'-'</span><span cl
ass="br0">&#41;</span><br/>
op <span class="sy0">=</span> x<span class="s
y0">-</span>y<br/>
<span class="kw1">case</span> <span class="br0">&#40;</s
pan><span class="st0">'*'</span><span class="br0">&#41;</span><br/>
op <s
pan class="sy0">=</span> x<span class="sy0">*</span>y<br/>
<span class="kw1
">case</span> <span class="br0">&#40;</span><span class="st0">'/'</span><span cl
ass="br0">&#41;</span><br/>
op <span class="sy0">=</span> x<span class="s
y0">/</span>y<br/>
<span class="kw1">end</span> <span class="kw1">select</spa
n><br/> <span class="kw1">end</span> <span class="kw1">function</span> op<br/>&
#160;<br/><span class="kw1">end</span> <span class="kw1">program</span> solve_24
</pre>
<pre class="fortran highlighted_source"><span class="kw1">module</span> helpers<
br/>&#160;<br/><span class="co1">contains</span><br/>&#160;<br/> pure <span cla
ss="kw1">subroutine</span> Insertion_Sort<span class="br0">&#40;</span>a<span cl
ass="br0">&#41;</span><br/>
<span class="kw3">integer</span>, <span class="kw
3">intent</span><span class="br0">&#40;</span><span class="kw3">inout</span><spa
n class="br0">&#41;</span> <span class="sy0">::</span> <span class="me2">a</span
><span class="br0">&#40;</span><span class="sy0">:</span><span class="br0">&#41;
</span><br/>
<span class="kw3">integer</span>
<span class="sy0
">::</span> <span class="me2">temp</span>, i, j<br/>
<span class="kw1">do</sp
an> i<span class="sy0">=</span><span class="nu0">2</span>,<span class="kw4">size
</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span><br/>
j
<span class="sy0">=</span> i<span class="sy0">-</span><span class="nu0">1</span
><br/>
temp <span class="sy0">=</span> a<span class="br0">&#40;</span>i<spa
n class="br0">&#41;</span><br/>
<span class="kw1">do</span> <span class="kw
1">while</span> <span class="br0">&#40;</span> j&gt;<span class="sy0">=</span><s
pan class="nu0">1</span> <span class="kw2">.<span class="me1">and</span>.</span>
a<span class="br0">&#40;</span>j<span class="br0">&#41;</span>&gt;temp <span cl
ass="br0">&#41;</span><br/>
a<span class="br0">&#40;</span>j<span class="
sy0">+</span><span class="nu0">1</span><span class="br0">&#41;</span> <span clas
s="sy0">=</span> a<span class="br0">&#40;</span>j<span class="br0">&#41;</span><
br/>
j <span class="sy0">=</span> j <span class="sy0">-</span> <span clas
s="nu0">1</span><br/>
<span class="kw1">end</span> <span class="kw1">do</sp
an><br/>
a<span class="br0">&#40;</span>j<span class="sy0">+</span><span cl
ass="nu0">1</span><span class="br0">&#41;</span> <span class="sy0">=</span> temp
<br/>
<span class="kw1">end</span> <span class="kw1">do</span><br/> <span cl
ass="kw1">end</span> <span class="kw1">subroutine</span> Insertion_Sort<br/>&#16
0;<br/> <span class="kw1">subroutine</span> nextpermutation<span class="br0">&#
40;</span>perm,last<span class="br0">&#41;</span><br/>
<span class="kw3">inte
ger</span>, <span class="kw3">intent</span><span class="br0">&#40;</span><span c
lass="kw3">inout</span><span class="br0">&#41;</span> <span class="sy0">::</span
> <span class="me2">perm</span><span class="br0">&#40;</span><span class="sy0">:
</span><span class="br0">&#41;</span><br/>
<span class="kw3">logical</span>,

<span class="kw3">intent</span><span class="br0">&#40;</span><span class="kw3">o


ut</span><span class="br0">&#41;</span> <span class="sy0">::</span> <span clas
s="me2">last</span><br/>
<span class="kw3">integer</span> <span class="sy0">:
:</span> <span class="me2">k</span>,l<br/>
k <span class="sy0">=</span> large
st1<span class="br0">&#40;</span><span class="br0">&#41;</span><br/>
last <sp
an class="sy0">=</span> k <span class="sy0">==</span> <span class="nu0">0</span>
<br/>
<span class="kw1">if</span> <span class="br0">&#40;</span> <span class=
"kw2">.<span class="kw4">not</span>.</span> last <span class="br0">&#41;</span>
<span class="kw1">then</span>
<br/>
l <span class="sy0">=</span> largest
2<span class="br0">&#40;</span>k<span class="br0">&#41;</span><br/>
<span c
lass="kw1">call</span> swap<span class="br0">&#40;</span>l,k<span class="br0">&#
41;</span><br/>
<span class="kw1">call</span> reverse<span class="br0">&#40
;</span>k<span class="br0">&#41;</span><br/>
<span class="kw1">end</span> <sp
an class="kw1">if</span><br/> <span class="kw1">contains</span><br/>
pure <s
pan class="kw3">integer</span> <span class="kw1">function</span> largest1<span c
lass="br0">&#40;</span><span class="br0">&#41;</span><br/>
<span class="kw3
">integer</span> <span class="sy0">::</span> <span class="me2">k</span>, <span c
lass="kw4">max</span><br/>
<span class="kw4">max</span> <span class="sy0">=
</span> <span class="nu0">0</span><br/>
<span class="kw1">do</span> k<span
class="sy0">=</span><span class="nu0">1</span>,<span class="kw4">size</span><spa
n class="br0">&#40;</span>perm<span class="br0">&#41;</span><span class="sy0">-<
/span><span class="nu0">1</span><br/>
<span class="kw1">if</span> <span c
lass="br0">&#40;</span> perm<span class="br0">&#40;</span>k<span class="br0">&#4
1;</span> &lt; perm<span class="br0">&#40;</span>k<span class="sy0">+</span><spa
n class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#41;</sp
an> <span class="kw1">then</span><br/>
<span class="kw4">max</span> <sp
an class="sy0">=</span> k<br/>
<span class="kw1">end</span> <span class="
kw1">if</span><br/>
<span class="kw1">end</span> <span class="kw1">do</span
><br/>
largest1 <span class="sy0">=</span> <span class="kw4">max</span><br/
>
<span class="kw1">end</span> <span class="kw1">function</span> largest1<br/
>&#160;<br/>
pure <span class="kw3">integer</span> <span class="kw1">function
</span> largest2<span class="br0">&#40;</span>k<span class="br0">&#41;</span><br
/>
<span class="kw3">integer</span>, <span class="kw3">intent</span><span c
lass="br0">&#40;</span><span class="kw3">in</span><span class="br0">&#41;</span>
<span class="sy0">::</span> <span class="me2">k</span><br/>
<span class="k
w3">integer</span>
<span class="sy0">::</span> <span class="me2">l</
span>, <span class="kw4">max</span><br/>
<span class="kw4">max</span> <span
class="sy0">=</span> k<span class="sy0">+</span><span class="nu0">1</span><br/>
<span class="kw1">do</span> l<span class="sy0">=</span>k<span class="sy0">
+</span><span class="nu0">2</span>,<span class="kw4">size</span><span class="br0
">&#40;</span>perm<span class="br0">&#41;</span><br/>
<span class="kw1">i
f</span> <span class="br0">&#40;</span> perm<span class="br0">&#40;</span>k<span
class="br0">&#41;</span> &lt; perm<span class="br0">&#40;</span>l<span class="b
r0">&#41;</span> <span class="br0">&#41;</span> <span class="kw1">then</span><br
/>
<span class="kw4">max</span> <span class="sy0">=</span> l<br/>
<span class="kw1">end</span> <span class="kw1">if</span><br/>
<span class
="kw1">end</span> <span class="kw1">do</span><br/>
largest2 <span class="sy
0">=</span> <span class="kw4">max</span><br/>
<span class="kw1">end</span> <s
pan class="kw1">function</span> largest2<br/>&#160;<br/>
<span class="kw1">su
broutine</span> swap<span class="br0">&#40;</span>l,k<span class="br0">&#41;</sp
an><br/>
<span class="kw3">integer</span>, <span class="kw3">intent</span><
span class="br0">&#40;</span><span class="kw3">in</span><span class="br0">&#41;<
/span> <span class="sy0">::</span> <span class="me2">k</span>,l<br/>
<span
class="kw3">integer</span>
<span class="sy0">::</span> <span class="
me2">temp</span><br/>
temp
<span class="sy0">=</span> perm<span class="b
r0">&#40;</span>k<span class="br0">&#41;</span><br/>
perm<span class="br0">
&#40;</span>k<span class="br0">&#41;</span> <span class="sy0">=</span> perm<span
class="br0">&#40;</span>l<span class="br0">&#41;</span><br/>
perm<span cla
ss="br0">&#40;</span>l<span class="br0">&#41;</span> <span class="sy0">=</span>
temp<br/>
<span class="kw1">end</span> <span class="kw1">subroutine</span> sw

ap<br/>&#160;<br/>
<span class="kw1">subroutine</span> reverse<span class="br
0">&#40;</span>k<span class="br0">&#41;</span><br/>
<span class="kw3">integ
er</span>, <span class="kw3">intent</span><span class="br0">&#40;</span><span cl
ass="kw3">in</span><span class="br0">&#41;</span> <span class="sy0">::</span> <s
pan class="me2">k</span><br/>
<span class="kw3">integer</span>
<span class="sy0">::</span> <span class="me2">i</span><br/>
<span class="kw
1">do</span> i<span class="sy0">=</span><span class="nu0">1</span>,<span class="
br0">&#40;</span><span class="kw4">size</span><span class="br0">&#40;</span>perm
<span class="br0">&#41;</span><span class="sy0">-</span>k<span class="br0">&#41;
</span><span class="sy0">/</span><span class="nu0">2</span><br/>
<span cl
ass="kw1">call</span> swap<span class="br0">&#40;</span>k<span class="sy0">+</sp
an>i,<span class="kw4">size</span><span class="br0">&#40;</span>perm<span class=
"br0">&#41;</span><span class="sy0">+</span><span class="nu0">1</span><span clas
s="sy0">-</span>i<span class="br0">&#41;</span><br/>
<span class="kw1">end<
/span> <span class="kw1">do</span><br/>
<span class="kw1">end</span> <span cl
ass="kw1">subroutine</span> reverse<br/>&#160;<br/> <span class="kw1">end</span
> <span class="kw1">subroutine</span> nextpermutation<br/>&#160;<br/><span class
="kw1">end</span> <span class="kw1">module</span> helpers</pre>
<div>
<dl><dt>Output:</div> (using g95):
</dt></dl>
<pre> 3 6 7 9 &#160;: 3 *(( 6 - 7 )+ 9 )
3 9 5 8 &#160;: (( 3 * 9 )+ 5 )- 8
4 5 6 9 &#160;: (( 4 + 5 )+ 6 )+ 9
2 9 9 8 &#160;: ( 2 +( 9 / 9 ))* 8
1 4 7 5 &#160;: ( 1 +( 4 * 7 ))- 5
8 7 7 6 &#160;: no solution.
3 3 8 9 &#160;: ( 3 *( 3 + 8 ))- 9
1 5 6 7 &#160;: ( 1 +( 5 * 6 ))- 7
2 3 5 3 &#160;: 2 *(( 3 * 5 )- 3 )
4 5 6 9 &#160;: (( 4 + 5 )+ 6 )+ 9
1 1 3 6 &#160;: ( 1 +( 1 * 3 ))* 6
2 4 6 8 &#160;: (( 2 / 4 )* 6 )* 8
</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=15" title="Edit section: GAP">edit</a>]</span> <span class
="mw-headline" id="GAP"><a href="/wiki/Category:GAP" title="Category:GAP">GAP</a
></span></h2>
<pre class="text highlighted_source"># Solution in '''RPN'''<br/>check&#160;:= f
unction(x, y, z)<br/> local r, c, s, i, j, k, a, b, p;<br/> i&#160;:= 0;<br/
>
j&#160;:= 0;<br/>
k&#160;:= 0;<br/>
s&#160;:= [ ];<br/>
r&#160;:= &quot;&quot;;<br/>
for c in z do<br/>
if c = 'x' then<
br/>
i&#160;:= i + 1;<br/>
k&#160;:= k + 1;
<br/>
s[k]&#160;:= x[i];<br/>
Append(r, String
(x[i]));<br/>
else<br/>
j&#160;:= j + 1;<br/>
b&#160;:= s[k];<br/>
k&#160;:= k - 1;<br/>
a&#160;:= s[k];<br/>
p&#160;:= y[j];<br/>
r[Size(r) + 1]&#160;:= p;<br/>
if p = '+' then<br/>
a&#160;:= a + b;<br/>
elif p = '-' then<br/>
a&#160;:= a - b;<br/>
elif p = '*' then<br/>
a&#160;:= a * b;<br/>
elif p = '/' then<br/>
if b = 0 then<br/>
continue;<br/>
else<br/>
a&#160;:= a / b;<br/>
fi;<br/>
else<br/>
return f
ail;<br/>
fi;<br/>
s[k]&#160;:= a;<
br/>
fi;<br/>
od;<br/>
if s[1] = 24 then<br/>
return r;<br/> else<br/>
return fail;<br/>
fi;<br/>end;<br/
>&#160;<br/>Player24&#160;:= function(digits)<br/>
local u, v, w, x, y, z,
r;<br/> u&#160;:= PermutationsList(digits);<br/>
v&#160;:= Tuples(&quot;+
-*/&quot;, 3);<br/>
w&#160;:= [&quot;xx*x*x*&quot;, &quot;xx*xx**&quot;, &qu

ot;xxx**x*&quot;, &quot;xxx*x**&quot;, &quot;xxxx***&quot;];<br/>


for x in
u do<br/>
for y in v do<br/>
for z in w do<br
/>
r&#160;:= check(x, y, z);<br/>
if r &lt;&gt; fail then<br/>
return r;<br/>
fi;<br/>
od;<br/>
od;<br/>
od;<br/>
return fail;<br/>end;<br/>&#160;<br/>Player24([1,2,7,7]);<br/># &quot;77*1-2/&qu
ot;<br/>Player24([9,8,7,6]);<br/># &quot;68*97-/&quot;<br/>Player24([1,1,7,7]);<
br/># fail<br/>&#160;<br/># Solutions with only one distinct digit are found onl
y for 3, 4, 5, 6:<br/>Player24([3,3,3,3]);<br/># &quot;33*3*3-&quot;<br/>Player2
4([4,4,4,4]);<br/># &quot;44*4+4+&quot;<br/>Player24([5,5,5,5]);<br/># &quot;55*
55/-&quot;<br/>Player24([6,6,6,6]);<br/># &quot;66*66+-&quot;<br/>&#160;<br/># A
tricky one:<br/>Player24([3,3,8,8]);<br/>&quot;8383/-/&quot;</pre>
<p><br/>
</p>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=16" title="Edit section: Go">edit</a>]</span> <span class=
"mw-headline" id="Go"><a href="/wiki/Category:Go" title="Category:Go">Go</a></sp
an></h2>
<pre class="go highlighted_source"><span class="kw1">package</span> main<br/>&#1
60;<br/><span class="kw1">import</span> <span class="sy1">(</span><br/> <span cl
ass="st0">&quot;fmt&quot;</span><br/> <span class="st0">&quot;math/rand&quot;<
/span><br/>
<span class="st0">&quot;time&quot;</span><br/><span class="sy1">
)</span><br/>&#160;<br/><span class="kw1">const</span> <span class="sy1">(</span
><br/> op_num <span class="sy2">=</span> iota<br/>
op_add<br/>
op_sub<b
r/>
op_mul<br/>
op_div<br/><span class="sy1">)</span><br/>&#160;<br/><sp
an class="kw1">type</span> frac <span class="kw4">struct</span> <span class="sy1
">{</span><br/> num<span class="sy1">,</span> denom <span class="kw4">int</span>
<br/><span class="sy1">}</span><br/>&#160;<br/><span class="co1">// Expression:
can either be a single number, or a result of binary</span><br/><span class="co1
">// operation from left and right node</span><br/><span class="kw1">type</span>
Expr <span class="kw4">struct</span> <span class="sy1">{</span><br/> op
<span class="kw4">int</span><br/> left<span class="sy1">,</span> right <sp
an class="sy3">*</span>Expr<br/>
value
frac<br/><span class="sy1">}
</span><br/>&#160;<br/><span class="kw1">var</span> n_cards <span class="sy2">=<
/span> <span class="nu0">4</span><br/><span class="kw1">var</span> goal <span cl
ass="sy2">=</span> <span class="nu0">24</span><br/><span class="kw1">var</span>
digit_range <span class="sy2">=</span> <span class="nu0">9</span><br/>&#160;<br/
><span class="kw4">func</span> <span class="sy1">(</span>x <span class="sy3">*</
span>Expr<span class="sy1">)</span> String<span class="sy1">()</span> <span clas
s="kw4">string</span> <span class="sy1">{</span><br/> <span class="kw1">if</sp
an> x<span class="sy3">.</span>op <span class="sy3">==</span> op_num <span class
="sy1">{</span><br/>
<span class="kw1">return</span> fmt<span class="
sy3">.</span>Sprintf<span class="sy1">(</span><span class="st0">&quot;%d&quot;</
span><span class="sy1">,</span> x<span class="sy3">.</span>value<span class="sy3
">.</span>num<span class="sy1">)</span><br/>
<span class="sy1">}</span><br/>&
#160;<br/>
<span class="kw1">var</span> bl1<span class="sy1">,</span> br1<s
pan class="sy1">,</span> bl2<span class="sy1">,</span> br2<span class="sy1">,</s
pan> opstr <span class="kw4">string</span><br/> <span class="kw1">switch</span>
<span class="sy1">{</span><br/> <span class="kw1">case</span> x<span class="sy3"
>.</span>left<span class="sy3">.</span>op <span class="sy3">==</span> op_num<spa
n class="sy1">:</span><br/>
<span class="kw1">case</span> x<span class="sy3"
>.</span>left<span class="sy3">.</span>op &gt;<span class="sy2">=</span> x<span
class="sy3">.</span>op<span class="sy1">:</span><br/> <span class="kw1">case</
span> x<span class="sy3">.</span>left<span class="sy3">.</span>op <span class="s
y3">==</span> op_add &amp;&amp; x<span class="sy3">.</span>op <span class="sy3">
==</span> op_sub<span class="sy1">:</span><br/>
bl1<span class="sy1">,</
span> br1 <span class="sy2">=</span> <span class="st0">&quot;&quot;</span><span
class="sy1">,</span> <span class="st0">&quot;&quot;</span><br/> <span class="kw1
">default</span><span class="sy1">:</span><br/>
bl1<span class="sy1">,</
span> br1 <span class="sy2">=</span> <span class="st0">&quot;(&quot;</span><span

class="sy1">,</span> <span class="st0">&quot;)&quot;</span><br/>


<span cl
ass="sy1">}</span><br/>&#160;<br/>
<span class="kw1">if</span> x<span class
="sy3">.</span>right<span class="sy3">.</span>op <span class="sy3">==</span> op_
num <span class="sy3">||</span> x<span class="sy3">.</span>op &lt; x<span class=
"sy3">.</span>right<span class="sy3">.</span>op <span class="sy1">{</span><br/>
bl2<span class="sy1">,</span> br2 <span class="sy2">=</span> <span class="st0">&
quot;&quot;</span><span class="sy1">,</span> <span class="st0">&quot;&quot;</spa
n><br/> <span class="sy1">}</span> <span class="kw1">else</span> <span class="sy
1">{</span><br/>
bl2<span class="sy1">,</span> br2 <span class="s
y2">=</span> <span class="st0">&quot;(&quot;</span><span class="sy1">,</span> <s
pan class="st0">&quot;)&quot;</span><br/>
<span class="sy1">}</span><br/>&
#160;<br/>
<span class="kw1">switch</span> <span class="sy1">{</span><br/>
<span class="kw1">case</span> x<span class="sy3">.</span>op <span class="sy3">==
</span> op_add<span class="sy1">:</span><br/>
opstr <span class="sy2">
=</span> <span class="st0">&quot; + &quot;</span><br/> <span class="kw1">case</
span> x<span class="sy3">.</span>op <span class="sy3">==</span> op_sub<span clas
s="sy1">:</span><br/>
opstr <span class="sy2">=</span> <span class="st
0">&quot; - &quot;</span><br/> <span class="kw1">case</span> x<span class="sy3"
>.</span>op <span class="sy3">==</span> op_mul<span class="sy1">:</span><br/>
opstr <span class="sy2">=</span> <span class="st0">&quot; * &quot;</span><br/>
<span class="kw1">case</span> x<span class="sy3">.</span>op <span class="sy3">==
</span> op_div<span class="sy1">:</span><br/>
opstr <span class="sy2">
=</span> <span class="st0">&quot; / &quot;</span><br/> <span class="sy1">}</spa
n><br/>&#160;<br/>
<span class="kw1">return</span> bl1 <span class="sy3">+<
/span> x<span class="sy3">.</span>left<span class="sy3">.</span>String<span clas
s="sy1">()</span> <span class="sy3">+</span> br1 <span class="sy3">+</span> opst
r <span class="sy3">+</span><br/>
bl2 <span class="sy3">+</span> x
<span class="sy3">.</span>right<span class="sy3">.</span>String<span class="sy1"
>()</span> <span class="sy3">+</span> br2<br/><span class="sy1">}</span><br/>&#1
60;<br/><span class="kw4">func</span> expr_eval<span class="sy1">(</span>x <span
class="sy3">*</span>Expr<span class="sy1">)</span> <span class="sy1">(</span>f
frac<span class="sy1">)</span> <span class="sy1">{</span><br/> <span class="kw1
">if</span> x<span class="sy3">.</span>op <span class="sy3">==</span> op_num <sp
an class="sy1">{</span><br/>
<span class="kw1">return</span> x<span c
lass="sy3">.</span>value<br/> <span class="sy1">}</span><br/>&#160;<br/>
l<span class="sy1">,</span> r <span class="sy2">:=</span> expr_eval<span class="
sy1">(</span>x<span class="sy3">.</span>left<span class="sy1">),</span> expr_eva
l<span class="sy1">(</span>x<span class="sy3">.</span>right<span class="sy1">)</
span><br/>&#160;<br/> <span class="kw1">switch</span> x<span class="sy3">.</sp
an>op <span class="sy1">{</span><br/> <span class="kw1">case</span> op_add<spa
n class="sy1">:</span><br/>
f<span class="sy3">.</span>num <span cla
ss="sy2">=</span> l<span class="sy3">.</span>num<span class="sy3">*</span>r<span
class="sy3">.</span>denom <span class="sy3">+</span> l<span class="sy3">.</span
>denom<span class="sy3">*</span>r<span class="sy3">.</span>num<br/>
f<span class="sy3">.</span>denom <span class="sy2">=</span> l<span class="sy3">.
</span>denom <span class="sy3">*</span> r<span class="sy3">.</span>denom<br/>
<span class="kw1">return</span><br/>&#160;<br/> <span class="kw1">case</span> op
_sub<span class="sy1">:</span><br/>
f<span class="sy3">.</span>num <
span class="sy2">=</span> l<span class="sy3">.</span>num<span class="sy3">*</spa
n>r<span class="sy3">.</span>denom <span class="sy3">-</span> l<span class="sy3"
>.</span>denom<span class="sy3">*</span>r<span class="sy3">.</span>num<br/>
f<span class="sy3">.</span>denom <span class="sy2">=</span> l<span class="sy3">.
</span>denom <span class="sy3">*</span> r<span class="sy3">.</span>denom<br/>
<span class="kw1">return</span><br/>&#160;<br/> <span class="kw1">case</span> op
_mul<span class="sy1">:</span><br/>
f<span class="sy3">.</span>num <
span class="sy2">=</span> l<span class="sy3">.</span>num <span class="sy3">*</sp
an> r<span class="sy3">.</span>num<br/>
f<span class="sy3">.</span>denom
<span class="sy2">=</span> l<span class="sy3">.</span>denom <span class="sy3">*
</span> r<span class="sy3">.</span>denom<br/>
<span class="kw1">return
</span><br/>&#160;<br/> <span class="kw1">case</span> op_div<span class="sy1">:<

/span><br/>
f<span class="sy3">.</span>num <span class="sy2">=</span
> l<span class="sy3">.</span>num <span class="sy3">*</span> r<span class="sy3">.
</span>denom<br/>
f<span class="sy3">.</span>denom <span class="sy
2">=</span> l<span class="sy3">.</span>denom <span class="sy3">*</span> r<span c
lass="sy3">.</span>num<br/>
<span class="kw1">return</span><br/>
<span class="sy1">}</span><br/> <span class="kw1">return</span><br/><span class=
"sy1">}</span><br/>&#160;<br/><span class="kw4">func</span> solve<span class="sy
1">(</span>ex_in <span class="sy1">[]</span><span class="sy3">*</span>Expr<span
class="sy1">)</span> <span class="kw4">bool</span> <span class="sy1">{</span><br
/>
<span class="co1">// only one expression left, meaning all numbers are a
rranged into</span><br/>
<span class="co1">// a binary tree, so evaluate
and see if we get 24</span><br/>
<span class="kw1">if</span> <span class=
"kw3">len</span><span class="sy1">(</span>ex_in<span class="sy1">)</span> <span
class="sy3">==</span> <span class="nu0">1</span> <span class="sy1">{</span><br/>
f <span class="sy2">:=</span> expr_eval<span class="sy1">(</span>ex_in<span clas
s="sy1">[</span><span class="nu0">0</span><span class="sy1">])</span><br/>
<span class="kw1">if</span> f<span class="sy3">.</span>denom <span class="sy2">!
=</span> <span class="nu0">0</span> &amp;&amp; f<span class="sy3">.</span>num <s
pan class="sy3">==</span> f<span class="sy3">.</span>denom<span class="sy3">*</s
pan>goal <span class="sy1">{</span><br/>
fmt<span class="
sy3">.</span>Println<span class="sy1">(</span>ex_in<span class="sy1">[</span><sp
an class="nu0">0</span><span class="sy1">]</span><span class="sy3">.</span>Strin
g<span class="sy1">())</span><br/>
<span class="kw1">return
</span> <span class="kw2">true</span><br/>
<span class="sy1">}</spa
n><br/>
<span class="kw1">return</span> <span class="kw2">false</span><b
r/>
<span class="sy1">}</span><br/>&#160;<br/>
<span class="kw1">var</s
pan> node Expr<br/>
ex <span class="sy2">:=</span> <span class="kw3">make</s
pan><span class="sy1">([]</span><span class="sy3">*</span>Expr<span class="sy1">
,</span> <span class="kw3">len</span><span class="sy1">(</span>ex_in<span class=
"sy1">)</span><span class="sy3">-</span><span class="nu0">1</span><span class="s
y1">)</span><br/>&#160;<br/>
<span class="co1">// try to combine a pair of ex
pressions into one, thus reduce</span><br/>
<span class="co1">// the list le
ngth by 1, and recurse down</span><br/> <span class="kw1">for</span> <span class
="nu2">i</span> <span class="sy2">:=</span> <span class="kw1">range</span> ex <s
pan class="sy1">{</span><br/>
<span class="kw3">copy</span><span class
="sy1">(</span>ex<span class="sy1">[</span><span class="nu2">i</span><span class
="sy1">:</span><span class="kw3">len</span><span class="sy1">(</span>ex<span cla
ss="sy1">)],</span> ex_in<span class="sy1">[</span><span class="nu2">i</span><sp
an class="sy3">+</span><span class="nu0">1</span><span class="sy1">:</span><span
class="kw3">len</span><span class="sy1">(</span>ex_in<span class="sy1">)])</spa
n><br/>&#160;<br/>
ex<span class="sy1">[</span><span class="nu2">i<
/span><span class="sy1">]</span> <span class="sy2">=</span> &amp;node<br/>
<span class="kw1">for</span> j <span class="sy2">:=</span> <span class="nu2">i</
span> <span class="sy3">+</span> <span class="nu0">1</span><span class="sy1">;</
span> j &lt; <span class="kw3">len</span><span class="sy1">(</span>ex_in<span cl
ass="sy1">);</span> j<span class="sy2">++</span> <span class="sy1">{</span><br/>
node<span class="sy3">.</span>left <span class="sy2">=</span> ex_in<span class="
sy1">[</span><span class="nu2">i</span><span class="sy1">]</span><br/>
node<span class="sy3">.</span>right <span class="sy2">=</span> ex_in<span class=
"sy1">[</span>j<span class="sy1">]</span><br/>&#160;<br/>
<span class="co1">// try all 4 operators</span><br/>
<span cl
ass="kw1">for</span> o <span class="sy2">:=</span> op_add<span class="sy1">;</sp
an> o &lt;<span class="sy2">=</span> op_div<span class="sy1">;</span> o<span cla
ss="sy2">++</span> <span class="sy1">{</span><br/>
node<span class="sy3">.</span>op <span class="sy2">=</span> o<br/>
<span class="kw1">if</span> solve<span class="sy1">(</span>ex<span class="sy1">)
</span> <span class="sy1">{</span><br/>
<span cl
ass="kw1">return</span> <span class="kw2">true</span><br/>
<span class="sy1">}</span><br/>
<span class="sy1">}</span><br/>&
#160;<br/>
<span class="co1">// also - and / are not commut

ative, so swap arguments</span><br/>


node<span class="sy3">.<
/span>left <span class="sy2">=</span> ex_in<span class="sy1">[</span>j<span clas
s="sy1">]</span><br/>
node<span class="sy3">.</span>right <spa
n class="sy2">=</span> ex_in<span class="sy1">[</span><span class="nu2">i</span>
<span class="sy1">]</span><br/>&#160;<br/>
node<span class=
"sy3">.</span>op <span class="sy2">=</span> op_sub<br/>
<span cl
ass="kw1">if</span> solve<span class="sy1">(</span>ex<span class="sy1">)</span>
<span class="sy1">{</span><br/>
<span class="kw1">return
</span> <span class="kw2">true</span><br/>
<span class="sy1
">}</span><br/>&#160;<br/>
node<span class="sy3">.</span>op
<span class="sy2">=</span> op_div<br/>
<span class="kw1">if</sp
an> solve<span class="sy1">(</span>ex<span class="sy1">)</span> <span class="sy1
">{</span><br/>
<span class="kw1">return</span> <span cl
ass="kw2">true</span><br/>
<span class="sy1">}</span><br/>&
#160;<br/>
<span class="kw1">if</span> j &lt; <span class="
kw3">len</span><span class="sy1">(</span>ex<span class="sy1">)</span> <span clas
s="sy1">{</span><br/>
ex<span class="sy1">[</span>j<sp
an class="sy1">]</span> <span class="sy2">=</span> ex_in<span class="sy1">[</spa
n>j<span class="sy1">]</span><br/>
<span class="sy1">}</spa
n><br/>
<span class="sy1">}</span><br/>
ex<span class="sy1">[</s
pan><span class="nu2">i</span><span class="sy1">]</span> <span class="sy2">=</sp
an> ex_in<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]
</span><br/>
<span class="sy1">}</span><br/> <span class="kw1">return</span>
<span class="kw2">false</span><br/><span class="sy1">}</span><br/>&#160;<br/><sp
an class="kw4">func</span> main<span class="sy1">()</span> <span class="sy1">{</
span><br/>
cards <span class="sy2">:=</span> <span class="kw3">make</span><
span class="sy1">([]</span><span class="sy3">*</span>Expr<span class="sy1">,</sp
an> n_cards<span class="sy1">)</span><br/>
rand<span class="sy3">.</span>Se
ed<span class="sy1">(</span>time<span class="sy3">.</span>Now<span class="sy1">(
)</span><span class="sy3">.</span>Unix<span class="sy1">())</span><br/>&#160;<br
/>
<span class="kw1">for</span> k <span class="sy2">:=</span> <span class="
nu0">0</span><span class="sy1">;</span> k &lt; <span class="nu0">10</span><span
class="sy1">;</span> k<span class="sy2">++</span> <span class="sy1">{</span><br/
>
<span class="kw1">for</span> <span class="nu2">i</span> <span cl
ass="sy2">:=</span> <span class="nu0">0</span><span class="sy1">;</span> <span c
lass="nu2">i</span> &lt; n_cards<span class="sy1">;</span> <span class="nu2">i</
span><span class="sy2">++</span> <span class="sy1">{</span><br/>
cards<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]</sp
an> <span class="sy2">=</span> &amp;Expr<span class="sy1">{</span>op_num<span cl
ass="sy1">,</span> <span class="kw2">nil</span><span class="sy1">,</span> <span
class="kw2">nil</span><span class="sy1">,</span><br/>
frac<span class="sy1">{</span>rand<span class="sy3">.</span>Intn<span class="sy1
">(</span>digit_range<span class="sy3">-</span><span class="nu0">1</span><span c
lass="sy1">)</span> <span class="sy3">+</span> <span class="nu0">1</span><span c
lass="sy1">,</span> <span class="nu0">1</span><span class="sy1">}}</span><br/>
fmt<span class="sy3">.</span>Printf<span class="sy1">(</span><span class="st0">&
quot;&#160;%d&quot;</span><span class="sy1">,</span> cards<span class="sy1">[</s
pan>i<span class="sy1">]</span><span class="sy3">.</span><span class="me1">value
</span><span class="sy3">.</span><span class="me1">num</span><span class="sy1">)
</span><br/>
<span class="sy1">}</span><br/>
fmt<span class="
sy3">.</span><span class="me1">Print</span><span class="sy1">(</span><span class
="st0">&quot;: &quot;</span><span class="sy1">)</span><br/>
<span cl
ass="kw1">if</span> <span class="sy3">!</span>solve<span class="sy1">(</span>car
ds<span class="sy1">)</span> <span class="sy1">{</span><br/>
fmt<span class="sy3">.</span>Println<span class="sy1">(</span><span class="st0">
&quot;No solution&quot;</span><span class="sy1">)</span><br/>
<span cl
ass="sy1">}</span><br/> <span class="sy1">}</span><br/><span class="sy1">}</span
></pre>
<div>
<dl><dt>Output:</div>

</dt></dl>
<pre> 8 6 7 6: No solution
7 2 6 6: (7 - 2) * 6 - 6
4 8 7 3: 4 * (7 - 3) + 8
3 8 8 7: 3 * 8 * (8 - 7)
5 7 3 7: No solution
5 7 8 3: 5 * 7 - 8 - 3
3 6 5 2: ((3 + 5) * 6) / 2
8 4 5 4: (8 - 4) * 5 + 4
2 2 8 8: (2 + 2) * 8 - 8
6 8 8 2: 6 + 8 + 8 + 2
</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=17" title="Edit section: Gosu">edit</a>]</span> <span clas
s="mw-headline" id="Gosu"><a href="/wiki/Category:Gosu" title="Category:Gosu">Go
su</a></span></h2>
<pre class="text highlighted_source">&#160;<br/>uses java.lang.Integer<br/>uses
java.lang.Double<br/>uses java.lang.System<br/>uses java.util.ArrayList<br/>uses
java.util.LinkedList<br/>uses java.util.List<br/>uses java.util.Scanner<br/>use
s java.util.Stack<br/>&#160;<br/>function permutations&lt;T&gt;( lst&#160;: List
&lt;T&gt; )&#160;: List&lt;List&lt;T&gt;&gt; {<br/>
if( lst.size() == 0 ) ret
urn {}<br/>
if( lst.size() == 1 ) return { lst }<br/>&#160;<br/>
var pivot
= lst.get(lst.size()-1)<br/>&#160;<br/>
var sublist = new ArrayList&lt;T&gt;
( lst )<br/>
sublist.remove( sublist.size() - 1 )<br/>&#160;<br/>
var subP
erms = permutations( sublist )<br/>&#160;<br/>
var ret = new ArrayList&lt;Lis
t&lt;T&gt;&gt;()<br/>
for( x in subPerms ) {<br/>
for( e in x index i
) {<br/>
var next = new LinkedList&lt;T&gt;( x )<br/>
next
.add( i, pivot )<br/>
ret.add( next )<br/>
}<br/>
x.add
( pivot )<br/>
ret.add( x )<br/>
}<br/>
return ret<br/>}<br/>&#160;
<br/>function readVals()&#160;: List&lt;Integer&gt; {<br/>
var line = new jav
a.io.BufferedReader( new java.io.InputStreamReader( System.in ) ).readLine()<br/
>
var scan = new Scanner( line )<br/>&#160;<br/>
var ret = new ArrayList&l
t;Integer&gt;()<br/>
for( i in 0..3 ) {<br/>
var next = scan.nextInt()
<br/>
if( 0 &gt;= next || next &gt;= 10 ) {<br/>
print( &quot
;Invalid entry: ${next}&quot; )<br/>
return null<br/>
}<br/>
ret.add( next )<br/>
}<br/>
return ret<br/>}<br/>&#160;<br/>function
getOp( i&#160;: int )&#160;: char[] {<br/>
var ret = new char[3]<br/>
var
ops = { '+', '-', '*', '/' }<br/>
ret[0] = ops[i / 16]<br/>
ret[1] = ops[
(i / 4)&#160;% 4 ]<br/>
ret[2] = ops[i&#160;% 4 ]<br/>
return ret<br/>}<br
/>&#160;<br/>function isSoln( nums&#160;: List&lt;Integer&gt;, ops&#160;: char[]
)&#160;: boolean {<br/>
var stk = new Stack&lt;Double&gt;()<br/>
for( n i
n nums ) {<br/>
stk.push( n )<br/>
}<br/>&#160;<br/>
for( c in ops
) {<br/>
var r = stk.pop().doubleValue()<br/>
var l = stk.pop().do
ubleValue()<br/>
if( c == '+' ) {<br/>
stk.push( l + r )<br/>
} else if( c == '-' ) {<br/>
stk.push( l - r )<br/>
} e
lse if( c == '*' ) {<br/>
stk.push( l * r )<br/>
} else if( c
== '/' ) {<br/>
// Avoid division by 0<br/>
if( r == 0.0 )
{<br/>
return false<br/>
}<br/>
stk.push(
l / r )<br/>
}<br/>
}<br/>&#160;<br/>
return java.lang.Math.abs( st
k.pop().doubleValue() - 24.0 ) &lt; 0.001<br/>}<br/>&#160;<br/>function printSol
n( nums&#160;: List&lt;Integer&gt;, ops&#160;: char[] ) {<br/>
// RPN: a b c
d + - *<br/>
// Infix (a * (b - (c + d)))<br/>
print( &quot;Found soln: ($
{nums.get(0)} ${ops[0]} (${nums.get(1)} ${ops[1]} (${nums.get(2)} ${ops[2]} ${nu
ms.get(3)})))&quot; )<br/>}<br/>&#160;<br/>System.out.print( &quot;#&gt; &quot;
)<br/>var vals = readVals()<br/>&#160;<br/>var opPerms = 0..63<br/>var solnFound
= false<br/>&#160;<br/>for( i in permutations( vals ) ) {<br/>
for( j in opP
erms ) {<br/>
var opList = getOp( j )<br/>
if( isSoln( i, opList )
) {<br/>
printSoln( i, opList )<br/>
solnFound = true<br/
>
}<br/>
}<br/>}<br/>&#160;<br/>if(&#160;! solnFound ) {<br/>
print
( &quot;No solution!&quot; )<br/>}<br/>&#160;</pre>

<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac


tion=edit&amp;section=18" title="Edit section: Haskell">edit</a>]</span> <span c
lass="mw-headline" id="Haskell"><a href="/wiki/Category:Haskell" title="Category
:Haskell">Haskell</a></span></h2>
<pre class="haskell highlighted_source"><span class="kw1">import</span> Data<spa
n class="sy0">.</span>List<br/><span class="kw1">import</span> Data<span class="
sy0">.</span>Ratio<br/><span class="kw1">import</span> Control<span class="sy0">
.</span><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.
html#t:Monad"><span class="kw4">Monad</span></a><br/><span class="kw1">import</s
pan> System<span class="sy0">.</span>Environment <span class="br0">&#40;</span>g
etArgs<span class="br0">&#41;</span><br/>&#160;<br/><span class="kw1">data</span
> Expr <span class="sy0">=</span> Constant <a href="http://haskell.org/ghc/docs/
latest/html/libraries/base/Prelude.html#t:Rational"><span class="kw4">Rational</
span></a> <span class="sy0">|</span><br/>
Expr&#160;:<span class="sy0">+</spa
n> Expr <span class="sy0">|</span> Expr&#160;:<span class="sy0">-</span> Expr <s
pan class="sy0">|</span><br/>
Expr&#160;:<span class="sy0">*</span> Expr <spa
n class="sy0">|</span> Expr&#160;:<span class="sy0">/</span> Expr<br/>
<span
class="kw1">deriving</span> <span class="br0">&#40;</span><a href="http://haskel
l.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Eq"><span class="kw4">E
q</span></a><span class="br0">&#41;</span><br/>&#160;<br/>ops <span class="sy0">
=</span> <span class="br0">&#9#91;</span><span class="br0">&#40;</span>:<span cl
ass="sy0">+</span><span class="br0">&#41;</span><span class="sy0">,</span> <span
class="br0">&#40;</span>:<span class="sy0">-</span><span class="br0">&#41;</spa
n><span class="sy0">,</span> <span class="br0">&#40;</span>:<span class="sy0">*<
/span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="br0"
>&#40;</span>:<span class="sy0">/</span><span class="br0">&#41;</span><span clas
s="br0">&#93;</span><br/>&#160;<br/><span class="kw1">instance</span> <a href="h
ttp://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Show"><span
class="kw4">Show</span></a> Expr <span class="kw1">where</span><br/>
<a href
="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:show"><s
pan class="kw3">show</span></a> <span class="br0">&#40;</span>Constant x<span cl
ass="br0">&#41;</span> <span class="sy0">=</span> <a href="http://haskell.org/gh
c/docs/latest/html/libraries/base/Prelude.html#v:show"><span class="kw3">show</s
pan></a> <span class="sy0">$</span> numerator x<br/>
<span class="co1">-- I
n this program, we need only print integers.</span><br/>
<a href="http://hask
ell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:show"><span class="kw
3">show</span></a> <span class="br0">&#40;</span>a&#160;:<span class="sy0">+</sp
an> b<span class="br0">&#41;</span>
<span class="sy0">=</span> strexp <span
class="st0">&quot;+&quot;</span> a b<br/>
<a href="http://haskell.org/ghc/doc
s/latest/html/libraries/base/Prelude.html#v:show"><span class="kw3">show</span><
/a> <span class="br0">&#40;</span>a&#160;:<span class="sy0">-</span> b<span clas
s="br0">&#41;</span>
<span class="sy0">=</span> strexp <span class="st0">&qu
ot;-&quot;</span> a b<br/>
<a href="http://haskell.org/ghc/docs/latest/html/l
ibraries/base/Prelude.html#v:show"><span class="kw3">show</span></a> <span class
="br0">&#40;</span>a&#160;:<span class="sy0">*</span> b<span class="br0">&#41;</
span>
<span class="sy0">=</span> strexp <span class="st0">&quot;*&quot;</spa
n> a b<br/>
<a href="http://haskell.org/ghc/docs/latest/html/libraries/base/P
relude.html#v:show"><span class="kw3">show</span></a> <span class="br0">&#40;</s
pan>a&#160;:<span class="sy0">/</span> b<span class="br0">&#41;</span>
<span
class="sy0">=</span> strexp <span class="st0">&quot;/&quot;</span> a b<br/>&#16
0;<br/>strexp <span class="sy0">::</span> <a href="http://haskell.org/ghc/docs/l
atest/html/libraries/base/Prelude.html#t:String"><span class="kw4">String</span>
</a> <span class="sy0">-&gt;</span> Expr <span class="sy0">-&gt;</span> Expr <sp
an class="sy0">-&gt;</span> <a href="http://haskell.org/ghc/docs/latest/html/lib
raries/base/Prelude.html#t:String"><span class="kw4">String</span></a><br/>strex
p op a b <span class="sy0">=</span> <span class="st0">&quot;(&quot;</span> <span
class="sy0">++</span> <a href="http://haskell.org/ghc/docs/latest/html/librarie
s/base/Prelude.html#v:show"><span class="kw3">show</span></a> a <span class="sy0
">++</span> <span class="st0">&quot; &quot;</span> <span class="sy0">++</span> o
p <span class="sy0">++</span> <span class="st0">&quot; &quot;</span> <span class

="sy0">++</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base


/Prelude.html#v:show"><span class="kw3">show</span></a> b <span class="sy0">++</
span> <span class="st0">&quot;)&quot;</span><br/>&#160;<br/>templates <span clas
s="sy0">::</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>Ex
pr<span class="br0">&#93;</span> <span class="sy0">-&gt;</span> Expr<span class=
"br0">&#93;</span><br/>templates <span class="sy0">=</span> <span class="kw1">do
</span><br/>
op1 <span class="sy0">&lt;-</span> ops<br/>
op2 <span class="
sy0">&lt;-</span> ops<br/>
op3 <span class="sy0">&lt;-</span> ops<br/>
<sp
an class="br0">&#91;</span>\<span class="br0">&#91;</span>a<span class="sy0">,</
span> b<span class="sy0">,</span> c<span class="sy0">,</span> d<span class="br0"
>&#93;</span> <span class="sy0">-&gt;</span> op1 a <span class="sy0">$</span> op
2 b <span class="sy0">$</span> op3 c d<span class="sy0">,</span><br/>
\<span
class="br0">&#91;</span>a<span class="sy0">,</span> b<span class="sy0">,</span>
c<span class="sy0">,</span> d<span class="br0">&#93;</span> <span class="sy0">&gt;</span> op1 <span class="br0">&#40;</span>op2 a b<span class="br0">&#41;</sp
an> <span class="sy0">$</span> op3 c d<span class="sy0">,</span><br/>
\<span
class="br0">&#91;</span>a<span class="sy0">,</span> b<span class="sy0">,</span>
c<span class="sy0">,</span> d<span class="br0">&#93;</span> <span class="sy0">&gt;</span> op1 a <span class="sy0">$</span> op2 <span class="br0">&#40;</span>o
p3 b c<span class="br0">&#41;</span> d<span class="sy0">,</span><br/>
\<span
class="br0">&#91;</span>a<span class="sy0">,</span> b<span class="sy0">,</span>
c<span class="sy0">,</span> d<span class="br0">&#93;</span> <span class="sy0">&gt;</span> op1 <span class="br0">&#40;</span>op2 a <span class="sy0">$</span> o
p3 b c<span class="br0">&#41;</span> d<span class="sy0">,</span><br/>
\<span
class="br0">&#91;</span>a<span class="sy0">,</span> b<span class="sy0">,</span>
c<span class="sy0">,</span> d<span class="br0">&#93;</span> <span class="sy0">&gt;</span> op1 <span class="br0">&#40;</span>op2 <span class="br0">&#40;</span>
op3 a b<span class="br0">&#41;</span> c<span class="br0">&#41;</span> d<span cla
ss="br0">&#93;</span><br/>&#160;<br/>eval <span class="sy0">::</span> Expr <span
class="sy0">-&gt;</span> <a href="http://haskell.org/ghc/docs/latest/html/libra
ries/base/Prelude.html#t:Maybe"><span class="kw4">Maybe</span></a> <a href="http
://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Rational"><spa
n class="kw4">Rational</span></a><br/>eval <span class="br0">&#40;</span>Constan
t c<span class="br0">&#41;</span> <span class="sy0">=</span> Just c<br/>eval <sp
an class="br0">&#40;</span>a&#160;:<span class="sy0">+</span> b<span class="br0"
>&#41;</span>
<span class="sy0">=</span> liftM2 <span class="br0">&#40;</spa
n><span class="sy0">+</span><span class="br0">&#41;</span> <span class="br0">&#4
0;</span>eval a<span class="br0">&#41;</span> <span class="br0">&#40;</span>eval
b<span class="br0">&#41;</span><br/>eval <span class="br0">&#40;</span>a&#160;:
<span class="sy0">-</span> b<span class="br0">&#41;</span>
<span class="sy0"
>=</span> liftM2 <span class="br0">&#40;</span><span class="sy0">-</span><span c
lass="br0">&#41;</span> <span class="br0">&#40;</span>eval a<span class="br0">&#
41;</span> <span class="br0">&#40;</span>eval b<span class="br0">&#41;</span><br
/>eval <span class="br0">&#40;</span>a&#160;:<span class="sy0">*</span> b<span c
lass="br0">&#41;</span>
<span class="sy0">=</span> liftM2 <span class="br0">
&#40;</span><span class="sy0">*</span><span class="br0">&#41;</span> <span class
="br0">&#40;</span>eval a<span class="br0">&#41;</span> <span class="br0">&#40;<
/span>eval b<span class="br0">&#41;</span><br/>eval <span class="br0">&#40;</spa
n>a&#160;:<span class="sy0">/</span> b<span class="br0">&#41;</span>
<span c
lass="sy0">=</span> <span class="kw1">do</span><br/>
denom <span class="sy0">
&lt;-</span> eval b<br/>
guard <span class="sy0">$</span> denom <span class="
sy0">/=</span> <span class="nu0">0</span><br/>
liftM <span class="br0">&#40;<
/span><span class="sy0">/</span> denom<span class="br0">&#41;</span> <span class
="sy0">$</span> eval a<br/>&#160;<br/>solve <span class="sy0">::</span> <a href=
"http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Rational"
><span class="kw4">Rational</span></a> <span class="sy0">-&gt;</span> <span clas
s="br0">&#91;</span><a href="http://haskell.org/ghc/docs/latest/html/libraries/b
ase/Prelude.html#t:Rational"><span class="kw4">Rational</span></a><span class="b
r0">&#93;</span> <span class="sy0">-&gt;</span> <span class="br0">&#91;</span>Ex
pr<span class="br0">&#93;</span><br/>solve target r4 <span class="sy0">=</span>

<a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:f
ilter"><span class="kw3">filter</span></a> <span class="br0">&#40;</span><a href
="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:maybe"><
span class="kw3">maybe</span></a> False <span class="br0">&#40;</span><span clas
s="sy0">==</span> target<span class="br0">&#41;</span> <span class="sy0">.</span
> eval<span class="br0">&#41;</span> <span class="sy0">$</span><br/>
liftM2 <
span class="br0">&#40;</span><span class="sy0">$</span><span class="br0">&#41;</
span> templates <span class="sy0">$</span><br/>
nub <span class="sy0">$</span
> permutations <span class="sy0">$</span> <a href="http://haskell.org/ghc/docs/l
atest/html/libraries/base/Prelude.html#v:map"><span class="kw3">map</span></a> C
onstant r4 <br/>&#160;<br/>main <span class="sy0">=</span> getArgs <span class="
sy0">&gt;&gt;=</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries
/base/Prelude.html#v:mapM_"><span class="kw3">mapM_</span></a> <a href="http://h
askell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:print"><span class
="kw3">print</span></a> <span class="sy0">.</span> solve <span class="nu0">24</s
pan> <span class="sy0">.</span> <a href="http://haskell.org/ghc/docs/latest/html
/libraries/base/Prelude.html#v:map"><span class="kw3">map</span></a> <span class
="br0">&#40;</span><a href="http://haskell.org/ghc/docs/latest/html/libraries/ba
se/Prelude.html#v:toEnum"><span class="kw3">toEnum</span></a> <span class="sy0">
.</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude
.html#v:read"><span class="kw3">read</span></a><span class="br0">&#41;</span></p
re>
<p>Example use:
</p>
<pre>$ runghc 24Player.hs 2 3 8 9
(8 * (9 - (3 * 2)))
(8 * (9 - (2 * 3)))
((9 - (2 * 3)) * 8)
((9 - (3 * 2)) * 8)
((9 - 3) * (8 / 2))
((8 / 2) * (9 - 3))
(8 * ((9 - 3) / 2))
(((9 - 3) / 2) * 8)
((9 - 3) / (2 / 8))
((8 * (9 - 3)) / 2)
(((9 - 3) * 8) / 2)
(8 / (2 / (9 - 3)))</pre>
<h3><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=19" title="Edit section: Alternative version">edit</a>]</s
pan> <span class="mw-headline" id="Alternative_version">Alternative version</spa
n></h3>
<pre class="haskell highlighted_source"><span class="kw1">import</span> Control<
span class="sy0">.</span>Applicative<br/><span class="kw1">import</span> Data<sp
an class="sy0">.</span>List<br/><span class="kw1">import</span> Text<span class=
"sy0">.</span>PrettyPrint<br/>&#160;<br/>&#160;<br/><span class="kw1">data</span
> Expr <span class="sy0">=</span> C <a href="http://haskell.org/ghc/docs/latest/
html/libraries/base/Prelude.html#t:Int"><span class="kw4">Int</span></a> <span c
lass="sy0">|</span> Op <a href="http://haskell.org/ghc/docs/latest/html/librarie
s/base/Prelude.html#t:String"><span class="kw4">String</span></a> Expr Expr<br/>
&#160;<br/>toDoc <span class="br0">&#40;</span>C
x <span class="br0">&#41;<
/span> <span class="sy0">=</span> int x<br/>toDoc <span class="br0">&#40;</span>
Op op x y<span class="br0">&#41;</span> <span class="sy0">=</span> parens <span
class="sy0">$</span> toDoc x <span class="sy0">&lt;+&gt;</span> text op <span cl
ass="sy0">&lt;+&gt;</span> toDoc y<br/>&#160;<br/>ops <span class="sy0">::</span
> <span class="br0">&#91;</span><span class="br0">&#40;</span><a href="http://ha
skell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:String"><span class
="kw4">String</span></a><span class="sy0">,</span> <a href="http://haskell.org/g
hc/docs/latest/html/libraries/base/Prelude.html#t:Int"><span class="kw4">Int</sp
an></a> <span class="sy0">-&gt;</span> <a href="http://haskell.org/ghc/docs/late
st/html/libraries/base/Prelude.html#t:Int"><span class="kw4">Int</span></a> <spa

n class="sy0">-&gt;</span> <a href="http://haskell.org/ghc/docs/latest/html/libr


aries/base/Prelude.html#t:Int"><span class="kw4">Int</span></a><span class="br0"
>&#41;</span><span class="br0">&#93;</span><br/>ops <span class="sy0">=</span> <
span class="br0">&#91;</span><span class="br0">&#40;</span><span class="st0">&qu
ot;+&quot;</span><span class="sy0">,</span><span class="br0">&#40;</span><span c
lass="sy0">+</span><span class="br0">&#41;</span><span class="br0">&#41;</span><
span class="sy0">,</span> <span class="br0">&#40;</span><span class="st0">&quot;
-&quot;</span><span class="sy0">,</span><span class="br0">&#40;</span><span clas
s="sy0">-</span><span class="br0">&#41;</span><span class="br0">&#41;</span><spa
n class="sy0">,</span> <span class="br0">&#40;</span><span class="st0">&quot;*&q
uot;</span><span class="sy0">,</span><span class="br0">&#40;</span><span class="
sy0">*</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span c
lass="sy0">,</span> <span class="br0">&#40;</span><span class="st0">&quot;/&quot
;</span><span class="sy0">,</span><a href="http://haskell.org/ghc/docs/latest/ht
ml/libraries/base/Prelude.html#v:div"><span class="kw3">div</span></a><span clas
s="br0">&#41;</span><span class="br0">&#93;</span><br/>&#160;<br/>&#160;<br/>sol
ve <span class="sy0">::</span> <a href="http://haskell.org/ghc/docs/latest/html/
libraries/base/Prelude.html#t:Int"><span class="kw4">Int</span></a> <span class=
"sy0">-&gt;</span> <span class="br0">&#91;</span><a href="http://haskell.org/ghc
/docs/latest/html/libraries/base/Prelude.html#t:Int"><span class="kw4">Int</span
></a><span class="br0">&#93;</span> <span class="sy0">-&gt;</span> <span class="
br0">&#91;</span>Expr<span class="br0">&#93;</span><br/>solve res <span class="s
y0">=</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Pre
lude.html#v:filter"><span class="kw3">filter</span></a> <span class="br0">&#40;<
/span><span class="br0">&#40;</span>Just res <span class="sy0">==</span><span cl
ass="br0">&#41;</span> <span class="sy0">.</span> eval<span class="br0">&#41;</s
pan> <span class="sy0">.</span> genAst<br/> <span class="kw1">where</span><br/>
genAst <span class="br0">&#91;</span>x<span class="br0">&#93;</span> <span c
lass="sy0">=</span> <span class="br0">&#91;</span>C x<span class="br0">&#93;</sp
an><br/>
genAst xs <span class="sy0">=</span> <span class="kw1">do</span><br
/>
<span class="br0">&#40;</span>ys<span class="sy0">,</span>zs<span class=
"br0">&#41;</span> <span class="sy0">&lt;-</span> split xs<br/>
<span class
="kw1">let</span> f <span class="br0">&#40;</span>Op op <span class="sy0">_</spa
n> <span class="sy0">_</span><span class="br0">&#41;</span> <span class="sy0">=<
/span> op `<a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelu
de.html#v:notElem"><span class="kw3">notElem</span></a>` <span class="br0">&#91;
</span><span class="st0">&quot;+&quot;</span><span class="sy0">,</span><span cla
ss="st0">&quot;*&quot;</span><span class="br0">&#93;</span> <span class="sy0">||
</span> ys <span class="sy0">&lt;=</span> zs<br/>
<a href="http://haskell.o
rg/ghc/docs/latest/html/libraries/base/Prelude.html#v:filter"><span class="kw3">
filter</span></a> f <span class="sy0">$</span> Op <span class="sy0">&lt;$&gt;</s
pan> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.htm
l#v:map"><span class="kw3">map</span></a> <a href="http://haskell.org/ghc/docs/l
atest/html/libraries/base/Prelude.html#v:fst"><span class="kw3">fst</span></a> o
ps <span class="sy0">&lt;*&gt;</span> genAst ys <span class="sy0">&lt;*&gt;</spa
n> genAst zs<br/>&#160;<br/>
eval <span class="br0">&#40;</span>C
x <sp
an class="br0">&#41;</span> <span class="sy0">=</span> Just x<br/>
eval <span
class="br0">&#40;</span>Op <span class="st0">&quot;/&quot;</span> <span class="
sy0">_</span> y<span class="br0">&#41;</span> <span class="sy0">|</span> Just <s
pan class="nu0">0</span> <span class="sy0">&lt;-</span> eval y <span class="sy0"
>=</span> Nothing<br/>
eval <span class="br0">&#40;</span>Op op x y<span cla
ss="br0">&#41;</span> <span class="sy0">=</span> <a href="http://haskell.org/ghc
/docs/latest/html/libraries/base/Prelude.html#v:lookup"><span class="kw3">lookup
</span></a> op ops <span class="sy0">&lt;*&gt;</span> eval x <span class="sy0">&
lt;*&gt;</span> eval y<br/>&#160;<br/>&#160;<br/>select <span class="sy0">::</sp
an> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html
#t:Int"><span class="kw4">Int</span></a> <span class="sy0">-&gt;</span> <span cl
ass="br0">&#91;</span><a href="http://haskell.org/ghc/docs/latest/html/libraries
/base/Prelude.html#t:Int"><span class="kw4">Int</span></a><span class="br0">&#93
;</span> <span class="sy0">-&gt;</span> <span class="br0">&#91;</span><span clas

s="br0">&#91;</span><a href="http://haskell.org/ghc/docs/latest/html/libraries/b
ase/Prelude.html#t:Int"><span class="kw4">Int</span></a><span class="br0">&#93;<
/span><span class="br0">&#93;</span><br/>select <span class="nu0">0</span> <span
class="sy0">_</span> <span class="sy0">=</span> <span class="br0">&#91;</span>
<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#
93;</span><br/>select n xs <span class="sy0">=</span> <span class="br0">&#91;</s
pan>x:zs <span class="sy0">|</span> k <span class="sy0">&lt;-</span> <span class
="br0">&#91;</span><span class="nu0">0</span><span class="sy0">..</span><a href=
"http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:length"><
span class="kw3">length</span></a> xs <span class="sy0">-</span> n<span class="b
r0">&#93;</span><br/>
<span class="sy0">,</span> <span class=
"kw1">let</span> <span class="br0">&#40;</span>x:ys<span class="br0">&#41;</span
> <span class="sy0">=</span> <a href="http://haskell.org/ghc/docs/latest/html/li
braries/base/Prelude.html#v:drop"><span class="kw3">drop</span></a> k xs<br/>
<span class="sy0">,</span> zs <span class="sy0">&lt;-</span> se
lect <span class="br0">&#40;</span>n <span class="sy0">-</span> <span class="nu0
">1</span><span class="br0">&#41;</span> ys<br/>
<span class=
"br0">&#93;</span><br/>&#160;<br/>split <span class="sy0">::</span> <span class=
"br0">&#91;</span><a href="http://haskell.org/ghc/docs/latest/html/libraries/bas
e/Prelude.html#t:Int"><span class="kw4">Int</span></a><span class="br0">&#93;</s
pan> <span class="sy0">-&gt;</span> <span class="br0">&#91;</span><span class="b
r0">&#40;</span><span class="br0">&#91;</span><a href="http://haskell.org/ghc/do
cs/latest/html/libraries/base/Prelude.html#t:Int"><span class="kw4">Int</span></
a><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91
;</span><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.
html#t:Int"><span class="kw4">Int</span></a><span class="br0">&#93;</span><span
class="br0">&#41;</span><span class="br0">&#93;</span><br/>split xs <span class=
"sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#40;</span>ys<sp
an class="sy0">,</span> xs \\ ys<span class="br0">&#41;</span> <span class="sy0"
>|</span> n <span class="sy0">&lt;-</span> <span class="br0">&#91;</span><span c
lass="nu0">1</span><span class="sy0">..</span><a href="http://haskell.org/ghc/do
cs/latest/html/libraries/base/Prelude.html#v:length"><span class="kw3">length</s
pan></a> xs <span class="sy0">-</span> <span class="nu0">1</span><span class="br
0">&#93;</span><br/>
<span class="sy0">,</span> ys <sp
an class="sy0">&lt;-</span> nub <span class="sy0">.</span> sort <span class="sy0
">$</span> select n xs<br/>
<span class="br0">&#93;</s
pan><br/>&#160;<br/>&#160;<br/>main <span class="sy0">=</span> <a href="http://h
askell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:mapM_"><span class
="kw3">mapM_</span></a> <span class="br0">&#40;</span><a href="http://haskell.or
g/ghc/docs/latest/html/libraries/base/Prelude.html#v:putStrLn"><span class="kw3"
>putStrLn</span></a> <span class="sy0">.</span> render <span class="sy0">.</span
> toDoc<span class="br0">&#41;</span> <span class="sy0">$</span> solve <span cla
ss="nu0">24</span> <span class="br0">&#91;</span><span class="nu0">2</span><span
class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span c
lass="nu0">8</span><span class="sy0">,</span><span class="nu0">9</span><span cla
ss="br0">&#93;</span></pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>((8 / 2) * (9 - 3))
((2 / 9) + (3 * 8))
((3 * 8) - (2 / 9))
((8 - (2 / 9)) * 3)
(((2 / 9) + 8) * 3)
(((8 + 9) / 2) * 3)
((2 + (8 * 9)) / 3)
((3 - (2 / 9)) * 8)
((9 - (2 * 3)) * 8)
(((2 / 9) + 3) * 8)
(((2 + 9) / 3) * 8)

(((9 - 3) / 2) * 8)
(((9 - 3) * 8) / 2)</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=20" title="Edit section: Icon and Unicon">edit</a>]</span>
<span class="mw-headline" id="Icon_and_Unicon"> <a href="/wiki/Category:Icon" t
itle="Category:Icon">Icon</a> and <a href="/wiki/Category:Unicon" title="Categor
y:Unicon">Unicon</a> </span></h2>
<p>This shares code with and solves the <a href="/wiki/24_game#Icon_and_Unicon"
title="24 game">24 game</a>. A series of pattern expressions are built up and th
en populated with the permutations of the selected digits. Equations are skipped
if they have been seen before. The procedure 'eval' was modified to catch zero
divides. The solution will find either all occurrences or just the first occurre
nce of a solution.
</p>
<pre class="icon highlighted_source"><span class="kw1">invocable</span> all <br/
><span class="kw1">link</span> strings <span class="co1"># for csort, deletec,
permutes</span><br/>&#160;<br/><span class="kw1">procedure</span> main<span cla
ss="br0">&#40;</span><span class="br0">&#41;</span><br/><span class="kw2">static
</span> eL<br/><span class="kw1">initial</span> <span class="br0">&#123;</span><
br/> eoP <span class="sy1">:=</span> <span class="br0">&#91;</span><span class
="br0">&#93;</span> <span class="co1"># set-up expression and operator permutat
ion patterns</span><br/> <span class="kw1">every</span> <span class="br0">&#40
;</span> e <span class="sy1">:=</span> <span class="sy1">!</span><span class="br
0">&#91;</span><span class="st0">&quot;a@b#c$d&quot;</span><span class="sy1">,</
span> <span class="st0">&quot;a@(b#c)$d&quot;</span><span class="sy1">,</span> <
span class="st0">&quot;a@b#(c$d)&quot;</span><span class="sy1">,</span> <span cl
ass="st0">&quot;a@(b#c$d)&quot;</span><span class="sy1">,</span> <span class="st
0">&quot;a@(b#(c$d))&quot;</span><span class="br0">&#93;</span> <span class="br0
">&#41;</span> <span class="sy1">&amp;</span> <br/>
<span class="br0">&#
40;</span> o <span class="sy1">:=</span> <span class="sy1">!</span><span class="
br0">&#40;</span>opers <span class="sy1">:=</span> <span class="st0">&quot;+-*/&
quot;</span><span class="br0">&#41;</span> <span class="sy1">||</span> <span cla
ss="sy1">!</span>opers <span class="sy1">||</span> <span class="sy1">!</span>ope
rs <span class="br0">&#41;</span> <span class="kw1">do</span><br/>
<span cl
ass="kw4">put</span><span class="br0">&#40;</span> eoP<span class="sy1">,</span>
<span class="kw4">map</span><span class="br0">&#40;</span>e<span class="sy1">,<
/span><span class="st0">&quot;@#$&quot;</span><span class="sy1">,</span>o<span c
lass="br0">&#41;</span> <span class="br0">&#41;</span>
<span class="co1"># ex
pr+oper perms</span><br/>&#160;<br/> eL <span class="sy1">:=</span> <span clas
s="br0">&#91;</span><span class="br0">&#93;</span> <span class="co1"># all cas
es</span><br/> <span class="kw1">every</span> <span class="br0">&#40;</span> e
<span class="sy1">:=</span> <span class="sy1">!</span>eoP <span class="br0">&#4
1;</span> <span class="sy1">&amp;</span> <span class="br0">&#40;</span> p <span
class="sy1">:=</span> permutes<span class="br0">&#40;</span><span class="st0">&q
uot;wxyz&quot;</span><span class="br0">&#41;</span> <span class="br0">&#41;</spa
n> <span class="kw1">do</span><br/>
<span class="kw4">put</span><span class
="br0">&#40;</span>eL<span class="sy1">,</span> <span class="kw4">map</span><spa
n class="br0">&#40;</span>e<span class="sy1">,</span><span class="st0">&quot;abc
d&quot;</span><span class="sy1">,</span>p<span class="br0">&#41;</span><span cla
ss="br0">&#41;</span><br/>&#160;<br/> <span class="br0">&#125;</span><br/>&#16
0;<br/><span class="kw4">write</span><span class="br0">&#40;</span><span class="
st0">&quot;This will attempt to find solutions to 24 for sets of numbers by<span
class="es0">\n</span>&quot;</span><span class="sy1">,</span><br/>
<span cl
ass="st0">&quot;combining 4 single digits between 1 and 9 to make 24 using only
+ - * / and ( ).<span class="es0">\n</span>&quot;</span><span class="sy1">,</spa
n><br/>
<span class="st0">&quot;All operations have equal precedence and ar
e evaluated left to right.<span class="es0">\n</span>&quot;</span><span class="s
y1">,</span><br/>
<span class="st0">&quot;Enter 'use n1 n2 n3 n4' or just h
it enter (to use a random set),&quot;</span><span class="sy1">,</span><br/>
<span class="st0">&quot;'first'/'all' shows the first or all solutions, 'quit'

to end.<span class="es0">\n</span><span class="es0">\n</span>&quot;</span><span


class="br0">&#41;</span><br/>&#160;<br/><span class="kw1">repeat</span> <span cl
ass="br0">&#123;</span><br/> e <span class="sy1">:=</span> <span class="kw4">t
rim</span><span class="br0">&#40;</span><span class="kw4">read</span><span class
="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="sy1">|</span> <span class="kw1">fail</span><br/> e <span class="s
y1">?</span> <span class="kw1">case</span> <span class="kw4">tab</span><span cl
ass="br0">&#40;</span><span class="kw4">find</span><span class="br0">&#40;</span
><span class="st0">&quot; &quot;</span><span class="br0">&#41;</span><span class
="sy1">|</span><span class="nu0">0</span><span class="br0">&#41;</span> <span cl
ass="kw1">of</span> <span class="br0">&#123;</span><br/>
<span class="st0">
&quot;q&quot;</span><span class="sy1">|</span><span class="st0">&quot;quit&quot;
</span> <span class="sy1">:</span> <span class="kw1">break</span><br/>
<spa
n class="st0">&quot;u&quot;</span><span class="sy1">|</span><span class="st0">&q
uot;use&quot;</span> <span class="sy1">:</span> e <span class="sy1">:=</span> <
span class="kw4">tab</span><span class="br0">&#40;</span><span class="nu0">0</sp
an><span class="br0">&#41;</span><br/>
<span class="st0">&quot;f&quot;</spa
n><span class="sy1">|</span><span class="st0">&quot;first&quot;</span><span clas
s="sy1">:</span> first <span class="sy1">:=</span> <span class="nu0">1</span> <s
pan class="sy1">&amp;</span> <span class="kw1">next</span><br/>
<span class
="st0">&quot;a&quot;</span><span class="sy1">|</span><span class="st0">&quot;all
&quot;</span> <span class="sy1">:</span> first <span class="sy1">:=</span> <spa
n class="sy1">&amp;</span><span class="kw3">null</span> <span class="sy1">&amp;<
/span> <span class="kw1">next</span><br/>
<span class="st0">&quot;&quot;</s
pan>
<span class="sy1">:</span> e <span class="sy1">:=</span> <span clas
s="st0">&quot; &quot;</span> <span class="sy1">||</span><span class="br0">&#40;<
/span><span class="nu0">1</span><span class="sy1">+?</span><span class="nu0">8</
span><span class="br0">&#41;</span> <span class="sy1">||</span> <span class="st0
">&quot; &quot;</span> <span class="sy1">||</span> <span class="br0">&#40;</span
><span class="nu0">1</span><span class="sy1">+?</span><span class="nu0">8</span>
<span class="br0">&#41;</span> <span class="sy1">||</span><span class="st0">&quo
t; &quot;</span> <span class="sy1">||</span> <span class="br0">&#40;</span><span
class="nu0">1</span><span class="sy1">+?</span><span class="nu0">8</span><span
class="br0">&#41;</span> <span class="sy1">||</span> <span class="st0">&quot; &q
uot;</span> <span class="sy1">||</span> <span class="br0">&#40;</span><span clas
s="nu0">1</span><span class="sy1">+?</span><span class="nu0">8</span><span class
="br0">&#41;</span><br/>
<span class="br0">&#125;</span><br/>&#160;<br/>
<span class="kw4">writes</span><span class="br0">&#40;</span><span class="st0">&
quot;Attempting to solve 24 for&quot;</span><span class="sy1">,</span>e<span cla
ss="br0">&#41;</span><br/>&#160;<br/> e <span class="sy1">:=</span> deletec<sp
an class="br0">&#40;</span>e<span class="sy1">,</span><span class="st0">' <span
class="es0">\t</span>'</span><span class="br0">&#41;</span> <span class="co1">#
no whitespace </span><br/> <span class="kw1">if</span> e <span class="sy1">?
</span> <span class="br0">&#40;</span> <span class="kw4">tab</span><span class="
br0">&#40;</span><span class="kw4">many</span><span class="br0">&#40;</span><spa
n class="st0">'123456789'</span><span class="br0">&#41;</span><span class="br0">
&#41;</span><span class="sy1">,</span> <span class="kw4">pos</span><span class="
br0">&#40;</span><span class="nu0">5</span><span class="br0">&#41;</span><span c
lass="sy1">,</span> <span class="kw4">pos</span><span class="br0">&#40;</span><s
pan class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#41;</
span> <span class="kw1">then</span> <br/>
<span class="kw4">write</span><sp
an class="br0">&#40;</span><span class="st0">&quot;:&quot;</span><span class="br
0">&#41;</span><br/> <span class="kw1">else</span> <span class="kw4">write</sp
an><span class="br0">&#40;</span><span class="st0">&quot; - invalid, only the di
gits '1..9' are allowed.&quot;</span><span class="br0">&#41;</span> <span class=
"sy1">&amp;</span> <span class="kw1">next</span> <br/>&#160;<br/> eS <span cl
ass="sy1">:=</span> <span class="kw4">set</span><span class="br0">&#40;</span><s
pan class="br0">&#41;</span><br/> <span class="kw1">every</span> ex <span clas
s="sy1">:=</span> <span class="kw4">map</span><span class="br0">&#40;</span><spa
n class="sy1">!</span>eL<span class="sy1">,</span><span class="st0">&quot;wxyz&q

uot;</span><span class="sy1">,</span>e<span class="br0">&#41;</span> <span class


="kw1">do</span> <span class="br0">&#123;</span><br/>
<span class="kw1">if<
/span> <span class="kw4">member</span><span class="br0">&#40;</span>eS<span clas
s="sy1">,</span>ex<span class="br0">&#41;</span> <span class="kw1">then</span> <
span class="kw1">next</span> <span class="co1"># skip duplicates of final expres
sion</span><br/>
<span class="kw4">insert</span><span class="br0">&#40;</sp
an>eS<span class="sy1">,</span>ex<span class="br0">&#41;</span><br/>
<span
class="kw1">if</span> ex <span class="sy1">?</span> <span class="br0">&#40;</spa
n>ans <span class="sy1">:=</span> eval<span class="br0">&#40;</span>E<span class
="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><
span class="sy1">,</span> <span class="kw4">pos</span><span class="br0">&#40;</s
pan><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#
41;</span> <span class="kw1">then</span> <span class="co1"># parse and evaluate<
/span><br/>
<span class="kw1">if</span> ans <span class="sy1">=</span> <
span class="nu0">24</span> <span class="kw1">then</span> <span class="br0">&#123
;</span><br/>
<span class="kw4">write</span><span class="br0">&#40;</
span><span class="st0">&quot;Success &quot;</span><span class="sy1">,</span><spa
n class="kw4">image</span><span class="br0">&#40;</span>ex<span class="br0">&#41
;</span><span class="sy1">,</span><span class="st0">&quot; evaluates to 24.&quot
;</span><span class="br0">&#41;</span><br/>
<span class="kw1">if</spa
n> <span class="sy1">\</span>first <span class="kw1">then</span> <span class="kw
1">break</span><br/>
<span class="br0">&#125;</span><br/>
<span
class="br0">&#125;</span><br/> <span class="br0">&#125;</span><br/><span class
="kw4">write</span><span class="br0">&#40;</span><span class="st0">&quot;Quiting
.&quot;</span><span class="br0">&#41;</span><br/><span class="kw1">end</span><br
/>&#160;<br/><span class="kw1">procedure</span> eval<span class="br0">&#40;</spa
n>X<span class="br0">&#41;</span>
<span class="co1">#: return the evaluated A
ST</span><br/> <span class="kw1">if</span> <span class="kw4">type</span><span
class="br0">&#40;</span>X<span class="br0">&#41;</span> <span class="sy1">==</sp
an> <span class="st0">&quot;list&quot;</span> <span class="kw1">then</span> <spa
n class="br0">&#123;</span><br/>
x <span class="sy1">:=</span> eval<span cl
ass="br0">&#40;</span><span class="kw4">get</span><span class="br0">&#40;</span>
X<span class="br0">&#41;</span><span class="br0">&#41;</span> <br/>
<span c
lass="kw1">while</span> o <span class="sy1">:=</span> <span class="kw4">get</spa
n><span class="br0">&#40;</span>X<span class="br0">&#41;</span> <span class="kw1
">do</span> <br/>
<span class="kw1">if</span> y <span class="sy1">:=</sp
an> <span class="kw4">get</span><span class="br0">&#40;</span>X<span class="br0"
>&#41;</span> <span class="kw1">then</span><br/>
x <span class="sy1">
:=</span> o<span class="br0">&#40;</span> <span class="kw4">real</span><span cla
ss="br0">&#40;</span>x<span class="br0">&#41;</span><span class="sy1">,</span> <
span class="br0">&#40;</span>o <span class="sy1">~==</span> <span class="st0">&q
uot;/&quot;</span> <span class="sy1">|</span> <span class="kw1">fail</span><span
class="sy1">,</span> eval<span class="br0">&#40;</span>y<span class="br0">&#41;
</span> <span class="br0">&#41;</span><span class="br0">&#41;</span><br/>
<span class="kw1">else</span> <span class="kw4">write</span><span class="br0">
&#40;</span><span class="st0">&quot;Malformed expression.&quot;</span><span clas
s="br0">&#41;</span> <span class="sy1">&amp;</span> <span class="kw1">fail</span
><br/> <span class="br0">&#125;</span><br/> <span class="kw1">return</span>
<span class="sy1">\</span>x <span class="sy1">|</span> X<br/><span class="kw1">e
nd</span><br/>&#160;<br/><span class="kw1">procedure</span> E<span class="br0">&
#40;</span><span class="br0">&#41;</span>
<span class="co1">#: expression</sp
an><br/> <span class="kw4">put</span><span class="br0">&#40;</span>lex <span c
lass="sy1">:=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span
><span class="sy1">,</span><span class="kw7">T</span><span class="br0">&#40;</sp
an><span class="br0">&#41;</span><span class="br0">&#41;</span><br/> <span cla
ss="kw1">while</span> <span class="kw4">put</span><span class="br0">&#40;</span>
lex<span class="sy1">,</span><span class="kw4">tab</span><span class="br0">&#40;
</span><span class="kw4">any</span><span class="br0">&#40;</span><span class="st
0">'+-*/'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><spa
n class="br0">&#41;</span> <span class="kw1">do</span><br/>
<span class="kw

4">put</span><span class="br0">&#40;</span>lex<span class="sy1">,</span><span cl


ass="kw7">T</span><span class="br0">&#40;</span><span class="br0">&#41;</span><s
pan class="br0">&#41;</span> <br/> <span class="kw1">suspend</span> <span cla
ss="kw1">if</span> <span class="sy1">*</span>lex <span class="sy1">=</span> <spa
n class="nu0">1</span> <span class="kw1">then</span> lex<span class="br0">&#91;<
/span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="kw1"
>else</span> lex
<span class="co1"># strip useless [] </span><br/><span cla
ss="kw1">end</span> <br/>&#160;<br/><span class="kw1">procedure</span> <span c
lass="kw7">T</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="co1">#: Term</span><br/> <span class="kw1">susp
end</span> <span class="nu0">2</span><span class="br0">&#40;</span><span class="
sy1">=</span><span class="st0">&quot;(&quot;</span><span class="sy1">,</span> E<
span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy1">,</
span> <span class="sy1">=</span><span class="st0">&quot;)&quot;</span><span clas
s="br0">&#41;</span> <span class="sy1">|</span> <span class="co1"># parenthesize
d subexpression, or ...</span><br/>
<span class="kw4">tab</span><span clas
s="br0">&#40;</span><span class="kw4">any</span><span class="br0">&#40;</span><s
pan class="sy1">&amp;</span><span class="kw3">digits</span><span class="br0">&#4
1;</span><span class="br0">&#41;</span>
<span class="co1"># just a value<
/span><br/><span class="kw1">end</span></pre>
<p><br/>
</p>
<div class="examplemeta libheader"><b>Library:</b> <a href="/wiki/Category:Icon_
Programming_Library" title="Category:Icon Programming Library">Icon Programming
Library</a></div>
<p><a rel="nofollow" class="external text" href="http://www.cs.arizona.edu/icon/
library/src/procs/strings.icn">strings.icn provides deletec and permutes</a>
</p>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=21" title="Edit section: J">edit</a>]</span> <span class="
mw-headline" id="J"><a href="/wiki/Category:J" title="Category:J">J</a></span></
h2>
<pre class="j highlighted_source">perm=: <span class="sy0">(</span>A.&amp;i.~&#1
60;!<span class="sy0">)</span> <span class="nu0">4</span><br/>ops=: <span class=
"st_h">' '</span>,.<span class="st_h">'+-*%'</span> {~ &gt;,{i.each <span class=
"nu0">4</span> <span class="nu0">4</span> <span class="nu0">4</span><br/>cmask=:
<span class="nu0">1</span> + <span class="nu0">0j1</span> * i.@{:@$@[ e. ]<br/>
left=: [ #!.<span class="st_h">'('</span>~&quot;<span class="nu0">1</span> cmas
k<br/>right=: [ #!.<span class="st_h">')'</span>~&quot;<span class="nu0">1</span
> cmask<br/>paren=: <span class="nu0">2</span>&#160;:<span class="st_h">'[: left
&amp;m right&amp;n'</span><br/>parens=: ], <span class="nu0">0</span> paren <spa
n class="nu0">3</span>, <span class="nu0">0</span> paren <span class="nu0">5</sp
an>, <span class="nu0">2</span> paren <span class="nu0">5</span>, [: <span class
="nu0">0</span> paren <span class="nu0">7</span> <span class="sy0">(</span><span
class="nu0">0</span> paren <span class="nu0">3</span><span class="sy0">)</span>
<br/>all=: [: parens [:,/ ops ,@,.&quot;<span class="nu0">1</span>/ perm { [:;&q
uot;:each<br/>answer=: <span class="sy0">(</span>{.@#~ <span class="nu0">24</spa
n> = &quot;.<span class="sy0">)</span>@all</pre>
<p>This implementation tests all 7680 candidate sentences.
</p><p>Example use:
</p>
<pre> answer 2 3 5 7
2+7+3*5
answer 8 4 7 1
8*7-4*1
answer 1 1 2 7
(1+2)*1+7
</pre>
<p>The answer will be either a suitable J sentence or blank if none can be found
. "J sentence" means that, for example, the sentence <code>8*7-4*1</code> is equ

ivalent to the sentence <code>8*(7-(4*1))</code>. [Many infix languages use oper


ator precedence to make polynomials easier to express without parenthesis, but J
has other mechanisms for expressing polynomials and minimal operator precedence
makes the language more regular.]
</p>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=22" title="Edit section: Java">edit</a>]</span> <span clas
s="mw-headline" id="Java"><a href="/wiki/Category:Java" title="Category:Java">Ja
va</a></span></h2>
<div class="examplemeta workswith"><b>Works with</b>: <a href="/wiki/Java" title
="Java" class="mw-redirect">Java</a> version 7</div>
<p>Playable version, will print solution on request.
</p>
<pre class="java highlighted_source"><span class="kw1">import</span> <span class
="co2">java.util.*</span><span class="sy0">;</span><br/>&#160;<br/><span class="
kw1">public</span> <span class="kw1">class</span> Game24Player <span class="br0"
>&#123;</span><br/>
<span class="kw1">final</span> <a href="http://www.google
.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%
20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span
class="br0">&#93;</span> patterns <span class="sy0">=</span> <span class="br0">&
#123;</span><span class="st0">&quot;nnonnoo&quot;</span>, <span class="st0">&quo
t;nnonono&quot;</span>, <span class="st0">&quot;nnnoono&quot;</span>, <span clas
s="st0">&quot;nnnonoo&quot;</span>,<br/>
<span class="st0">&quot;nnnnooo&
quot;</span><span class="br0">&#125;</span><span class="sy0">;</span><br/>
<s
pan class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=a
llinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3
">String</span></a> ops <span class="sy0">=</span> <span class="st0">&quot;+-*/^
&quot;</span><span class="sy0">;</span><br/>&#160;<br/>
<a href="http://www.g
oogle.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Fee
ling%20Lucky"><span class="kw3">String</span></a> solution<span class="sy0">;</s
pan><br/>
List<span class="sy0">&lt;</span>Integer<span class="sy0">&gt;</spa
n> digits<span class="sy0">;</span><br/>&#160;<br/>
<span class="kw1">public<
/span> <span class="kw1">static</span> <span class="kw4">void</span> main<span c
lass="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinur
l%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Stri
ng</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<s
pan class="br0">&#41;</span> <span class="br0">&#123;</span><br/>
<span c
lass="kw1">new</span> Game24Player<span class="br0">&#40;</span><span class="br0
">&#41;</span>.<span class="me1">play</span><span class="br0">&#40;</span><span
class="br0">&#41;</span><span class="sy0">;</span><br/>
<span class="br0">&#1
25;</span><br/>&#160;<br/>
<span class="kw4">void</span> play<span class="br0
">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br/
>
digits <span class="sy0">=</span> getSolvableDigits<span class="br0">&#
40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br/>&#160;<br
/>
Scanner in <span class="sy0">=</span> <span class="kw1">new</span> Sca
nner<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&am
p;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class
="kw3">System</span></a>.<span class="me1">in</span><span class="br0">&#41;</spa
n><span class="sy0">;</span><br/>
<span class="kw1">while</span> <span cl
ass="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span
> <span class="br0">&#123;</span><br/>
<a href="http://www.google.com
/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lu
cky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span clas
s="me1">print</span><span class="br0">&#40;</span><span class="st0">&quot;Make 2
4 using these digits: &quot;</span><span class="br0">&#41;</span><span class="sy
0">;</span><br/>
<a href="http://www.google.com/search?hl=en&amp;q=al
linurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3"
>System</span></a>.<span class="me1">out</span>.<span class="me1">println</span>
<span class="br0">&#40;</span>digits<span class="br0">&#41;</span><span class="s
y0">;</span><br/>
<a href="http://www.google.com/search?hl=en&amp;q=a

llinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3
">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span
><span class="br0">&#40;</span><span class="st0">&quot;(Enter 'q' to quit, 's' f
or a solution)&quot;</span><span class="br0">&#41;</span><span class="sy0">;</sp
an><br/>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3
Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System<
/span></a>.<span class="me1">out</span>.<span class="me1">print</span><span clas
s="br0">&#40;</span><span class="st0">&quot;&gt; &quot;</span><span class="br0">
&#41;</span><span class="sy0">;</span><br/>&#160;<br/>
<a href="http:
//www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27
m%20Feeling%20Lucky"><span class="kw3">String</span></a> line <span class="sy0">
=</span> in.<span class="me1">nextLine</span><span class="br0">&#40;</span><span
class="br0">&#41;</span><span class="sy0">;</span><br/>
<span class=
"kw1">if</span> <span class="br0">&#40;</span>line.<span class="me1">equalsIgnor
eCase</span><span class="br0">&#40;</span><span class="st0">&quot;q&quot;</span>
<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&
#123;</span><br/>
<a href="http://www.google.com/search?hl=en&amp
;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class=
"kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</
span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n<
/span>Thanks for playing&quot;</span><span class="br0">&#41;</span><span class="
sy0">;</span><br/>
<span class="kw1">return</span><span class="sy
0">;</span><br/>
<span class="br0">&#125;</span><br/>&#160;<br/>
<span class="kw1">if</span> <span class="br0">&#40;</span>line.<span clas
s="me1">equalsIgnoreCase</span><span class="br0">&#40;</span><span class="st0">&
quot;s&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span><br/>
<a href="http://www.google.c
om/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20
Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span cl
ass="me1">println</span><span class="br0">&#40;</span>solution<span class="br0">
&#41;</span><span class="sy0">;</span><br/>
digits <span class="s
y0">=</span> getSolvableDigits<span class="br0">&#40;</span><span class="br0">&#
41;</span><span class="sy0">;</span><br/>
<span class="kw1">conti
nue</span><span class="sy0">;</span><br/>
<span class="br0">&#125;</s
pan><br/>&#160;<br/>
<span class="kw4">char</span><span class="br0">&
#91;</span><span class="br0">&#93;</span> entry <span class="sy0">=</span> line.
<span class="me1">replaceAll</span><span class="br0">&#40;</span><span class="st
0">&quot;[^*+-/)(<span class="es0">\\</span>d]&quot;</span>, <span class="st0">&
quot;&quot;</span><span class="br0">&#41;</span>.<span class="me1">toCharArray</
span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy
0">;</span><br/>&#160;<br/>
<span class="kw1">try</span> <span class=
"br0">&#123;</span><br/>
validate<span class="br0">&#40;</span>en
try<span class="br0">&#41;</span><span class="sy0">;</span><br/>&#160;<br/>
<span class="kw1">if</span> <span class="br0">&#40;</span>evaluate<sp
an class="br0">&#40;</span>infixToPostfix<span class="br0">&#40;</span>entry<spa
n class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;<
/span> <span class="br0">&#123;</span><br/>
<a href="http://w
ww.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%2
0Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</spa
n>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st
0">&quot;<span class="es0">\n</span>Correct! Want to try another? &quot;</span><
span class="br0">&#41;</span><span class="sy0">;</span><br/>
digits <span class="sy0">=</span> getSolvableDigits<span class="br0">&#40;</span
><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<s
pan class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#
123;</span><br/>
<a href="http://www.google.com/search?hl=en&
amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span cla
ss="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">printl
n</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">
\n</span>Not correct.&quot;</span><span class="br0">&#41;</span><span class="sy0

">;</span><br/>
<span class="br0">&#125;</span><br/>&#160;<br/>
<span class="br0">&#125;</span> <span class="kw1">catch</span> <span c
lass="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinur
l%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">E
xception</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</sp
an><br/>
<a href="http://www.google.com/search?hl=en&amp;q=allinu
rl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Sys
tem</span></a>.<span class="me1">out</span>.<span class="me1">printf</span><span
class="br0">&#40;</span><span class="st0">&quot;%n%s Try again.%n&quot;</span>,
e.<span class="me1">getMessage</span><span class="br0">&#40;</span><span class=
"br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>
<span class="br0">&#125;<
/span><br/>
<span class="br0">&#125;</span><br/>&#160;<br/>
<span class="k
w4">void</span> validate<span class="br0">&#40;</span><span class="kw4">char</sp
an><span class="br0">&#91;</span><span class="br0">&#93;</span> input<span class
="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.c
om/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling
%20Lucky"><span class="kw3">Exception</span></a> <span class="br0">&#123;</span>
<br/>
<span class="kw4">int</span> total1 <span class="sy0">=</span> <spa
n class="nu0">0</span>, parens <span class="sy0">=</span> <span class="nu0">0</s
pan>, opsCount <span class="sy0">=</span> <span class="nu0">0</span><span class=
"sy0">;</span><br/>&#160;<br/>
<span class="kw1">for</span> <span class="
br0">&#40;</span><span class="kw4">char</span> c <span class="sy0">:</span> inpu
t<span class="br0">&#41;</span> <span class="br0">&#123;</span><br/>
<span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.go
ogle.com/search?hl=en&amp;q=allinurl%3Acharacter+java.sun.com&amp;btnI=I%27m%20F
eeling%20Lucky"><span class="kw3">Character</span></a>.<span class="me1">isDigit
</span><span class="br0">&#40;</span>c<span class="br0">&#41;</span><span class=
"br0">&#41;</span><br/>
total1 <span class="sy0">+=</span> <span
class="nu0">1</span> <span class="sy0">&lt;&lt;</span> <span class="br0">&#40;</
span>c <span class="sy0">-</span> <span class="st0">'0'</span><span class="br0">
&#41;</span> <span class="sy0">*</span> <span class="nu0">4</span><span class="s
y0">;</span><br/>
<span class="kw1">else</span> <span class="kw1">if<
/span> <span class="br0">&#40;</span>c <span class="sy0">==</span> <span class="
st0">'('</span><span class="br0">&#41;</span><br/>
parens<span cl
ass="sy0">++;</span><br/>
<span class="kw1">else</span> <span class="
kw1">if</span> <span class="br0">&#40;</span>c <span class="sy0">==</span> <span
class="st0">')'</span><span class="br0">&#41;</span><br/>
parens
<span class="sy0">--;</span><br/>
<span class="kw1">else</span> <span
class="kw1">if</span> <span class="br0">&#40;</span>ops.<span class="me1">index
Of</span><span class="br0">&#40;</span>c<span class="br0">&#41;</span> <span cla
ss="sy0">!=</span> <span class="sy0">-</span><span class="nu0">1</span><span cla
ss="br0">&#41;</span><br/>
opsCount<span class="sy0">++;</span><b
r/>
<span class="kw1">if</span> <span class="br0">&#40;</span>parens
<span class="sy0">&lt;</span> <span class="nu0">0</span><span class="br0">&#41;<
/span><br/>
<span class="kw1">throw</span> <span class="kw1">new<
/span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+ja
va.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span><
/a><span class="br0">&#40;</span><span class="st0">&quot;Parentheses mismatch.&q
uot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>&#160;<br/>
<span class="kw1">if</spa
n> <span class="br0">&#40;</span>parens <span class="sy0">!=</span> <span class=
"nu0">0</span><span class="br0">&#41;</span><br/>
<span class="kw1">t
hrow</span> <span class="kw1">new</span> <a href="http://www.google.com/search?h
l=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><
span class="kw3">Exception</span></a><span class="br0">&#40;</span><span class="
st0">&quot;Parentheses mismatch.&quot;</span><span class="br0">&#41;</span><span
class="sy0">;</span><br/>&#160;<br/>
<span class="kw1">if</span> <span c
lass="br0">&#40;</span>opsCount <span class="sy0">!=</span> <span class="nu0">3<
/span><span class="br0">&#41;</span><br/>
<span class="kw1">throw</sp

an> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp


;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span cla
ss="kw3">Exception</span></a><span class="br0">&#40;</span><span class="st0">&qu
ot;Wrong number of operators.&quot;</span><span class="br0">&#41;</span><span cl
ass="sy0">;</span><br/>&#160;<br/>
<span class="kw4">int</span> total2 <s
pan class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br
/>
<span class="kw1">for</span> <span class="br0">&#40;</span><span class
="kw4">int</span> d <span class="sy0">:</span> digits<span class="br0">&#41;</sp
an><br/>
total2 <span class="sy0">+=</span> <span class="nu0">1</span
> <span class="sy0">&lt;&lt;</span> d <span class="sy0">*</span> <span class="nu
0">4</span><span class="sy0">;</span><br/>&#160;<br/>
<span class="kw1">i
f</span> <span class="br0">&#40;</span>total1 <span class="sy0">!=</span> total2
<span class="br0">&#41;</span><br/>
<span class="kw1">throw</span> <s
pan class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=all
inurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw
3">Exception</span></a><span class="br0">&#40;</span><span class="st0">&quot;Not
the same digits.&quot;</span><span class="br0">&#41;</span><span class="sy0">;<
/span><br/>
<span class="br0">&#125;</span><br/>&#160;<br/>
<span class="k
w4">boolean</span> evaluate<span class="br0">&#40;</span><span class="kw4">char<
/span><span class="br0">&#91;</span><span class="br0">&#93;</span> line<span cla
ss="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google
.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeli
ng%20Lucky"><span class="kw3">Exception</span></a> <span class="br0">&#123;</spa
n><br/>
Stack<span class="sy0">&lt;</span>Float<span class="sy0">&gt;</sp
an> s <span class="sy0">=</span> <span class="kw1">new</span> Stack<span class="
sy0">&lt;&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="sy0">;</span><br/>
<span class="kw1">try</span> <span class=
"br0">&#123;</span><br/>
<span class="kw1">for</span> <span class="br
0">&#40;</span><span class="kw4">char</span> c <span class="sy0">:</span> line<s
pan class="br0">&#41;</span> <span class="br0">&#123;</span><br/>
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">'0'
</span> <span class="sy0">&lt;=</span> c <span class="sy0">&amp;&amp;</span> c <
span class="sy0">&lt;=</span> <span class="st0">'9'</span><span class="br0">&#41
;</span><br/>
s.<span class="me1">push</span><span class="br0
">&#40;</span><span class="br0">&#40;</span><span class="kw4">float</span><span
class="br0">&#41;</span> c <span class="sy0">-</span> <span class="st0">'0'</spa
n><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<
span class="kw1">else</span><br/>
s.<span class="me1">push</s
pan><span class="br0">&#40;</span>applyOperator<span class="br0">&#40;</span>s.<
span class="me1">pop</span><span class="br0">&#40;</span><span class="br0">&#41;
</span>, s.<span class="me1">pop</span><span class="br0">&#40;</span><span class
="br0">&#41;</span>, c<span class="br0">&#41;</span><span class="br0">&#41;</spa
n><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/
>
<span class="br0">&#125;</span> <span class="kw1">catch</span> <span cl
ass="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl
%3Aemptystackexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span clas
s="kw3">EmptyStackException</span></a> e<span class="br0">&#41;</span> <span cla
ss="br0">&#123;</span><br/>
<span class="kw1">throw</span> <span clas
s="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3A
exception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Excep
tion</span></a><span class="br0">&#40;</span><span class="st0">&quot;Invalid ent
ry.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>
<span class="kw1">return</span>
<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q
=allinurl%3Amath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3
">Math</span></a>.<span class="me1">abs</span><span class="br0">&#40;</span><spa
n class="nu0">24</span> <span class="sy0">-</span> s.<span class="me1">peek</spa
n><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">
&#41;</span> <span class="sy0">&lt;</span> 0.001F<span class="br0">&#41;</span><
span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>&#160;<br/

>
<span class="kw4">float</span> applyOperator<span class="br0">&#40;</span><
span class="kw4">float</span> a, <span class="kw4">float</span> b, <span class="
kw4">char</span> c<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<br/>
<span class="kw1">switch</span> <span class="br0">&#40;</span>c<spa
n class="br0">&#41;</span> <span class="br0">&#123;</span><br/>
<span
class="kw1">case</span> <span class="st0">'+'</span><span class="sy0">:</span><
br/>
<span class="kw1">return</span> a <span class="sy0">+</span>
b<span class="sy0">;</span><br/>
<span class="kw1">case</span> <span
class="st0">'-'</span><span class="sy0">:</span><br/>
<span clas
s="kw1">return</span> b <span class="sy0">-</span> a<span class="sy0">;</span><b
r/>
<span class="kw1">case</span> <span class="st0">'*'</span><span c
lass="sy0">:</span><br/>
<span class="kw1">return</span> a <span
class="sy0">*</span> b<span class="sy0">;</span><br/>
<span class="kw
1">case</span> <span class="st0">'/'</span><span class="sy0">:</span><br/>
<span class="kw1">return</span> b <span class="sy0">/</span> a<span cl
ass="sy0">;</span><br/>
<span class="kw1">default</span><span class="
sy0">:</span><br/>
<span class="kw1">return</span> <a href="http:
//www.google.com/search?hl=en&amp;q=allinurl%3Afloat+java.sun.com&amp;btnI=I%27m
%20Feeling%20Lucky"><span class="kw3">Float</span></a>.<span class="me1">NaN</sp
an><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>
<span class="br0">&#125;</span><br/>&#160;<br/>
List<span class="sy0">&lt;<
/span>Integer<span class="sy0">&gt;</span> randomDigits<span class="br0">&#40;</
span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br/>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arandom+java.sun.com
&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Random</span></a> r <span c
lass="sy0">=</span> <span class="kw1">new</span> <a href="http://www.google.com/
search?hl=en&amp;q=allinurl%3Arandom+java.sun.com&amp;btnI=I%27m%20Feeling%20Luc
ky"><span class="kw3">Random</span></a><span class="br0">&#40;</span><span class
="br0">&#41;</span><span class="sy0">;</span><br/>
List<span class="sy0">
&lt;</span>Integer<span class="sy0">&gt;</span> result <span class="sy0">=</span
> <span class="kw1">new</span> ArrayList<span class="sy0">&lt;&gt;</span><span c
lass="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span><
span class="sy0">;</span><br/>
<span class="kw1">for</span> <span class="
br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span
class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span>
<span class="nu0">4</span><span class="sy0">;</span> i<span class="sy0">++</span
><span class="br0">&#41;</span><br/>
result.<span class="me1">add</sp
an><span class="br0">&#40;</span>r.<span class="me1">nextInt</span><span class="
br0">&#40;</span><span class="nu0">9</span><span class="br0">&#41;</span> <span
class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#41;</span><sp
an class="sy0">;</span><br/>
<span class="kw1">return</span> result<span
class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>&#160;<br/>
List<span class="sy0">&lt;</span>Integer<span class="sy0">&gt;</span> getSolvabl
eDigits<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class=
"br0">&#123;</span><br/>
List<span class="sy0">&lt;</span>Integer<span cl
ass="sy0">&gt;</span> result<span class="sy0">;</span><br/>
<span class="
kw1">do</span> <span class="br0">&#123;</span><br/>
result <span clas
s="sy0">=</span> randomDigits<span class="br0">&#40;</span><span class="br0">&#4
1;</span><span class="sy0">;</span><br/>
<span class="br0">&#125;</span>
<span class="kw1">while</span> <span class="br0">&#40;</span><span class="sy0">!
</span>isSolvable<span class="br0">&#40;</span>result<span class="br0">&#41;</sp
an><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<span cl
ass="kw1">return</span> result<span class="sy0">;</span><br/>
<span class="br
0">&#125;</span><br/>&#160;<br/>
<span class="kw4">boolean</span> isSolvable<
span class="br0">&#40;</span>List<span class="sy0">&lt;</span>Integer<span class
="sy0">&gt;</span> digits<span class="br0">&#41;</span> <span class="br0">&#123;
</span><br/>
Set<span class="sy0">&lt;</span>List<span class="sy0">&lt;</
span>Integer<span class="sy0">&gt;&gt;</span> dPerms <span class="sy0">=</span>
<span class="kw1">new</span> HashSet<span class="sy0">&lt;&gt;</span><span class
="br0">&#40;</span><span class="nu0">4</span> <span class="sy0">*</span> <span c

lass="nu0">3</span> <span class="sy0">*</span> <span class="nu0">2</span><span c


lass="br0">&#41;</span><span class="sy0">;</span><br/>
permute<span class
="br0">&#40;</span>digits, dPerms, <span class="nu0">0</span><span class="br0">&
#41;</span><span class="sy0">;</span><br/>&#160;<br/>
<span class="kw4">i
nt</span> total <span class="sy0">=</span> <span class="nu0">4</span> <span clas
s="sy0">*</span> <span class="nu0">4</span> <span class="sy0">*</span> <span cla
ss="nu0">4</span><span class="sy0">;</span><br/>
List<span class="sy0">&l
t;</span>List<span class="sy0">&lt;</span>Integer<span class="sy0">&gt;&gt;</spa
n> oPerms <span class="sy0">=</span> <span class="kw1">new</span> ArrayList<span
class="sy0">&lt;&gt;</span><span class="br0">&#40;</span>total<span class="br0"
>&#41;</span><span class="sy0">;</span><br/>
permuteOperators<span class=
"br0">&#40;</span>oPerms, <span class="nu0">4</span>, total<span class="br0">&#4
1;</span><span class="sy0">;</span><br/>&#160;<br/>
StringBuilder sb <spa
n class="sy0">=</span> <span class="kw1">new</span> StringBuilder<span class="br
0">&#40;</span><span class="nu0">4</span> <span class="sy0">+</span> <span class
="nu0">3</span><span class="br0">&#41;</span><span class="sy0">;</span><br/>&#16
0;<br/>
<span class="kw1">for</span> <span class="br0">&#40;</span><a hre
f="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;b
tnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pattern <span c
lass="sy0">:</span> patterns<span class="br0">&#41;</span> <span class="br0">&#1
23;</span><br/>
<span class="kw4">char</span><span class="br0">&#91;<
/span><span class="br0">&#93;</span> patternChars <span class="sy0">=</span> pat
tern.<span class="me1">toCharArray</span><span class="br0">&#40;</span><span cla
ss="br0">&#41;</span><span class="sy0">;</span><br/>&#160;<br/>
<span
class="kw1">for</span> <span class="br0">&#40;</span>List<span class="sy0">&lt;
</span>Integer<span class="sy0">&gt;</span> dig <span class="sy0">:</span> dPerm
s<span class="br0">&#41;</span> <span class="br0">&#123;</span><br/>
<span class="kw1">for</span> <span class="br0">&#40;</span>List<span class="
sy0">&lt;</span>Integer<span class="sy0">&gt;</span> opr <span class="sy0">:</sp
an> oPerms<span class="br0">&#41;</span> <span class="br0">&#123;</span><br/>&#1
60;<br/>
<span class="kw4">int</span> i <span class="sy0">=</
span> <span class="nu0">0</span>, j <span class="sy0">=</span> <span class="nu0"
>0</span><span class="sy0">;</span><br/>
<span class="kw1">fo
r</span> <span class="br0">&#40;</span><span class="kw4">char</span> c <span cla
ss="sy0">:</span> patternChars<span class="br0">&#41;</span> <span class="br0">&
#123;</span><br/>
<span class="kw1">if</span> <span class
="br0">&#40;</span>c <span class="sy0">==</span> <span class="st0">'n'</span><sp
an class="br0">&#41;</span><br/>
sb.<span class="me1"
>append</span><span class="br0">&#40;</span>dig.<span class="me1">get</span><spa
n class="br0">&#40;</span>i<span class="sy0">++</span><span class="br0">&#41;</s
pan><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<span class="kw1">else</span><br/>
sb.<span
class="me1">append</span><span class="br0">&#40;</span>ops.<span class="me1">cha
rAt</span><span class="br0">&#40;</span>opr.<span class="me1">get</span><span cl
ass="br0">&#40;</span>j<span class="sy0">++</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;<
/span><br/>
<span class="br0">&#125;</span><br/>&#160;<br/>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3As
tring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</s
pan></a> candidate <span class="sy0">=</span> sb.<span class="me1">toString</spa
n><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">
;</span><br/>
<span class="kw1">try</span> <span class="br0">
&#123;</span><br/>
<span class="kw1">if</span> <span clas
s="br0">&#40;</span>evaluate<span class="br0">&#40;</span>candidate.<span class=
"me1">toCharArray</span><span class="br0">&#40;</span><span class="br0">&#41;</s
pan><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br
0">&#123;</span><br/>
solution <span class="sy0">=</s
pan> postfixToInfix<span class="br0">&#40;</span>candidate<span class="br0">&#41
;</span><span class="sy0">;</span><br/>
<span class="
kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span><br/>

<span class="br0">&#125;</span><br/>
<
span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">
&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexcepti
on+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</s
pan></a> ignored<span class="br0">&#41;</span> <span class="br0">&#123;</span><b
r/>
<span class="br0">&#125;</span><br/>
s
b.<span class="me1">setLength</span><span class="br0">&#40;</span><span class="n
u0">0</span><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>
<span class="br0">&#125
;</span><br/>
<span class="br0">&#125;</span><br/>
<span class="kw
1">return</span> <span class="kw2">false</span><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>&#160;<br/>
<a href="http://www.google.
com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%2
0Lucky"><span class="kw3">String</span></a> postfixToInfix<span class="br0">&#40
;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java
.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> p
ostfix<span class="br0">&#41;</span> <span class="br0">&#123;</span><br/>
<span class="kw1">class</span> Expression <span class="br0">&#123;</span><br/>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+j
ava.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a
> op, ex<span class="sy0">;</span><br/>
<span class="kw4">int</span>
prec <span class="sy0">=</span> <span class="nu0">3</span><span class="sy0">;</s
pan><br/>&#160;<br/>
Expression<span class="br0">&#40;</span><a href=
"http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btn
I=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> e<span class="br0
">&#41;</span> <span class="br0">&#123;</span><br/>
ex <span clas
s="sy0">=</span> e<span class="sy0">;</span><br/>
<span class="br0">&
#125;</span><br/>&#160;<br/>
Expression<span class="br0">&#40;</span>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com
&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> e1, <a hr
ef="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;
btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> e2, <a href="h
ttp://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=
I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> o<span class="br0">
&#41;</span> <span class="br0">&#123;</span><br/>
ex <span class=
"sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astri
ng+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span
></a>.<span class="me1">format</span><span class="br0">&#40;</span><span class="
st0">&quot;%s&#160;%s&#160;%s&quot;</span>, e1, o, e2<span class="br0">&#41;</sp
an><span class="sy0">;</span><br/>
op <span class="sy0">=</span>
o<span class="sy0">;</span><br/>
prec <span class="sy0">=</span>
ops.<span class="me1">indexOf</span><span class="br0">&#40;</span>o<span class="
br0">&#41;</span> <span class="sy0">/</span> <span class="nu0">2</span><span cla
ss="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>
<s
pan class="br0">&#125;</span><br/>&#160;<br/>
Stack<span class="sy0">&lt;
</span>Expression<span class="sy0">&gt;</span> expr <span class="sy0">=</span> <
span class="kw1">new</span> Stack<span class="sy0">&lt;&gt;</span><span class="b
r0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br/>&#1
60;<br/>
<span class="kw1">for</span> <span class="br0">&#40;</span><span
class="kw4">char</span> c <span class="sy0">:</span> postfix.<span class="me1">
toCharArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span><s
pan class="br0">&#41;</span> <span class="br0">&#123;</span><br/>
<sp
an class="kw4">int</span> idx <span class="sy0">=</span> ops.<span class="me1">i
ndexOf</span><span class="br0">&#40;</span>c<span class="br0">&#41;</span><span
class="sy0">;</span><br/>
<span class="kw1">if</span> <span class="br
0">&#40;</span>idx <span class="sy0">!=</span> <span class="sy0">-</span><span c
lass="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span
><br/>&#160;<br/>
Expression r <span class="sy0">=</span> expr.<s
pan class="me1">pop</span><span class="br0">&#40;</span><span class="br0">&#41;<
/span><span class="sy0">;</span><br/>
Expression l <span class="s

y0">=</span> expr.<span class="me1">pop</span><span class="br0">&#40;</span><spa


n class="br0">&#41;</span><span class="sy0">;</span><br/>&#160;<br/>
<span class="kw4">int</span> opPrec <span class="sy0">=</span> idx <span cla
ss="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span><br/>&#160
;<br/>
<span class="kw1">if</span> <span class="br0">&#40;</span>
l.<span class="me1">prec</span> <span class="sy0">&lt;</span> opPrec<span class=
"br0">&#41;</span><br/>
l.<span class="me1">ex</span> <span c
lass="sy0">=</span> <span class="st0">'('</span> <span class="sy0">+</span> l.<s
pan class="me1">ex</span> <span class="sy0">+</span> <span class="st0">')'</span
><span class="sy0">;</span><br/>&#160;<br/>
<span class="kw1">if<
/span> <span class="br0">&#40;</span>r.<span class="me1">prec</span> <span class
="sy0">&lt;=</span> opPrec<span class="br0">&#41;</span><br/>
r.<span class="me1">ex</span> <span class="sy0">=</span> <span class="st0">'('<
/span> <span class="sy0">+</span> r.<span class="me1">ex</span> <span class="sy0
">+</span> <span class="st0">')'</span><span class="sy0">;</span><br/>&#160;<br/
>
expr.<span class="me1">push</span><span class="br0">&#40;</span
><span class="kw1">new</span> Expression<span class="br0">&#40;</span>l.<span cl
ass="me1">ex</span>, r.<span class="me1">ex</span>, <span class="st0">&quot;&quo
t;</span> <span class="sy0">+</span> c<span class="br0">&#41;</span><span class=
"br0">&#41;</span><span class="sy0">;</span><br/>
<span class="br0">&
#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br/>
expr.<span class="me1">push</span><span class="br0">&#40;</span><
span class="kw1">new</span> Expression<span class="br0">&#40;</span><span class=
"st0">&quot;&quot;</span> <span class="sy0">+</span> c<span class="br0">&#41;</s
pan><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<sp
an class="br0">&#125;</span><br/>
<span class="br0">&#125;</span><br/>
<span class="kw1">return</span> expr.<span class="me1">peek</span><span cla
ss="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">ex</span><
span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>&#160;<br/
>
<span class="kw4">char</span><span class="br0">&#91;</span><span class="br0
">&#93;</span> infixToPostfix<span class="br0">&#40;</span><span class="kw4">cha
r</span><span class="br0">&#91;</span><span class="br0">&#93;</span> infix<span
class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.goo
gle.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Fe
eling%20Lucky"><span class="kw3">Exception</span></a> <span class="br0">&#123;</
span><br/>
StringBuilder sb <span class="sy0">=</span> <span class="kw1">
new</span> StringBuilder<span class="br0">&#40;</span><span class="br0">&#41;</s
pan><span class="sy0">;</span><br/>
Stack<span class="sy0">&lt;</span>Int
eger<span class="sy0">&gt;</span> s <span class="sy0">=</span> <span class="kw1"
>new</span> Stack<span class="sy0">&lt;&gt;</span><span class="br0">&#40;</span>
<span class="br0">&#41;</span><span class="sy0">;</span><br/>
<span class
="kw1">try</span> <span class="br0">&#123;</span><br/>
<span class="k
w1">for</span> <span class="br0">&#40;</span><span class="kw4">char</span> c <sp
an class="sy0">:</span> infix<span class="br0">&#41;</span> <span class="br0">&#
123;</span><br/>
<span class="kw4">int</span> idx <span class="sy
0">=</span> ops.<span class="me1">indexOf</span><span class="br0">&#40;</span>c<
span class="br0">&#41;</span><span class="sy0">;</span><br/>
<spa
n class="kw1">if</span> <span class="br0">&#40;</span>idx <span class="sy0">!=</
span> <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41
;</span> <span class="br0">&#123;</span><br/>
<span class="kw
1">if</span> <span class="br0">&#40;</span>s.<span class="me1">isEmpty</span><sp
an class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;
</span><br/>
s.<span class="me1">push</span><span class="
br0">&#40;</span>idx<span class="br0">&#41;</span><span class="sy0">;</span><br/
>
<span class="kw1">else</span> <span class="br0">&#123;</spa
n><br/>
<span class="kw1">while</span> <span class="br0">
&#40;</span><span class="sy0">!</span>s.<span class="me1">isEmpty</span><span cl
ass="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</spa
n> <span class="br0">&#123;</span><br/>
<span class="
kw4">int</span> prec2 <span class="sy0">=</span> s.<span class="me1">peek</span>

<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">/


</span> <span class="nu0">2</span><span class="sy0">;</span><br/>
<span class="kw4">int</span> prec1 <span class="sy0">=</span> idx <
span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span><b
r/>
<span class="kw1">if</span> <span class="br0">&#4
0;</span>prec2 <span class="sy0">&gt;=</span> prec1<span class="br0">&#41;</span
><br/>
sb.<span class="me1">append</span><span cl
ass="br0">&#40;</span>ops.<span class="me1">charAt</span><span class="br0">&#40;
</span>s.<span class="me1">pop</span><span class="br0">&#40;</span><span class="
br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><sp
an class="sy0">;</span><br/>
<span class="kw1">else</
span><br/>
<span class="kw1">break</span><span cl
ass="sy0">;</span><br/>
<span class="br0">&#125;</span><b
r/>
s.<span class="me1">push</span><span class="br0">&#40
;</span>idx<span class="br0">&#41;</span><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>
<span class="br0
">&#125;</span> <span class="kw1">else</span> <span class="kw1">if</span> <span
class="br0">&#40;</span>c <span class="sy0">==</span> <span class="st0">'('</spa
n><span class="br0">&#41;</span> <span class="br0">&#123;</span><br/>
s.<span class="me1">push</span><span class="br0">&#40;</span><span clas
s="sy0">-</span><span class="nu0">2</span><span class="br0">&#41;</span><span cl
ass="sy0">;</span><br/>
<span class="br0">&#125;</span> <span cla
ss="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>c
<span class="sy0">==</span> <span class="st0">')'</span><span class="br0">&#41;
</span> <span class="br0">&#123;</span><br/>
<span class="kw1
">while</span> <span class="br0">&#40;</span>s.<span class="me1">peek</span><spa
n class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</s
pan> <span class="sy0">-</span><span class="nu0">2</span><span class="br0">&#41;
</span><br/>
sb.<span class="me1">append</span><span clas
s="br0">&#40;</span>ops.<span class="me1">charAt</span><span class="br0">&#40;</
span>s.<span class="me1">pop</span><span class="br0">&#40;</span><span class="br
0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span
class="sy0">;</span><br/>
s.<span class="me1">pop</span><spa
n class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</spa
n><br/>
<span class="br0">&#125;</span> <span class="kw1">else</s
pan> <span class="br0">&#123;</span><br/>
sb.<span class="me1
">append</span><span class="br0">&#40;</span>c<span class="br0">&#41;</span><spa
n class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>
<span class="br0">&#125;</span><br/>
<span class="kw1">whi
le</span> <span class="br0">&#40;</span><span class="sy0">!</span>s.<span class=
"me1">isEmpty</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span><br/>
sb.<span class="me1">append</
span><span class="br0">&#40;</span>ops.<span class="me1">charAt</span><span clas
s="br0">&#40;</span>s.<span class="me1">pop</span><span class="br0">&#40;</span>
<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#
41;</span><span class="sy0">;</span><br/>&#160;<br/>
<span class="br0">&#
125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span><a href
="http://www.google.com/search?hl=en&amp;q=allinurl%3Aemptystackexception+java.s
un.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">EmptyStackException</
span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span><br/>
<span class="kw1">throw</span> <span class="kw1">new</span> <a href="h
ttp://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;bt
nI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a><span class="b
r0">&#40;</span><span class="st0">&quot;Invalid entry.&quot;</span><span class="
br0">&#41;</span><span class="sy0">;</span><br/>
<span class="br0">&#125;
</span><br/>
<span class="kw1">return</span> sb.<span class="me1">toStrin
g</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class
="me1">toCharArray</span><span class="br0">&#40;</span><span class="br0">&#41;</
span><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>&#16
0;<br/>
<span class="kw4">void</span> permute<span class="br0">&#40;</span>Li

st<span class="sy0">&lt;</span>Integer<span class="sy0">&gt;</span> lst, Set<spa


n class="sy0">&lt;</span>List<span class="sy0">&lt;</span>Integer<span class="sy
0">&gt;&gt;</span> res, <span class="kw4">int</span> k<span class="br0">&#41;</s
pan> <span class="br0">&#123;</span><br/>
<span class="kw1">for</span> <s
pan class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</
span> k<span class="sy0">;</span> i <span class="sy0">&lt;</span> lst.<span clas
s="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><
span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</s
pan> <span class="br0">&#123;</span><br/>
<a href="http://www.google.
com/search?hl=en&amp;q=allinurl%3Acollections+java.sun.com&amp;btnI=I%27m%20Feel
ing%20Lucky"><span class="kw3">Collections</span></a>.<span class="me1">swap</sp
an><span class="br0">&#40;</span>lst, i, k<span class="br0">&#41;</span><span cl
ass="sy0">;</span><br/>
permute<span class="br0">&#40;</span>lst, res
, k <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#41;
</span><span class="sy0">;</span><br/>
<a href="http://www.google.com
/search?hl=en&amp;q=allinurl%3Acollections+java.sun.com&amp;btnI=I%27m%20Feeling
%20Lucky"><span class="kw3">Collections</span></a>.<span class="me1">swap</span>
<span class="br0">&#40;</span>lst, k, i<span class="br0">&#41;</span><span class
="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>
<span cl
ass="kw1">if</span> <span class="br0">&#40;</span>k <span class="sy0">==</span>
lst.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0"
>&#41;</span><span class="br0">&#41;</span><br/>
res.<span class="me1
">add</span><span class="br0">&#40;</span><span class="kw1">new</span> ArrayList
<span class="sy0">&lt;&gt;</span><span class="br0">&#40;</span>lst<span class="b
r0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br/>
<span class="br0">&#125;</span><br/>&#160;<br/>
<span class="kw4">void</span
> permuteOperators<span class="br0">&#40;</span>List<span class="sy0">&lt;</span
>List<span class="sy0">&lt;</span>Integer<span class="sy0">&gt;&gt;</span> res,
<span class="kw4">int</span> n, <span class="kw4">int</span> total<span class="b
r0">&#41;</span> <span class="br0">&#123;</span><br/>
<span class="kw1">f
or</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span cla
ss="sy0">=</span> <span class="nu0">0</span>, npow <span class="sy0">=</span> n
<span class="sy0">*</span> n<span class="sy0">;</span> i <span class="sy0">&lt;<
/span> total<span class="sy0">;</span> i<span class="sy0">++</span><span class="
br0">&#41;</span><br/>
res.<span class="me1">add</span><span class="b
r0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aarr
ays+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Arrays</spa
n></a>.<span class="me1">asList</span><span class="br0">&#40;</span><span class=
"br0">&#40;</span>i <span class="sy0">/</span> npow<span class="br0">&#41;</span
>, <span class="br0">&#40;</span>i <span class="sy0">%</span> npow<span class="b
r0">&#41;</span> <span class="sy0">/</span> n, i <span class="sy0">%</span> n<sp
an class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</sp
an><br/>
<span class="br0">&#125;</span><br/><span class="br0">&#125;</span><
/pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>Make 24 using these digits: [5, 7, 1, 8]
(Enter 'q' to quit, 's' for a solution)
&gt; (8-5) * (7+1)
Correct! Want to try another?
Make 24 using these digits: [3, 9, 2, 9]
(Enter 'q' to quit, 's' for a solution)
&gt; (3*2) + 9 + 9
Correct! Want to try another?
Make 24 using these digits: [4, 4, 8, 5]
(Enter 'q' to quit, 's' for a solution)
&gt; s

4 * 5 - (4 - 8)
Make 24 using these digits: [2, 5, 9, 1]
(Enter 'q' to quit, 's' for a solution)
&gt; 2+5+9+1
Not correct.
Make 24 using these digits: [2, 5, 9, 1]
(Enter 'q' to quit, 's' for a solution)
&gt; 2 * 9 + 5 + 1
Correct! Want to try another?
Make 24 using these digits: [8, 4, 3, 1]
(Enter 'q' to quit, 's' for a solution)
&gt; s
(8 + 4) * (3 - 1)
Make 24 using these digits: [9, 4, 5, 6]
(Enter 'q' to quit, 's' for a solution)
&gt; (9 +4) * 2 - 2
Not the same digits. Try again.
Make 24 using these digits: [9, 4, 5, 6]
(Enter 'q' to quit, 's' for a solution)
&gt; q
Thanks for playing</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=23" title="Edit section: JavaScript">edit</a>]</span> <spa
n class="mw-headline" id="JavaScript"><a href="/wiki/Category:JavaScript" title=
"Category:JavaScript">JavaScript</a></span></h2>
<p>This is a translation of the C code.
</p>
<pre class="javascript highlighted_source"><span class="kw1">var</span> ar<span
class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#93;</span>
<span class="sy0">,</span>order<span class="sy0">=</span><span class="br0">&#91;
</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">1</
span><span class="sy0">,</span><span class="nu0">2</span><span class="br0">&#93;
</span><span class="sy0">,</span>op<span class="sy0">=</span><span class="br0">&
#91;</span><span class="br0">&#93;</span><span class="sy0">,</span>val<span clas
s="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#93;</span><spa
n class="sy0">;</span><br/><span class="kw1">var</span> NOVAL<span class="sy0">=
</span><span class="nu0">9999</span><span class="sy0">,</span>oper<span class="s
y0">=</span><span class="st0">&quot;+-*/&quot;</span><span class="sy0">,</span>o
ut<span class="sy0">;</span><br/>&#160;<br/><span class="kw1">function</span> rn
d<span class="br0">&#40;</span>n<span class="br0">&#41;</span><span class="br0">
&#123;</span><span class="kw1">return</span> <span class="kw4">Math</span>.<span
class="me1">floor</span><span class="br0">&#40;</span><span class="kw4">Math</s
pan>.<span class="me1">random</span><span class="br0">&#40;</span><span class="b
r0">&#41;</span><span class="sy0">*</span>n<span class="br0">&#41;</span><span c
lass="br0">&#125;</span><br/>&#160;<br/><span class="kw1">function</span> say<sp
an class="br0">&#40;</span>s<span class="br0">&#41;</span><span class="br0">&#12
3;</span><br/> <span class="kw1">try</span><span class="br0">&#123;</span>docume
nt.<span class="me1">write</span><span class="br0">&#40;</span>s<span class="sy0
">+</span><span class="st0">&quot;&lt;br&gt;&quot;</span><span class="br0">&#41;
</span><span class="br0">&#125;</span><br/> <span class="kw1">catch</span><span
class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;<
/span>WScript.<span class="me1">Echo</span><span class="br0">&#40;</span>s<span
class="br0">&#41;</span><span class="br0">&#125;</span><br/><span class="br0">&#
125;</span><br/>&#160;<br/><span class="kw1">function</span> getvalue<span class
="br0">&#40;</span>x<span class="sy0">,</span>dir<span class="br0">&#41;</span><
span class="br0">&#123;</span><br/> <span class="kw1">var</span> r<span class="s

y0">=</span>NOVAL<span class="sy0">;</span><br/> <span class="kw1">if</span><spa


n class="br0">&#40;</span>dir<span class="sy0">&gt;</span><span class="nu0">0</s
pan><span class="br0">&#41;</span><span class="sy0">++</span>x<span class="sy0">
;</span><br/> while<span class="br0">&#40;</span><span class="nu0">1</span><span
class="br0">&#41;</span><span class="br0">&#123;</span><br/> <span class="kw1"
>if</span><span class="br0">&#40;</span>val<span class="br0">&#91;</span>x<span
class="br0">&#93;</span><span class="sy0">!=</span>NOVAL<span class="br0">&#41;<
/span><span class="br0">&#123;</span><br/> r<span class="sy0">=</span>val<span
class="br0">&#91;</span>x<span class="br0">&#93;</span><span class="sy0">;</spa
n><br/> val<span class="br0">&#91;</span>x<span class="br0">&#93;</span><span
class="sy0">=</span>NOVAL<span class="sy0">;</span><br/> <span class="kw1">bre
ak</span><span class="sy0">;</span><br/> <span class="br0">&#125;</span><br/>
x<span class="sy0">+=</span>dir<span class="sy0">;</span><br/> <span class="br0"
>&#125;</span><br/> <span class="kw1">return</span> r<span class="sy0">*</span><
span class="nu0">1</span><span class="sy0">;</span><br/><span class="br0">&#125;
</span><br/>&#160;<br/><span class="kw1">function</span> calc<span class="br0">&
#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br/> <s
pan class="kw1">var</span> c<span class="sy0">=</span><span class="nu0">0</span>
<span class="sy0">,</span>l<span class="sy0">,</span>r<span class="sy0">,</span>
x<span class="sy0">;</span><br/> val<span class="sy0">=</span>ar.<span class="me
1">join</span><span class="br0">&#40;</span><span class="st0">'/'</span><span cl
ass="br0">&#41;</span>.<span class="me1">split</span><span class="br0">&#40;</sp
an><span class="st0">'/'</span><span class="br0">&#41;</span><span class="sy0">;
</span><br/> while<span class="br0">&#40;</span>c<span class="sy0">&lt;</span><s
pan class="nu0">3</span><span class="br0">&#41;</span><span class="br0">&#123;</
span><br/> x<span class="sy0">=</span>order<span class="br0">&#91;</span>c<span
class="br0">&#93;</span><span class="sy0">;</span><br/> l<span class="sy0">=</
span>getvalue<span class="br0">&#40;</span>x<span class="sy0">,-</span><span cla
ss="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br/>
r<span class="sy0">=</span>getvalue<span class="br0">&#40;</span>x<span class="s
y0">,</span><span class="nu0">1</span><span class="br0">&#41;</span><span class=
"sy0">;</span><br/> <span class="kw1">switch</span><span class="br0">&#40;</spa
n>op<span class="br0">&#91;</span>x<span class="br0">&#93;</span><span class="br
0">&#41;</span><span class="br0">&#123;</span><br/> <span class="kw1">case</sp
an> <span class="nu0">0</span><span class="sy0">:</span>val<span class="br0">&#9
1;</span>x<span class="br0">&#93;</span><span class="sy0">=</span>l<span class="
sy0">+</span>r<span class="sy0">;</span><span class="kw1">break</span><span clas
s="sy0">;</span><br/> <span class="kw1">case</span> <span class="nu0">1</span>
<span class="sy0">:</span>val<span class="br0">&#91;</span>x<span class="br0">&#
93;</span><span class="sy0">=</span>l<span class="sy0">-</span>r<span class="sy0
">;</span><span class="kw1">break</span><span class="sy0">;</span><br/> <span
class="kw1">case</span> <span class="nu0">2</span><span class="sy0">:</span>val<
span class="br0">&#91;</span>x<span class="br0">&#93;</span><span class="sy0">=<
/span>l<span class="sy0">*</span>r<span class="sy0">;</span><span class="kw1">br
eak</span><span class="sy0">;</span><br/> <span class="kw1">case</span> <span
class="nu0">3</span><span class="sy0">:</span><br/> <span class="kw1">if</span
><span class="br0">&#40;</span><span class="sy0">!</span>r<span class="sy0">||</
span>l<span class="sy0">%</span>r<span class="br0">&#41;</span><span class="kw1"
>return</span> <span class="nu0">0</span><span class="sy0">;</span><br/> val<s
pan class="br0">&#91;</span>x<span class="br0">&#93;</span><span class="sy0">=</
span>l<span class="sy0">/</span>r<span class="sy0">;</span><br/> <span class="b
r0">&#125;</span><br/> <span class="sy0">++</span>c<span class="sy0">;</span><b
r/> <span class="br0">&#125;</span><br/> <span class="kw1">return</span> getvalu
e<span class="br0">&#40;</span><span class="sy0">-</span><span class="nu0">1</sp
an><span class="sy0">,</span><span class="nu0">1</span><span class="br0">&#41;</
span><span class="sy0">;</span><br/><span class="br0">&#125;</span><br/>&#160;<b
r/><span class="kw1">function</span> shuffle<span class="br0">&#40;</span>s<span
class="sy0">,</span>n<span class="br0">&#41;</span><span class="br0">&#123;</sp
an><br/> <span class="kw1">var</span> x<span class="sy0">=</span>n<span class="s
y0">,</span>p<span class="sy0">=</span>eval<span class="br0">&#40;</span>s<span

class="br0">&#41;</span><span class="sy0">,</span>r<span class="sy0">,</span>t<s


pan class="sy0">;</span><br/> while<span class="br0">&#40;</span>x<span class="s
y0">--</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br/>
r<span class="sy0">=</span>rnd<span class="br0">&#40;</span>n<span class="br0">
&#41;</span><span class="sy0">;</span><br/> t<span class="sy0">=</span>p<span c
lass="br0">&#91;</span>x<span class="br0">&#93;</span><span class="sy0">;</span>
<br/> p<span class="br0">&#91;</span>x<span class="br0">&#93;</span><span class
="sy0">=</span>p<span class="br0">&#91;</span>r<span class="br0">&#93;</span><sp
an class="sy0">;</span><br/> p<span class="br0">&#91;</span>r<span class="br0">
&#93;</span><span class="sy0">=</span>t<span class="sy0">;</span><br/> <span cla
ss="br0">&#125;</span><br/><span class="br0">&#125;</span><br/>&#160;<br/><span
class="kw1">function</span> parenth<span class="br0">&#40;</span>n<span class="b
r0">&#41;</span><span class="br0">&#123;</span><br/> while<span class="br0">&#40
;</span>n<span class="sy0">&gt;</span><span class="nu0">0</span><span class="br0
">&#41;</span><span class="sy0">--</span>n<span class="sy0">,</span>out<span cla
ss="sy0">+=</span><span class="st0">'('</span><span class="sy0">;</span><br/> wh
ile<span class="br0">&#40;</span>n<span class="sy0">&lt;</span><span class="nu0"
>0</span><span class="br0">&#41;</span><span class="sy0">++</span>n<span class="
sy0">,</span>out<span class="sy0">+=</span><span class="st0">')'</span><span cla
ss="sy0">;</span><br/><span class="br0">&#125;</span><br/>&#160;<br/><span class
="kw1">function</span> getpriority<span class="br0">&#40;</span>x<span class="br
0">&#41;</span><span class="br0">&#123;</span><br/> <span class="kw1">for</span>
<span class="br0">&#40;</span><span class="kw1">var</span> z<span class="sy0">=<
/span><span class="nu0">3</span><span class="sy0">;</span>z<span class="sy0">--;
</span><span class="br0">&#41;</span><span class="kw1">if</span><span class="br0
">&#40;</span>order<span class="br0">&#91;</span>z<span class="br0">&#93;</span>
<span class="sy0">==</span>x<span class="br0">&#41;</span><span class="kw1">retu
rn</span> <span class="nu0">3</span><span class="sy0">-</span>z<span class="sy0"
>;</span><br/> <span class="kw1">return</span> <span class="nu0">0</span><span c
lass="sy0">;</span><br/><span class="br0">&#125;</span><br/>&#160;<br/><span cla
ss="kw1">function</span> showsolution<span class="br0">&#40;</span><span class="
br0">&#41;</span><span class="br0">&#123;</span><br/> <span class="kw1">var</spa
n> x<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</spa
n>p<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span
>lp<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span
>v<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span>
<br/> while<span class="br0">&#40;</span>x<span class="sy0">&lt;</span><span cla
ss="nu0">4</span><span class="br0">&#41;</span><span class="br0">&#123;</span><b
r/> <span class="kw1">if</span><span class="br0">&#40;</span>x<span class="sy0"
>&lt;</span><span class="nu0">3</span><span class="br0">&#41;</span><span class=
"br0">&#123;</span><br/> lp<span class="sy0">=</span>p<span class="sy0">;</spa
n><br/> p<span class="sy0">=</span>getpriority<span class="br0">&#40;</span>x<
span class="br0">&#41;</span><span class="sy0">;</span><br/> v<span class="sy0
">=</span>p<span class="sy0">-</span>lp<span class="sy0">;</span><br/> <span c
lass="kw1">if</span><span class="br0">&#40;</span>v<span class="sy0">&gt;</span>
<span class="nu0">0</span><span class="br0">&#41;</span>parenth<span class="br0"
>&#40;</span>v<span class="br0">&#41;</span><span class="sy0">;</span><br/> <sp
an class="br0">&#125;</span><br/> out<span class="sy0">+=</span>ar<span class="
br0">&#91;</span>x<span class="br0">&#93;</span><span class="sy0">;</span><br/>
<span class="kw1">if</span><span class="br0">&#40;</span>x<span class="sy0">&lt
;</span><span class="nu0">3</span><span class="br0">&#41;</span><span class="br0
">&#123;</span><br/> <span class="kw1">if</span><span class="br0">&#40;</span>
v<span class="sy0">&lt;</span><span class="nu0">0</span><span class="br0">&#41;<
/span>parenth<span class="br0">&#40;</span>v<span class="br0">&#41;</span><span
class="sy0">;</span><br/> out<span class="sy0">+=</span>oper.<span class="me1"
>charAt</span><span class="br0">&#40;</span>op<span class="br0">&#91;</span>x<sp
an class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</sp
an><br/> <span class="br0">&#125;</span><br/> <span class="sy0">++</span>x<spa
n class="sy0">;</span><br/> <span class="br0">&#125;</span><br/> parenth<span cl
ass="br0">&#40;</span><span class="sy0">-</span>p<span class="br0">&#41;</span><

span class="sy0">;</span><br/> say<span class="br0">&#40;</span>out<span class="


br0">&#41;</span><span class="sy0">;</span><br/><span class="br0">&#125;</span><
br/>&#160;<br/><span class="kw1">function</span> solve24<span class="br0">&#40;<
/span>s<span class="br0">&#41;</span><span class="br0">&#123;</span><br/> <span
class="kw1">var</span> z<span class="sy0">=</span><span class="nu0">4</span><spa
n class="sy0">,</span>r<span class="sy0">;</span><br/> while<span class="br0">&#
40;</span>z<span class="sy0">--</span><span class="br0">&#41;</span>ar<span clas
s="br0">&#91;</span>z<span class="br0">&#93;</span><span class="sy0">=</span>s.<
span class="me1">charCodeAt</span><span class="br0">&#40;</span>z<span class="br
0">&#41;</span><span class="sy0">-</span><span class="nu0">48</span><span class=
"sy0">;</span><br/> out<span class="sy0">=</span><span class="st0">&quot;&quot;<
/span><span class="sy0">;</span><br/> <span class="kw1">for</span><span class="b
r0">&#40;</span>z<span class="sy0">=</span><span class="nu0">100000</span><span
class="sy0">;</span>z<span class="sy0">--;</span><span class="br0">&#41;</span><
span class="br0">&#123;</span><br/> r<span class="sy0">=</span>rnd<span class="
br0">&#40;</span><span class="nu0">256</span><span class="br0">&#41;</span><span
class="sy0">;</span><br/> op<span class="br0">&#91;</span><span class="nu0">0<
/span><span class="br0">&#93;</span><span class="sy0">=</span>r<span class="sy0"
>&amp;</span><span class="nu0">3</span><span class="sy0">;</span><br/> op<span
class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>
<span class="sy0">=</span><span class="br0">&#40;</span>r<span class="sy0">&gt;&
gt;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="s
y0">&amp;</span><span class="nu0">3</span><span class="sy0">;</span><br/> op<sp
an class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</sp
an><span class="sy0">=</span><span class="br0">&#40;</span>r<span class="sy0">&g
t;&gt;</span><span class="nu0">4</span><span class="br0">&#41;</span><span class
="sy0">&amp;</span><span class="nu0">3</span><span class="sy0">;</span><br/> sh
uffle<span class="br0">&#40;</span><span class="st0">&quot;ar&quot;</span><span
class="sy0">,</span><span class="nu0">4</span><span class="br0">&#41;</span><spa
n class="sy0">;</span><br/> shuffle<span class="br0">&#40;</span><span class="s
t0">&quot;order&quot;</span><span class="sy0">,</span><span class="nu0">3</span>
<span class="br0">&#41;</span><span class="sy0">;</span><br/> <span class="kw1"
>if</span><span class="br0">&#40;</span>calc<span class="br0">&#40;</span><span
class="br0">&#41;</span><span class="sy0">!=</span><span class="nu0">24</span><s
pan class="br0">&#41;</span><span class="kw1">continue</span><span class="sy0">;
</span><br/> showsolution<span class="br0">&#40;</span><span class="br0">&#41;<
/span><span class="sy0">;</span><br/> <span class="kw1">break</span><span class
="sy0">;</span><br/> <span class="br0">&#125;</span><br/><span class="br0">&#125
;</span><br/>&#160;<br/>solve24<span class="br0">&#40;</span><span class="st0">&
quot;1234&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><b
r/>solve24<span class="br0">&#40;</span><span class="st0">&quot;6789&quot;</span
><span class="br0">&#41;</span><span class="sy0">;</span><br/>solve24<span class
="br0">&#40;</span><span class="st0">&quot;1127&quot;</span><span class="br0">&#
41;</span><span class="sy0">;</span></pre>
<p>Examples:
</p>
<pre>(((3*1)*4)*2)
((6*8)/((9-7)))
(((1+7))*(2+1))</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=24" title="Edit section: jq">edit</a>]</span> <span class=
"mw-headline" id="jq"><a href="/wiki/Category:Jq" title="Category:Jq">jq</a></sp
an></h2>
<div class="examplemeta workswith"><b>Works with</b>: <a href="/wiki/Jq" title="
Jq" class="mw-redirect">jq</a> version 1.4</div>
<p>The following solution is generic: the objective (e.g. 24) is specified as
the argument to solve/1, and the user may specify any number of numbers.
</p><p><b>Infrastructure:</b>
</p>
<pre class="text highlighted_source"># Generate a stream of the permutations of

the input array.<br/>def permutations:<br/> if length == 0 then []<br/> else<b


r/>
. as $in | range(0;length) | . as $i<br/>
| ($in|del(.[$i])|permutatio
ns) <br/>
| [$in[$i]] + .<br/> end&#160;;<br/>&#160;<br/># Generate a stream
of arrays of length n, <br/># with members drawn from the input array.<br/>def
take(n):<br/> length as $l | <br/> if n == 1 then range(0;$l) as $i | [ .[$i]
]<br/> else take(n-1) + take(1)<br/> end;<br/>&#160;<br/># Emit an array with
elements that alternate between those in the input array and those in short,<br/
># starting with the former, and using nothing if &quot;short&quot; is too too s
hort.<br/>def intersperse(short):<br/> . as $in<br/> | reduce range(0;length) as
$i<br/>
([]; . + [ $in[$i], (short[$i] // empty) ]);<br/>&#160;<br/># Emit
a stream of all the nested triplet groupings of the input array elements,<br/>#
e.g. [1,2,3,4,5] =&gt;<br/># [1,2,[3,4,5]]<br/># [[1,2,3],4,5]<br/>#<br/>def tri
ples:<br/> . as $in<br/> | if length == 3 then .<br/>
elif length == 1 th
en $in[0]<br/>
elif length &lt; 3 then empty<br/>
else<br/>
(range(0;
(length-1) / 2) * 2 + 1) as $i<br/>
| ($in[0:$i] | triples) as $head<br/
>
| ($in[$i+1:] | triples) as $tail<br/>
| [$head, $in[$i], $tail]<br/
>
end;</pre>
<p><b>Evaluation and pretty-printing of allowed expressions</b>
</p>
<pre class="text highlighted_source"># Evaluate the input, which must be a numbe
r or a triple: [x, op, y]<br/>def eval:<br/> if type == &quot;array&quot; then
<br/>
.[1] as $op<br/>
| if .[0] == null or .[2] == null then null<br/>
else<br/>
(.[0] | eval) as $left | (.[2] | eval) as $right<br/>
|
if $left == null or $right == null then null<br/>
elif $op == &quot;+&q
uot; then $left + $right<br/>
elif $op == &quot;-&quot; then $left - $ri
ght<br/>
elif $op == &quot;*&quot; then $left * $right<br/>
elif
$op == &quot;/&quot; then<br/>
if $right == 0 then null<br/>
else $left / $right<br/>
end<br/>
else &quot;invalid arithmetic
operator: \($op)&quot; | error<br/>
end<br/>
end<br/> else .<br/> end
;<br/>&#160;<br/>def pp:<br/> &quot;\(.)&quot; | explode | map([.] | implode |
if . == &quot;,&quot; then &quot; &quot; elif . == &quot;\&quot;&quot; then &quo
t;&quot; else . end) | join(&quot;&quot;);</pre>
<p><b>24 Game</b>:
</p>
<pre class="text highlighted_source">def OPERATORS: [&quot;+&quot;, &quot;-&quot
;, &quot;*&quot;, &quot;/&quot;];<br/>&#160;<br/># Input: an array of 4 digits<b
r/># o: an array of 3 operators<br/># Output: a stream<br/>def EXPRESSIONS(o):<b
r/> intersperse( o ) | triples;<br/>&#160;<br/>def solve(objective):<br/> len
gth as $length<br/> | [ (OPERATORS | take($length-1)) as $poperators<br/>
|
permutations | EXPRESSIONS($poperators)<br/>
| select( eval == objective)<br/
> ] as $answers<br/> | if $answers|length &gt; 3 then &quot;That was too easy.
I found \($answers|length) answers, e.g. \($answers[0] | pp)&quot;<br/>
elif
$answers|length &gt; 1 then $answers[] | pp<br/>
else &quot;You lose! There
are no solutions.&quot;<br/>
end<br/>;<br/>&#160;<br/>solve(24), &quot;Please
try again.&quot;</pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre class="text highlighted_source">$ jq -r -f Solve.jq<br/>[1,2,3,4]<br/>That
was too easy. I found 242 answers, e.g. [4 * [1 + [2 + 3]]]<br/>Please try again
.<br/>[1,2,3,40,1]<br/>That was too easy. I found 636 answers, e.g. [[[1 / 2] *
40] + [3 + 1]]<br/>Please try again.<br/>[3,8,9]<br/>That was too easy. I found
8 answers, e.g. [[8 / 3] * 9]<br/>Please try again.<br/>[4,5,6]<br/>You lose! Th
ere are no solutions.<br/>Please try again.<br/>[1,2,3,4,5,6]<br/>That was too e
asy. I found 197926 answers, e.g. [[2 * [1 + 4]] + [3 + [5 + 6]]]<br/>Please try
again.</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=25" title="Edit section: Julia">edit</a>]</span> <span cla
ss="mw-headline" id="Julia"><a href="/wiki/Category:Julia" title="Category:Julia
">Julia</a></span></h2>

<pre class="text highlighted_source">function solve24(nums)<br/>


length(nums)
&#160;!= 4 &amp;&amp; error(&quot;Input must be a 4-element Array&quot;)<br/>
syms = [+,-,*,/]<br/>
for x in syms, y in syms, z in syms<br/>
for i
= 1:24<br/>
a,b,c,d = nthperm(nums,i)<br/>
if round(x(y(a,
b),z(c,d)),5) == 24<br/>
return &quot;($a$y$b)$x($c$z$d)&quot;<br
/>
elseif round(x(a,y(b,z(c,d))),5) == 24 <br/>
return
&quot;$a$x($b$y($c$z$d))&quot;<br/>
elseif round(x(y(z(c,d),b),a),5)
== 24 <br/>
return &quot;(($c$z$d)$y$b)$x$a&quot;<br/>
elseif round(x(y(b,z(c,d)),a),5) == 24 <br/>
return &quot;($b$y
($c$z$d))$x$a&quot;<br/>
end<br/>
end<br/>
end<br/>
retu
rn &quot;0&quot;<br/>end</pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>julia&gt; for i in 1:10
nums = rand(1:9, 4)
println(&quot;solve24($nums) -&gt; $(solve24(nums))&quot;)
end
solve24([9,4,4,5]) -&gt; 0
solve24([1,7,2,7]) -&gt; ((7*7)-1)/2
solve24([5,7,5,4]) -&gt; 4*(7-(5/5))
solve24([1,4,6,6]) -&gt; 6+(6*(4-1))
solve24([2,3,7,3]) -&gt; ((2+7)*3)-3
solve24([8,7,9,7]) -&gt; 0
solve24([1,6,2,6]) -&gt; 6+(6*(1+2))
solve24([7,9,4,1]) -&gt; (7-4)*(9-1)
solve24([6,4,2,2]) -&gt; (2-2)+(6*4)
solve24([5,7,9,7]) -&gt; (5+7)*(9-7)</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=26" title="Edit section: Liberty BASIC">edit</a>]</span> <
span class="mw-headline" id="Liberty_BASIC"><a href="/wiki/Category:Liberty_BASI
C" title="Category:Liberty BASIC">Liberty BASIC</a></span></h2>
<pre class="lb highlighted_source"><span class="kw1">dim</span> d<span class="br
0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span><br/><spa
n class="kw1">input</span> <span class="st0">&quot;Enter 4 digits: &quot;</span>
; a$<br/>nD<span class="sy0">=</span><span class="nu0">0</span><br/><span class=
"kw1">for</span> i <span class="sy0">=</span><span class="nu0">1</span> <span cl
ass="kw1">to</span> <span class="kw2">len</span><span class="br0">&#40;</span>a$
<span class="br0">&#41;</span><br/>
c$<span class="sy0">=</span><span class="
kw2">mid$</span><span class="br0">&#40;</span>a$<span class="sy0">,</span>i<span
class="sy0">,</span><span class="nu0">1</span><span class="br0">&#41;</span><br
/>
<span class="kw1">if</span> <span class="kw2">instr</span><span class="br0
">&#40;</span><span class="st0">&quot;123456789&quot;</span><span class="sy0">,<
/span>c$<span class="br0">&#41;</span> <span class="kw1">then</span><br/>
nD<span class="sy0">=</span>nD<span class="sy0">+</span><span class="nu0">1</sp
an><br/>
d<span class="br0">&#40;</span>nD<span class="br0">&#41;</span><
span class="sy0">=</span><span class="kw2">val</span><span class="br0">&#40;</sp
an>c$<span class="br0">&#41;</span><br/>
<span class="kw1">end</span> <span c
lass="kw1">if</span><br/><span class="kw1">next</span><br/><span class="co1">'fo
r i = 1 to 4</span><br/><span class="co1">'
print d(i);</span><br/><span clas
s="co1">'next</span><br/>&#160;<br/><span class="co1">'precompute permutations.
Dumb way.</span><br/>nPerm <span class="sy0">=</span> <span class="nu0">1</span>
<span class="sy0">*</span><span class="nu0">2</span><span class="sy0">*</span><s
pan class="nu0">3</span><span class="sy0">*</span><span class="nu0">4</span><br/
><span class="kw1">dim</span> perm<span class="br0">&#40;</span>nPerm<span class
="sy0">,</span> <span class="nu0">4</span><span class="br0">&#41;</span><br/>n <
span class="sy0">=</span> <span class="nu0">0</span><br/><span class="kw1">for</
span> i <span class="sy0">=</span> <span class="nu0">1</span> <span class="kw1">
to</span> <span class="nu0">4</span><br/>
<span class="kw1">for</span> j <spa
n class="sy0">=</span> <span class="nu0">1</span> <span class="kw1">to</span> <s

pan class="nu0">4</span><br/>
<span class="kw1">for</span> k <span class=
"sy0">=</span> <span class="nu0">1</span> <span class="kw1">to</span> <span clas
s="nu0">4</span><br/>
<span class="kw1">for</span> l <span class="sy0
">=</span> <span class="nu0">1</span> <span class="kw1">to</span> <span class="n
u0">4</span><br/>
<span class="co1">'valid permutation (no dupes?)</s
pan><br/>
<span class="kw1">if</span> i<span class="sy0">&lt;&gt;
</span>j <span class="kw1">and</span> i<span class="sy0">&lt;&gt;</span>k <span
class="kw1">and</span> i<span class="sy0">&lt;&gt;</span>l _<br/>
<span class="kw1">and</span> j<span class="sy0">&lt;&gt;</span>k <span clas
s="kw1">and</span> j<span class="sy0">&lt;&gt;</span>l _<br/>
<span class="kw1">and</span> k<span class="sy0">&lt;&gt;</span>l <span clas
s="kw1">then</span><br/>
n<span class="sy0">=</span>n<span cl
ass="sy0">+</span><span class="nu0">1</span><br/>
<span class
="co1">'</span><br/><span class="co1">'
perm(n,1)=i</span><br
/><span class="co1">'
perm(n,2)=j</span><br/><span class="co1
">'
perm(n,3)=k</span><br/><span class="co1">'
perm(n,4)=l</span><br/>
<span class="co1">'actually, we
can as well permute given digits</span><br/>
perm<span class=
"br0">&#40;</span>n<span class="sy0">,</span><span class="nu0">1</span><span cla
ss="br0">&#41;</span><span class="sy0">=</span>d<span class="br0">&#40;</span>i<
span class="br0">&#41;</span><br/>
perm<span class="br0">&#40
;</span>n<span class="sy0">,</span><span class="nu0">2</span><span class="br0">&
#41;</span><span class="sy0">=</span>d<span class="br0">&#40;</span>j<span class
="br0">&#41;</span><br/>
perm<span class="br0">&#40;</span>n<
span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#41;</span
><span class="sy0">=</span>d<span class="br0">&#40;</span>k<span class="br0">&#4
1;</span><br/>
perm<span class="br0">&#40;</span>n<span class
="sy0">,</span><span class="nu0">4</span><span class="br0">&#41;</span><span cla
ss="sy0">=</span>d<span class="br0">&#40;</span>l<span class="br0">&#41;</span><
br/>
<span class="kw1">end</span> <span class="kw1">if</span><br/
>
<span class="kw1">next</span><br/>
<span class="kw1">next</s
pan><br/>
<span class="kw1">next</span><br/><span class="kw1">next</span><br/
><span class="co1">'check if permutations look OK. They are</span><br/><span cla
ss="co1">'for i =1 to n</span><br/><span class="co1">'
print i,</span><br/><s
pan class="co1">'
for j =1 to 4: print perm(i,j);:next</span><br/><span class
="co1">'
print</span><br/><span class="co1">'next</span><br/>&#160;<br/><span
class="co1">'possible brackets</span><br/>NBrackets <span class="sy0">=</span>
<span class="nu0">11</span><br/><span class="kw1">dim</span> Brakets$<span class
="br0">&#40;</span>NBrackets<span class="br0">&#41;</span><br/><span class="kw1"
>DATA</span> <span class="st0">&quot;4#4#4#4&quot;</span><br/><span class="kw1">
DATA</span> <span class="st0">&quot;(4#4)#4#4&quot;</span><br/><span class="kw1"
>DATA</span> <span class="st0">&quot;4#(4#4)#4&quot;</span><br/><span class="kw1
">DATA</span> <span class="st0">&quot;4#4#(4#4)&quot;</span><br/><span class="kw
1">DATA</span> <span class="st0">&quot;(4#4)#(4#4)&quot;</span><br/><span class=
"kw1">DATA</span> <span class="st0">&quot;(4#4#4)#4&quot;</span><br/><span class
="kw1">DATA</span> <span class="st0">&quot;4#(4#4#4)&quot;</span><br/><span clas
s="kw1">DATA</span> <span class="st0">&quot;((4#4)#4)#4&quot;</span><br/><span c
lass="kw1">DATA</span> <span class="st0">&quot;(4#(4#4))#4&quot;</span><br/><spa
n class="kw1">DATA</span> <span class="st0">&quot;4#((4#4)#4)&quot;</span><br/><
span class="kw1">DATA</span> <span class="st0">&quot;4#(4#(4#4))&quot;</span><br
/><span class="kw1">for</span> i <span class="sy0">=</span> <span class="nu0">1<
/span> <span class="kw1">to</span> NBrackets<br/>
<span class="kw1">read</spa
n> Tmpl$<span class="sy0">:</span> Brakets$<span class="br0">&#40;</span>i<span
class="br0">&#41;</span> <span class="sy0">=</span> Tmpl$<br/><span class="kw1">
next</span><br/>&#160;<br/><span class="co1">'operations: full search</span><br/
>count <span class="sy0">=</span> <span class="nu0">0</span><br/>Ops$<span class
="sy0">=</span><span class="st0">&quot;+ - * /&quot;</span><br/><span class="kw1
">dim</span> Op$<span class="br0">&#40;</span><span class="nu0">3</span><span cl
ass="br0">&#41;</span><br/><span class="kw1">For</span> op1<span class="sy0">=</
span><span class="nu0">1</span> <span class="kw1">to</span> <span class="nu0">4<

/span><br/>
Op$<span class="br0">&#40;</span><span class="nu0">1</span><span
class="br0">&#41;</span><span class="sy0">=</span><span class="kw1">word</span>$
<span class="br0">&#40;</span>Ops$<span class="sy0">,</span>op1<span class="br0"
>&#41;</span><br/>
<span class="kw1">For</span> op2<span class="sy0">=</span>
<span class="nu0">1</span> <span class="kw1">to</span> <span class="nu0">4</span
><br/>
Op$<span class="br0">&#40;</span><span class="nu0">2</span><span c
lass="br0">&#41;</span><span class="sy0">=</span><span class="kw1">word</span>$<
span class="br0">&#40;</span>Ops$<span class="sy0">,</span>op2<span class="br0">
&#41;</span><br/>
<span class="kw1">For</span> op3<span class="sy0">=</sp
an><span class="nu0">1</span> <span class="kw1">to</span> <span class="nu0">4</s
pan><br/>
Op$<span class="br0">&#40;</span><span class="nu0">3</span>
<span class="br0">&#41;</span><span class="sy0">=</span><span class="kw1">word</
span>$<span class="br0">&#40;</span>Ops$<span class="sy0">,</span>op3<span class
="br0">&#41;</span><br/>
<span class="co1">'print &quot;*&quot;</span
><br/>
<span class="co1">'substitute all brackets</span><br/>
<span class="kw1">for</span> t <span class="sy0">=</span> <span class="nu0">
1</span> <span class="kw1">to</span> NBrackets<br/>
Tmpl$<span cl
ass="sy0">=</span>Brakets$<span class="br0">&#40;</span>t<span class="br0">&#41;
</span><br/>
<span class="co1">'print , Tmpl$</span><br/>
<span class="co1">'now, substitute all digits: permutations.</span><br/>
<span class="kw1">for</span> p <span class="sy0">=</span> <span
class="nu0">1</span> <span class="kw1">to</span> nPerm<br/>
r
es$<span class="sy0">=</span> <span class="st0">&quot;&quot;</span><br/>
nOp<span class="sy0">=</span><span class="nu0">0</span><br/>
nD<span class="sy0">=</span><span class="nu0">0</span><br/>
<span class="kw1">for</span> i <span class="sy0">=</span> <span class
="nu0">1</span> <span class="kw1">to</span> <span class="kw2">len</span><span cl
ass="br0">&#40;</span>Tmpl$<span class="br0">&#41;</span><br />
c$ <span class="sy0">=</span> <span class="kw2">mid$</span><span class="b
r0">&#40;</span>Tmpl$<span class="sy0">,</span> i<span class="sy0">,</span> <spa
n class="nu0">1</span><span class="br0">&#41;</span><br />
<span class="kw1">select</span> <span class="kw1">case</span> c$<br />
<span class="kw1">case</span> <span class="st0">&quot;#&quot;</s
pan>
<span class="co1">'operations</span><br />
nOp <span class="sy0">=</span> nOp<span class="sy0">+</span><span clas
s="nu0">1</span><br />
res$ <span class="sy0">=</span
> res$<span class="sy0">+</span>Op$<span class="br0">&#40;</span>nOp<span class=
"br0">&#41;</span><br />
<span class="kw1">case</span> <s
pan class="st0">&quot;4&quot;</span>
<span class="co1">'digits</s
pan><br />
nD <span class="sy0">=</span> nOp<span cla
ss="sy0">+</span><span class="nu0">1</span><br />
res
$ <span class="sy0">=</span> res$; perm<span class="br0">&#40;</span>p<span clas
s="sy0">,</span>nD<span class="br0">&#41;</span><br />
<s
pan class="kw1">case</span> <span class="kw1">else</span>
<span cl
ass="co1">'brackets goes here</span><br />
res$ <span
class="sy0">=</span> res$<span class="sy0">+</span> c$ <br />
<span class="kw1">end</span> <span class="kw1">select</span><br />
<span class="kw1">next</span><br />
<span class="
co1">'print,, res$</span><br />
<span class="co1">'eval here<
/span><br />
<span class="kw1">if</span> evalWithErrCheck<spa
n class="br0">&#40;</span>res$<span class="br0">&#41;</span> <span class="sy0">=
</span> <span class="nu0">24</span> <span class="kw1">then</span><br />
<span class="kw1">print</span> <span class="st0">&quot;24 = &quot
;</span>;res$<br />
<span class="kw1">end</span> <span cl
ass="co1">'comment it out if you want to see all versions</span><br />
<span class="kw1">end</span> <span class="kw1">if</span><br />
count <span class="sy0">=</span> count <span class="sy0">+</span> <s
pan class="nu0">1</span><br />
<span class="kw1">next</span><br /
>
<span class="kw1">next</span><br />
<span class="kw1">Next</
span><br />
<span class="kw1">Next</span><br /><span class="kw1">next</span><

br />&#160;<br /><span class="kw1">print</span> <span class="st0">&quot;If you s


ee this, probably task cannot be solved with these digits&quot;</span><br /><spa
n class="co1">'print count</span><br /><span class="kw1">end</span><br />&#160;<
br /><span class="kw1">function</span> evalWithErrCheck<span class="br0">&#40;</
span>expr$<span class="br0">&#41;</span><br />
<span class="kw1">on</span> <s
pan class="kw1">error</span> <span class="kw1">goto</span> <span class="br0">&#9
1;</span>handler<span class="br0">&#93;</span><br />
evalWithErrCheck<span cl
ass="sy0">=</span><span class="kw2">eval</span><span class="br0">&#40;</span>exp
r$<span class="br0">&#41;</span><br />
<span class="kw1">exit</span> <span cl
ass="kw1">function</span><br /><span class="br0">&#91;</span>handler<span class=
"br0">&#93;</span><br /><span class="kw1">end</span> <span class="kw1">function<
/span></pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=27" title="Edit section: Lua">edit</a>]</span> <span class
="mw-headline" id="Lua"><a href="/wiki/Category:Lua" title="Category:Lua">Lua</a
></span></h2>
<p>Generic solver: pass card of any size with 1st argument and target number wit
h second.
</p>
<pre class="lua highlighted_source">&#160;<br /><span class="kw1">local</span> S
IZE <span class="sy0">=</span> <span class="sy0">#</span>arg<span class="br0">&#
91;</span><span class="nu0">1</span><span class="br0">&#93;</span><br /><span cl
ass="kw1">local</span> GOAL <span class="sy0">=</span> <span class="kw3">tonumbe
r</span><span class="br0">&#40;</span>arg<span class="br0">&#91;</span><span cla
ss="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <s
pan class="kw2">or</span> <span class="nu0">24</span><br />&#160;<br /><span cla
ss="kw1">local</span> input <span class="sy0">=</span> <span class="br0">&#123;<
/span><span class="br0">&#125;</span><br /><span class="kw1">for</span> v <span
class="kw2">in</span> arg<span class="br0">&#91;</span><span class="nu0">1</span
><span class="br0">&#93;</span><span class="sy0">:</span>gmatch<span class="br0"
>&#40;</span><span class="st0">&quot;%d&quot;</span><span class="br0">&#41;</spa
n> <span class="kw1">do</span><br />
<span class="kw3">table.insert</span><sp
an class="br0">&#40;</span>input<span class="sy0">,</span> v<span class="br0">&#
41;</span><br /><span class="kw1">end</span><br /><span class="kw3">assert</span
><span class="br0">&#40;</span><span class="sy0">#</span>input <span class="sy0"
>==</span> SIZE<span class="sy0">,</span> <span class="st0">'Invalid input'</spa
n><span class="br0">&#41;</span><br />&#160;<br /><span class="kw1">local</span>
operations <span class="sy0">=</span> <span class="br0">&#123;</span><span clas
s="st0">'+'</span><span class="sy0">,</span> <span class="st0">'-'</span><span c
lass="sy0">,</span> <span class="st0">'*'</span><span class="sy0">,</span> <span
class="st0">'/'</span><span class="br0">&#125;</span><br />&#160;<br /><span cl
ass="kw1">local</span> <span class="kw1">function</span> BinaryTrees<span class=
"br0">&#40;</span>vert<span class="br0">&#41;</span><br />
<span class="kw1
">if</span> vert <span class="sy0">==</span> <span class="nu0">0</span> <span cl
ass="kw1">then</span><br />
<span class="kw1">return</span> <span cl
ass="br0">&#123;</span><span class="kw4">false</span><span class="br0">&#125;</s
pan><br />
<span class="kw1">else</span><br />
<span class="kw1
">local</span> buf <span class="sy0">=</span> <span class="br0">&#123;</span><sp
an class="br0">&#125;</span><br />
<span class="kw1">for</span> lef
ten <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">,</sp
an> vert <span class="sy0">-</span> <span class="nu0">1</span> <span class="kw1"
>do</span><br />
<span class="kw1">local</span> righten <
span class="sy0">=</span> vert <span class="sy0">-</span> leften <span class="sy
0">-</span> <span class="nu0">1</span><br />
<span class="kw1
">for</span> _<span class="sy0">,</span> left <span class="kw2">in</span> <span
class="kw3">pairs</span><span class="br0">&#40;</span>BinaryTrees<span class="br
0">&#40;</span>leften<span class="br0">&#41;</span><span class="br0">&#41;</span
> <span class="kw1">do</span><br />
<span class="kw1
">for</span> _<span class="sy0">,</span> right <span class="kw2">in</span> <span
class="kw3">pairs</span><span class="br0">&#40;</span>BinaryTrees<span class="b

r0">&#40;</span>righten<span class="br0">&#41;</span><span class="br0">&#41;</sp


an> <span class="kw1">do</span><br />
<span cl
ass="kw3">table.insert</span><span class="br0">&#40;</span>buf<span class="sy0">
,</span> <span class="br0">&#123;</span>left<span class="sy0">,</span> right<spa
n class="br0">&#125;</span><span class="br0">&#41;</span><br />
<span class="kw1">end</span><br />
<span class="kw1">end</s
pan><br />
<span class="kw1">end</span><br />
<span cl
ass="kw1">return</span> buf<br />
<span class="kw1">end</span><br /><span
class="kw1">end</span><br /><span class="kw1">local</span> trees <span class="sy
0">=</span> BinaryTrees<span class="br0">&#40;</span>SIZE<span class="sy0">-</sp
an><span class="nu0">1</span><span class="br0">&#41;</span><br /><span class="kw
1">local</span> c<span class="sy0">,</span> opc<span class="sy0">,</span> oper<s
pan class="sy0">,</span> str<br /><span class="kw1">local</span> <span class="kw
3">max</span> <span class="sy0">=</span> <span class="kw3">math</span><span clas
s="sy0">.</span>pow<span class="br0">&#40;</span><span class="sy0">#</span>opera
tions<span class="sy0">,</span> SIZE<span class="sy0">-</span><span class="nu0">
1</span><span class="br0">&#41;</span><br /><span class="kw1">local</span> <span
class="kw1">function</span> op<span class="br0">&#40;</span>a<span class="sy0">
,</span>b<span class="br0">&#41;</span><br /> opc <span class="sy0">=</span> o
pc <span class="sy0">+</span> <span class="nu0">1</span><br /> <span class="kw1
">local</span> i <span class="sy0">=</span> <span class="kw3">math.floor</span><
span class="br0">&#40;</span>oper<span class="sy0">/</span><span class="kw3">mat
h</span><span class="sy0">.</span>pow<span class="br0">&#40;</span><span class="
sy0">#</span>operations<span class="sy0">,</span> opc<span class="sy0">-</span><
span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</
span><span class="sy0">%#</span>operations<span class="sy0">+</span><span class=
"nu0">1</span><br />
<span class="kw1">return</span> <span class="st0">'('</s
pan><span class="sy0">..</span> a <span class="sy0">..</span> operations<span cl
ass="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy0">..</span
> b <span class="sy0">..</span><span class="st0">')'</span><br /><span class="kw
1">end</span><br />&#160;<br /><span class="kw1">local</span> <span class="kw1">
function</span> EvalTree<span class="br0">&#40;</span>tree<span class="br0">&#41
;</span><br /> <span class="kw1">if</span> tree <span class="sy0">==</span> <sp
an class="kw4">false</span> <span class="kw1">then</span><br />
c <span
class="sy0">=</span> c <span class="sy0">+</span> <span class="nu0">1</span><br
/>
<span class="kw1">return</span> input<span class="br0">&#91;</sp
an>c<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#93;<
/span><br />
<span class="kw1">else</span><br />
<span class="kw1
">return</span> op<span class="br0">&#40;</span>EvalTree<span class="br0">&#40;<
/span>tree<span class="br0">&#91;</span><span class="nu0">1</span><span class="b
r0">&#93;</span><span class="br0">&#41;</span><span class="sy0">,</span> EvalTre
e<span class="br0">&#40;</span>tree<span class="br0">&#91;</span><span class="nu
0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span cla
ss="br0">&#41;</span><br />
<span class="kw1">end</span><br /><span class="k
w1">end</span><br />&#160;<br /><span class="kw1">local</span> <span class="kw1"
>function</span> printResult<span class="br0">&#40;</span><span class="br0">&#41
;</span><br /> <span class="kw1">for</span> _<span class="sy0">,</span> v <span
class="kw2">in</span> <span class="kw3">ipairs</span><span class="br0">&#40;</s
pan>trees<span class="br0">&#41;</span> <span class="kw1">do</span><br />
<span class="kw1">for</span> i <span class="sy0">=</span> <span class="nu0">0</s
pan><span class="sy0">,</span> <span class="kw3">max</span> <span class="kw1">do
</span><br />
c<span class="sy0">,</span> opc<span class="sy0"
>,</span> oper <span class="sy0">=</span> <span class="nu0">1</span><span class=
"sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> i<br />
str <span class="sy0">=</span> EvalTree<span class="br0">&#40;</span>v<span clas
s="br0">&#41;</span><br />
<span class="kw3">loadstring</sp
an><span class="br0">&#40;</span><span class="st0">'res='</span><span class="sy0
">..</span>str<span class="br0">&#41;</span><span class="br0">&#40;</span><span
class="br0">&#41;</span><br />
<span class="kw1">if</span><span
class="br0">&#40;</span>res <span class="sy0">==</span> GOAL<span class="br0">&

#41;</span> <span class="kw1">then</span> <span class="kw3">print</span><span cl


ass="br0">&#40;</span>str<span class="sy0">,</span> <span class="st0">'='</span>
<span class="sy0">,</span> res<span class="br0">&#41;</span> <span class="kw1">e
nd</span><br />
<span class="kw1">end</span><br />
<span class="kw1
">end</span><br /><span class="kw1">end</span><br />&#160;<br /><span class="kw1
">local</span> uniq <span class="sy0">=</span> <span class="br0">&#123;</span><s
pan class="br0">&#125;</span><br /><span class="kw1">local</span> <span class="k
w1">function</span> permgen <span class="br0">&#40;</span>a<span class="sy0">,</
span> n<span class="br0">&#41;</span><br />
<span class="kw1">if</span> n <s
pan class="sy0">==</span> <span class="nu0">0</span> <span class="kw1">then</spa
n><br />
<span class="kw1">local</span> str <span class="sy0">=</
span> <span class="kw3">table.concat</span><span class="br0">&#40;</span>a<span
class="br0">&#41;</span><br />
<span class="kw1">if</span> <span class=
"kw2">not</span> uniq<span class="br0">&#91;</span>str<span class="br0">&#93;</s
pan> <span class="kw1">then</span> <br />
printResult<span
class="br0">&#40;</span><span class="br0">&#41;</span><br />
uniq<span class="br0">&#91;</span>str<span class="br0">&#93;</span> <span class=
"sy0">=</span> <span class="kw4">true</span><br />
<span class="kw1
">end</span><br />
<span class="kw1">else</span><br />
<span cl
ass="kw1">for</span> i <span class="sy0">=</span> <span class="nu0">1</span><spa
n class="sy0">,</span> n <span class="kw1">do</span><br />
a<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="sy0">
,</span> a<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span cl
ass="sy0">=</span> a<span class="br0">&#91;</span>i<span class="br0">&#93;</span
><span class="sy0">,</span> a<span class="br0">&#91;</span>n<span class="br0">&#
93;</span><br />
permgen<span class="br0">&#40;</span>a<s
pan class="sy0">,</span> n <span class="sy0">-</span> <span class="nu0">1</span>
<span class="br0">&#41;</span><br />
a<span class="br0">&#91;
</span>n<span class="br0">&#93;</span><span class="sy0">,</span> a<span class="b
r0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy0">=</span> a<spa
n class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">,</sp
an> a<span class="br0">&#91;</span>n<span class="br0">&#93;</span><br />
<span class="kw1">end</span><br />
<span class="kw1">end</span><br /><span
class="kw1">end</span><br />&#160;<br />permgen<span class="br0">&#40;</span>inp
ut<span class="sy0">,</span> SIZE<span class="br0">&#41;</span><br />&#160;</pre
>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>
$ lua 24game.solve.lua 2389
(8*(9-(3*2))) =
24
(8*((9-3)/2)) =
24
((8*(9-3))/2) =
24
((9-3)*(8/2)) =
24
(((9-3)*8)/2) =
24
(8*(9-(2*3))) =
24
(8/(2/(9-3))) =
24
((8/2)*(9-3)) =
24
((9-3)/(2/8)) =
24
((9-(3*2))*8) =
24
(((9-3)/2)*8) =
24
((9-(2*3))*8) =
24
$ lua 24game.solve.lua 1172
((1+7)*(2+1)) =
24
((7+1)*(2+1)) =
24
((1+2)*(7+1)) =
24
((2+1)*(7+1)) =
24
((1+2)*(1+7)) =
24
((2+1)*(1+7)) =
24

((1+7)*(1+2)) =
24
((7+1)*(1+2)) =
24
$ lua 24game.solve.lua 123456789 1000
(2*(3+(4-(5+(6-(7*(8*(9*1))))))))
=
1000
(2*(3+(4-(5+(6-(7*(8*(9/1))))))))
=
1000
(2*(3*(4*(5+(6*(7-(8/(9*1))))))))
=
1000
(2*(3*(4*(5+(6*(7-(8/(9/1))))))))
=
1000
(2*(3+(4-(5+(6-(7*((8*9)*1)))))))
=
1000
(2*(3+(4-(5+(6-(7*((8*9)/1)))))))
=
1000
(2*(3*(4*(5+(6*(7-((8/9)*1)))))))
=
1000
(2*(3*(4*(5+(6*(7-((8/9)/1)))))))
=
1000
.....
</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=28" title="Edit section: Mathematica / Wolfram Language">e
dit</a>]</span> <span class="mw-headline" id="Mathematica_.2F_Wolfram_Language">
<a href="/wiki/Category:Mathematica" title="Category:Mathematica">Mathematica</a
> / <a href="/wiki/Category:Wolfram_Language" title="Category:Wolfram Language">
Wolfram Language</a></span></h2>
<p>The code:
</p>
<pre class="text highlighted_source">&#160;<br />treeR[n_]&#160;:= Table[o[trees
[a], trees[n - a]], {a, 1, n - 1}]<br />treeR[1]&#160;:= n<br />tree[n_]&#160;:=
<br /> Flatten[treeR[n] //. {o[a_List, b_]&#160;:&gt; (o[#, b] &amp; /@ a), <br
/>
o[a_, b_List]&#160;:&gt; (o[a, #] &amp; /@ b)}]<br />game24play[val_List]
&#160;:= <br /> Union[StringReplace[StringTake[ToString[#, InputForm], {10, -2}]
, <br />
&quot;-1*&quot; ~~ n_&#160;:&gt; &quot;-&quot; &lt;&gt; n] &amp; /@
(HoldForm /@ <br />
Select[Union@<br />
Flatten[Outer[# /. {o[q_Int
eger]&#160;:&gt; #2[[q]], <br />
n[q_]&#160;:&gt; #3[[q]]} &amp;, <b
r />
Block[{O = 1, N = 1}, # /. {o&#160;:&gt; o[O++], n&#160;:&gt; n[N+
+]}] &amp; /@ <br />
tree[4], Tuples[{Plus, Subtract, Times, Divide},
3], <br />
Permutations[Array[v, 4]], 1]], <br />
Quiet[(# /. v[q
_]&#160;:&gt; val[[q]]) == 24] &amp;] /. <br />
Table[v[q] -&gt; val[[q]], {
q, 4}])]</pre>
<p>The <code>treeR</code> method recursively computes all possible operator tree
s for a certain number of inputs. It does this by tabling all combinations of di
stributions of inputs across the possible values. (For example, <code>treeR[4]</
code> is allotted 4 inputs, so it returns <code>{o[treeR[3],treeR[1]],o[treeR[2]
,treeR[2]],o[treeR[1],treeR[3]]}</code>, where <code>o</code> is the operator (g
eneric at this point).
The base case <code>treeR[1]</code> returns <code>n</code> (the input).
The final output of <code>tree[4]</code> (the 24 game has 4 random inputs) (<cod
e>tree</code> cleans up the output of <code>treeR</code>) is:
</p>
<pre>
{o[n, o[n, o[n, n]]],
o[n, o[o[n, n], n]],
o[o[n, n], o[n, n]],
o[o[n, o[n, n]], n],
o[o[o[n, n], n], n]}</pre>
<p><code>game24play</code> takes the four random numbers as input and does the f
ollowing (the <code><font color="red">%</font></code> refers to code output from
previous bullets):
</p>
<ul><li><code>Block[{O = 1, N = 1}, # /. {o&#160;:&gt; o[O++], n&#160;:&gt; n[N+
+]}] &amp; /@ tree[4]</code>
<ul><li> Assign ascending numbers to the input and operator placeholders.
</li><li> Ex: <code>o[1][o[2][n[1], n[2]], o[3][n[3], n[4]]]</code>
</li></ul>
</li><li><code>Tuples[{Plus, Subtract, Times, Divide}, 3]</code>

<ul><li> Find all combinations (<code>Tuples</code> allows repeats) of the four


allowed operations.
</li><li> Ex: <code>{{Plus, Plus, Plus}, {Plus, Plus, Subtract}, &lt;&lt;60&gt;&
gt;, {Divide, Divide, Times}, {Divide, Divide, Divide}}</code>
</li></ul>
</li><li><code>Permutations[Array[v, 4]]</code>
<ul><li> Find all permutations (<code>Permutations</code> does not allow repeats
) of the four given values.
</li><li> Ex: <code>{{v[1],v[2],v[3],v[4]}, {v[1],v[2],v[4],v[3]}, &lt;&lt;20&gt
;&gt;, {v[4],v[3],v[1],v[2]}, {v[4],v[3],v[2],v[1]}}</code>
</li></ul>
</li><li><code>Outer[# /. {o[q_Integer] :&gt; #2[[q]], n[q_] :&gt; #3[[q]]} &amp
;, <font color="red">%%%</font>, <font color="red">%%</font>, <font color="red">
%</font>, 1]</code>
<ul><li> Perform an outer join on the three above lists (every combination of ea
ch element) and with each combination put into the first (the operator tree) the
second (the operation at each level) and the third (the value <i>indexes</i>, n
ot actual values).
</li><li> Ex: <code>v[1] + v[2] - v[3] + v[4]</code>
</li></ul>
</li><li><code>Union@Flatten[<font color="red">%</font>]</code>
<ul><li> Get rid of any sublists caused by <code>Outer</code> and remove any dup
licates (<code>Union</code>).
</li></ul>
</li><li><code>Select[<font color="red">%</font>, Quiet[(# /. v[q_] :&gt; val[[q
]]) == 24] &amp;]</code>
<ul><li> Select the elements of the above list where substituting the real value
s returns 24 (and do it <code>Quiet</code>ly because of div-0 concerns).
</li></ul>
</li><li><code>HoldForm /@ <font color="red">%</font> /. Table[v[q] -&gt; val[[q
]], {q, 4}]</code>
<ul><li> Apply <code>HoldForm</code> so that substituting numbers will not cause
evaluation (otherwise it would only ever return lists like <code>{24, 24, 24}</
code>!) and substitute the numbers in.
</li></ul>
</li><li><code>Union[StringReplace[StringTake[ToString[#, InputForm], {10, -2}],
"-1*" ~~ n_&#160;:&gt; "-" &lt;&gt; n] &amp; /@ <font color="red">%</font>]</c
ode>
<ul><li>For each result, turn the expression into a string (for easy manipulatio
n), strip the "<code>HoldForm</code>" wrapper, replace numbers like "-1*7" with
"-7" (a idiosyncrasy of the conversion process), and remove any lingering duplic
ates. Some duplicates will still remain, notably constructs like "3 - 3" vs. "-3
+ 3" and trivially similar expressions like "(8*3)*(6-5)" vs "(8*3)/(6-5)". Exa
mple run input and outputs:
</li></ul>
</li></ul>
<pre class="text highlighted_source">game24play[RandomInteger[{1, 9}, 4]]</pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>{7, 2, 9, 5}
{-2 - 9 + 7*5}</pre>
<pre>{7, 5, 6, 2}
{6*(7 - 5 + 2), (7 - 5)*6*2, 7 + 5 + 6*2}</pre>
<pre>{7, 6, 7, 7}
{}</pre>
<pre>{3, 7, 6, 1}
{(-3 + 6)*(7 + 1), ((-3 + 7)*6)/1, (-3 + 7)*6*1,
6 - 3*(-7 + 1), 6*(-3 + 7*1), 6*(-3 + 7/1),
6 + 3*(7 - 1), 6*(7 - 3*1), 6*(7 - 3/1), 7 + 3*6 - 1}</pre>

<p>Note that although this program is designed to be extensible to higher number


s of inputs, the largest working set in the program (the output of the <code>Out
er</code> function can get very large:
</p>
<ul><li><code>tree[n]</code> returns a list with the length being the (n-1)-th <
a href="http://en.wikipedia.org/wiki/Catalan_number" class="extiw" title="wp:Cat
alan number">Catalan number</a>.
</li><li><code>Tuples[{Plus, Subtract, Times, Divide}, 3]</code> has fixed lengt
h 64 (or <i>p<sup>3</sup></i> for <i>p</i> operations).
</li><li><code>Permutations[Array[v, n]]</code> returns <span class="texhtml" di
r="ltr"><i>n</i>!</span> permutations.
</li></ul>
<p>Therefore, the size of the working set is <img class="tex" alt="64 \cdot n!\,
C_{n-1} = 64 \cdot (n-1)!!!! = 64 \frac{(2n-2)!}{(n-1)!}" src="/mw/images/math/
a/8/3/a838adb896342b78cff998e6922d7203.png" />, where <span class="texhtml" dir=
"ltr"><i>n</i>!!!!</span> is the <a href="http://en.wikipedia.org/wiki/quadruple
_factorial" class="extiw" title="wp:quadruple factorial">quadruple factorial</a>
. It goes without saying that this number increases very fast. For this game, th
e total is 7680 elements. For higher numbers of inputs, it is {7 680, 107 520, 1
935 360, 42 577 920, 1 107 025 920, ...}.
</p>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=29" title="Edit section: OCaml">edit</a>]</span> <span cla
ss="mw-headline" id="OCaml"><a href="/wiki/Category:OCaml" title="Category:OCaml
">OCaml</a></span></h2>
<pre class="ocaml highlighted_source"><span class="kw1">type</span> expression <
span class="sy0">=</span><br /> <span class="sy0">|</span> Const <span class="k
w1">of</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasi
ves.html#VALfloat"><span class="kw3">float</span></a><br /> <span class="sy0">|
</span> Sum <span class="kw1">of</span> expression <span class="sy0">*</span> e
xpression <span class="co1">(* e1 + e2 *)</span><br /> <span class="sy0">|</s
pan> Diff <span class="kw1">of</span> expression <span class="sy0">*</span> expr
ession <span class="co1">(* e1 - e2 *)</span><br /> <span class="sy0">|</span
> Prod <span class="kw1">of</span> expression <span class="sy0">*</span> express
ion <span class="co1">(* e1 * e2 *)</span><br /> <span class="sy0">|</span> Q
uot <span class="kw1">of</span> expression <span class="sy0">*</span> expression
<span class="co1">(* e1 / e2 *)</span><br />&#160;<br /><span class="kw1">let
</span> <span class="kw1">rec</span> eval <span class="sy0">=</span> <span class
="kw1">function</span><br /> <span class="sy0">|</span> Const c <span class="sy
0">-&gt;</span> c<br /> <span class="sy0">|</span> Sum <span class="br0">&#40;<
/span>f, g<span class="br0">&#41;</span> <span class="sy0">-&gt;</span> eval f <
span class="sy0">+.</span> eval g<br /> <span class="sy0">|</span> Diff<span cl
ass="br0">&#40;</span>f, g<span class="br0">&#41;</span> <span class="sy0">-&gt;
</span> eval f <span class="sy0">-.</span> eval g<br /> <span class="sy0">|</sp
an> Prod<span class="br0">&#40;</span>f, g<span class="br0">&#41;</span> <span c
lass="sy0">-&gt;</span> eval f <span class="sy0">*.</span> eval g<br /> <span c
lass="sy0">|</span> Quot<span class="br0">&#40;</span>f, g<span class="br0">&#41
;</span> <span class="sy0">-&gt;</span> eval f <span class="sy0">/.</span> eval
g<br />&#160;<br /><span class="kw1">let</span> print_expr expr <span class="sy0
">=</span><br /> <span class="kw1">let</span> open_paren prec op_prec <span cla
ss="sy0">=</span><br />
<span class="kw1">if</span> prec <span class="sy0">&g
t;</span> op_prec <span class="kw1">then</span> <a href="http://caml.inria.fr/pu
b/docs/manual-ocaml/libref/Pervasives.html#VALprint_string"><span class="kw3">pr
int_string</span></a> <span class="st0">&quot;(&quot;</span> <span class="kw1">i
n</span><br /> <span class="kw1">let</span> close_paren prec op_prec <span clas
s="sy0">=</span><br />
<span class="kw1">if</span> prec <span class="sy0">&gt
;</span> op_prec <span class="kw1">then</span> <a href="http://caml.inria.fr/pub
/docs/manual-ocaml/libref/Pervasives.html#VALprint_string"><span class="kw3">pri
nt_string</span></a> <span class="st0">&quot;)&quot;</span> <span class="kw1">in
</span><br /> <span class="kw1">let</span> <span class="kw1">rec</span> print p

rec <span class="sy0">=</span> <span class="kw1">function</span> <span class="


co1">(* prec is the current precedence *)</span><br />
<span class="sy0">|</s
pan> Const c <span class="sy0">-&gt;</span> <a href="http://caml.inria.fr/pub/do
cs/manual-ocaml/libref/Printf.html"><span class="kw2">Printf</span></a><span cla
ss="sy0">.</span>printf <span class="st0">&quot;%g&quot;</span> c<br />
<span
class="sy0">|</span> Sum<span class="br0">&#40;</span>f, g<span class="br0">&#4
1;</span> <span class="sy0">-&gt;</span><br />
open_paren prec <span clas
s="nu0">0</span><span class="sy0">;</span><br />
print <span class="nu0">
0</span> f<span class="sy0">;</span> <a href="http://caml.inria.fr/pub/docs/manu
al-ocaml/libref/Pervasives.html#VALprint_string"><span class="kw3">print_string<
/span></a> <span class="st0">&quot; + &quot;</span><span class="sy0">;</span> pr
int <span class="nu0">0</span> g<span class="sy0">;</span><br />
close_pa
ren prec <span class="nu0">0</span><br />
<span class="sy0">|</span> Diff<spa
n class="br0">&#40;</span>f, g<span class="br0">&#41;</span> <span class="sy0">&gt;</span><br />
open_paren prec <span class="nu0">0</span><span class="
sy0">;</span><br />
print <span class="nu0">0</span> f<span class="sy0">;
</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.ht
ml#VALprint_string"><span class="kw3">print_string</span></a> <span class="st0">
&quot; - &quot;</span><span class="sy0">;</span> print <span class="nu0">1</span
> g<span class="sy0">;</span><br />
close_paren prec <span class="nu0">0<
/span><br />
<span class="sy0">|</span> Prod<span class="br0">&#40;</span>f,
g<span class="br0">&#41;</span> <span class="sy0">-&gt;</span><br />
open
_paren prec <span class="nu0">2</span><span class="sy0">;</span><br />
pr
int <span class="nu0">2</span> f<span class="sy0">;</span> <a href="http://caml.
inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALprint_string"><span cla
ss="kw3">print_string</span></a> <span class="st0">&quot; * &quot;</span><span c
lass="sy0">;</span> print <span class="nu0">2</span> g<span class="sy0">;</span>
<br />
close_paren prec <span class="nu0">2</span><br />
<span class="
sy0">|</span> Quot<span class="br0">&#40;</span>f, g<span class="br0">&#41;</spa
n> <span class="sy0">-&gt;</span><br />
open_paren prec <span class="nu0"
>2</span><span class="sy0">;</span><br />
print <span class="nu0">2</span
> f<span class="sy0">;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocam
l/libref/Pervasives.html#VALprint_string"><span class="kw3">print_string</span><
/a> <span class="st0">&quot; / &quot;</span><span class="sy0">;</span> print <sp
an class="nu0">3</span> g<span class="sy0">;</span><br />
close_paren pre
c <span class="nu0">2</span><br /> <span class="kw1">in</span><br /> print <sp
an class="nu0">0</span> expr<br />&#160;<br /><span class="kw1">let</span> <span
class="kw1">rec</span> insert v <span class="sy0">=</span> <span class="kw1">fu
nction</span><br /> <span class="sy0">|</span> <span class="br0">&#91;</span><s
pan class="br0">&#93;</span> <span class="sy0">-&gt;</span> <span class="br0">&#
91;</span><span class="br0">&#91;</span>v<span class="br0">&#93;</span><span cla
ss="br0">&#93;</span><br /> <span class="sy0">|</span> x<span class="sy0">::</s
pan>xs <span class="kw1">as</span> li <span class="sy0">-&gt;</span> <span class
="br0">&#40;</span>v<span class="sy0">::</span>li<span class="br0">&#41;</span>
<span class="sy0">::</span> <span class="br0">&#40;</span><a href="http://caml.i
nria.fr/pub/docs/manual-ocaml/libref/List.html"><span class="kw2">List</span></a
><span class="sy0">.</span>map <span class="br0">&#40;</span><span class="kw1">f
un</span> y <span class="sy0">-&gt;</span> x<span class="sy0">::</span>y<span cl
ass="br0">&#41;</span> <span class="br0">&#40;</span>insert v xs<span class="br0
">&#41;</span><span class="br0">&#41;</span><br />&#160;<br /><span class="kw1">
let</span> permutations li <span class="sy0">=</span> <br /> <a href="http://ca
ml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span class="kw2">List</span
></a><span class="sy0">.</span>fold_right <span class="br0">&#40;</span><span cl
ass="kw1">fun</span> x z <span class="sy0">-&gt;</span> <a href="http://caml.inr
ia.fr/pub/docs/manual-ocaml/libref/List.html"><span class="kw2">List</span></a><
span class="sy0">.</span>concat <span class="br0">&#40;</span><a href="http://ca
ml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span class="kw2">List</span
></a><span class="sy0">.</span>map <span class="br0">&#40;</span>insert x<span c
lass="br0">&#41;</span> z<span class="br0">&#41;</span><span class="br0">&#41;</
span> li <span class="br0">&#91;</span><span class="br0">&#91;</span><span class

="br0">&#93;</span><span class="br0">&#93;</span><br />&#160;<br /><span class="


kw1">let</span> <span class="kw1">rec</span> comp expr <span class="sy0">=</span
> <span class="kw1">function</span><br /> <span class="sy0">|</span> x<span cla
ss="sy0">::</span>xs <span class="sy0">-&gt;</span><br />
comp <span class=
"br0">&#40;</span>Sum <span class="br0">&#40;</span>expr, x<span class="br0">&#4
1;</span><span class="br0">&#41;</span> xs<span class="sy0">;</span><br />
comp <span class="br0">&#40;</span>Diff<span class="br0">&#40;</span>expr, x<spa
n class="br0">&#41;</span><span class="br0">&#41;</span> xs<span class="sy0">;</
span><br />
comp <span class="br0">&#40;</span>Prod<span class="br0">&#40;<
/span>expr, x<span class="br0">&#41;</span><span class="br0">&#41;</span> xs<spa
n class="sy0">;</span><br />
comp <span class="br0">&#40;</span>Quot<span c
lass="br0">&#40;</span>expr, x<span class="br0">&#41;</span><span class="br0">&#
41;</span> xs<span class="sy0">;</span><br /> <span class="sy0">|</span> <span
class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">-&gt;</
span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span>eval
expr<span class="br0">&#41;</span> <span class="sy0">=</span> <span class="nu0">
24.0</span><br />
<span class="kw1">then</span> <span class="br0">&#40;</sp
an>print_expr expr<span class="sy0">;</span> <a href="http://caml.inria.fr/pub/d
ocs/manual-ocaml/libref/Pervasives.html#VALprint_newline"><span class="kw3">prin
t_newline</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span><br /><span class="sy0">;;</span><br />&#160;<br /
><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#
41;</span> <span class="sy0">=</span><br /> <a href="http://caml.inria.fr/pub/d
ocs/manual-ocaml/libref/Random.html"><span class="kw2">Random</span></a><span cl
ass="sy0">.</span>self_init<span class="br0">&#40;</span><span class="br0">&#41;
</span><span class="sy0">;</span><br /> <span class="kw1">let</span> digits <sp
an class="sy0">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libr
ef/Array.html"><span class="kw2">Array</span></a><span class="sy0">.</span>init
<span class="nu0">4</span> <span class="br0">&#40;</span><span class="kw1">fun</
span> _ <span class="sy0">-&gt;</span> <span class="nu0">1</span> <span class="s
y0">+</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Random.h
tml"><span class="kw2">Random</span></a><span class="sy0">.</span><a href="http:
//caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#TYPEint"><span clas
s="kw4">int</span></a> <span class="nu0">9</span><span class="br0">&#41;</span>
<span class="kw1">in</span><br /> <a href="http://caml.inria.fr/pub/docs/manual
-ocaml/libref/Pervasives.html#VALprint_string"><span class="kw3">print_string</s
pan></a> <span class="st0">&quot;Input digits: &quot;</span><span class="sy0">;<
/span><br /> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Array.h
tml"><span class="kw2">Array</span></a><span class="sy0">.</span>iter <span clas
s="br0">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/P
rintf.html"><span class="kw2">Printf</span></a><span class="sy0">.</span>printf
<span class="st0">&quot;&#160;%d&quot;</span><span class="br0">&#41;</span> digi
ts<span class="sy0">;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml
/libref/Pervasives.html#VALprint_newline"><span class="kw3">print_newline</span>
</a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0
">;</span><br /> <span class="kw1">let</span> digits <span class="sy0">=</span>
<a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Array.html"><span cl
ass="kw2">Array</span></a><span class="sy0">.</span>to_list<span class="br0">&#4
0;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Array.html">
<span class="kw2">Array</span></a><span class="sy0">.</span>map <a href="http://
caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat_of_int"><spa
n class="kw3">float_of_int</span></a> digits<span class="br0">&#41;</span> <span
class="kw1">in</span><br /> <span class="kw1">let</span> digits <span class="s
y0">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.htm
l"><span class="kw2">List</span></a><span class="sy0">.</span>map <span class="b
r0">&#40;</span><span class="kw1">fun</span> v <span class="sy0">-&gt;</span> Co
nst v<span class="br0">&#41;</span> digits <span class="kw1">in</span><br /> <s
pan class="kw1">let</span> all <span class="sy0">=</span> permutations digits <s
pan class="kw1">in</span><br /> <a href="http://caml.inria.fr/pub/docs/manual-o
caml/libref/List.html"><span class="kw2">List</span></a><span class="sy0">.</spa

n>iter <span class="br0">&#40;</span><span class="kw1">function</span><br />


<span class="sy0">|</span> x<span class="sy0">::</span>xs <span class="sy0">-&gt
;</span> comp x xs<br />
<span class="sy0">|</span> <span class="br0">&#91;</
span><span class="br0">&#93;</span> <span class="sy0">-&gt;</span> assert <span
class="kw1">false</span><br /> <span class="br0">&#41;</span> all</pre>
<pre>
Input digits: 5 7 4 1
7 * 4 - 5 + 1
7 * 4 + 1 - 5
4 * 7 - 5 + 1
4 * 7 + 1 - 5
(5 - 1) * 7 - 4
</pre>
<p>(notice that the printer only puts parenthesis when needed)
</p>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=30" title="Edit section: Perl">edit</a>]</span> <span clas
s="mw-headline" id="Perl"><a href="/wiki/Category:Perl" title="Category:Perl">Pe
rl</a></span></h2>
<p>Will generate all possible solutions of any given four numbers according to t
he rules of the <a href="/wiki/24_game" title="24 game">24 game</a>.
</p><p>Note: the <code>permute</code> function was taken from <a rel="nofollow"
class="external text" href="http://faq.perl.org/perlfaq4.html#How_do_I_permute_N
_e">here</a>
</p>
<pre class="perl highlighted_source"><span class="co1"># Fischer-Krause ordered
permutation generator</span><br /><span class="co1"># http://faq.perl.org/perlfa
q4.html#How_do_I_permute_N_e</span><br /><span class="kw2">sub</span> permute <s
pan class="br0">&#40;</span><span class="sy0">&amp;@</span><span class="br0">&#4
1;</span> <span class="br0">&#123;</span><br />
<span class="kw1">my</sp
an> <span class="re0">$code</span> <span class="sy0">=</span> <a href="http://pe
rldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span cla
ss="sy0">;</span><br />
<span class="kw1">my</span> <span class="re0">@i
dx</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0"
>..</span><span class="re0">$#_</span><span class="sy0">;</span><br />
<span class="kw1">while</span> <span class="br0">&#40;</span> <span class="re0">
$code</span><span class="sy0">-&gt;</span><span class="br0">&#40;</span><span cl
ass="co5">@_</span><span class="br0">&#91;</span><span class="re0">@idx</span><s
pan class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#4
1;</span> <span class="br0">&#123;</span><br />
<span class="kw1
">my</span> <span class="re0">$p</span> <span class="sy0">=</span> <span class="
re0">$#idx</span><span class="sy0">;</span><br />
<span cl
ass="sy0">--</span><span class="re0">$p</span> <span class="kw1">while</span> <s
pan class="re0">$idx</span><span class="br0">&#91;</span><span class="re0">$p</s
pan><span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#93;<
/span> <span class="sy0">&gt;</span> <span class="re0">$idx</span><span class="b
r0">&#91;</span><span class="re0">$p</span><span class="br0">&#93;</span><span c
lass="sy0">;</span><br />
<span class="kw1">my</span> <spa
n class="re0">$q</span> <span class="sy0">=</span> <span class="re0">$p</span> <
span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/return.htm
l"><span class="kw3">return</span></a><span class="sy0">;</span><br />
<a href="http://perldoc.perl.org/functions/push.html"><span class="kw3">push</sp
an></a> <span class="re0">@idx</span><span class="sy0">,</span> <a href="http://
perldoc.perl.org/functions/reverse.html"><span class="kw3">reverse</span></a> <a
href="http://perldoc.perl.org/functions/splice.html"><span class="kw3">splice</
span></a> <span class="re0">@idx</span><span class="sy0">,</span> <span class="r
e0">$p</span><span class="sy0">;</span><br />
<span class="sy0
">++</span><span class="re0">$q</span> <span class="kw1">while</span> <span clas
s="re0">$idx</span><span class="br0">&#91;</span><span class="re0">$p</span><spa
n class="sy0">-</span><span class="nu0">1</span><span class="br0">&#93;</span> <

span class="sy0">&gt;</span> <span class="re0">$idx</span><span class="br0">&#91


;</span><span class="re0">$q</span><span class="br0">&#93;</span><span class="sy
0">;</span><br />
<span class="re0">@idx</span><span class
="br0">&#91;</span><span class="re0">$p</span><span class="sy0">-</span><span cl
ass="nu0">1</span><span class="sy0">,</span><span class="re0">$q</span><span cla
ss="br0">&#93;</span><span class="sy0">=</span><span class="re0">@idx</span><spa
n class="br0">&#91;</span><span class="re0">$q</span><span class="sy0">,</span><
span class="re0">$p</span><span class="sy0">-</span><span class="nu0">1</span><s
pan class="br0">&#93;</span><span class="sy0">;</span><br />
<span cl
ass="br0">&#125;</span><br /> <span class="br0">&#125;</span><br />&#160;<br /
><span class="re0">@formats</span> <span class="sy0">=</span> <span class="br0">
&#40;</span><br />
<span class="st_h">'((%d&#160;%s&#160;%d)&#160;%s&#160;%
d)&#160;%s&#160;%d'</span><span class="sy0">,</span><br />
<span class="st_
h">'(%d&#160;%s (%d&#160;%s&#160;%d))&#160;%s&#160;%d'</span><span class="sy0">,
</span><br /> <span class="st_h">'(%d&#160;%s&#160;%d)&#160;%s (%d&#160;%s&#16
0;%d)'</span><span class="sy0">,</span><br /> <span class="st_h">'%d&#160;%s (
(%d&#160;%s&#160;%d)&#160;%s&#160;%d)'</span><span class="sy0">,</span><br />
<span class="st_h">'%d&#160;%s (%d&#160;%s (%d&#160;%s&#160;%d))'</span><span cl
ass="sy0">,</span><br />
<span class="br0">&#41;</span><span class="sy0">
;</span><br />&#160;<br /><span class="co1"># generate all possible combinations
of operators</span><br /><span class="re0">@op</span> <span class="sy0">=</span
> <a href="http://perldoc.perl.org/functions/qw.html"><span class="kw3">qw</span
></a><span class="br0">&#40;</span> <span class="sy0">+</span> <span class="sy0"
>-</span> <span class="sy0">*</span> <span class="sy0">/</span> <span class="br0
">&#41;</span><span class="sy0">;</span><br /><span class="re0">@operators</span
> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/map.html
"><span class="kw3">map</span></a><span class="br0">&#123;</span> <span class="r
e0">$a</span><span class="sy0">=</span><span class="co5">$_</span><span class="s
y0">;</span> <a href="http://perldoc.perl.org/functions/map.html"><span class="k
w3">map</span></a><span class="br0">&#123;</span> <span class="re0">$b</span><sp
an class="sy0">=</span><span class="co5">$_</span><span class="sy0">;</span> <a
href="http://perldoc.perl.org/functions/map.html"><span class="kw3">map</span></
a><span class="br0">&#123;</span> <span class="st0">&quot;$a $b $_&quot;</span>
<span class="br0">&#125;</span><span class="re0">@op</span> <span class="br0">&#
125;</span><span class="re0">@op</span> <span class="br0">&#125;</span><span cla
ss="re0">@op</span><span class="sy0">;</span><br />&#160;<br /><span class="kw1"
>while</span><span class="br0">&#40;</span><span class="nu0">1</span><span class
="br0">&#41;</span><br /><span class="br0">&#123;</span><br /> <a href="http://
perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span
class="st0">&quot;Enter four integers or 'q' to exit: &quot;</span><span class="
sy0">;</span><br />
<a href="http://perldoc.perl.org/functions/chomp.html"><
span class="kw3">chomp</span></a><span class="br0">&#40;</span><span class="re0"
>$ent</span> <span class="sy0">=</span> <span class="sy0">&lt;&gt;</span><span c
lass="br0">&#41;</span><span class="sy0">;</span><br /> <span class="kw1">last</
span> <span class="kw1">if</span> <span class="re0">$ent</span> <span class="kw1
">eq</span> <span class="st_h">'q'</span><span class="sy0">;</span><br />&#160;<
br />&#160;<br />
<span class="kw1">if</span><span class="br0">&#40;</span
><span class="re0">$ent</span> <span class="sy0">!~</span> <span class="co2">/^[
1-9] [1-9] [1-9] [1-9]$/</span><span class="br0">&#41;</span><span class="br0">&
#123;</span> <a href="http://perldoc.perl.org/functions/print.html"><span class=
"kw3">print</span></a> <span class="st0">&quot;invalid input<span class="es0">\n
</span>&quot;</span><span class="sy0">;</span> <span class="kw1">next</span> <sp
an class="br0">&#125;</span><br />&#160;<br /> <span class="re0">@n</span> <spa
n class="sy0">=</span> <a href="http://perldoc.perl.org/functions/split.html"><s
pan class="kw3">split</span></a> <span class="co2">/ /</span><span class="sy0">,
</span><span class="re0">$ent</span><span class="sy0">;</span><br />
permute
<span class="br0">&#123;</span> <a href="http://perldoc.perl.org/functions/push.
html"><span class="kw3">push</span></a> <span class="re0">@numbers</span><span c
lass="sy0">,</span><a href="http://perldoc.perl.org/functions/join.html"><span c
lass="kw3">join</span></a> <span class="st_h">' '</span><span class="sy0">,</spa

n><span class="co5">@_</span> <span class="br0">&#125;</span><span class="re0">@


n</span><span class="sy0">;</span><br />&#160;<br />
<span class="kw1">for</s
pan> <span class="re0">$format</span> <span class="br0">&#40;</span><span class=
"re0">@formats</span><span class="br0">&#41;</span><br />
<span class="br0
">&#123;</span><br />
<span class="kw1">for</span><span class="br0">&#
40;</span><span class="re0">@numbers</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
<span class="re0">@n</sp
an> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/split.
html"><span class="kw3">split</span></a><span class="sy0">;</span><br />
<span class="kw1">for</span><span class="br0">&#40;</span><span class="re0">@ope
rators</span><span class="br0">&#41;</span><br />
<span cl
ass="br0">&#123;</span><br />
<span class="re0">@o</sp
an> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/split.
html"><span class="kw3">split</span></a><span class="sy0">;</span><br />
<span class="re0">$str</span> <span class="sy0">=</span> <a href="http://perldoc
.perl.org/functions/sprintf.html"><span class="kw3">sprintf</span></a> <span cla
ss="re0">$format</span><span class="sy0">,</span><span class="re0">$n</span><spa
n class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</spa
n><span class="sy0">,</span><span class="re0">$o</span><span class="br0">&#91;</
span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,
</span><span class="re0">$n</span><span class="br0">&#91;</span><span class="nu0
">1</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="r
e0">$o</span><span class="br0">&#91;</span><span class="nu0">1</span><span class
="br0">&#93;</span><span class="sy0">,</span><span class="re0">$n</span><span cl
ass="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><s
pan class="sy0">,</span><span class="re0">$o</span><span class="br0">&#91;</span
><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</sp
an><span class="re0">$n</span><span class="br0">&#91;</span><span class="nu0">3<
/span><span class="br0">&#93;</span><span class="sy0">;</span><br />
<span class="re0">$r</span> <span class="sy0">=</span> <a href="http://perldoc.p
erl.org/functions/eval.html"><span class="kw3">eval</span></a><span class="br0">
&#40;</span><span class="re0">$str</span><span class="br0">&#41;</span><span cla
ss="sy0">;</span><br />
<a href="http://perldoc.perl.org
/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quo
t;$str<span class="es0">\n</span>&quot;</span> <span class="kw1">if</span> <span
class="re0">$r</span> <span class="sy0">==</span> <span class="nu0">24</span><s
pan class="sy0">;</span><br />
<span class="br0">&#125;</span><
br />
<span class="br0">&#125;</span><br /> <span class="br0">&#125;
</span><br /><span class="br0">&#125;</span></pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>E:\Temp&gt;24solve.pl
Enter four integers or 'q' to exit: 1 3 3 8
((1 + 8) * 3) - 3
((1 + 8) * 3) - 3
((8 + 1) * 3) - 3
((8 - 1) * 3) + 3
((8 + 1) * 3) - 3
((8 - 1) * 3) + 3
(3 * (1 + 8)) - 3
(3 * (8 + 1)) - 3
(3 * (8 - 1)) + 3
(3 * (1 + 8)) - 3
(3 * (8 + 1)) - 3
(3 * (8 - 1)) + 3
3 - ((1 - 8) * 3)
3 + ((8 - 1) * 3)
3 - ((1 - 8) * 3)
3 + ((8 - 1) * 3)

3 - (3 * (1 - 8))
3 + (3 * (8 - 1))
3 - (3 * (1 - 8))
3 + (3 * (8 - 1))
Enter four integers or 'q' to exit: q
E:\Temp&gt;</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=31" title="Edit section: Perl 6">edit</a>]</span> <span cl
ass="mw-headline" id="Perl_6"><a href="/wiki/Category:Perl_6" title="Category:Pe
rl 6">Perl 6</a></span></h2>
<p>A loose translation of the Perl entry. Does not return every possible permuta
tion of the possible solutions. Filters out duplicates (from repeated digits) an
d only reports the solution for a particular order of digits and operators with
the fewest parenthesis (avoids reporting duplicate solutions only differing by u
nnecessary parenthesis).
</p><p>Since Perl 6 uses Rational numbers for division (whenever possible) there
is no loss of precision as is common with floating point division. So a compari
son like (1 + 7) / (1 / 3) == 24 "Just Works"<sup>&#8482;</sup>
</p>
<pre class="perl6 highlighted_source"><span class="kw1">my</span> <span class="r
e0">@digits</span><span class="sy0">;</span><br /><span class="kw1">my</span> <s
pan class="re0">$amount</span> <span class="sy0">=</span> <span class="nu0">4</s
pan><span class="sy0">;</span><br />&#160;<br /><span class="co1"># Get $amount
digits from the user,</span><br /><span class="co1"># ask for more if they don't
supply enough</span><br /><span class="kw1">while</span> <span class="re0">@dig
its</span><span class="sy0">.</span><span class="kw3">elems</span> <span class="
sy0">&lt;</span> <span class="re0">$amount</span> <span class="br0">&#123;</span
><br />
<span class="re0">@digits</span> <span class="sy0">,=</span> <span cl
ass="br0">&#40;</span>prompt <span class="st0">&quot;Enter {$amount - @digits} d
igits from 1 to 9, &quot;</span><br />
<span class="sy0">~</span> <span class
="st_h">'(repeats allowed): '</span><span class="br0">&#41;</span><span class="s
y0">.</span><span class="kw3">comb</span><span class="br0">&#40;</span><span cla
ss="co2">/&lt;[1..9]&gt;/</span><span class="br0">&#41;</span><span class="sy0">
;</span><br /><span class="br0">&#125;</span><br /><span class="co1"># Throw awa
y any extras</span><br /><span class="re0">@digits</span> <span class="sy0">=</s
pan> <span class="re0">@digits</span><span class="br0">&#91;</span><span class="
sy0">^</span><span class="re0">$amount</span><span class="br0">&#93;</span><span
class="sy0">;</span><br />&#160;<br /><span class="co1"># Generate combinations
of operators</span><br /><span class="kw1">my</span> <span class="re0">@op</spa
n> <span class="sy0">=</span> <span class="sy0">&lt;+</span> <span class="sy0"></span> <span class="sy0">*</span> <span class="sy0">/&gt;;</span><br /><span cl
ass="kw1">my</span> <span class="re0">@ops</span> <span class="sy0">=</span> <sp
an class="kw3">map</span> <span class="br0">&#123;</span><span class="kw1">my</s
pan> <span class="re0">$a</span> <span class="sy0">=</span> <span class="re0">$_
</span><span class="sy0">;</span> <span class="kw3">map</span> <span class="br0"
>&#123;</span><span class="kw1">my</span> <span class="re0">$b</span> <span clas
s="sy0">=</span> <span class="re0">$_</span><span class="sy0">;</span> <span cla
ss="kw3">map</span> <span class="br0">&#123;</span><span class="br0">&#91;</span
><span class="re0">$a</span><span class="sy0">,</span><span class="re0">$b</span
><span class="sy0">,</span><span class="re0">$_</span><span class="br0">&#93;</s
pan><span class="br0">&#125;</span><span class="sy0">,</span> <span class="re0">
@op</span><span class="br0">&#125;</span><span class="sy0">,</span> <span class=
"re0">@op</span><span class="br0">&#125;</span><span class="sy0">,</span> <span
class="re0">@op</span><span class="sy0">;</span><br />&#160;<br /><span class="c
o1"># Enough sprintf formats to cover most precedence orderings</span><br /><spa
n class="kw1">my</span> <span class="re0">@formats</span> <span class="sy0">=</s
pan> <span class="br0">&#40;</span><br />
<span class="st_h">'%d&#160;%s&#160
;%d&#160;%s&#160;%d&#160;%s&#160;%d'</span><span class="sy0">,</span><br />
<
span class="st_h">'(%d&#160;%s&#160;%d)&#160;%s&#160;%d&#160;%s&#160;%d'</span><

span class="sy0">,</span><br />


<span class="st_h">'(%d&#160;%s&#160;%d&#160;
%s&#160;%d)&#160;%s&#160;%d'</span><span class="sy0">,</span><br />
<span cla
ss="st_h">'((%d&#160;%s&#160;%d)&#160;%s&#160;%d)&#160;%s&#160;%d'</span><span c
lass="sy0">,</span><br />
<span class="st_h">'(%d&#160;%s&#160;%d)&#160;%s (%
d&#160;%s&#160;%d)'</span><span class="sy0">,</span><br />
<span class="st_h"
>'%d&#160;%s (%d&#160;%s&#160;%d&#160;%s&#160;%d)'</span><span class="sy0">,</sp
an><br />
<span class="st_h">'%d&#160;%s (%d&#160;%s (%d&#160;%s&#160;%d))'</
span><span class="sy0">,</span><br /><span class="br0">&#41;</span><span class="
sy0">;</span><br />&#160;<br /><span class="co1"># Brute force test the differen
t permutations</span><br /><span class="kw1">for</span> unique permutations <spa
n class="re0">@digits</span> <span class="sy0">-&gt;</span> <span class="re0">@p
</span> <span class="br0">&#123;</span><br />
<span class="kw1">for</span> <s
pan class="re0">@ops</span> <span class="sy0">-&gt;</span> <span class="re0">@o<
/span> <span class="br0">&#123;</span><br />
<span class="kw1">for</span>
<span class="re0">@formats</span> <span class="sy0">-&gt;</span> <span class="r
e0">$format</span> <span class="br0">&#123;</span><br />
<span class=
"kw1">my</span> <span class="re0">$string</span> <span class="sy0">=</span> <spa
n class="kw3">sprintf</span> <span class="re0">$format</span><span class="sy0">,
</span> <span class="re0">@p</span><span class="br0">&#91;</span><span class="nu
0">0</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class=
"re0">@o</span><span class="br0">&#91;</span><span class="nu0">0</span><span cla
ss="br0">&#93;</span><span class="sy0">,</span><br />
<span
class="re0">@p</span><span class="br0">&#91;</span><span class="nu0">1</span><sp
an class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">@o</span
><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;
</span><span class="sy0">,</span> <span class="re0">@p</span><span class="br0">&
#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="
sy0">,</span> <span class="re0">@o</span><span class="br0">&#91;</span><span cla
ss="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</span> <span
class="re0">@p</span><span class="br0">&#91;</span><span class="nu0">3</span><sp
an class="br0">&#93;</span><span class="sy0">;</span><br />
<span cla
ss="kw1">my</span> <span class="re0">$result</span> <span class="sy0">=</span> t
ry <span class="br0">&#123;</span> EVAL<span class="br0">&#40;</span><span class
="re0">$string</span><span class="br0">&#41;</span> <span class="br0">&#125;</sp
an><span class="sy0">;</span><br />
<span class="kw3">say</span> <spa
n class="st0">&quot;$string = 24&quot;</span> <span class="kw1">and</span> <span
class="kw1">last</span> <span class="kw1">if</span> <span class="re0">$result</
span> <span class="kw1">and</span> <span class="re0">$result</span> <span class=
"sy0">==</span> <span class="nu0">24</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br /
><span class="br0">&#125;</span><br />&#160;<br /><span class="co1"># Perl 6 tra
nslation of Fischer-Krause ordered permutation algorithm</span><br /><span class
="kw2">sub</span> permutations <span class="br0">&#40;</span><span class="re0">@
array</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw1">my</span> <span class="sy0">@</span><span class="kw3">inde
x</span> <span class="sy0">=</span> <span class="sy0">^</span><span class="re0">
@array</span><span class="sy0">;</span><br />
<span class="kw1">my</span> <sp
an class="re0">$last</span> <span class="sy0">=</span> <span class="sy0">@</span
><span class="kw3">index</span><span class="br0">&#91;</span><span class="sy0">*
-</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0
">;</span><br />
<span class="kw1">my</span> <span class="br0">&#40;</span><s
pan class="re0">@permutations</span><span class="sy0">,</span> <span class="re0"
>$rev</span><span class="sy0">,</span> <span class="re0">$fwd</span><span class=
"br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">loop</sp
an> <span class="br0">&#123;</span><br />
<span class="kw3">push</span> <
span class="re0">@permutations</span><span class="sy0">,</span> <span class="br0
">&#91;</span><span class="re0">@array</span><span class="br0">&#91;</span><span
class="sy0">@</span><span class="kw3">index</span><span class="br0">&#93;</span
><span class="br0">&#93;</span><span class="sy0">;</span><br />
<span cla
ss="re0">$rev</span> <span class="sy0">=</span> <span class="re0">$last</span><s

pan class="sy0">;</span><br />


<span class="sy0">--</span><span class="re
0">$rev</span> <span class="kw1">while</span> <span class="re0">$rev</span> <spa
n class="kw1">and</span> <span class="sy0">@</span><span class="kw3">index</span
><span class="br0">&#91;</span><span class="re0">$rev</span><span class="sy0">-<
/span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="sy0"
>&gt;</span> <span class="sy0">@</span><span class="kw3">index</span><span class
="br0">&#91;</span><span class="re0">$rev</span><span class="br0">&#93;</span><s
pan class="sy0">;</span><br />
<span class="kw1">return</span> <span clas
s="re0">@permutations</span> <span class="kw1">unless</span> <span class="re0">$
rev</span><span class="sy0">;</span><br />
<span class="re0">$fwd</span>
<span class="sy0">=</span> <span class="re0">$rev</span><span class="sy0">;</spa
n><br />
<span class="kw3">push</span> <span class="sy0">@</span><span cl
ass="kw3">index</span><span class="sy0">,</span> <span class="sy0">@</span><span
class="kw3">index</span><span class="sy0">.</span><span class="kw3">splice</spa
n><span class="br0">&#40;</span><span class="re0">$rev</span><span class="br0">&
#41;</span><span class="sy0">.</span><span class="kw3">reverse</span><span class
="sy0">;</span><br /> <span class="sy0">++</span><span class="re0">$fwd</span>
<span class="kw1">while</span> <span class="sy0">@</span><span class="kw3">inde
x</span><span class="br0">&#91;</span><span class="re0">$rev</span><span class="
sy0">-</span><span class="nu0">1</span><span class="br0">&#93;</span> <span clas
s="sy0">&gt;</span> <span class="sy0">@</span><span class="kw3">index</span><spa
n class="br0">&#91;</span><span class="re0">$fwd</span><span class="br0">&#93;</
span><span class="sy0">;</span><br /> <span class="sy0">@</span><span class="k
w3">index</span><span class="br0">&#91;</span><span class="re0">$rev</span><span
class="sy0">-</span><span class="nu0">1</span><span class="sy0">,</span><span c
lass="re0">$fwd</span><span class="br0">&#93;</span> <span class="sy0">=</span>
<span class="sy0">@</span><span class="kw3">index</span><span class="br0">&#91;<
/span><span class="re0">$fwd</span><span class="sy0">,</span><span class="re0">$
rev</span><span class="sy0">-</span><span class="nu0">1</span><span class="br0">
&#93;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><
br /><span class="br0">&#125;</span><br />&#160;<br /><span class="co1"># Only r
eturn unique sub-arrays</span><br /><span class="kw2">sub</span> unique <span cl
ass="br0">&#40;</span><span class="re0">@array</span><span class="br0">&#41;</sp
an> <span class="br0">&#123;</span><br />
<span class="kw1">my</span> <span c
lass="re0">%h</span> <span class="sy0">=</span> <span class="kw3">map</span> <sp
an class="br0">&#123;</span> <span class="re0">$_</span><span class="sy0">.</spa
n><span class="me1">Str</span> <span class="sy0">=&gt;</span> <span class="re0">
$_</span> <span class="br0">&#125;</span><span class="sy0">,</span> <span class=
"re0">@array</span><span class="sy0">;</span><br />
<span class="re0">%h</spa
n><span class="sy0">.</span><span class="kw3">values</span><span class="sy0">;</
span><br /><span class="br0">&#125;</span><br />&#160;</pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>
Enter 4 digits from 1 to 9, (repeats allowed): 3711
3 * (7 + 1 * 1) = 24
3 * (7 + 1 / 1) = 24
3 * (7 * 1 + 1) = 24
3 * (7 / 1 + 1) = 24
(3 + 1) * (7 - 1) = 24
3 * (1 + 7 * 1) = 24
3 * (1 + 7 / 1) = 24
(3 * 1) * (7 + 1) = 24
(3 / 1) * (7 + 1) = 24
3 / (1 / (7 + 1)) = 24
3 * (1 + 1 * 7) = 24
(3 * 1) * (1 + 7) = 24
3 * (1 / 1 + 7) = 24
(3 / 1) * (1 + 7) = 24

3 / (1 / (1 + 7))
(7 + 1) * 3 * 1 =
(7 + 1) * 3 / 1 =
(7 - 1) * (3 + 1)
(7 + 1) * 1 * 3 =
(7 + 1) / 1 * 3 =
(7 + 1) / (1 / 3)
(7 - 1) * (1 + 3)
(7 * 1 + 1) * 3 =
(7 / 1 + 1) * 3 =
(1 + 3) * (7 - 1)
(1 * 3) * (7 + 1)
(1 * 3) * (1 + 7)
(1 + 7) * 3 * 1 =
(1 + 7) * 3 / 1 =
(1 + 7) * 1 * 3 =
(1 + 7) / 1 * 3 =
(1 + 7) / (1 / 3)
(1 * 7 + 1) * 3 =
(1 + 1 * 7) * 3 =
(1 * 1 + 7) * 3 =
(1 / 1 + 7) * 3 =

= 24
24
24
= 24
24
24
= 24
= 24
24
24
= 24
= 24
= 24
24
24
24
24
= 24
24
24
24
24

Enter 4 digits from 1 to 9, (repeats allowed): 5 5 5 5


5 * 5 - 5 / 5 = 24
Enter 4 digits from 1 to 9, (repeats allowed): 8833
8 / (3 - 8 / 3) = 24
</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=32" title="Edit section: Phix">edit</a>]</span> <span clas
s="mw-headline" id="Phix"><a href="/wiki/Category:Phix" title="Category:Phix">Ph
ix</a></span></h2>
<pre class="text highlighted_source">--<br />-- 24_game_solve.exw<br />-- ======
===========<br />--<br />-- Write a function that given four digits subject to t
he rules of the 24 game, computes an expression to solve the game if possible.<b
r />-- Show examples of solutions generated by the function<br />--<br />-- The
following 5 parse expressions are possible.<br />-- Obviously numbers 1234 repre
sent 24 permutations from <br />-- {1,2,3,4} to {4,3,2,1} of indexes to the rea
l numbers.<br />-- Likewise &quot;+-*&quot; is like &quot;123&quot; representing
64 combinations<br />-- from {1,1,1} to {4,4,4} of indexes to &quot;+-*/&quot;
.<br />-- Both will be replaced if/when the strings get printed.<br />--<br />co
nstant OPS = &quot;+-*/&quot;<br />constant expressions = {&quot;1+(2-(3*4))&quo
t;,<br />
&quot;1+((2-3)*4)&quot;,<br />
&quot;(1+2)-(3*4)&quot;,<br />
&quot;(1+(2-3))*4&q
uot;,<br />
&quot;((1+2)-3)*4&quot;} -- (equivalent to &
quot;1+2-3*4&quot;)<br />--TODO: I'm sure there is a simple (recursive) way to p
rogramatically<br />-generate the above (for n=2..9) but I'm not seeing i
t yet...<br />&#160;<br />-- The above represented as three sequential operation
s (the result gets <br />-- left in &lt;(map)1&gt;, ie vars[perms[operations[i]
[3][1]]] aka vars[lhs]):<br />constant operations = {{{3,'*',4},{2,'-',3},{1,'+'
,2}}, --3*=4; 2-=3; 1+=2<br />
{{2,'-',3},{2,'*',4},{1,'+'
,2}}, --2-=3; 2*=4; 1+=2<br />
{{1,'+',2},{3,'*',4},{1,'-'
,3}}, --1+=2; 3*=4; 1-=3<br />
{{2,'-',3},{1,'+',2},{1,'*'
,4}}, --2-=3; 1+=2; 1*=4<br />
{{1,'+',2},{1,'-',3},{1,'*'
,4}}} --1+=2; 1-=3; 1*=4<br />--TODO: ... and likewise for parsing &quot;express
ions&quot; to yield &quot;operations&quot;.<br />&#160;<br />function evalopset(
sequence opset, sequence perms, sequence ops, sequence vars)<br />-- invoked 5*2
4*64 = 7680 times, to try all possible expressions/vars/operators<br />-- (btw,
vars is copy-on-write, like all parameters not explicitly returned, so<br />--

we can safely re-use it without clobbering the callee version.)<br />intege


r lhs,op,rhs<br />atom inf<br />
for i=1 to length(opset) do<br />
{lh
s,op,rhs} = opset[i]<br />
lhs = perms[lhs]<br />
op = ops[find(op
,OPS)]<br />
rhs = perms[rhs]<br />
if op='+' then<br />
vars[lhs] += vars[rhs]<br />
elsif op='-' then<br />
vars[lh
s] -= vars[rhs]<br />
elsif op='*' then<br />
vars[lhs] *= var
s[rhs]<br />
elsif op='/' then<br />
if vars[rhs]=0 then inf =
1e300*1e300 return inf end if<br />
vars[lhs] /= vars[rhs]<br />
end if<br />
end for<br />
return vars[lhs]<br />end function<br />&#1
60;<br />integer nSolutions<br />sequence xSolutions<br />&#160;<br />procedure
success(string expr, sequence perms, sequence ops, sequence vars, atom r)<br />i
nteger ch<br />
for i=1 to length(expr) do<br />
ch = expr[i]<br />
if ch&gt;='1' and ch&lt;='9' then<br />
expr[i] = vars[perms[ch'0']]+'0'<br />
else<br />
ch = find(ch,OPS)<br />
if ch then<br />
expr[i] = ops[ch]<br />
end if<br />
end if<br />
end for<br />
if not find(expr,xSolutions) then<br />
-- avoid duplicates for eg {1,1,2,7} because this has found<br />
-- the &quot;same&quot; solution but with the 1st and 2nd 1s swapped,<br />
-- and likewise whenever an operator is used more than once.<br />
pri
ntf(1,&quot;success:&#160;%s =&#160;%s\n&quot;,{expr,sprint(r)})<br />
nS
olutions += 1<br />
xSolutions = append(xSolutions,expr)<br />
end if<
br />end procedure<br />&#160;<br />procedure tryperms(sequence perms, sequence
ops, sequence vars)<br />atom r<br />
for i=1 to length(operations) do<br />
-- 5 parse expressions<br />
r = evalopset(operations[i], perms, o
ps, vars)<br />
if r=24 then<br />
success(expressions[i], per
ms, ops, vars, r)<br />
end if<br />
end for<br />end procedure<br />&
#160;<br />include builtins/factorial.e<br />include builtins/permute.e<br />&#1
60;<br />procedure tryops(sequence ops, sequence vars)<br />
for p=1 to facto
rial(4) do<br />
-- 24 var permutations<br />
tryperms(permute(p,{
1,2,3,4}),ops, vars)<br />
end for<br />end procedure<br />&#160;<br />global
procedure solve24(sequence vars)<br />
nSolutions = 0<br />
xSolutions =
{}<br />
for op1=1 to 4 do<br />
for op2=1 to 4 do<br />
fo
r op3=1 to 4 do<br />
-- 64 operator combinations<br />
tryops({OPS[op1],OPS[op2],OPS[op3]},vars)<br />
end for<br />
end for<br />
end for<br />&#160;<br />
printf(1,&quot;\n%d solution
s\n&quot;,{nSolutions})<br />end procedure<br />&#160;<br />
solve24({1,1,2,7
})<br />
if getc(0) then end if</pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>
success: (1+2)*(7+1) = 24
success: (1+7)*(1+2) = 24
success: (1+2)*(1+7) = 24
success: (2+1)*(7+1) = 24
success: (7+1)*(1+2) = 24
success: (2+1)*(1+7) = 24
success: (1+7)*(2+1) = 24
success: (7+1)*(2+1) = 24
8 solutions
</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=33" title="Edit section: PicoLisp">edit</a>]</span> <span
class="mw-headline" id="PicoLisp"><a href="/wiki/Category:PicoLisp" title="Categ
ory:PicoLisp">PicoLisp</a></span></h2>
<p>We use Pilog (PicoLisp Prolog) to solve this task
</p>
<pre class="text highlighted_source">(be play24 (@Lst @Expr)
# De
fine Pilog rule<br /> (permute @Lst (@A @B @C @D))<br /> (member @Op1 (+ - *

/))<br /> (member @Op2 (+ - * /))<br /> (member @Op3 (+ - * /))<br /> (or
<br />
((equal @Expr (@Op1 (@Op2 @A @B) (@Op3 @C @D))))<br />
((equal
@Expr (@Op1 @A (@Op2 @B (@Op3 @C @D))))) )<br /> (^ @ (= 24 (catch '(&quot;Div
/0&quot;) (eval (-&gt; @Expr))))) )<br />&#160;<br />(de play24 (A B C D)
# Define PicoLisp function<br /> (pilog<br />
(quote<br />
@L (list A B C D)<br />
(play24 @L @X) )<br />
(println @X) )
)<br />&#160;<br />(play24 5 6 7 8)
# Call 'play24' funct
ion</pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>(* (+ 5 7) (- 8 6))
(* 6 (+ 5 (- 7 8)))
(* 6 (- 5 (- 8 7)))
(* 6 (- 5 (/ 8 7)))
(* 6 (+ 7 (- 5 8)))
(* 6 (- 7 (- 8 5)))
(* 6 (/ 8 (- 7 5)))
(/ (* 6 8) (- 7 5))
(* (+ 7 5) (- 8 6))
(* (- 8 6) (+ 5 7))
(* (- 8 6) (+ 7 5))
(* 8 (/ 6 (- 7 5)))
(/ (* 8 6) (- 7 5))</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=34" title="Edit section: ProDOS">edit</a>]</span> <span cl
ass="mw-headline" id="ProDOS"><a href="/wiki/Category:ProDOS" title="Category:Pr
oDOS">ProDOS</a></span></h2>
<p>Note
This example uses the math module:
</p>
<pre class="text highlighted_source">editvar /modify -random- = &lt;10<br />:a<b
r />editvar /newvar /withothervar /value=-random- /title=1<br />editvar /newvar
/withothervar /value=-random- /title=2<br />editvar /newvar /withothervar /value
=-random- /title=3<br />editvar /newvar /withothervar /value=-random- /title=4<b
r />printline These are your four digits: -1- -2- -3- -4-<br />printline Use an
algorithm to make the number 24.<br />editvar /newvar /value=a /userinput=1 /tit
le=Algorithm:<br />do -a-<br />if -a- /hasvalue 24 printline Your algorithm work
ed! &amp; goto&#160;:b (<br />) else printline Your algorithm did not work.<br /
>editvar /newvar /value=b /userinput=1 /title=Do you want to see how you could h
ave done it?<br />if -b- /hasvalue y goto&#160;:c else goto&#160;:b<br />:b <br
/>editvar /newvar /value=c /userinput=1 /title=Do you want to play again?<br />i
f -c- /hasvalue y goto&#160;:a else exitcurrentprogram<br />:c<br />editvar /new
var /value=do -1- + -2- + -3- + -4- /title=c &amp; do -c- &gt;d &amp; if -d- /ha
svalue 24 goto&#160;:solve<br />editvar /newvar /value=do -1- - -2- + -3- + -4/title=c &amp; do -c- &gt;d &amp; if -d- /hasvalue 24 goto&#160;:solve<br />edit
var /newvar /value=do -1- / -2- + -3- + -4- /title=c &amp; do -c- &gt;d &amp; if
-d- /hasvalue 24 goto&#160;:solve<br />editvar /newvar /value=do -1- * -2- + -3
- + -4- /title=c &amp; do -c- &gt;d &amp; if -d- /hasvalue 24 goto&#160;:solve<b
r />editvar /newvar /value=do -1- + -2- - -3- + -4- /title=c &amp; do -c- &gt;d
&amp; if -d- /hasvalue 24 goto&#160;:solve<br />editvar /newvar /value=do -1- +
-2- / -3- + -4- /title=c &amp; do -c- &gt;d &amp; if -d- /hasvalue 24 goto&#160;
:solve<br />editvar /newvar /value=do -1- + -2- * -3- + -4- /title=c &amp; do -c
- &gt;d &amp; if -d- /hasvalue 24 goto&#160;:solve<br />editvar /newvar /value=d
o -1- + -2- + -3- - -4- /title=c &amp; do -c- &gt;d &amp; if -d- /hasvalue 24 go
to&#160;:solve<br />editvar /newvar /value=do -1- + -2- + -3- / -4- /title=c &am
p; do -c- &gt;d &amp; if -d- /hasvalue 24 goto&#160;:solve<br />editvar /newvar
/value=do -1- + -2- + -3- * -4- /title=c &amp; do -c- &gt;d &amp; if -d- /hasval
ue 24 goto&#160;:solve<br />editvar /newvar /value=do -1- - -2- - -3- - -4- /tit
le=c &amp; do -c- &gt;d &amp; if -d- /hasvalue 24 goto&#160;:solve<br />editvar

/newvar /value=do -1- / -2- / -3- / -4- /title=c &amp; do -c- &gt;d &amp; if -d/hasvalue 24 goto&#160;:solve<br />editvar /newvar /value=do -1- * -2- * -3- *
-4- /title=c &amp; do -c- &gt;d &amp; if -d- /hasvalue 24 goto&#160;:solve<br />
:solve<br />printline you could have done it by doing -c-<br />stoptask<br />got
o&#160;:b</pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>These are your four digits: 1 4 5 2
Use an algorithm to make the number 24.
Algorithm: 4 + 2 - 5 + 1
Your algorithm did not work.
Do you want to play again? y
These are your four digits: 1 8 9 6
Use an algorithm to make the number 24.
Algorithm: 1 + 8 + 9 + 6
Your algorithm worked!
Do you want to play again? n</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=35" title="Edit section: Prolog">edit</a>]</span> <span cl
ass="mw-headline" id="Prolog"><a href="/wiki/Category:Prolog" title="Category:Pr
olog">Prolog</a></span></h2>
<p>Works with SWI-Prolog.<br />
The game is generic, you can choose to play with a goal different of 24,
any number of numbers in other ranges than 1 .. 9&#160;! <br />
rdiv/2 is use instead of //2 to enable the program to solve difficult cases as [
3 3 8 8].
</p>
<pre class="prolog highlighted_source">play24<span class="br0">&#40;</span>Len<s
pan class="sy4">,</span> Range<span class="sy4">,</span> Goal<span class="br0">&
#41;</span> <span class="sy1">:-</span><br /> game<span class="br0">&#40;</spa
n>Len<span class="sy4">,</span> Range<span class="sy4">,</span> Goal<span class=
"sy4">,</span> L<span class="sy4">,</span> S<span class="br0">&#41;</span><span
class="sy4">,</span><br />
maplist<span class="br0">&#40;</span>my_write<sp
an class="sy4">,</span> L<span class="br0">&#41;</span><span class="sy4">,</span
><br /> format<span class="br0">&#40;</span><span class="st_h">': ~w~n'</span><s
pan class="sy4">,</span> <span class="br0">&#91;</span>S<span class="br0">&#93;<
/span><span class="br0">&#41;</span><span class="sy4">.</span><br />&#160;<br />
game<span class="br0">&#40;</span>Len<span class="sy4">,</span> Range<span class
="sy4">,</span> Value<span class="sy4">,</span> L<span class="sy4">,</span> S<sp
an class="br0">&#41;</span> <span class="sy1">:-</span><br /> length<span clas
s="br0">&#40;</span>L<span class="sy4">,</span> Len<span class="br0">&#41;</span
><span class="sy4">,</span><br />
maplist<span class="br0">&#40;</span>cho
ose<span class="br0">&#40;</span>Range<span class="br0">&#41;</span><span class=
"sy4">,</span> L<span class="br0">&#41;</span><span class="sy4">,</span><br />
compute<span class="br0">&#40;</span>L<span class="sy4">,</span> Value<span clas
s="sy4">,</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><sp
an class="sy4">,</span> S<span class="br0">&#41;</span><span class="sy4">.</span
><br />&#160;<br />&#160;<br />choose<span class="br0">&#40;</span>Range<span cl
ass="sy4">,</span> V<span class="br0">&#41;</span> <span class="sy1">:-</span><b
r />
V <a href="http://pauillac.inria.fr/~deransar/prolog/bips.html"><span cl
ass="kw1">is</span></a> random<span class="br0">&#40;</span>Range<span class="br
0">&#41;</span> <span class="sy3">+</span> <span class="nu0">1</span><span class
="sy4">.</span><br />&#160;<br />&#160;<br />write_tree<span class="br0">&#40;</
span><span class="br0">&#91;</span>M<span class="br0">&#93;</span><span class="s
y4">,</span> <span class="br0">&#91;</span>M<span class="br0">&#93;</span><span
class="br0">&#41;</span><span class="sy4">.</span><br />&#160;<br />write_tree<s
pan class="br0">&#40;</span><span class="br0">&#91;</span><span class="sy3">+</s
pan><span class="sy4">,</span> M<span class="sy4">,</span> N<span class="br0">&#

93;</span><span class="sy4">,</span> S<span class="br0">&#41;</span> <span class


="sy1">:-</span><br /> write_tree<span class="br0">&#40;</span>M<span class="sy
4">,</span> MS<span class="br0">&#41;</span><span class="sy4">,</span><br />
write_tree<span class="br0">&#40;</span>N<span class="sy4">,</span> NS<span clas
s="br0">&#41;</span><span class="sy4">,</span><br />
append<span class="br0">
&#40;</span>MS<span class="sy4">,</span> <span class="br0">&#91;</span><span cla
ss="sy3">+</span> <span class="sy5">|</span> NS<span class="br0">&#93;</span><sp
an class="sy4">,</span> S<span class="br0">&#41;</span><span class="sy4">.</span
><br />&#160;<br />write_tree<span class="br0">&#40;</span><span class="br0">&#9
1;</span><span class="sy3">-</span><span class="sy4">,</span> M<span class="sy4"
>,</span> N<span class="br0">&#93;</span><span class="sy4">,</span> S<span class
="br0">&#41;</span> <span class="sy1">:-</span><br /> write_tree<span class="b
r0">&#40;</span>M<span class="sy4">,</span> MS<span class="br0">&#41;</span><spa
n class="sy4">,</span><br />
write_tree<span class="br0">&#40;</span>N<span c
lass="sy4">,</span> NS<span class="br0">&#41;</span><span class="sy4">,</span><b
r />
<span class="br0">&#40;</span> is_add<span class="br0">&#40;</span>N<s
pan class="br0">&#41;</span> <span class="sy3">-</span><span class="sy6">&gt;</s
pan> append<span class="br0">&#40;</span>MS<span class="sy4">,</span> <span clas
s="br0">&#91;</span><span class="sy3">-</span><span class="sy4">,</span> <span c
lass="st_h">'('</span> <span class="sy5">|</span> NS<span class="br0">&#93;</spa
n><span class="sy4">,</span> Temp<span class="br0">&#41;</span><span class="sy4"
>,</span> append<span class="br0">&#40;</span>Temp<span class="sy4">,</span> <sp
an class="st_h">')'</span><span class="sy4">,</span> S<span class="br0">&#41;</s
pan><br />
<span class="sy4">;</span> append<span class="br0">&#40;</span
>MS<span class="sy4">,</span> <span class="br0">&#91;</span><span class="sy3">-<
/span> <span class="sy5">|</span> NS<span class="br0">&#93;</span><span class="s
y4">,</span> S<span class="br0">&#41;</span><span class="br0">&#41;</span><span
class="sy4">.</span><br />&#160;<br />&#160;<br />write_tree<span class="br0">&#
40;</span><span class="br0">&#91;</span><a href="http://pauillac.inria.fr/~deran
sar/prolog/bips.html"><span class="kw1">Op</span></a><span class="sy4">,</span>
M<span class="sy4">,</span> N<span class="br0">&#93;</span><span class="sy4">,</
span> S<span class="br0">&#41;</span> <span class="sy1">:-</span><br /> member<s
pan class="br0">&#40;</span><a href="http://pauillac.inria.fr/~deransar/prolog/b
ips.html"><span class="kw1">Op</span></a><span class="sy4">,</span> <span class=
"br0">&#91;</span><span class="sy3">*</span><span class="sy4">,</span> <span cla
ss="sy3">/</span><span class="br0">&#93;</span><span class="br0">&#41;</span><sp
an class="sy4">,</span><br /> write_tree<span class="br0">&#40;</span>M<span c
lass="sy4">,</span> MS<span class="br0">&#41;</span><span class="sy4">,</span><b
r />
write_tree<span class="br0">&#40;</span>N<span class="sy4">,</span> NS<s
pan class="br0">&#41;</span><span class="sy4">,</span><br />
<span class="br0
">&#40;</span> is_add<span class="br0">&#40;</span>M<span class="br0">&#41;</s
pan> <span class="sy3">-</span><span class="sy6">&gt;</span> append<span class="
br0">&#40;</span><span class="br0">&#91;</span><span class="st_h">'('</span> <sp
an class="sy5">|</span> MS<span class="br0">&#93;</span><span class="sy4">,</spa
n> <span class="br0">&#91;</span><span class="st_h">')'</span><span class="br0">
&#93;</span><span class="sy4">,</span> TempM<span class="br0">&#41;</span><br />
<span class="sy4">;</span> TempM <span class="sy6">=</span> MS<span class="br0"
>&#41;</span><span class="sy4">,</span><br /> <span class="br0">&#40;</span>
is_add<span class="br0">&#40;</span>N<span class="br0">&#41;</span> <span class
="sy3">-</span><span class="sy6">&gt;</span> append<span class="br0">&#40;</span
><span class="br0">&#91;</span><span class="st_h">'('</span> <span class="sy5">|
</span> NS<span class="br0">&#93;</span><span class="sy4">,</span> <span class="
br0">&#91;</span><span class="st_h">')'</span><span class="br0">&#93;</span><spa
n class="sy4">,</span> TempN<span class="br0">&#41;</span><br />
<span cl
ass="sy4">;</span> TempN <span class="sy6">=</span> NS<span class="br0">&#41;<
/span><span class="sy4">,</span><br /> append<span class="br0">&#40;</span>Temp
M<span class="sy4">,</span> <span class="br0">&#91;</span><a href="http://pauill
ac.inria.fr/~deransar/prolog/bips.html"><span class="kw1">Op</span></a> <span cl
ass="sy5">|</span> TempN<span class="br0">&#93;</span><span class="sy4">,</span>
S<span class="br0">&#41;</span><span class="sy4">.</span><br />&#160;<br />is_a

dd<span class="br0">&#40;</span><span class="br0">&#91;</span><a href="http://pa


uillac.inria.fr/~deransar/prolog/bips.html"><span class="kw1">Op</span></a><span
class="sy4">,</span> _<span class="sy4">,</span> _<span class="br0">&#93;</span
><span class="br0">&#41;</span> <span class="sy1">:-</span><br />
member<s
pan class="br0">&#40;</span><a href="http://pauillac.inria.fr/~deransar/prolog/b
ips.html"><span class="kw1">Op</span></a><span class="sy4">,</span> <span class=
"br0">&#91;</span><span class="sy3">+</span><span class="sy4">,</span> <span cla
ss="sy3">-</span><span class="br0">&#93;</span><span class="br0">&#41;</span><sp
an class="sy4">.</span><br />&#160;<br />compute<span class="br0">&#40;</span><s
pan class="br0">&#91;</span>Value<span class="br0">&#93;</span><span class="sy4"
>,</span> Value<span class="sy4">,</span> <span class="br0">&#91;</span><span cl
ass="br0">&#91;</span>_R<span class="sy3">-</span>S1<span class="br0">&#93;</spa
n><span class="br0">&#93;</span><span class="sy4">,</span> S<span class="br0">&#
41;</span> <span class="sy1">:-</span><br />
write_tree<span class="br0">&#40
;</span>S1<span class="sy4">,</span> S2<span class="br0">&#41;</span><span class
="sy4">,</span><br /> with_output_to<span class="br0">&#40;</span><a href="htt
p://pauillac.inria.fr/~deransar/prolog/bips.html"><span class="kw1">atom</span><
/a><span class="br0">&#40;</span>S<span class="br0">&#41;</span><span class="sy4
">,</span> maplist<span class="br0">&#40;</span><a href="http://pauillac.inria.f
r/~deransar/prolog/bips.html"><span class="kw1">write</span></a><span class="sy4
">,</span> S2<span class="br0">&#41;</span><span class="br0">&#41;</span><span c
lass="sy4">.</span><br />&#160;<br />compute<span class="br0">&#40;</span>L<span
class="sy4">,</span> Value<span class="sy4">,</span> CS<span class="sy4">,</spa
n> S<span class="br0">&#41;</span> <span class="sy1">:-</span><br />
select<s
pan class="br0">&#40;</span>M<span class="sy4">,</span> L<span class="sy4">,</sp
an> L1<span class="br0">&#41;</span><span class="sy4">,</span><br />
select<s
pan class="br0">&#40;</span>N<span class="sy4">,</span> L1<span class="sy4">,</s
pan> L2<span class="br0">&#41;</span><span class="sy4">,</span><br /> next_val
ue<span class="br0">&#40;</span>M<span class="sy4">,</span> N<span class="sy4">,
</span> R<span class="sy4">,</span> CS<span class="sy4">,</span> Expr<span class
="br0">&#41;</span><span class="sy4">,</span><br />
compute<span class="br0"
>&#40;</span><span class="br0">&#91;</span>R<span class="sy5">|</span>L2<span cl
ass="br0">&#93;</span><span class="sy4">,</span> Value<span class="sy4">,</span>
Expr<span class="sy4">,</span> S<span class="br0">&#41;</span><span class="sy4"
>.</span><br />&#160;<br />next_value<span class="br0">&#40;</span>M<span class=
"sy4">,</span> N<span class="sy4">,</span> R<span class="sy4">,</span> CS<span c
lass="sy4">,</span><span class="br0">&#91;</span><span class="br0">&#91;</span>R
<span class="sy3">-</span> <span class="br0">&#91;</span><span class="sy3">+</s
pan><span class="sy4">,</span> M1<span class="sy4">,</span> N1<span class="br0">
&#93;</span><span class="br0">&#93;</span> <span class="sy5">|</span> CS2<span c
lass="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy1">:-</span
><br /> R <a href="http://pauillac.inria.fr/~deransar/prolog/bips.html"><span cl
ass="kw1">is</span></a> M<span class="sy3">+</span>N<span class="sy4">,</span><b
r />
<span class="br0">&#40;</span> member<span class="br0">&#40;</span><sp
an class="br0">&#91;</span>M<span class="sy3">-</span>ExprM<span class="br0">&#9
3;</span><span class="sy4">,</span> CS<span class="br0">&#41;</span> <span class
="sy3">-</span><span class="sy6">&gt;</span> select<span class="br0">&#40;</span
><span class="br0">&#91;</span>M<span class="sy3">-</span>ExprM<span class="br0"
>&#93;</span><span class="sy4">,</span> CS<span class="sy4">,</span> CS1<span cl
ass="br0">&#41;</span><span class="sy4">,</span> M1 <span class="sy6">=</span> E
xprM<br />
<span class="sy4">;</span> M1 <span class="sy6">=</span> <span
class="br0">&#91;</span>M<span class="br0">&#93;</span><span class="sy4">,</spa
n> CS1 <span class="sy6">=</span> CS<br />
<span class="br0">&#41;</span><s
pan class="sy4">,</span><br /> <span class="br0">&#40;</span> member<span cla
ss="br0">&#40;</span><span class="br0">&#91;</span>N<span class="sy3">-</span>Ex
prN<span class="br0">&#93;</span><span class="sy4">,</span> CS1<span class="br0"
>&#41;</span> <span class="sy3">-</span><span class="sy6">&gt;</span> select<spa
n class="br0">&#40;</span><span class="br0">&#91;</span>N<span class="sy3">-</sp
an>ExprN<span class="br0">&#93;</span><span class="sy4">,</span> CS1<span class=
"sy4">,</span> CS2<span class="br0">&#41;</span><span class="sy4">,</span> N1 <s

pan class="sy6">=</span> ExprN<br />


<span class="sy4">;</span> N1 <span cl
ass="sy6">=</span> <span class="br0">&#91;</span>N<span class="br0">&#93;</span>
<span class="sy4">,</span> CS2 <span class="sy6">=</span> CS1<br />
<span cl
ass="br0">&#41;</span><span class="sy4">.</span><br />&#160;<br />next_value<spa
n class="br0">&#40;</span>M<span class="sy4">,</span> N<span class="sy4">,</span
> R<span class="sy4">,</span> CS<span class="sy4">,</span><span class="br0">&#91
;</span><span class="br0">&#91;</span>R <span class="sy3">-</span> <span class="
br0">&#91;</span><span class="sy3">-</span><span class="sy4">,</span> M1<span cl
ass="sy4">,</span> N1<span class="br0">&#93;</span><span class="br0">&#93;</span
> <span class="sy5">|</span> CS2<span class="br0">&#93;</span><span class="br0">
&#41;</span> <span class="sy1">:-</span><br /> R <a href="http://pauillac.inria
.fr/~deransar/prolog/bips.html"><span class="kw1">is</span></a> M<span class="sy
3">-</span>N<span class="sy4">,</span><br />
<span class="br0">&#40;</span>
member<span class="br0">&#40;</span><span class="br0">&#91;</span>M<span class=
"sy3">-</span>ExprM<span class="br0">&#93;</span><span class="sy4">,</span> CS<s
pan class="br0">&#41;</span> <span class="sy3">-</span><span class="sy6">&gt;</s
pan> select<span class="br0">&#40;</span><span class="br0">&#91;</span>M<span cl
ass="sy3">-</span>ExprM<span class="br0">&#93;</span><span class="sy4">,</span>
CS<span class="sy4">,</span> CS1<span class="br0">&#41;</span><span class="sy4">
,</span> M1 <span class="sy6">=</span> ExprM<br />
<span class="sy4">;</spa
n> M1 <span class="sy6">=</span> <span class="br0">&#91;</span>M<span class="b
r0">&#93;</span><span class="sy4">,</span> CS1 <span class="sy6">=</span> CS<br
/>
<span class="br0">&#41;</span><span class="sy4">,</span><br /> <span cl
ass="br0">&#40;</span> member<span class="br0">&#40;</span><span class="br0">&
#91;</span>N<span class="sy3">-</span>ExprN<span class="br0">&#93;</span><span c
lass="sy4">,</span> CS1<span class="br0">&#41;</span> <span class="sy3">-</span>
<span class="sy6">&gt;</span> select<span class="br0">&#40;</span><span class="b
r0">&#91;</span>N<span class="sy3">-</span>ExprN<span class="br0">&#93;</span><s
pan class="sy4">,</span> CS1<span class="sy4">,</span> CS2<span class="br0">&#41
;</span><span class="sy4">,</span> N1 <span class="sy6">=</span> ExprN<br />
<span class="sy4">;</span> N1 <span class="sy6">=</span> <span class="br0">&#9
1;</span>N<span class="br0">&#93;</span><span class="sy4">,</span> CS2 <span cla
ss="sy6">=</span> CS1<br />
<span class="br0">&#41;</span><span class="sy4">
.</span><br />&#160;<br />next_value<span class="br0">&#40;</span>M<span class="
sy4">,</span> N<span class="sy4">,</span> R<span class="sy4">,</span> CS<span cl
ass="sy4">,</span><span class="br0">&#91;</span><span class="br0">&#91;</span>R
<span class="sy3">-</span> <span class="br0">&#91;</span><span class="sy3">*</sp
an><span class="sy4">,</span> M1<span class="sy4">,</span> N1<span class="br0">&
#93;</span><span class="br0">&#93;</span> <span class="sy5">|</span> CS2<span cl
ass="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy1">:-</span>
<br /> R <a href="http://pauillac.inria.fr/~deransar/prolog/bips.html"><span cl
ass="kw1">is</span></a> M<span class="sy3">*</span>N<span class="sy4">,</span><b
r />
<span class="br0">&#40;</span> member<span class="br0">&#40;</span><sp
an class="br0">&#91;</span>M<span class="sy3">-</span>ExprM<span class="br0">&#9
3;</span><span class="sy4">,</span> CS<span class="br0">&#41;</span> <span class
="sy3">-</span><span class="sy6">&gt;</span> select<span class="br0">&#40;</span
><span class="br0">&#91;</span>M<span class="sy3">-</span>ExprM<span class="br0"
>&#93;</span><span class="sy4">,</span> CS<span class="sy4">,</span> CS1<span cl
ass="br0">&#41;</span><span class="sy4">,</span> M1 <span class="sy6">=</span> E
xprM<br />
<span class="sy4">;</span> M1 <span class="sy6">=</span> <span
class="br0">&#91;</span>M<span class="br0">&#93;</span><span class="sy4">,</spa
n> CS1 <span class="sy6">=</span> CS<br />
<span class="br0">&#41;</span><s
pan class="sy4">,</span><br /> <span class="br0">&#40;</span> member<span cla
ss="br0">&#40;</span><span class="br0">&#91;</span>N<span class="sy3">-</span>Ex
prN<span class="br0">&#93;</span><span class="sy4">,</span> CS1<span class="br0"
>&#41;</span> <span class="sy3">-</span><span class="sy6">&gt;</span> select<spa
n class="br0">&#40;</span><span class="br0">&#91;</span>N<span class="sy3">-</sp
an>ExprN<span class="br0">&#93;</span><span class="sy4">,</span> CS1<span class=
"sy4">,</span> CS2<span class="br0">&#41;</span><span class="sy4">,</span> N1 <s
pan class="sy6">=</span> ExprN<br />
<span class="sy4">;</span> N1 <span cl

ass="sy6">=</span> <span class="br0">&#91;</span>N<span class="br0">&#93;</span>


<span class="sy4">,</span> CS2 <span class="sy6">=</span> CS1<br />
<span cl
ass="br0">&#41;</span><span class="sy4">.</span><br />&#160;<br />next_value<spa
n class="br0">&#40;</span>M<span class="sy4">,</span> N<span class="sy4">,</span
> R<span class="sy4">,</span> CS<span class="sy4">,</span><span class="br0">&#91
;</span><span class="br0">&#91;</span>R <span class="sy3">-</span> <span class="
br0">&#91;</span><span class="sy3">/</span><span class="sy4">,</span> M1<span cl
ass="sy4">,</span> N1<span class="br0">&#93;</span><span class="br0">&#93;</span
> <span class="sy5">|</span> CS2<span class="br0">&#93;</span><span class="br0">
&#41;</span> <span class="sy1">:-</span><br /> N \<span class="sy6">=</span> <s
pan class="nu0">0</span><span class="sy4">,</span><br />
R <a href="http:
//pauillac.inria.fr/~deransar/prolog/bips.html"><span class="kw1">is</span></a>
rdiv<span class="br0">&#40;</span>M<span class="sy4">,</span>N<span class="br0">
&#41;</span><span class="sy4">,</span><br />
<span class="br0">&#40;</span>
member<span class="br0">&#40;</span><span class="br0">&#91;</span>M<span class=
"sy3">-</span>ExprM<span class="br0">&#93;</span><span class="sy4">,</span> CS<s
pan class="br0">&#41;</span> <span class="sy3">-</span><span class="sy6">&gt;</s
pan> select<span class="br0">&#40;</span><span class="br0">&#91;</span>M<span cl
ass="sy3">-</span>ExprM<span class="br0">&#93;</span><span class="sy4">,</span>
CS<span class="sy4">,</span> CS1<span class="br0">&#41;</span><span class="sy4">
,</span> M1 <span class="sy6">=</span> ExprM<br />
<span class="sy4">;</spa
n> M1 <span class="sy6">=</span> <span class="br0">&#91;</span>M<span class="b
r0">&#93;</span><span class="sy4">,</span> CS1 <span class="sy6">=</span> CS<br
/>
<span class="br0">&#41;</span><span class="sy4">,</span><br /> <span cl
ass="br0">&#40;</span> member<span class="br0">&#40;</span><span class="br0">&
#91;</span>N<span class="sy3">-</span>ExprN<span class="br0">&#93;</span><span c
lass="sy4">,</span> CS1<span class="br0">&#41;</span> <span class="sy3">-</span>
<span class="sy6">&gt;</span> select<span class="br0">&#40;</span><span class="b
r0">&#91;</span>N<span class="sy3">-</span>ExprN<span class="br0">&#93;</span><s
pan class="sy4">,</span> CS1<span class="sy4">,</span> CS2<span class="br0">&#41
;</span><span class="sy4">,</span> N1 <span class="sy6">=</span> ExprN<br />
<span class="sy4">;</span> N1 <span class="sy6">=</span> <span class="br0">&#9
1;</span>N<span class="br0">&#93;</span><span class="sy4">,</span> CS2 <span cla
ss="sy6">=</span> CS1<br />
<span class="br0">&#41;</span><span class="sy4">
.</span><br />&#160;<br />my_write<span class="br0">&#40;</span>V<span class="br
0">&#41;</span> <span class="sy1">:-</span><br />
format<span class="br0">
&#40;</span><span class="st_h">'~w '</span><span class="sy4">,</span> <span clas
s="br0">&#91;</span>V<span class="br0">&#93;</span><span class="br0">&#41;</span
><span class="sy4">.</span></pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>?- play24(4,9, 24).
6 2 3 4&#160;: (6-2+4)*3
true&#160;;
6 2 3 4&#160;: 3*(6-2+4)
true&#160;;
6 2 3 4&#160;: (6-2+4)*3
true&#160;;
6 2 3 4&#160;: 3*(6-2+4)
true&#160;;
6 2 3 4&#160;: (6*2-4)*3
true&#160;;
6 2 3 4&#160;: 3*(6*2-4)
true&#160;;
6 2 3 4&#160;: 3*4+6*2
true&#160;;
6 2 3 4&#160;: 3*4+6*2
true&#160;;
6 2 3 4&#160;: 4*3+6*2

true&#160;;
6 2 3 4&#160;:
true&#160;;
6 2 3 4&#160;:
true&#160;;
6 2 3 4&#160;:
true&#160;;
6 2 3 4&#160;:
true&#160;;
6 2 3 4&#160;:
true&#160;;
6 2 3 4&#160;:
true&#160;;
6 2 3 4&#160;:
true&#160;;
6 2 3 4&#160;:
...

4*3+6*2
(6/2+3)*4
4*(6/2+3)
(6/2+3)*4
4*(6/2+3)
(6-3)*2*4
4*(6-3)*2
(6-3)*4*2

?- play24(7,99, 1).
66 40 2 76 95 59 12&#160;: (66+40)/2-76+95-59-12
true&#160;;
66 40 2 76 95 59 12&#160;: (66+40)/2-76+95-12-59
true&#160;;
66 40 2 76 95 59 12&#160;: (66+40)/2-76-59+95-12
true&#160;;
66 40 2 76 95 59 12&#160;: (66+40)/2-76-59-12+95
true&#160;;
66 40 2 76 95 59 12&#160;: 95+(66+40)/2-76-59-12
true&#160;;
66 40 2 76 95 59 12&#160;: 95+(66+40)/2-76-59-12
true&#160;;
66 40 2 76 95 59 12&#160;: 95-12+(66+40)/2-76-59
true&#160;;
66 40 2 76 95 59 12&#160;: (66+40)/2-76-59+95-12
....
</pre>
<h3><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=36" title="Edit section: Minimal version">edit</a>]</span>
<span class="mw-headline" id="Minimal_version">Minimal version</span></h3>
<div class="examplemeta workswith"><b>Works with</b>: <a href="/wiki/GNU_Prolog"
title="GNU Prolog">GNU Prolog</a> version 1.4.4</div>
<p>Little efforts to remove dublicates (e.g. output for [4,6,9,9]).
</p>
<pre class="prolog highlighted_source"><span class="sy1">:-</span> <a href="http
://pauillac.inria.fr/~deransar/prolog/bips.html"><span class="kw1">initializatio
n</span></a><span class="br0">&#40;</span>main<span class="br0">&#41;</span><spa
n class="sy4">.</span><br />&#160;<br />solve<span class="br0">&#40;</span>N<spa
n class="sy4">,</span>Xs<span class="sy4">,</span>Ast<span class="br0">&#41;</sp
an> <span class="sy1">:-</span><br />
Err <span class="sy6">=</span> evaluati
on_error<span class="br0">&#40;</span>zero_divisor<span class="br0">&#41;</span>
<br /> <span class="sy4">,</span> gen_ast<span class="br0">&#40;</span>Xs<span
class="sy4">,</span>Ast<span class="br0">&#41;</span><span class="sy4">,</span>
<a href="http://pauillac.inria.fr/~deransar/prolog/bips.html"><span class="kw1">
catch</span></a><span class="br0">&#40;</span>Ast <span class="sy1">=:=</span> N
<span class="sy4">,</span> error<span class="br0">&#40;</span>Err<span class="sy
4">,</span>_<span class="br0">&#41;</span><span class="sy4">,</span> <a href="ht
tp://pauillac.inria.fr/~deransar/prolog/bips.html"><span class="kw1">fail</span>
</a><span class="br0">&#41;</span><br /> <span class="sy4">.</span><br />&#160;
<br />gen_ast<span class="br0">&#40;</span><span class="br0">&#91;</span>N<span
class="br0">&#93;</span><span class="sy4">,</span>N<span class="br0">&#41;</span

> <span class="sy1">:-</span> between<span class="br0">&#40;</span><span class="


nu0">1</span><span class="sy4">,</span><span class="nu0">9</span><span class="sy
4">,</span>N<span class="br0">&#41;</span><span class="sy4">.</span><br />gen_as
t<span class="br0">&#40;</span>Xs<span class="sy4">,</span>Ast<span class="br0">
&#41;</span> <span class="sy1">:-</span><br />
Ys <span class="sy6">=</span>
<span class="br0">&#91;</span>_<span class="sy5">|</span>_<span class="br0">&#93
;</span><span class="sy4">,</span> Zs <span class="sy6">=</span> <span class="br
0">&#91;</span>_<span class="sy5">|</span>_<span class="br0">&#93;</span><span c
lass="sy4">,</span> split<span class="br0">&#40;</span>Xs<span class="sy4">,</sp
an>Ys<span class="sy4">,</span>Zs<span class="br0">&#41;</span><br /> <span cla
ss="sy4">,</span> <span class="br0">&#40;</span> member<span class="br0">&#40;</
span><a href="http://pauillac.inria.fr/~deransar/prolog/bips.html"><span class="
kw1">Op</span></a><span class="sy4">,</span> <span class="br0">&#91;</span><span
class="br0">&#40;</span><span class="sy3">+</span><span class="br0">&#41;</span
><span class="sy4">,</span><span class="br0">&#40;</span><span class="sy3">*</sp
an><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0"
>&#41;</span><span class="sy4">,</span> Ys <span class="sy5">@</span><span class
="sy6">=&lt;</span> Zs <span class="sy4">;</span> member<span class="br0">&#40;<
/span><a href="http://pauillac.inria.fr/~deransar/prolog/bips.html"><span class=
"kw1">Op</span></a><span class="sy4">,</span> <span class="br0">&#91;</span><spa
n class="br0">&#40;</span><span class="sy3">-</span><span class="br0">&#41;</spa
n><span class="sy4">,</span><span class="br0">&#40;</span><span class="sy3">//</
span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br
0">&#41;</span> <span class="br0">&#41;</span><br /> <span class="sy4">,</span>
gen_ast<span class="br0">&#40;</span>Ys<span class="sy4">,</span>A<span class="
br0">&#41;</span><span class="sy4">,</span> gen_ast<span class="br0">&#40;</span
>Zs<span class="sy4">,</span>B<span class="br0">&#41;</span><span class="sy4">,<
/span> Ast <span class="sy6">=</span><span class="sy4">..</span> <span class="br
0">&#91;</span><a href="http://pauillac.inria.fr/~deransar/prolog/bips.html"><sp
an class="kw1">Op</span></a><span class="sy4">,</span>A<span class="sy4">,</span
>B<span class="br0">&#93;</span><br /> <span class="sy4">.</span><br />&#160;<b
r />split<span class="br0">&#40;</span>Xs<span class="sy4">,</span>Ys<span class
="sy4">,</span>Zs<span class="br0">&#41;</span> <span class="sy1">:-</span> subl
ist<span class="br0">&#40;</span>Ys<span class="sy4">,</span>Xs<span class="br0"
>&#41;</span><span class="sy4">,</span> select_all<span class="br0">&#40;</span>
Ys<span class="sy4">,</span>Xs<span class="sy4">,</span>Zs<span class="br0">&#41
;</span><span class="sy4">.</span><br />
<span class="co1">% where</span><br
/>
select_all<span class="br0">&#40;</span><span class="br0">&#91;</span><spa
n class="br0">&#93;</span><span class="sy4">,</span>Xs<span class="sy4">,</span>
Xs<span class="br0">&#41;</span><span class="sy4">.</span><br />
select_all<s
pan class="br0">&#40;</span><span class="br0">&#91;</span>Y<span class="sy5">|</
span>Ys<span class="br0">&#93;</span><span class="sy4">,</span>Xs<span class="sy
4">,</span>Zs<span class="br0">&#41;</span> <span class="sy1">:-</span> select<s
pan class="br0">&#40;</span>Y<span class="sy4">,</span>Xs<span class="sy4">,</sp
an>X1<span class="br0">&#41;</span><span class="sy4">,</span> <span class="sy5">
!</span><span class="sy4">,</span> select_all<span class="br0">&#40;</span>Ys<sp
an class="sy4">,</span>X1<span class="sy4">,</span>Zs<span class="br0">&#41;</sp
an><span class="sy4">.</span><br />&#160;<br />&#160;<br />test<span class="br0"
>&#40;</span>T<span class="br0">&#41;</span> <span class="sy1">:-</span> solve<s
pan class="br0">&#40;</span><span class="nu0">24</span><span class="sy4">,</span
> <span class="br0">&#91;</span><span class="nu0">2</span><span class="sy4">,</s
pan><span class="nu0">3</span><span class="sy4">,</span><span class="nu0">8</spa
n><span class="sy4">,</span><span class="nu0">9</span><span class="br0">&#93;</s
pan><span class="sy4">,</span> T<span class="br0">&#41;</span><span class="sy4">
.</span><br />main <span class="sy1">:-</span> forall<span class="br0">&#40;</sp
an>test<span class="br0">&#40;</span>T<span class="br0">&#41;</span><span class=
"sy4">,</span> <span class="br0">&#40;</span><a href="http://pauillac.inria.fr/~
deransar/prolog/bips.html"><span class="kw1">write</span></a><span class="br0">&
#40;</span>T<span class="br0">&#41;</span><span class="sy4">,</span> <a href="ht
tp://pauillac.inria.fr/~deransar/prolog/bips.html"><span class="kw1">nl</span></

a><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">


,</span> <a href="http://pauillac.inria.fr/~deransar/prolog/bips.html"><span cla
ss="kw1">halt</span></a><span class="sy4">.</span></pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>(9-3)*8//2
3*8-2//9
(8+9)//2*3
(8-2//9)*3
(2//9+8)*3
(2+8*9)//3
2//9+3*8
8//2*(9-3)
(9-3)//2*8
(9-2*3)*8
(3-2//9)*8
(2//9+3)*8
(2+9)//3*8</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=37" title="Edit section: Python">edit</a>]</span> <span cl
ass="mw-headline" id="Python"><a href="/wiki/Category:Python" title="Category:Py
thon">Python</a></span></h2>
<p>The function is called <b>solve</b>, and is integrated into the game player.
The docstring of the solve function shows examples of its use when isolated at t
he Python command line.
</p>
<pre class="python highlighted_source"><span class="st0">'''<br /> The 24 Game P
layer<br />&#160;<br /> Given any four digits in the range 1 to 9, which may hav
e repetitions,<br /> Using just the +, -, *, and / operators; and the possible u
se of<br /> brackets, (), show how to make an answer of 24.<br />&#160;<br /> An
answer of &quot;q&quot; will quit the game.<br /> An answer of &quot;!&quot;
will generate a new set of four digits.<br /> An answer of &quot;!!&quot; will a
sk you for a new set of four digits.<br /> An answer of &quot;?&quot; will comp
ute an expression for the current digits.<br />&#160;<br /> Otherwise you are re
peatedly asked for an expression until it evaluates to 24<br />&#160;<br /> Note
: you cannot form multiple digit numbers from the supplied digits,<br /> so an a
nswer of 12+12 when given 1, 2, 2, and 1 would not be allowed.<br />&#160;<br />
'''</span><br />&#160;<br /><span class="kw1">from</span> <span class="kw3">__
future__</span> <span class="kw1">import</span> division<span class="sy0">,</spa
n> print_function<br /><span class="kw1">from</span> <span class="kw3">itertoo
ls</span> <span class="kw1">import</span> permutations<span class="sy0">,</span
> combinations<span class="sy0">,</span> product<span class="sy0">,</span> \<br
/>
chain<br /><span class="kw1">from</span> <span clas
s="kw3">pprint</span>
<span class="kw1">import</span> <span class="kw3">ppri
nt</span> <span class="kw1">as</span> pp<br /><span class="kw1">from</span> fr
actions <span class="kw1">import</span> Fraction <span class="kw1">as</span> F<
br /><span class="kw1">import</span> <span class="kw3">random</span><span class=
"sy0">,</span> ast<span class="sy0">,</span> <span class="kw3">re</span><br /><s
pan class="kw1">import</span> <span class="kw3">sys</span><br />&#160;<br /><spa
n class="kw1">if</span> <span class="kw3">sys</span>.<span class="me1">version_i
nfo</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="b
r0">&#93;</span> <span class="sy0">&lt;</span> <span class="nu0">3</span>:<br />
<span class="kw2">input</span> <span class="sy0">=</span> <span class="kw2">
raw_input</span><br />
<span class="kw1">from</span> <span class="kw3">iterto
ols</span> <span class="kw1">import</span> izip_longest <span class="kw1">as</sp
an> zip_longest<br /><span class="kw1">else</span>:<br />
<span class="kw1">f
rom</span> <span class="kw3">itertools</span> <span class="kw1">import</span> zi
p_longest<br />&#160;<br />&#160;<br /><span class="kw1">def</span> choose4<span
class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
<span class="s

t0">'four random digits &gt;0 as characters'</span><br />


<span class="kw1">r
eturn</span> <span class="br0">&#91;</span><span class="kw2">str</span><span cla
ss="br0">&#40;</span><span class="kw3">random</span>.<span class="me1">randint</
span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,
</span><span class="nu0">9</span><span class="br0">&#41;</span><span class="br0"
>&#41;</span> <span class="kw1">for</span> i <span class="kw1">in</span> <span c
lass="kw2">range</span><span class="br0">&#40;</span><span class="nu0">4</span><
span class="br0">&#41;</span><span class="br0">&#93;</span><br />&#160;<br /><sp
an class="kw1">def</span> ask4<span class="br0">&#40;</span><span class="br0">&#
41;</span>:<br />
<span class="st0">'get four random digits &gt;0 from the pl
ayer'</span><br />
digits <span class="sy0">=</span> <span class="st0">''</sp
an><br />
<span class="kw1">while</span> <span class="kw2">len</span><span cl
ass="br0">&#40;</span>digits<span class="br0">&#41;</span> <span class="sy0">!=<
/span> <span class="nu0">4</span> <span class="kw1">or</span> <span class="kw1">
not</span> <span class="kw2">all</span><span class="br0">&#40;</span>d <span cla
ss="kw1">in</span> <span class="st0">'123456789'</span> <span class="kw1">for</s
pan> d <span class="kw1">in</span> digits<span class="br0">&#41;</span>:<br />
digits <span class="sy0">=</span> <span class="kw2">input</span><span clas
s="br0">&#40;</span><span class="st0">'Enter the digits to solve for: '</span><s
pan class="br0">&#41;</span><br />
digits <span class="sy0">=</span> <spa
n class="st0">''</span>.<span class="me1">join</span><span class="br0">&#40;</sp
an>digits.<span class="me1">strip</span><span class="br0">&#40;</span><span clas
s="br0">&#41;</span>.<span class="me1">split</span><span class="br0">&#40;</span
><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span cla
ss="kw1">return</span> <span class="kw2">list</span><span class="br0">&#40;</spa
n>digits<span class="br0">&#41;</span><br />&#160;<br /><span class="kw1">def</s
pan> welcome<span class="br0">&#40;</span>digits<span class="br0">&#41;</span>:<
br />
<span class="kw1">print</span> <span class="br0">&#40;</span>__doc__<sp
an class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class=
"br0">&#40;</span><span class="st0">&quot;Your four digits: &quot;</span> + <spa
n class="st0">' '</span>.<span class="me1">join</span><span class="br0">&#40;</s
pan>digits<span class="br0">&#41;</span><span class="br0">&#41;</span><br />&#16
0;<br /><span class="kw1">def</span> check<span class="br0">&#40;</span>answer<s
pan class="sy0">,</span> digits<span class="br0">&#41;</span>:<br />
allowed
<span class="sy0">=</span> <span class="kw2">set</span><span class="br0">&#40;</
span><span class="st0">'() +-*/<span class="es0">\t</span>'</span>+<span class="
st0">''</span>.<span class="me1">join</span><span class="br0">&#40;</span>digits
<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
ok <span c
lass="sy0">=</span> <span class="kw2">all</span><span class="br0">&#40;</span>ch
<span class="kw1">in</span> allowed <span class="kw1">for</span> ch <span class
="kw1">in</span> answer<span class="br0">&#41;</span> <span class="kw1">and</spa
n> \<br />
<span class="kw2">all</span><span class="br0">&#40;</span>dig
its.<span class="me1">count</span><span class="br0">&#40;</span>dig<span class="
br0">&#41;</span> <span class="sy0">==</span> answer.<span class="me1">count</sp
an><span class="br0">&#40;</span>dig<span class="br0">&#41;</span> <span class="
kw1">for</span> dig <span class="kw1">in</span> <span class="kw2">set</span><spa
n class="br0">&#40;</span>digits<span class="br0">&#41;</span><span class="br0">
&#41;</span> \<br />
<span class="kw1">and</span> <span class="kw1">not<
/span> <span class="kw3">re</span>.<span class="me1">search</span><span class="b
r0">&#40;</span><span class="st0">'<span class="es0">\d</span><span class="es0">
\d</span>'</span><span class="sy0">,</span> answer<span class="br0">&#41;</span>
<br />
<span class="kw1">if</span> ok:<br />
<span class="kw1">try</sp
an>:<br />
ast.<span class="me1">parse</span><span class="br0">&#40;<
/span>answer<span class="br0">&#41;</span><br />
<span class="kw1">except
</span>:<br />
ok <span class="sy0">=</span> <span class="kw2">False<
/span><br />
<span class="kw1">return</span> ok<br />&#160;<br /><span class=
"kw1">def</span> solve<span class="br0">&#40;</span>digits<span class="br0">&#41
;</span>:<br />
<span class="st0">&quot;&quot;&quot;<span class="es0">\</span
><br />
&gt;&gt;&gt; for digits in '3246 4788 1111 123456 1127 3838'.split():
<br />
solve(list(digits))<br />&#160;<br />&#160;<br />
Solution

found: 2 + 3 * 6 + 4<br />


'2 + 3 * 6 + 4'<br />
Solution found: ( 4 + 7 8 ) * 8<br />
'( 4 + 7 - 8 ) * 8'<br />
No solution found for: 1 1 1 1<br
/>
'!'<br />
Solution found: 1 + 2 + 3 * ( 4 + 5 ) - 6<br />
'1 + 2 +
3 * ( 4 + 5 ) - 6'<br />
Solution found: ( 1 + 2 ) * ( 1 + 7 )<br />
'( 1
+ 2 ) * ( 1 + 7 )'<br />
Solution found: 8 / ( 3 - 8 / 3 )<br />
'8 / ( 3
- 8 / 3 )'<br />
&gt;&gt;&gt; &quot;&quot;&quot;</span><br />
digilen <spa
n class="sy0">=</span> <span class="kw2">len</span><span class="br0">&#40;</span
>digits<span class="br0">&#41;</span><br />
<span class="co1"># length of an
exp without brackets </span><br />
exprlen <span class="sy0">=</span> <span c
lass="nu0">2</span> * digilen - <span class="nu0">1</span><br />
<span class=
"co1"># permute all the digits</span><br />
digiperm <span class="sy0">=</spa
n> <span class="kw2">sorted</span><span class="br0">&#40;</span><span class="kw2
">set</span><span class="br0">&#40;</span>permutations<span class="br0">&#40;</s
pan>digits<span class="br0">&#41;</span><span class="br0">&#41;</span><span clas
s="br0">&#41;</span><br />
<span class="co1"># All the possible operator comb
inations</span><br />
opcomb <span class="sy0">=</span> <span class="kw2">l
ist</span><span class="br0">&#40;</span>product<span class="br0">&#40;</span><sp
an class="st0">'+-*/'</span><span class="sy0">,</span> repeat<span class="sy0">=
</span>digilen-<span class="nu0">1</span><span class="br0">&#41;</span><span cla
ss="br0">&#41;</span><br />
<span class="co1"># All the bracket insertion poi
nts:</span><br />
brackets <span class="sy0">=</span> <span class="br0">&#40;
</span> <span class="br0">&#91;</span><span class="br0">&#40;</span><span class=
"br0">&#41;</span><span class="br0">&#93;</span> + <span class="br0">&#91;</span
><span class="br0">&#40;</span>x<span class="sy0">,</span>y<span class="br0">&#4
1;</span><br />
<span class="kw1">for</span> x <span cla
ss="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><
span class="nu0">0</span><span class="sy0">,</span> exprlen<span class="sy0">,</
span> <span class="nu0">2</span><span class="br0">&#41;</span><br />
<span class="kw1">for</span> y <span class="kw1">in</span> <span cl
ass="kw2">range</span><span class="br0">&#40;</span>x+<span class="nu0">4</span>
<span class="sy0">,</span> exprlen+<span class="nu0">2</span><span class="sy0">,
</span> <span class="nu0">2</span><span class="br0">&#41;</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span>x<span
class="sy0">,</span>y<span class="br0">&#41;</span> <span class="sy0">!=</span>
<span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</spa
n>exprlen+<span class="nu0">1</span><span class="br0">&#41;</span><span class="b
r0">&#93;</span><br />
+ <span class="br0">&#91;</span><span cla
ss="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span> <span
class="nu0">3</span>+<span class="nu0">1</span><span class="sy0">,</span> <span
class="nu0">4</span>+<span class="nu0">2</span><span class="sy0">,</span> <span
class="nu0">7</span>+<span class="nu0">3</span><span class="br0">&#41;</span><sp
an class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="co1"># d
ouble brackets case</span><br />
<span class="kw1">for</span> d <span class="
kw1">in</span> digiperm:<br />
<span class="kw1">for</span> ops <span cla
ss="kw1">in</span> opcomb:<br />
<span class="kw1">if</span> <span cl
ass="st0">'/'</span> <span class="kw1">in</span> ops:<br />
d2 <s
pan class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#40;</
span><span class="st0">'F(%s)'</span>&#160;% i<span class="br0">&#41;</span> <sp
an class="kw1">for</span> i <span class="kw1">in</span> d<span class="br0">&#93;
</span> <span class="co1"># Use Fractions for accuracy</span><br />
<
span class="kw1">else</span>:<br />
d2 <span class="sy0">=</span>
d<br />
ex <span class="sy0">=</span> <span class="kw2">list</span><
span class="br0">&#40;</span>chain.<span class="me1">from_iterable</span><span c
lass="br0">&#40;</span>zip_longest<span class="br0">&#40;</span>d2<span class="s
y0">,</span> ops<span class="sy0">,</span> fillvalue<span class="sy0">=</span><s
pan class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</
span><span class="br0">&#41;</span><br />
<span class="kw1">for</span
> b <span class="kw1">in</span> brackets:<br />
exp <span class="
sy0">=</span> ex<span class="br0">&#91;</span>::<span class="br0">&#93;</span><b
r />
<span class="kw1">for</span> insertpoint<span class="sy0">,<

/span> bracket <span class="kw1">in</span> <span class="kw2">zip</span><span cla


ss="br0">&#40;</span>b<span class="sy0">,</span> <span class="st0">'()'</span>*<
span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;
</span>b<span class="br0">&#41;</span>//<span class="nu0">2</span><span class="b
r0">&#41;</span><span class="br0">&#41;</span>:<br />
exp.<sp
an class="me1">insert</span><span class="br0">&#40;</span>insertpoint<span class
="sy0">,</span> bracket<span class="br0">&#41;</span><br />
txt <
span class="sy0">=</span> <span class="st0">''</span>.<span class="me1">join</sp
an><span class="br0">&#40;</span>exp<span class="br0">&#41;</span><br />
<span class="kw1">try</span>:<br />
num <span class="
sy0">=</span> <span class="kw2">eval</span><span class="br0">&#40;</span>txt<spa
n class="br0">&#41;</span><br />
<span class="kw1">except</span>
<span class="kw2">ZeroDivisionError</span>:<br />
<span class
="kw1">continue</span><br />
<span class="kw1">if</span> num <spa
n class="sy0">==</span> <span class="nu0">24</span>:<br />
<s
pan class="kw1">if</span> <span class="st0">'/'</span> <span class="kw1">in</spa
n> ops:<br />
exp <span class="sy0">=</span> <span class=
"br0">&#91;</span> <span class="br0">&#40;</span>term <span class="kw1">if</span
> <span class="kw1">not</span> term.<span class="me1">startswith</span><span cla
ss="br0">&#40;</span><span class="st0">'F('</span><span class="br0">&#41;</span>
<span class="kw1">else</span> term<span class="br0">&#91;</span><span class="nu
0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<span class="kw1">for</span> term <span class="kw1">
in</span> exp <span class="br0">&#93;</span><br />
ans <span
class="sy0">=</span> <span class="st0">' '</span>.<span class="me1">join</span><
span class="br0">&#40;</span>exp<span class="br0">&#41;</span>.<span class="me1"
>rstrip</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="br0">&#40;</span
><span class="st0">&quot;Solution found:&quot;</span><span class="sy0">,</span>a
ns<span class="br0">&#41;</span><br />
<span class="kw1">retu
rn</span> ans<br />
<span class="kw1">print</span> <span class="br0">&#40;</s
pan><span class="st0">&quot;No solution found for:&quot;</span><span class="sy0"
>,</span> <span class="st0">' '</span>.<span class="me1">join</span><span class=
"br0">&#40;</span>digits<span class="br0">&#41;</span><span class="br0">&#41;</s
pan>
<br />
<span class="kw1">return</span> <span class="st0">'!'<
/span><br />&#160;<br /><span class="kw1">def</span> main<span class="br0">&#40;
</span><span class="br0">&#41;</span>:
<br />
digits <span class="sy0">=</
span> choose4<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
welcome<span class="br0">&#40;</span>digits<span class="br0">&#41;</span><br
/>
trial <span class="sy0">=</span> <span class="nu0">0</span><br />
answe
r <span class="sy0">=</span> <span class="st0">''</span><br />
chk <span clas
s="sy0">=</span> ans <span class="sy0">=</span> <span class="kw2">False</span><b
r />
<span class="kw1">while</span> <span class="kw1">not</span> <span class=
"br0">&#40;</span>chk <span class="kw1">and</span> ans <span class="sy0">==</spa
n> <span class="nu0">24</span><span class="br0">&#41;</span>:<br />
trial
+<span class="sy0">=</span><span class="nu0">1</span><br />
answer <span
class="sy0">=</span> <span class="kw2">input</span><span class="br0">&#40;</spa
n><span class="st0">&quot;Expression&#160;%i: &quot;</span>&#160;% trial<span cl
ass="br0">&#41;</span><br />
chk <span class="sy0">=</span> check<span cl
ass="br0">&#40;</span>answer<span class="sy0">,</span> digits<span class="br0">&
#41;</span><br />
<span class="kw1">if</span> answer <span class="sy0">==
</span> <span class="st0">'?'</span>:<br />
solve<span class="br0">&#
40;</span>digits<span class="br0">&#41;</span><br />
answer <span cla
ss="sy0">=</span> <span class="st0">'!'</span><br />
<span class="kw1">if
</span> answer.<span class="me1">lower</span><span class="br0">&#40;</span><span
class="br0">&#41;</span> <span class="sy0">==</span> <span class="st0">'q'</spa
n>:<br />
<span class="kw1">break</span><br />
<span class="kw
1">if</span> answer <span class="sy0">==</span> <span class="st0">'!'</span>:<br
/>
digits <span class="sy0">=</span> choose4<span class="br0">&#40;<
/span><span class="br0">&#41;</span><br />
trial <span class="sy0">=<

/span> <span class="nu0">0</span><br />


<span class="kw1">print</span
> <span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</sp
an>New digits:&quot;</span><span class="sy0">,</span> <span class="st0">' '</spa
n>.<span class="me1">join</span><span class="br0">&#40;</span>digits<span class=
"br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="k
w1">continue</span><br />
<span class="kw1">if</span> answer <span class=
"sy0">==</span> <span class="st0">'!!'</span>:<br />
digits <span cla
ss="sy0">=</span> ask4<span class="br0">&#40;</span><span class="br0">&#41;</spa
n><br />
trial <span class="sy0">=</span> <span class="nu0">0</span><
br />
<span class="kw1">print</span> <span class="br0">&#40;</span><s
pan class="st0">&quot;<span class="es0">\n</span>New digits:&quot;</span><span c
lass="sy0">,</span> <span class="st0">' '</span>.<span class="me1">join</span><s
pan class="br0">&#40;</span>digits<span class="br0">&#41;</span><span class="br0
">&#41;</span><br />
<span class="kw1">continue</span><br />
<
span class="kw1">if</span> <span class="kw1">not</span> chk:<br />
<s
pan class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&qu
ot;The input '%s' was wonky!&quot;</span>&#160;% answer<span class="br0">&#41;</
span><br />
<span class="kw1">else</span>:<br />
<span class="
kw1">if</span> <span class="st0">'/'</span> <span class="kw1">in</span> answer:<
br />
<span class="co1"># Use Fractions for accuracy in divisions
</span><br />
answer <span class="sy0">=</span> <span class="st0"
>''</span>.<span class="me1">join</span><span class="br0">&#40;</span> <span cla
ss="br0">&#40;</span><span class="br0">&#40;</span><span class="st0">'F(%s)'</sp
an>&#160;% char<span class="br0">&#41;</span> <span class="kw1">if</span> char <
span class="kw1">in</span> <span class="st0">'123456789'</span> <span class="kw1
">else</span> char<span class="br0">&#41;</span><br />
<span class="kw1">for</span> char <span class="kw1">in</span> answer <sp
an class="br0">&#41;</span><br />
ans <span class="sy0">=</span> <spa
n class="kw2">eval</span><span class="br0">&#40;</span>answer<span class="br0">&
#41;</span><br />
<span class="kw1">print</span> <span class="br0">&#
40;</span><span class="st0">&quot; = &quot;</span><span class="sy0">,</span> ans
<span class="br0">&#41;</span><br />
<span class="kw1">if</span> ans
<span class="sy0">==</span> <span class="nu0">24</span>:<br />
<s
pan class="kw1">print</span> <span class="br0">&#40;</span><span class="st0">&qu
ot;Thats right!&quot;</span><span class="br0">&#41;</span><br />
<span class=
"kw1">print</span> <span class="br0">&#40;</span><span class="st0">&quot;Thank y
ou and goodbye&quot;</span><span class="br0">&#41;</span> <br />&#160;<br />ma
in<span class="br0">&#40;</span><span class="br0">&#41;</span></pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>
The 24 Game Player
Given any four digits in the range 1 to 9, which may have repetitions,
Using just the +, -, *, and / operators; and the possible use of
brackets, (), show how to make an answer of 24.
An answer of &quot;q&quot; will quit the game.
An answer of &quot;!&quot; will generate a new set of four digits.
An answer of &quot;?&quot; will compute an expression for the current digits.
Otherwise you are repeatedly asked for an expression until it evaluates to 24
Note: you cannot form multiple digit numbers from the supplied digits,
so an answer of 12+12 when given 1, 2, 2, and 1 would not be allowed.
Your four digits: 6 7 9 5
Expression 1:&#160;?

Solution found: 6 - ( 5 - 7 ) * 9
Thank you and goodbye</pre>
<h3><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=38" title="Edit section: Difficult case requiring precise
division">edit</a>]</span> <span class="mw-headline" id="Difficult_case_requirin
g_precise_division">Difficult case requiring precise division</span></h3>
<p>The digits 3,3,8 and 8 have a solution that is not equal to 24 when using Pyt
hons double-precision floating point because of a division in all answers.
The solver above switches to precise fractional arithmetic when division is invo
lved and so can both recognise and solve for cases like this, (rather than allow
ing some range of closeness to 24).
</p><p><b>Evaluation needing precise division</b>
</p>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>...
Expression 1:&#160;!!
Enter the digits to solve for: 3388
New digits: 3 3 8 8
Expression 1: 8/(3-(8/3))
= 24
Thats right!
Thank you and goodbye</pre>
<p><b>Solving needing precise division</b>
</p>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre>...
Expression 1:&#160;!!
Enter the digits to solve for: 3388
New digits: 3 3 8 8
Expression 1:&#160;?
Solution found: 8 / ( 3 - 8 / 3 )</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=39" title="Edit section: R">edit</a>]</span> <span class="
mw-headline" id="R"><a href="/wiki/Category:R" title="Category:R">R</a></span></
h2>
<p>This uses exhaustive search and makes use of R's ability to work with express
ions as data. It is in principle general for any set of operands and binary oper
ators.
</p>
<pre class="text highlighted_source">&#160;<br />library(gtools)<br />&#160;<br
/>solve24 &lt;- function(vals=c(8, 4, 2, 1),<br />
goal=24,<b
r />
ops=c(&quot;+&quot;, &quot;-&quot;, &quot;*&quot;, &quot
;/&quot;)) {<br />&#160;<br /> val.perms &lt;- as.data.frame(t(<br />
permutations(length(vals), length(vals))))<br />&#160;<br /> nop &lt;length(vals)-1<br /> op.perms &lt;- as.data.frame(t(<br />
do.
call(expand.grid,<br />
replicate(nop, list(ops)))))<br
/>&#160;<br /> ord.perms &lt;- as.data.frame(t(<br />
do.cal
l(expand.grid,<br />
replicate(n &lt;- nop, 1:((n &lt;
&lt;- n-1)+1)))))<br />&#160;<br /> for (val.perm in val.perms)<br />
for (o
p.perm in op.perms)<br />
for (ord.perm in ord.perms)<br />
{<br />
expr &lt;- as.list(vals[val.perm])<br />
for (i in 1:nop) {<br
/>
expr[[ ord.perm[i] ]] &lt;- call(as.character(op.perm[i]),<br />
expr[[ ord.perm[i] ]],<br />
expr[[ ord.perm[i]+1 ]])<br />
expr

&lt;- expr[ -(ord.perm[i]+1) ]<br />


}<br />
if (identical(eva
l(expr[[1]]), goal)) return(expr[[1]])<br />
}<br />&#160;<br /> return(
NA)<br />}<br />&#160;</pre>
<div>
<dl><dt>Output:</div>
</dt></dl>
<pre class="text highlighted_source">&#160;<br />&gt; solve24()<br />8 * (4 - 2
+ 1)<br />&gt; solve24(c(6,7,9,5))<br />6 + (7 - 5) * 9<br />&gt; solve24(c(8,8,
8,8))<br />[1] NA<br />&gt; solve24(goal=49) #different goal value<br />8 * (4 +
2) + 1<br />&gt; solve24(goal=52) #no solution<br />[1] NA<br />&gt; solve24(op
s=c('-', '/')) #restricted set of operators<br />(8 - 2)/(1/4)<br />&#160;</pre>
<h2><span class="editsection">[<a href="/mw/index.php?title=24_game/Solve&amp;ac
tion=edit&amp;section=40" title="Edit section: Racket">edit</a>]</span> <span cl
ass="mw-headline" id="Racket"><a href="/wiki/Category:Racket" title="Category:Ra
cket">Racket</a></span></h2>
<p>The sequence of all possible variants of expressions with given numbers <i>n1
, n2, n3, n4</i> and operations <i>o1, o2, o3</i>.
</p>
<pre class="text highlighted_source">&#160;<br />(define (in-variants n1 o1 n2 o
2 n3 o3 n4)<br /> (let ([o1n (object-name o1)]<br />
[o2n (object-name o
2)]<br />
[o3n (object-name o3)])<br />
(with-handlers ((exn:fail:cont
ract:divide-by-zero? ( (_) empty-sequence))) <br />
(in-para e <br />
( ist (o1 (o2 (o3 n1 n2) n3) n4)<br />
(o1 (o2 n1 (o3 n2 n3)) n4
)<br />
(o1 (o2 n1 n2) (o3 n3 n4))<br />
(o1 n1 (o2 (o
3 n2 n3) n4))<br />
(o1 n1 (o2 n2 (o3 n3 n4))))<br />
( ist `
(((,n1 ,o3n ,n2) ,o2n ,n3) ,o1n ,n4)<br />
`((,n1 ,o2n (,n2 ,o3n ,n3
)) ,o1n ,n4)<br />
`((,n1 ,o2n ,n2) ,o1n (,n3 ,o3n ,n4))<br />
`(,n1 ,o1n ((,n2 ,o3n ,n3) ,o2n ,n4))<br />
`(,n1 ,o1n (,n2 ,
o2n (,n3 ,o3n ,n4))))))))<br />&#160;</pre>
<p>Search for a so utions using brute force:
</p>
<pre c ass="text high ighted_source">&#160;<br />(define (find-so utions numbers
(goa 24))<br /> (define in-operations ( ist + - * /))<br /> (remove-dup icat
es<br /> (for*/ ist ([n1 numbers]<br />
[n2 (remove-from numbers
n1)]<br />
[n3 (remove-from numbers n1 n2)]<br />
[
n4 (remove-from numbers n1 n2 n3)]<br />
[o1 in-operations]<br />
[o2 in-operations]<br />
[o3 in-operations]<br />
[(res expr) (in-variants n1 o1 n2 o2 n3 o3 n4)]<br />
#:when (= res goa ))<br />
expr)))<br />&#160;<br />(define (remove-from num
bers . n) (fo dr remq numbers n))<br />&#160;</pre>
<p>Examp es:
</p>
<pre>
&gt; (find-so utions '(3 8 3 8))
'((8 / (3 - (8 / 3))))
&gt; (find-so utions '(3 8 2 9))
'(((8 / 2) * (9 - 3))
(8 / (2 / (9 - 3)))
(8 * (9 - (3 * 2)))
(8 * ((9 - 3) / 2))
((8 * (9 - 3)) / 2)
(8 * (9 - (2 * 3)))
((9 - 3) * (8 / 2))
(((9 - 3) * 8) / 2)
((9 - (3 * 2)) * 8)
(((9 - 3) / 2) * 8)
((9 - 3) / (2 / 8))
((9 - (2 * 3)) * 8))
</pre>
<p>In order to find just one so ution effective y one needs to change <tt>for*/

ist</tt> to <tt>for*/first</tt> in the function <tt>find-so utions</tt>.


</p>
<h2><span c ass="editsection">[<a href="/mw/index.php?tit e=24_game/So ve&amp;ac
tion=edit&amp;section=41" tit e="Edit section: REXX">edit</a>]</span> <span c as
s="mw-head ine" id="REXX"><a href="/wiki/Category:REXX" tit e="Category:REXX">RE
XX</a></span></h2>
<pre c ass="rexx high ighted_source"><span c ass="coMULTI">/*REXX program to he
p the user find so utions to the game of 24.
*/</span><br /><span c ass="c
oMULTI">/* <br /> Arg
<br /> where one or both strings must be exact y four numera s (digit
s) <br /> comprised so ey of the numera s (digits) 1 9 (no zeroes). <br />
<br /> In
SSS
S-FFFF
SSSS is the start,
<br />
FFFF is the start.
<br />
<span c ass="coMULTI">/*get the guess from the argument. */</span><b
r /><span c ass="kw1">parse</span> <span c ass="kw2">var</span> orig start <span
c ass="st0">'-'</span> finish <span c ass="coMULTI">/*get the start and finish
(maybe). */</span><br />start=<span c ass="kw6">space</span><span c ass="br0
">&#40;</span>start,<span c ass="nu0">0</span><span c ass="br0">&#41;</span>
<span c ass="coMULTI">/*remove any b anks from the START. */</span><
br />finish=<span c ass="kw6">space</span><span c ass="br0">&#40;</span>finish,<
span c ass="nu0">0</span><span c ass="br0">&#41;</span>
<span c ass="c
oMULTI">/*remove any b anks from the FINISH. */</span><br />finish=<span c ass
="kw6">word</span><span c ass="br0">&#40;</span>finish start,<span c ass="nu0">1
</span><span c ass="br0">&#41;</span>
<span c ass="coMULTI">/*if no FINISH
specified, use START.*/</span><br />digs=<span c ass="nu0">123456789</span>
<span c ass="coMULTI">/*numera s (digits) that can be used. */
</span><br /><span c ass="kw1">ca </span> va idate start<br /><span c ass="kw1"
>ca </span> va idate finish<br />opers=<span c ass="st0">'+-*/'</span>
<span c ass="coMULTI">/*define the ega arithmetic operators*/</spa
n><br />ops=<span c ass="kw6"> ength</span><span c ass="br0">&#40;</span>opers<s
pan c ass="br0">&#41;</span>
<span c ass="coMULTI">/* and the count
of them ( ength). */</span><br />
<span c ass="kw1">do</span> j=<span c
ass="nu0">1</span> <span c ass="kw2">for</span> ops
<span c ass="coMUL
TI">/*define a version for fast execution. */</span><br />
o<span c ass=
"sy0">.</span>j=<span c ass="kw6">substr</span><span c ass="br0">&#40;</span>ope
rs,j,<span c ass="nu0">1</span><span c ass="br0">&#41;</span><br />
<spa
n c ass="kw3">end</span> <span c ass="coMULTI">/*j*/</span><br />finds=<span c
ass="nu0">0</span>
<span c ass="coMULTI">/*number of f
ound so utions (so far). */</span><br />x<span c ass="sy0">.</span>=<span c ass
="nu0">0</span>
<span c ass="coMULTI">/*a method to
ho d unique expressions. */</span><br />indent=<span c ass="kw6"> eft</span><spa
n c ass="br0">&#40;</span><span c ass="st0">''</span>,<span c ass="nu0">30</span
><span c ass="br0">&#41;</span>
<span c ass="coMULTI">/*used to in
dent disp ay of so utions. */</span><br />
<span
c ass="coMULTI">/*a ternative: indent=copies(' ',30) */</span><br />Lpar=<spa
n c ass="st0">'('</span>
<span c ass="coMULTI">/*a strin
g to make REXX code prettier. */</span><br />Rpar=<span c ass="st0">')'</span>
<span c ass="coMULTI">/*ditto.
*/</span><br />&#160;<br /> <span c ass="kw1">do</span> g=start <span c as
s="kw2">to</span> finish
<span c ass="coMULTI">/*process a (possib e) r
ange of va ues.*/</span><br /> <span c ass="kw1">if</span> <span c ass="kw6">po
s</span><span c ass="br0">&#40;</span><span c ass="nu0">0</span>,g<span c ass="b
r0">&#41;</span><span c ass="sy0">\</span>==<span c ass="nu0">0</span> <span c
ass="kw3">then</span> <span c ass="kw1">iterate</span> <span c ass="coMULTI">/*
ignore va ues with zero in them.
*/</span><br />&#160;<br />
<span
c ass="kw1">do</span> _=<span c ass="nu0">1</span> <span c ass="kw2">for</span>
<span c ass="nu0">4</span>
<span c ass="coMULTI">/*define versions for
faster execution.*/</span><br />
g<span c ass="sy0">.</span>_=<span c
ass="kw6">substr</span><span c ass="br0">&#40;</span>g,_,<span c ass="nu0">1</sp

an><span c ass="br0">&#41;</span><br />


<span c ass="kw3">end</span>
<span c ass="coMULTI">/*_*/</span><br />&#160;<br />
<span c ass="kw1">do</sp
an> i=<span c ass="nu0">1</span>
<span c ass="kw2">for</span> ops
<span c ass="coMULTI">/*insert an operator after 1st number. */</span><br />
<span c ass="kw1">do</span> j=<span c ass="nu0">1</span> <span c ass="kw2">f
or</span> ops
<span c ass="coMULTI">/*insert an operator after 2nd num
ber. */</span><br />
<span c ass="kw1">do</span> k=<span c ass="nu0">1</s
pan> <span c ass="kw2">for</span> ops
<span c ass="coMULTI">/*insert a
n operator after 2nd number. */</span><br />
<span c ass="kw1">do</span
> m=<span c ass="nu0">0</span> <span c ass="kw2">for</span> <span c ass="nu0">4
</span>; L<span c ass="sy0">.</span>= <span c ass="coMULTI">/*assume no eft
parenthesis so far. */</span><br />
<span c ass="kw1">do</span> n=
m+<span c ass="nu0">1</span> <span c ass="kw2">to</span> <span c ass="nu0">4</s
pan>
<span c ass="coMULTI">/*match eft paren with a right paren. */</span
><br />
L<span c ass="sy0">.</span>m=Lpar
<span c ass="co
MULTI">/*define a eft paren, m=0 means ignore*/</span><br />
R<span
c ass="sy0">.</span>=
<span c ass="coMULTI">/*un-define a rig
ht parenthesis.
*/</span><br />
<span c ass="kw1">if</span> m==<s
pan c ass="nu0">1</span> <span c ass="sy0">&amp;</span> n==<span c ass="nu0">2</
span> <span c ass="kw3">then</span> L<span c ass="sy0">.</span>=
<span c
ass="coMULTI">/*specia case: (n)+ */</span><br />
<span c ass="kw3">e se</span> <span c ass="kw1">if</span> m<span c ass="sy0">\</
span>==<span c ass="nu0">0</span> <span c ass="kw3">then</span> R<span c ass="s
y0">.</span>n=Rpar
<span c ass="coMULTI">/*no (, no )*/</span><br />
e= L<span c ass="sy0">.</span>1 g<span c ass="sy0">.</span>1 o<span c ass="
sy0">.</span>i L<span c ass="sy0">.</span>2 g<span c ass="sy0">.</span>2 o<sp
an c ass="sy0">.</span>j L<span c ass="sy0">.</span>3 g<span c ass="sy0">.</sp
an>3 R<span c ass="sy0">.</span>3 o<span c ass="sy0">.</span>k g<span c ass="
sy0">.</span>4 R<span c ass="sy0">.</span>4<br />
e=<span c ass="kw6
">space</span><span c ass="br0">&#40;</span>e,<span c ass="nu0">0</span><span c
ass="br0">&#41;</span>
<span c ass="coMULTI">/*remove a b anks from th
e expression*/</span><br />&#160;<br />
<span c
ass="coMULTI">/*(be ow) change expression:
*/</span><br />
<span c ass="coMULTI">/*
/(yyy) ===&gt; /div(yyy)
*/</span><br />
<span c ass="coMULTI">/*Ena
b es to check for division by zero*/</span><br />
origE=e
<span c ass="coMULTI">/*keep o d version for the disp ay.
*/</span><br />
<span c ass="kw1">if</span> <span c ass="kw6">pos</span><span c ass="b
r0">&#40;</span><span c ass="st0">'/('</span>,e<span c ass="br0">&#41;</span><sp
an c ass="sy0">\</span>==<span c ass="nu0">0</span> <span c ass="kw3">then</spa
n> e=<span c ass="kw6">changestr</span><span c ass="br0">&#40;</span><span c ass
="st0">'/('</span>, e, <span c ass="st0">&quot;/div(&quot;</span><span c ass="br
0">&#41;</span><br />
<span c ass="coMULTI">/*Th
e above cou d be rep aced by:
*/</span><br />
<span c ass="coMULTI">/* e=changestr('/(',e,&quot;/div(&quot;)
*/</sp
an><br />&#160;<br />
<span c ass="coMULTI">/*IN
TERPRET stresses REXX's groin, so */</span><br />
<span c ass="coMULTI">/* try to avoid repeated heavy ifting.*/</span><br />
<span c ass="kw1">if</span> x<span c ass="sy0">.</span>e <span c ass=
"kw3">then</span> <span c ass="kw1">iterate</span> <span c ass="coMULTI">/*was
the expression a ready used?
*/</span><br />
x<span c ass="sy0">.
</span>e=<span c ass="nu0">1</span>
<span c ass="coMULTI">/*mark
this expression as unique.
*/</span><br />
<span c ass="coMULTI">/*have REXX do the heavy ifting (ugh).*/</span><br />
<span c ass="kw1">interpret</span> <span c ass="st0">'x='</span> e
<
span c ass="coMULTI">/* strain
*/</span><br />
pan c ass="sy0">/</span><span c ass="nu0">1</span>
<span c ass="c
oMULTI">/*remove trai ing decima points(maybe)*/</span><br />
<span
c ass="kw1">if</span> x<span c ass="sy0">\</span>==<span c ass="nu0">24</span>
<span c ass="kw3">then</span> <span c ass="kw1">iterate</span>
<span c ass

x=x<s

="coMULTI">/*Not correct? Try again.


*/</span><br />
finds=finds+
<span c ass="nu0">1</span>
<span c ass="coMULTI">/*bump number of found s
o utions.
*/</span><br />
_=<span c ass="kw6">trans ate</span><s
pan c ass="br0">&#40;</span>origE, <span c ass="st0">']['</span>, <span c ass="s
t0">&quot;)(&quot;</span><span c ass="br0">&#41;</span>
<span c ass="coMULTI
">/*show [], not ().
*/</span><br />
<span c ass="kw1">say</spa
n> indent <span c ass="st0">'a so ution:'</span> _
<span c ass="coMULTI"
>/*disp ay a so ution.
*/</span><br />
<span c ass="kw3">end</span
> <span c ass="coMULTI">/*n*/</span><br />
<span c ass="kw3">end</spa
n>
<span c ass="coMULTI">/*m*/</span><br />
<span c ass="kw3">end</sp
an>
<span c ass="coMULTI">/*k*/</span><br />
<span c ass="kw3">end</s
pan>
<span c ass="coMULTI">/*j*/</span><br />
<span c ass="kw3">end</
span>
<span c ass="coMULTI">/*i*/</span><br /> <span c ass="kw3">end<
/span>
<span c ass="coMULTI">/*g*/</span><br />&#160;<br />so s=find
s<br /><span c ass="kw1">if</span> so s==<span c ass="nu0">0</span> <span c ass=
"kw3">then</span> so s=<span c ass="st0">'No'</span>
<span c ass="coMULTI
">/*make the sentence not so geek- ike. */</span><br /><span c ass="kw1">say</s
pan>; <span c ass="kw1">say</span> so s <span c ass="st0">'unique so ution'</s
pan>s<span c ass="br0">&#40;</span>finds<span c ass="br0">&#41;</span> <span c a
ss="st0">&quot;found for&quot;</span> orig <span c ass="coMULTI">/*p ura ize.*/
</span><br /><span c ass="kw1">exit</span><br /><span c ass="coMULTI">/*
pan>; <span c ass="kw1">parse</span> <span c ass="kw1">arg</span> q
<span c
ass="coMULTI">/*tests if dividing by 0 (zero).
*/</span><br /><span c ass
="kw1">if</span> q=<span c ass="nu0">0</span> <span c ass="kw3">then</span> q=1
e9
<span c ass="coMULTI">/*if dividing by zero, change divisor. */
</span><br /><span c ass="kw1">return</span> q
<span c a
ss="coMULTI">/*changing Q inva idates the expression*/</span><br /><span c ass="
coMULTI">/*GER subroutine*/</span><br
or! ***'</span>;
<span c ass="kw1">if</span> _<span c ass="sy0">\</span>==<
span c ass="st0">''</span> <span c ass="kw3">then</span> <span c ass="kw1">say<
/span> <span c ass="st0">'guess='</span> _<br /><span c ass="kw1">say</span> <sp
an c ass="kw1">arg</span><span c ass="br0">&#40;</span><span c ass="nu0">1</span
><span c ass="br0">&#41;</span>;
<span c ass="kw1">say</span>;
<span c ass="kw1">exit</span> <span c ass="nu0">13</span><br /><span c
ass="coMULTI">/*S subroutine*/</spa
c ass="nu0">1</span><span c ass="br0">&#41;</span>==<span c ass="nu0">1</span>
<span c ass="kw3">then</span> <span c ass="kw1">return</span> <span c ass="st0">
''</span>; <span c ass="kw1">return</span> <span c ass="st0">'s'</span>
<span c ass="coMULTI">/*simp e p ura izer.*/</span><br /><span c ass="coMULTI">/
*va idate subroutine*/</span><br />va idat
an c ass="nu0">0</span>;
_v=<span c ass="kw6">verify</span><span c ass="br
0">&#40;</span>y,digs<span c ass="br0">&#41;</span><br />
<span c ass="kw1">s
e ect</span><br />
<span c ass="kw3">when</span> y==<span c ass="st0">''</spa
n>
<span c ass="kw3">then</span> <span c ass="kw1">ca </span> ger <span
c ass="st0">'no digits entered.'</span><br />
<span c ass="kw3">when</span> <
span c ass="kw6"> ength</span><span c ass="br0">&#40;</span>y<span c ass="br0">&
#41;</span><span c ass="sy0">& t;</span><span c ass="nu0">4</span> <span c ass=
"kw3">then</span> <span c ass="kw1">ca </span> ger <span c ass="st0">'not enoug
h digits entered, must be 4'</span><br />
<span c ass="kw3">when</span> <span
c ass="kw6"> ength</span><span c ass="br0">&#40;</span>y<span c ass="br0">&#41;
</span><span c ass="sy0">&gt;</span><span c ass="nu0">4</span> <span c ass="kw3
">then</span> <span c ass="kw1">ca </span> ger <span c ass="st0">'too many digi
ts entered, must be 4'</span><br />
<span c ass="kw3">when</span> <span c ass
="kw6">pos</span><span c ass="br0">&#40;</span><span c ass="nu0">0</span>,y<span
c ass="br0">&#41;</span><span c ass="sy0">\</span>==<span c ass="nu0">0</span>
<span c ass="kw3">then</span> <span c ass="kw1">ca </span> ger <span c ass="st0
">&quot;can't use the digit 0 (zero)&quot;</span><br />
<span c ass="kw3">wh
en</span> _v<span c ass="sy0">\</span>==<span c ass="nu0">0</span>
<span c
ass="kw3">then</span> <span c ass="kw1">ca </span> ger <span c ass="st0">'i e
ga character:'</span> <span c ass="kw6">substr</span><span c ass="br0">&#40;</s

pan>y,_v,<span c ass="nu0">1</span><span c ass="br0">&#41;</span><br />


<span
c ass="kw3">otherwise</span> <span c ass="kw1">nop</span><br />
<span c ass=
"kw3">end</span>
<span c ass="coMULTI">/*se ect*/</span><br /><span c ass="kw
1">return</span> <span c ass="sy0">\</span>errCode</pre>
<p>Some o der REXXes don't have a &#160; <b>changestr</b> &#160; BIF, so one is
inc uded here &#160; &#160; <a href="/wiki/CHANGESTR.REX" tit e="CHANGESTR.REX">CH
ANGESTR.REX</a>.
<br /><br />
<b>output</b> when the fo owing input is used: &#160; <tt> 1111-1234 </tt>
</p>
<pre sty e="height:30ex">
a so ution: [1+1+1]*8
a so ution: [1+1+2]*6
a so ution: [1+1*2]*8
a so ution: [1*1+2]*8
a so ution: 1*[1+2]*8
a so ution: [1/1+2]*8
a so ution: [1+1*3]*6
a so ution: [1*1+3]*6
a so ution: 1*[1+3]*6
a so ution: [1/1+3]*6
a so ution: 1-1+3*8
a so ution: [1-1+3]*8
a so ution: [1-1+3*8]
a so ution: 1-1+[3*8]
a so ution: 1-[1-3*8]
a so ution: 1*1*3*8
a so ution: [1*1*3]*8
a so ution: [1*1*3*8]
a so ution: 1*[1*3]*8
a so ution: 1*[1*3*8]
a so ution: 1*1*[3*8]
a so ution: 1/1*3*8
a so ution: [1/1*3]*8
a so ution: [1/1*3*8]
a so ution: 1/1*[3*8]
a so ution: 1/[1/3]*8
a so ution: 1/[1/3/8]
a so ution: [1+1+4]*4
a so ution: 1-1+4*6
a so ution: [1-1+4]*6
a so ution: [1-1+4*6]
a so ution: 1-1+[4*6]
a so ution: 1-[1-4*6]
a so ution: 1*1*4*6
a so ution: [1*1*4]*6
a so ution: [1*1*4*6]
a so ution: 1*[1*4]*6
a so ution: 1*[1*4*6]
a so ution: 1*1*[4*6]
a so ution: 1/1*4*6
a so ution: [1/1*4]*6
a so ution: [1/1*4*6]
a so ution: 1/1*[4*6]
a so ution: 1/[1/4]*6
a so ution: 1/[1/4/6]
a so ution: [1+1*5]*4
a so ution: [1*1+5]*4
a so ution: 1*[1+5]*4
a so ution: [1/1+5]*4

a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a

so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so
so

ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:
ution:

107 unique so utions found for 1111-1234

[1+1+6]*3
1-1+6*4
[1-1+6]*4
[1-1+6*4]
1-1+[6*4]
1-[1-6*4]
1*1*6*4
[1*1*6]*4
[1*1*6*4]
1*[1*6]*4
1*[1*6*4]
1*1*[6*4]
1/1*6*4
[1/1*6]*4
[1/1*6*4]
1/1*[6*4]
1/[1/6]*4
[1+1*7]*3
[1*1+7]*3
1*[1+7]*3
[1/1+7]*3
1-1+8*3
[1-1+8]*3
[1-1+8*3]
1-1+[8*3]
1-[1-8*3]
1*1*8*3
[1*1*8]*3
[1*1*8*3]
1*[1*8]*3
1*[1*8*3]
1*1*[8*3]
1/1*8*3
[1/1*8]*3
[1/1*8*3]
1/1*[8*3]
1/[1/8]*3
1/[1/8/3]
[1+2+1]*6
[1+2*1]*8
[1+2/1]*8
[1*2+1]*8
1*[2+1]*8
[1*2+2]*6
1*[2+2]*6
1*2*2*6
[1*2*2]*6
[1*2*2*6]
1*[2*2]*6
1*[2*2*6]
1*2*[2*6]
[1+2+3]*4
1*2*3*4
[1*2*3]*4
[1*2*3*4]
1*[2*3]*4
1*[2*3*4]
1*2*[3*4]

</pre>
<h2><span c ass="editsection">[<a href="/mw/index.php?tit e=24_game/So ve&amp;ac
tion=edit&amp;section=42" tit e="Edit section: Ruby">edit</a>]</span> <span c as
s="mw-head ine" id="Ruby"><a href="/wiki/Category:Ruby" tit e="Category:Ruby">Ru
by</a></span></h2>
<div c ass="examp emeta trans ation"><b>Trans ation of</b>: <a href="/wiki/24_ga
me/So ve#Tc " tit e="24 game/So ve">Tc </a></div>
<pre c ass="ruby high ighted_source"><span c ass="kw1">c ass</span> TwentyFourGa
meP ayer<br /> EXPRESSIONS = <span c ass="br0">&#91;</span><br />
<span c as
s="st0">'((%d&#160;%s&#160;%d)&#160;%s&#160;%d)&#160;%s&#160;%d'</span>,<br />
<span c ass="st0">'(%d&#160;%s (%d&#160;%s&#160;%d))&#160;%s&#160;%d'</span>,<
br />
<span c ass="st0">'(%d&#160;%s&#160;%d)&#160;%s (%d&#160;%s&#160;%d)'</
span>,<br />
<span c ass="st0">'%d&#160;%s ((%d&#160;%s&#160;%d)&#160;%s&#160
;%d)'</span>,<br />
<span c ass="st0">'%d&#160;%s (%d&#160;%s (%d&#160;%s&#16
0;%d))'</span>,<br /> <span c ass="br0">&#93;</span>.<span c ass="me1">map</spa
n><span c ass="br0">&#123;</span><span c ass="sy0">|</span>expr<span c ass="sy0"
>|</span> <span c ass="br0">&#91;</span>expr, expr.<span c ass="kw3">gsub</span>
<span c ass="br0">&#40;</span><span c ass="st0">'%d'</span>, <span c ass="st0">'
Rationa (%d,1)'</span><span c ass="br0">&#41;</span><span c ass="br0">&#93;</spa
n><span c ass="br0">&#125;</span><br />&#160;<br /> OPERATORS = <span c ass="br
0">&#91;</span>:<span c ass="sy0">+</span>,&#160;:<span c ass="sy0">-</span>,&#1
60;:<span c ass="sy0">*</span>,&#160;:<span c ass="sy0">/</span><span c ass="br0
">&#93;</span>.<span c ass="me1">repeated_permutation</span><span c ass="br0">&#
40;</span><span c ass="nu0">3</span><span c ass="br0">&#41;</span><br />&#160;<b
r /> OBJECTIVE = <span c ass="kw4">Rationa </span><span c ass="br0">&#40;</span
><span c ass="nu0">24</span>,<span c ass="nu0">1</span><span c ass="br0">&#41;</
span><br />&#160;<br /> <span c ass="kw1">def</span> <span c ass="kw2">se f</sp
an>.<span c ass="me1">so ve</span><span c ass="br0">&#40;</span>digits<span c as
s="br0">&#41;</span><br />
so utions = <span c ass="br0">&#91;</span><span c
ass="br0">&#93;</span><br />
digits.<span c ass="me1">permutation</span>.<spa
n c ass="me1">to_a</span>.<span c ass="me1">uniq</span>.<span c ass="me1">each</
span> <span c ass="kw1">do</span> <span c ass="sy0">|</span>a,b,c,d<span c ass="
sy0">|</span><br />
OPERATORS.<span c ass="me1">each</span> <span c ass="kw
1">do</span> <span c ass="sy0">|</span>op1,op2,op3<span c ass="sy0">|</span><br
/>
EXPRESSIONS.<span c ass="me1">each</span> <span c ass="kw1">do</span>
<span c ass="sy0">|</span>expr,expr_rat<span c ass="sy0">|</span><br />
<span c ass="co1"># eva uate using rationa arithmetic</span><br />
te
st = expr_rat <span c ass="sy0">%</span> <span c ass="br0">&#91;</span>a, op1, b
, op2, c, op3, d<span c ass="br0">&#93;</span><br />
va ue = <span c as
s="kw3">eva </span><span c ass="br0">&#40;</span>test<span c ass="br0">&#41;</sp
an> <span c ass="kw1">rescue</span> <span c ass="sy0">-</span><span c ass="nu0">
1</span> <span c ass="co1"># catch division by zero</span><br />
<span
c ass="kw1">if</span> va ue == OBJECTIVE<br />
so utions <span c ass
="sy0">& t;& t;</span> expr <span c ass="sy0">%</span> <span c ass="br0">&#91;</
span>a, op1, b, op2, c, op3, d<span c ass="br0">&#93;</span><br />
<spa
n c ass="kw1">end</span><br />
<span c ass="kw1">end</span><br />
<s
pan c ass="kw1">end</span><br />
<span c ass="kw1">end</span><br />
so uti
ons<br /> <span c ass="kw1">end</span><br /><span c ass="kw1">end</span><br />&
#160;<br /><span c ass="co1"># va idate user input</span><br />digits = ARGV.<sp
an c ass="me1">map</span> <span c ass="kw1">do</span> <span c ass="sy0">|</span>
arg<span c ass="sy0">|</span> <br /> <span c ass="kw1">begin</span><br />
<s
pan c ass="kw3">Integer</span><span c ass="br0">&#40;</span>arg<span c ass="br0"
>&#41;</span><br /> <span c ass="kw1">rescue</span> <span c ass="kw4">ArgumentE
rror</span><br />
<span c ass="kw3">raise</span> <span c ass="st0">&quot;erro
r: not an integer: '#{arg}'&quot;</span><br /> <span c ass="kw1">end</span><br
/><span c ass="kw1">end</span><br />digits.<span c ass="me1">size</span> == <spa
n c ass="nu0">4</span> <span c ass="kw1">or</span> <span c ass="kw3">raise</span
> <span c ass="st0">&quot;error: need 4 digits, on y have #{digits.size}&quot;</
span><br />&#160;<br />so utions = TwentyFourGameP ayer.<span c ass="me1">so ve<
/span><span c ass="br0">&#40;</span>digits<span c ass="br0">&#41;</span><br /><s

pan c ass="kw1">if</span> so utions.<span c ass="me1">empty</span>?<br /> <span


c ass="kw3">puts</span> <span c ass="st0">&quot;no so utions&quot;</span><br />
<span c ass="kw1">e se</span><br /> <span c ass="kw3">puts</span> <span c ass="
st0">&quot;found #{so utions.size} so utions, inc uding #{so utions.first}&quot;
</span><br /> <span c ass="kw3">puts</span> so utions.<span c ass="me1">sort</s
pan><br /><span c ass="kw1">end</span></pre>
<div>
<d ><dt>Output:</div>
</dt></d >
<pre>$ ruby 24game.p ayer.rb 1 1 1 1
no so utions
$ ruby 24game.p ayer.rb 1 1 2 7
found 8 so utions, inc uding (1 + 2) * (1 + 7)
(1 + 2) * (1 + 7)
(1 + 2) * (7 + 1)
(1 + 7) * (1 + 2)
(1 + 7) * (2 + 1)
(2 + 1) * (1 + 7)
(2 + 1) * (7 + 1)
(7 + 1) * (1 + 2)
(7 + 1) * (2 + 1)
$ ruby 24game.p ayer.rb 2 3 8 9
found 12 so utions, inc uding (8 / 2) * (9 - 3)
((9 - 3) * 8) / 2
((9 - 3) / 2) * 8
(8 * (9 - 3)) / 2
(8 / 2) * (9 - 3)
(9 - (2 * 3)) * 8
(9 - (3 * 2)) * 8
(9 - 3) * (8 / 2)
(9 - 3) / (2 / 8)
8 * ((9 - 3) / 2)
8 * (9 - (2 * 3))
8 * (9 - (3 * 2))
8 / (2 / (9 - 3))</pre>
<h2><span c ass="editsection">[<a href="/mw/index.php?tit e=24_game/So ve&amp;ac
tion=edit&amp;section=43" tit e="Edit section: Sca a">edit</a>]</span> <span c a
ss="mw-head ine" id="Sca a"><a href="/wiki/Category:Sca a" tit e="Category:Sca a
">Sca a</a></span></h2>
<p>A non-interactive p ayer.
</p>
<pre c ass="sca a high ighted_source"><a href="http://sca a- ang.org"><span c as
s="kw1">def</span></a> permute<span c ass="br0">&#40;</span> <span c ass="sy0">:
</span> List<span c ass="br0">&#91;</span>Doub e<span c ass="br0">&#93;</span><s
pan c ass="br0">&#41;</span><span c ass="sy0">:</span> List<span c ass="br0">&#9
1;</span>List<span c ass="br0">&#91;</span>Doub e<span c ass="br0">&#93;</span><
span c ass="br0">&#93;</span> <span c ass="sy0">=</span>
<a href="http://sca a
- ang.org"><span c ass="kw1">match</span></a> <span c ass="br0">&#123;</span><br
/> <a href="http://sca a- ang.org"><span c ass="kw1">case</span></a> Ni <span
c ass="sy0">=&gt;</span> List<span c ass="br0">&#40;</span>Ni <span c ass="br0"
>&#41;</span><br /> <a href="http://sca a- ang.org"><span c ass="kw1">case</spa
n></a> x <span c ass="sy0">::</span> xs <span c ass="sy0">=&gt;</span><br />
<a href="http://sca a- ang.org"><span c ass="kw1">for</span></a> <span c ass="br
0">&#123;</span><br />
ys <span c ass="sy0">& t;</span>- permute<span c ass
="br0">&#40;</span>xs<span c ass="br0">&#41;</span><br />
position <span c
ass="sy0">& t;</span>- <span c ass="nu0">0</span> to ys.<span c ass="me1"> ength
</span><br />
<span c ass="br0">&#40;</span> eft, right<span c ass="br0">&#
41;</span> <span c ass="sy0">=</span> ys sp itAt position<br />
<span c ass="

br0">&#125;</span> <a href="http://sca a- ang.org"><span c ass="kw1">yie d</span


></a> eft <span c ass="sy0">:::</span> <span c ass="br0">&#40;</span>x <span c
ass="sy0">::</span> right<span c ass="br0">&#41;</span><br /><span c ass="br0">&
#125;</span><br />&#160;<br /><a href="http://sca a- ang.org"><span c ass="kw1">
def</span></a> computeA Operations<span c ass="br0">&#40;</span> <span c ass="s
y0">:</span> List<span c ass="br0">&#91;</span>Doub e<span c ass="br0">&#93;</sp
an><span c ass="br0">&#41;</span><span c ass="sy0">:</span> List<span c ass="br0
">&#91;</span><span c ass="br0">&#40;</span>Doub e,String<span c ass="br0">&#41;
</span><span c ass="br0">&#93;</span> <span c ass="sy0">=</span>
<a href="http
://sca a- ang.org"><span c ass="kw1">match</span></a> <span c ass="br0">&#123;</
span><br /> <a href="http://sca a- ang.org"><span c ass="kw1">case</span></a> N
i <span c ass="sy0">=&gt;</span> Ni <br /> <a href="http://sca a- ang.org"><sp
an c ass="kw1">case</span></a> x <span c ass="sy0">::</span> Ni <span c ass="sy
0">=&gt;</span> List<span c ass="br0">&#40;</span><span c ass="br0">&#40;</span>
x, <span c ass="st0">&quot;%1.0f&quot;</span> format x<span c ass="br0">&#41;</s
pan><span c ass="br0">&#41;</span><br /> <a href="http://sca a- ang.org"><span
c ass="kw1">case</span></a> x <span c ass="sy0">::</span> xs <span c ass="sy0">=
&gt;</span><br />
<a href="http://sca a- ang.org"><span c ass="kw1">for</span
></a> <span c ass="br0">&#123;</span><br />
<span c ass="br0">&#40;</span>y
, ops<span c ass="br0">&#41;</span> <span c ass="sy0">& t;</span>- computeA Ope
rations<span c ass="br0">&#40;</span>xs<span c ass="br0">&#41;</span><br />
<span c ass="br0">&#40;</span>z, op<span c ass="br0">&#41;</span> <span c ass="
sy0">& t;</span>- <br />
<a href="http://sca a- ang.org"><span c ass="kw1
">if</span></a> <span c ass="br0">&#40;</span>y <span c ass="sy0">==</span> <spa
n c ass="nu0">0</span><span c ass="br0">&#41;</span> <br />
List<span c
ass="br0">&#40;</span><span c ass="br0">&#40;</span>x<span c ass="sy0">*</span>
y, <span c ass="st0">&quot;*&quot;</span><span c ass="br0">&#41;</span>, <span c
ass="br0">&#40;</span>x+y, <span c ass="st0">&quot;+&quot;</span><span c ass="b
r0">&#41;</span>, <span c ass="br0">&#40;</span>x-y, <span c ass="st0">&quot;-&q
uot;</span><span c ass="br0">&#41;</span><span c ass="br0">&#41;</span> <br />
<a href="http://sca a- ang.org"><span c ass="kw1">e se</span></a> <br />
List<span c ass="br0">&#40;</span><span c ass="br0">&#40;</span>x<span c
ass="sy0">*</span>y, <span c ass="st0">&quot;*&quot;</span><span c ass="br0">&#
41;</span>, <span c ass="br0">&#40;</span>x/y, <span c ass="st0">&quot;/&quot;</
span><span c ass="br0">&#41;</span>, <span c ass="br0">&#40;</span>x+y, <span c
ass="st0">&quot;+&quot;</span><span c ass="br0">&#41;</span>, <span c ass="br0">
&#40;</span>x-y, <span c ass="st0">&quot;-&quot;</span><span c ass="br0">&#41;</
span><span c ass="br0">&#41;</span><br />
<span c ass="br0">&#125;</span> <a
href="http://sca a- ang.org"><span c ass="kw1">yie d</span></a> <span c ass="br0
">&#40;</span>z, <span c ass="st0">&quot;(%1.0f%s%s)&quot;</span> format <span c
ass="br0">&#40;</span>x,op,ops<span c ass="br0">&#41;</span><span c ass="br0">&
#41;</span><br /><span c ass="br0">&#125;</span><br />&#160;<br /><a href="http:
//sca a- ang.org"><span c ass="kw1">def</span></a> hasSo ution<span c ass="br0">
&#40;</span> <span c ass="sy0">:</span> List<span c ass="br0">&#91;</span>Doub e
<span c ass="br0">&#93;</span><span c ass="br0">&#41;</span> <span c ass="sy0">=
</span> permute<span c ass="br0">&#40;</span> <span c ass="br0">&#41;</span> f a
tMap computeA Operations fi ter <span c ass="br0">&#40;</span><span c ass="sy0"
>_</span>.<span c ass="sy0">_</span>1 <span c ass="sy0">==</span> <span c ass="n
u0">24</span><span c ass="br0">&#41;</span> map <span c ass="br0">&#40;</span><s
pan c ass="sy0">_</span>.<span c ass="sy0">_</span>2<span c ass="br0">&#41;</spa
n></pre>
<p>Examp e:
</p>
<pre>
va prob emsIterator = (
Iterator
continua y List.fi (4)(sca a.uti .Random.nextInt(9) + 1 toDoub e)
fi ter (!hasSo ution(_).isEmpty)
)

va so utionIterator = prob emsIterator map hasSo ution


sca a&gt; so utionIterator.next
res8: List[String] = List((3*(5-(3-6))), (3*(5-(3-6))), (3*(5+(6-3))), (3+(6+(3*
5))), (3*(6-(3-5))), (3+(6+(5*3))), (3*(
6+(5-3))), (3*(5+(6-3))), (3+(6+(5*3))), (3*(6+(5-3))), (6+(3+(5*3))), (6*(5-(3/
3))), (6*(5-(3/3))), (3+(6+(3*5))), (3*(
6-(3-5))), (6+(3+(3*5))), (6+(3+(3*5))), (6+(3+(5*3))))
sca a&gt; so utionIterator.next
res9: List[String] = List((4-(5*(5-9))), (4-(5*(5-9))), (4+(5*(9-5))), (4+(5*(95))), (9-(5-(4*5))), (9-(5-(5*4))), (9-(
5-(4*5))), (9-(5-(5*4))))
sca a&gt; so utionIterator.next
res10: List[String] = List((2*(4+(3+5))), (2*(3+(4+5))), (2*(3+(5+4))), (4*(3-(2
-5))), (4*(3+(5-2))), (2*(4+(5+3))), (2*
(5+(4+3))), (2*(5+(3+4))), (4*(5-(2-3))), (4*(5+(3-2))))
sca a&gt; so utionIterator.next
res11: List[String] = List((4*(5-(2-3))), (2*(4+(5+3))), (2*(5+(4+3))), (2*(5+(3
+4))), (2*(4+(3+5))), (2*(3+(4+5))), (2*
(3+(5+4))), (4*(5+(3-2))), (4*(3+(5-2))), (4*(3-(2-5))))
</pre>
<h2><span c ass="editsection">[<a href="/mw/index.php?tit e=24_game/So ve&amp;ac
tion=edit&amp;section=44" tit e="Edit section: Sidef">edit</a>]</span> <span c a
ss="mw-head ine" id="Sidef"><a href="/wiki/Category:Sidef" tit e="Category:Sidef
">Sidef</a></span></h2>
<p><b>With eva uation:</b>
</p>
<pre c ass="ruby high ighted_source">var formats = <span c ass="br0">&#91;</span
><br />
<span c ass="st0">'((%d&#160;%s&#160;%d)&#160;%s&#160;%d)&#160;%s&#16
0;%d'</span>,<br />
<span c ass="st0">'(%d&#160;%s (%d&#160;%s&#160;%d))&#160
;%s&#160;%d'</span>,<br />
<span c ass="st0">'(%d&#160;%s&#160;%d)&#160;%s (%
d&#160;%s&#160;%d)'</span>,<br />
<span c ass="st0">'%d&#160;%s ((%d&#160;%s&
#160;%d)&#160;%s&#160;%d)'</span>,<br />
<span c ass="st0">'%d&#160;%s (%d&#1
60;%s (%d&#160;%s&#160;%d))'</span>,<br /><span c ass="br0">&#93;</span>;<br />&
#160;<br />var op = <span c ass="sy0">%</span>w<span c ass="br0">&#40;</span> <s
pan c ass="sy0">+</span> <span c ass="sy0">-</span> <span c ass="sy0">*</span> <
span c ass="sy0">/</span> <span c ass="br0">&#41;</span>;<br />var operators = o
p.<span c ass="me1">map</span> <span c ass="br0">&#123;</span> <span c ass="sy0"
>|</span>a<span c ass="sy0">|</span> op.<span c ass="me1">map</span> <span c ass
="br0">&#123;</span><span c ass="sy0">|</span>b<span c ass="sy0">|</span> op.<sp
an c ass="me1">map</span> <span c ass="br0">&#123;</span><span c ass="sy0">|</sp
an>c<span c ass="sy0">|</span> <span c ass="st0">&quot;#{a} #{b} #{c}&quot;</spa
n> <span c ass="br0">&#125;</span> <span c ass="br0">&#125;</span> <span c ass="
br0">&#125;</span>.<span c ass="me1">f atten</span>;<br />&#160;<br /><span c as
s="kw3"> oop</span> <span c ass="br0">&#123;</span><br />
var input = Sys.<sp
an c ass="me1">scan n</span><span c ass="br0">&#40;</span><span c ass="st0">&quo
t;Enter four integers or 'q' to exit: &quot;</span><span c ass="br0">&#41;</span
>;<br />
input == <span c ass="st0">'q'</span> <span c ass="sy0">&amp;&amp;</
span> <span c ass="kw1">break</span>;<br />&#160;<br />
input ~~ <span c ass=
"sy0">/</span>^\h<span c ass="sy0">*</span><span c ass="br0">&#91;</span><span c
ass="nu0">1</span><span c ass="sy0">-</span><span c ass="nu0">9</span><span c a
ss="br0">&#93;</span>\h<span c ass="sy0">+</span><span c ass="br0">&#91;</span><
span c ass="nu0">1</span><span c ass="sy0">-</span><span c ass="nu0">9</span><sp
an c ass="br0">&#93;</span>\h<span c ass="sy0">+</span><span c ass="br0">&#91;</
span><span c ass="nu0">1</span><span c ass="sy0">-</span><span c ass="nu0">9</sp
an><span c ass="br0">&#93;</span>\h<span c ass="sy0">+</span><span c ass="br0">&
#91;</span><span c ass="nu0">1</span><span c ass="sy0">-</span><span c ass="nu0"

>9</span><span c ass="br0">&#93;</span>\h<span c ass="sy0">*</span>$<span c ass=


"sy0">/</span> <span c ass="sy0">||</span> <span c ass="br0">&#40;</span><br />
say <span c ass="st0">&quot;Inva id input!&quot;</span>; <span c ass="kw1
">next</span>;<br />
<span c ass="br0">&#41;</span>;<br />&#160;<br />
var
n = input.<span c ass="kw3">sp it</span>.<span c ass="me1">map</span><span c as
s="br0">&#123;</span>.<span c ass="me1">to_i</span><span c ass="br0">&#125;</spa
n>;<br />
var numbers = n.<span c ass="me1">permute</span>;<br />&#160;<br />
formats.<span c ass="me1">each</span> <span c ass="br0">&#123;</span> <span
c ass="sy0">|</span><span c ass="kw3">format</span><span c ass="sy0">|</span><br
/>
numbers.<span c ass="me1">each</span> <span c ass="br0">&#123;</span>
<span c ass="sy0">|</span>n<span c ass="sy0">|</span><br />
operator
s.<span c ass="me1">each</span> <span c ass="br0">&#123;</span> <span c ass="sy0
">|</span>operator<span c ass="sy0">|</span><br />
var o = operat
or.<span c ass="kw3">sp it</span>;<br />
var str = <span c ass="b
r0">&#40;</span><span c ass="kw3">format</span> <span c ass="sy0">%</span> <span
c ass="br0">&#40;</span>n<span c ass="br0">&#91;</span><span c ass="nu0">0</spa
n><span c ass="br0">&#93;</span>,o<span c ass="br0">&#91;</span><span c ass="nu0
">0</span><span c ass="br0">&#93;</span>,n<span c ass="br0">&#91;</span><span c
ass="nu0">1</span><span c ass="br0">&#93;</span>,o<span c ass="br0">&#91;</span>
<span c ass="nu0">1</span><span c ass="br0">&#93;</span>,n<span c ass="br0">&#91
;</span><span c ass="nu0">2</span><span c ass="br0">&#93;</span>,o<span c ass="b
r0">&#91;</span><span c ass="nu0">2</span><span c ass="br0">&#93;</span>,n<span
c ass="br0">&#91;</span><span c ass="nu0">3</span><span c ass="br0">&#93;</span>
<span c ass="br0">&#41;</span><span c ass="br0">&#41;</span>;<br />
<span c ass="kw3">eva </span><span c ass="br0">&#40;</span>str<span c ass="br
0">&#41;</span> == <span c ass="nu0">24</span> <span c ass="sy0">&amp;&amp;</spa
n> say str;<br />
<span c ass="br0">&#125;</span><br />
<span
c ass="br0">&#125;</span><br />
<span c ass="br0">&#125;</span><br /><span c
ass="br0">&#125;</span></pre>
<p><b>Without eva uation:</b>
</p>
<pre c ass="ruby high ighted_source">var formats = <span c ass="br0">&#91;</span
><br />
<span c ass="br0">&#123;</span><span c ass="sy0">|</span>a,b,c<span c
ass="sy0">|</span><br />
<span c ass="kw4">Hash</span>.<span c ass="me1"
>new</span><span c ass="br0">&#40;</span><br />
func <span c ass="s
y0">=&gt;</span> <span c ass="br0">&#123;</span><span c ass="sy0">|</span>d,e,f,
g<span c ass="sy0">|</span> <span c ass="br0">&#40;</span><span c ass="br0">&#40
;</span>d.$a<span c ass="br0">&#40;</span>e<span c ass="br0">&#41;</span><span c
ass="br0">&#41;</span>.$b<span c ass="br0">&#40;</span>f<span c ass="br0">&#41;
</span><span c ass="br0">&#41;</span>.$c<span c ass="br0">&#40;</span>g<span c a
ss="br0">&#41;</span> <span c ass="br0">&#125;</span>.<span c ass="me1">copy</sp
an>,<br />
<span c ass="kw3">format</span> <span c ass="sy0">=&gt;</s
pan> <span c ass="st0">&quot;((%d #{a}&#160;%d) #{b}&#160;%d) #{c}&#160;%d&quot;
</span><br />
<span c ass="br0">&#41;</span><br />
<span c ass="br0">&
#125;</span>,<br />
<span c ass="br0">&#123;</span><span c ass="sy0">|</span>
a,b,c<span c ass="sy0">|</span><br />
<span c ass="kw4">Hash</span>.<span
c ass="me1">new</span><span c ass="br0">&#40;</span><br />
func <s
pan c ass="sy0">=&gt;</span> <span c ass="br0">&#123;</span><span c ass="sy0">|<
/span>d,e,f,g<span c ass="sy0">|</span> <span c ass="br0">&#40;</span>d.$a<span
c ass="br0">&#40;</span><span c ass="br0">&#40;</span>e.$b<span c ass="br0">&#40
;</span>f<span c ass="br0">&#41;</span><span c ass="br0">&#41;</span><span c ass
="br0">&#41;</span><span c ass="br0">&#41;</span>.$c<span c ass="br0">&#40;</spa
n>g<span c ass="br0">&#41;</span> <span c ass="br0">&#125;</span>.<span c ass="m
e1">copy</span>,<br />
<span c ass="kw3">format</span> <span c ass="s
y0">=&gt;</span> <span c ass="st0">&quot;(%d #{a} (%d #{b}&#160;%d)) #{c}&#160;%
d&quot;</span>,<br />
<span c ass="br0">&#41;</span><br />
<span c ass
="br0">&#125;</span>,<br />
<span c ass="br0">&#123;</span><span c ass="sy0">
|</span>a,b,c<span c ass="sy0">|</span><br />
<span c ass="kw4">Hash</spa
n>.<span c ass="me1">new</span><span c ass="br0">&#40;</span><br />
f
unc <span c ass="sy0">=&gt;</span> <span c ass="br0">&#123;</span><span c ass=

"sy0">|</span>d,e,f,g<span c ass="sy0">|</span> <span c ass="br0">&#40;</span>d.


$a<span c ass="br0">&#40;</span>e<span c ass="br0">&#41;</span><span c ass="br0"
>&#41;</span>.$b<span c ass="br0">&#40;</span>f.$c<span c ass="br0">&#40;</span>
g<span c ass="br0">&#41;</span><span c ass="br0">&#41;</span> <span c ass="br0">
&#125;</span>.<span c ass="me1">copy</span>,<br />
<span c ass="kw3">
format</span> <span c ass="sy0">=&gt;</span> <span c ass="st0">&quot;(%d #{a}&#1
60;%d) #{b} (%d #{c}&#160;%d)&quot;</span>,<br />
<span c ass="br0">&#41;
</span><br />
<span c ass="br0">&#125;</span>,<br />
<span c ass="br0">&#1
23;</span><span c ass="sy0">|</span>a,b,c<span c ass="sy0">|</span><br />
<span c ass="kw4">Hash</span>.<span c ass="me1">new</span><span c ass="br0">&#4
0;</span><br />
func <span c ass="sy0">=&gt;</span> <span c ass="br
0">&#123;</span><span c ass="sy0">|</span>d,e,f,g<span c ass="sy0">|</span> <spa
n c ass="br0">&#40;</span>d.$a<span c ass="br0">&#40;</span>e<span c ass="br0">&
#41;</span><span c ass="br0">&#41;</span>.$b<span c ass="br0">&#40;</span>f.$c<s
pan c ass="br0">&#40;</span>g<span c ass="br0">&#41;</span><span c ass="br0">&#4
1;</span> <span c ass="br0">&#125;</span>.<span c ass="me1">copy</span>,<br />
<span c ass="kw3">format</span> <span c ass="sy0">=&gt;</span> <span c
ass="st0">&quot;(%d #{a}&#160;%d) #{b} (%d #{c}&#160;%d)&quot;</span>,<br />
<span c ass="br0">&#41;</span><br />
<span c ass="br0">&#125;</span>,<br
/>
<span c ass="br0">&#123;</span><span c ass="sy0">|</span>a,b,c<span c ass
="sy0">|</span><br />
<span c ass="kw4">Hash</span>.<span c ass="me1">new
</span><span c ass="br0">&#40;</span><br />
func <span c ass="sy0">
=&gt;</span> <span c ass="br0">&#123;</span><span c ass="sy0">|</span>d,e,f,g<sp
an c ass="sy0">|</span> d.$a<span c ass="br0">&#40;</span>e.$b<span c ass="br0">
&#40;</span>f.$c<span c ass="br0">&#40;</span>g<span c ass="br0">&#41;</span><sp
an c ass="br0">&#41;</span><span c ass="br0">&#41;</span> <span c ass="br0">&#12
5;</span>.<span c ass="me1">copy</span>,<br />
<span c ass="kw3">form
at</span> <span c ass="sy0">=&gt;</span> <span c ass="st0">&quot;%d #{a} (%d #{b
} (%d #{c}&#160;%d))&quot;</span>,<br />
<span c ass="br0">&#41;</span><b
r />
<span c ass="br0">&#125;</span>,<br /><span c ass="br0">&#93;</span>;<br
/>&#160;<br />var op = <span c ass="sy0">%</span>w<span c ass="br0">&#40;</span
> <span c ass="sy0">+</span> <span c ass="sy0">-</span> <span c ass="sy0">*</spa
n> <span c ass="sy0">/</span> <span c ass="br0">&#41;</span>;<br />var b ocks =
op.<span c ass="me1">map</span> <span c ass="br0">&#123;</span> <span c ass="sy0
">|</span>a<span c ass="sy0">|</span> op.<span c ass="me1">map</span> <span c as
s="br0">&#123;</span> <span c ass="sy0">|</span>b<span c ass="sy0">|</span> op.<
span c ass="me1">map</span> <span c ass="br0">&#123;</span> <span c ass="sy0">|<
/span>c<span c ass="sy0">|</span> formats.<span c ass="me1">map</span> <span c a
ss="br0">&#123;</span> <span c ass="sy0">|</span><span c ass="kw3">format</span>
<span c ass="sy0">|</span><br />
<span c ass="kw3">format</span><span c ass="
br0">&#40;</span>a,b,c<span c ass="br0">&#41;</span><br /><span c ass="br0">&#12
5;</span><span c ass="br0">&#125;</span><span c ass="br0">&#125;</span><span c a
ss="br0">&#125;</span>.<span c ass="me1">f atten</span>;<br />&#160;<br /><span
c ass="kw3"> oop</span> <span c ass="br0">&#123;</span><br />
var input = Sys
.<span c ass="me1">scan n</span><span c ass="br0">&#40;</span><span c ass="st0">
&quot;Enter four integers or 'q' to exit: &quot;</span><span c ass="br0">&#41;</
span>;<br />
input == <span c ass="st0">'q'</span> <span c ass="sy0">&amp;&am
p;</span> <span c ass="kw1">break</span>;<br />&#160;<br />
input ~~ <span c
ass="sy0">/</span>^\h<span c ass="sy0">*</span><span c ass="br0">&#91;</span><sp
an c ass="nu0">1</span><span c ass="sy0">-</span><span c ass="nu0">9</span><span
c ass="br0">&#93;</span>\h<span c ass="sy0">+</span><span c ass="br0">&#91;</sp
an><span c ass="nu0">1</span><span c ass="sy0">-</span><span c ass="nu0">9</span
><span c ass="br0">&#93;</span>\h<span c ass="sy0">+</span><span c ass="br0">&#9
1;</span><span c ass="nu0">1</span><span c ass="sy0">-</span><span c ass="nu0">9
</span><span c ass="br0">&#93;</span>\h<span c ass="sy0">+</span><span c ass="br
0">&#91;</span><span c ass="nu0">1</span><span c ass="sy0">-</span><span c ass="
nu0">9</span><span c ass="br0">&#93;</span>\h<span c ass="sy0">*</span>$<span c
ass="sy0">/</span> <span c ass="sy0">||</span> <span c ass="br0">&#40;</span><br
/>
say <span c ass="st0">&quot;Inva id input!&quot;</span>; <span c ass=
"kw1">next</span>;<br />
<span c ass="br0">&#41;</span>;<br />&#160;<br />

var n = input.<span c ass="kw3">sp it</span>.<span c ass="me1">map</span><span


c ass="br0">&#123;</span>.<span c ass="me1">to_num</span><span c ass="br0">&#125
;</span>;<br />
var numbers = n.<span c ass="me1">permute</span>;<br />&#160;
<br />
b ocks.<span c ass="me1">each</span> <span c ass="br0">&#123;</span> <
span c ass="sy0">|</span>b ock<span c ass="sy0">|</span><br />
numbers.<s
pan c ass="me1">each</span> <span c ass="br0">&#123;</span> <span c ass="sy0">|<
/span>n<span c ass="sy0">|</span><br />
<span c ass="kw1">if</span> <
span c ass="br0">&#40;</span>b ock<span c ass="br0">&#91;</span><span c ass="re3
">:func</span><span c ass="br0">&#93;</span>.<span c ass="me1">ca </span><span
c ass="br0">&#40;</span>n...<span c ass="br0">&#41;</span> == <span c ass="nu0">
24</span><span c ass="br0">&#41;</span> <span c ass="br0">&#123;</span><br />
say <span c ass="br0">&#40;</span>b ock<span c ass="br0">&#91;</spa
n>:<span c ass="kw3">format</span><span c ass="br0">&#93;</span> <span c ass="sy
0">%</span> <span c ass="br0">&#40;</span>n...<span c ass="br0">&#41;</span><spa
n c ass="br0">&#41;</span>;<br />
<span c ass="br0">&#125;</span><br
/>
<span c ass="br0">&#125;</span><br />
<span c ass="br0">&#125;</spa
n><br /><span c ass="br0">&#125;</span></pre>
<div>
<d ><dt>Output:</div>
</dt></d >
<pre>
Enter four integers or 'q' to exit: 8 7 9 6
(8 / (9 - 7)) * 6
(6 / (9 - 7)) * 8
(8 * 6) / (9 - 7)
(6 * 8) / (9 - 7)
8 / ((9 - 7) / 6)
6 / ((9 - 7) / 8)
8 * (6 / (9 - 7))
6 * (8 / (9 - 7))
Enter four integers or 'q' to exit: q
</pre>
<h2><span c ass="editsection">[<a href="/mw/index.php?tit e=24_game/So ve&amp;ac
tion=edit&amp;section=45" tit e="Edit section: Swift">edit</a>]</span> <span c a
ss="mw-head ine" id="Swift"><a href="/wiki/Category:Swift" tit e="Category:Swift
">Swift</a></span></h2>
<pre c ass="text high ighted_source">&#160;<br />import Darwin<br />import Found
ation<br />&#160;<br />var so ution = &quot;&quot;<br />&#160;<br />print n(&quo
t;24 Game&quot;)<br />print n(&quot;Generating 4 digits...&quot;)<br />&#160;<br
/>func randomDigits() -&gt; [Int] {<br /> var resu t = [Int]()<br /> for i in
0 ..& t; 4 {<br />
resu t.append(Int(arc4random_uniform(9)+1))<br /> }<br /
> return resu t<br />}<br />&#160;<br />// Choose 4 digits<br /> et digits = ra
ndomDigits()<br />&#160;<br />print(&quot;Make 24 using these digits&#160;: &quo
t;)<br />&#160;<br />for digit in digits {<br /> print(&quot;\(digit) &quot;)<b
r />}<br />print n()<br />&#160;<br />// get input from operator<br />var input
= NSString(data:NSFi eHand e.fi eHand eWithStandardInput().avai ab eData, encodi
ng:NSUTF8StringEncoding)!<br />&#160;<br />var enteredDigits = [Doub e]()<br />&
#160;<br />var enteredOperations = [Character]()<br />&#160;<br /> et inputStrin
g = input as String<br />&#160;<br />// store input in the appropriate tab e<br
/>for character in inputString {<br /> switch character {<br /> case &quot;1&q
uot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;, &quot;5&quot;, &quot;6&quot;,
&quot;7&quot;, &quot;8&quot;, &quot;9&quot;:<br />
et digit = String(charac
ter)<br />
enteredDigits.append(Doub e(digit.toInt()!))<br /> case &quot;+&q
uot;, &quot;-&quot;, &quot;*&quot;, &quot;/&quot;:<br />
enteredOperations.ap
pend(character)<br /> case &quot;\n&quot;:<br />
print n()<br /> defau t:<b
r />
print n(&quot;Inva id expression&quot;)<br /> }<br />}<br />&#160;<br /
>// check va ue of expression provided by the operator<br />var va ue = 0.0<br /
>&#160;<br />if enteredDigits.count == 4 &amp;&amp; enteredOperations.count == 3
{<br /> va ue = enteredDigits[0]<br /> for (i, operation) in enumerate(entere
dOperations) {<br />
switch operation {<br />
case &quot;+&quot;:<br />

va ue = va ue + enteredDigits[i+1]<br />
case &quot;-&quot;:<br />
va
ue = va ue - enteredDigits[i+1]<br />
case &quot;*&quot;:<br />
va ue =
va ue * enteredDigits[i+1]<br />
case &quot;/&quot;:<br />
va ue = va u
e / enteredDigits[i+1]<br />
defau t:<br />
print n(&quot;This message s
hou d never happen!&quot;)<br />
}<br /> }<br />}<br />&#160;<br />func eva
uate(dPerm: [Doub e], oPerm: [String]) -&gt; Boo {<br /> var va ue = 0.0<br />
&#160;<br /> if dPerm.count == 4 &amp;&amp; oPerm.count == 3 {<br />
va ue =
dPerm[0]<br />
for (i, operation) in enumerate(oPerm) {<br />
switch op
eration {<br />
case &quot;+&quot;:<br />
va ue = va ue + dPerm[i+1]
<br />
case &quot;-&quot;:<br />
va ue = va ue - dPerm[i+1]<br />
case &quot;*&quot;:<br />
va ue = va ue * dPerm[i+1]<br />
case &
quot;/&quot;:<br />
va ue = va ue / dPerm[i+1]<br />
defau t:<br />
print n(&quot;This message shou d never happen!&quot;)<br />
}<br />
}<br /> }<br /> return (abs(24 - va ue) & t; 0.001)<br />}<br />&#160;<br
/>func isSo vab e(inout digits: [Doub e]) -&gt; Boo {<br />&#160;<br /> var re
su t = fa se<br /> var dPerms = [[Doub e]]()<br /> permute(&amp;digits, &amp;d
Perms, 0)<br />&#160;<br />
et tota = 4 * 4 * 4<br /> var oPerms = [[String]
]()<br /> permuteOperators(&amp;oPerms, 4, tota )<br />&#160;<br />&#160;<br />
for dig in dPerms {<br />
for opr in oPerms {<br />
var expression = &
quot;&quot;<br />&#160;<br />
if eva uate(dig, opr) {<br />
for digi
t in dig {<br />
expression += &quot;\(digit)&quot;<br />
}<br /
>&#160;<br />
for oper in opr {<br />
expression += oper<br />
}<br />&#160;<br />
so ution = beautify(expression)<br />
re
su t = true<br />
}<br />
}<br /> }<br /> return resu t<br />}<br />&#
160;<br />func permute(inout st: [Doub e], inout res: [[Doub e]], k: Int) -&gt;
Void {<br /> for i in k ..& t; st.count {<br />
swap(&amp; st[i], &amp; st
[k])<br />
permute(&amp; st, &amp;res, k + 1)<br />
swap(&amp; st[k], &amp
; st[i])<br /> }<br /> if k == st.count {<br />
res.append( st)<br /> }<b
r />}<br />&#160;<br />// n=4, tota =64, npow=16<br />func permuteOperators(inou
t res: [[String]], n: Int, tota : Int) -&gt; Void {<br /> et posOperations = [
&quot;+&quot;, &quot;-&quot;, &quot;*&quot;, &quot;/&quot;]<br />
et npow = n
* n<br /> for i in 0 ..& t; tota {<br />
res.append([posOperations[(i / npo
w)], posOperations[((i&#160;% npow) / n)], posOperations[(i&#160;% n)]])<br />
}<br />}<br />&#160;<br />func beautify(infix: String) -&gt; String {<br />
et
newString = infix as NSString<br />&#160;<br /> var so ution = &quot;&quot;<br
/>&#160;<br /> so ution += newString.substringWithRange(NSMakeRange(0, 1))<br
/> so ution += newString.substringWithRange(NSMakeRange(12, 1))<br /> so ution
+= newString.substringWithRange(NSMakeRange(3, 1))<br /> so ution += newString
.substringWithRange(NSMakeRange(13, 1))<br /> so ution += newString.substringWi
thRange(NSMakeRange(6, 1))<br /> so ution += newString.substringWithRange(NSMak
eRange(14, 1))<br /> so ution += newString.substringWithRange(NSMakeRange(9, 1)
)<br />&#160;<br /> return so ution<br />}<br />&#160;<br />if va ue&#160;!= 24
{<br /> print n(&quot;The va ue of the provided expression is \(va ue) instead
of 24!&quot;)<br /> if isSo vab e(&amp;enteredDigits) {<br />
print n(&quot
;quot;A possib e so ution cou d have been &quot; + so ution)<br /> } e se {<br
/>
print n(&quot;Anyway, there was no known so ution to this one.&quot;)<br /
> }<br />} e se {<br /> print n(&quot;Congratu ations, you found a so ution!&q
uot;)<br />}</pre>
<div>
<d ><dt>Output:</div>The program in action:
</dt></d >
<pre sty e="height:30ex;overf ow:scro ">
24 Game
Generating 4 digits...
Make 24 using these digits&#160;: 2 4 1 9
2+1*4+9
The va ue of the provided expression is 21.0 instead of 24!
A possib e so ution cou d have been 9-2-1*4

24 Game
Generating 4 digits...
Make 24 using these digits&#160;: 2 7 2 3
7-2*2*3
The va ue of the provided expression is 30.0 instead of 24!
A possib e so ution cou d have been 3+7+2*2
24 Game
Generating 4 digits...
Make 24 using these digits&#160;: 4 6 3 4
4+4+6+3
The va ue of the provided expression is 17.0 instead of 24!
A possib e so ution cou d have been 3*4-6*4
24 Game
Generating 4 digits...
Make 24 using these digits&#160;: 8 8 2 6
8+8+2+6
Congratu ations, you found a so ution!
24 Game
Generating 4 digits...
Make 24 using these digits&#160;: 6 7 8 9
6+7+8+9
The va ue of the provided expression is 30.0 instead of 24!
Anyway, there was no known so ution to this one.
</pre>
<h2><span c ass="editsection">[<a href="/mw/index.php?tit e=24_game/So ve&amp;ac
tion=edit&amp;section=46" tit e="Edit section: Tc ">edit</a>]</span> <span c ass
="mw-head ine" id="Tc "><a href="/wiki/Category:Tc " tit e="Category:Tc ">Tc </a
></span></h2>
<p>This is a comp ete Tc script, intended to be invoked from the command ine.
</p>
<div c ass="examp emeta ibheader"><b>Library:</b> <a href="/wiki/Category:Tc i
b" tit e="Category:Tc ib">Tc ib</a> <sma >(<b>Package:</b> struct:: ist)</sma
></div>
<pre c ass="tc high ighted_source"><span c ass="kw2">package</span> require str
uct::<span c ass="kw2"> ist</span><br /><span c ass="co1"># Encoding the various
expression trees that are possib e</span><br /><span c ass="kw1">set</span> pat
terns <span c ass="br0">&#123;</span><br />
<span c ass="br0">&#123;</span><s
pan c ass="br0">&#40;</span><span c ass="br0">&#40;</span>A x B<span c ass="br0"
>&#41;</span> y C<span c ass="br0">&#41;</span> z D<span c ass="br0">&#125;</spa
n><br />
<span c ass="br0">&#123;</span><span c ass="br0">&#40;</span>A x <s
pan c ass="br0">&#40;</span>B y C<span c ass="br0">&#41;</span><span c ass="br0"
>&#41;</span> z D<span c ass="br0">&#125;</span><br />
<span c ass="br0">&#1
23;</span><span c ass="br0">&#40;</span>A x B<span c ass="br0">&#41;</span> y <s
pan c ass="br0">&#40;</span>C z D<span c ass="br0">&#41;</span><span c ass="br0"
>&#125;</span><br />
<span c ass="br0">&#123;</span>A x <span c ass="br0">&
#40;</span><span c ass="br0">&#40;</span>B y C<span c ass="br0">&#41;</span> z D
<span c ass="br0">&#41;</span><span c ass="br0">&#125;</span><br />
<span c
ass="br0">&#123;</span>A x <span c ass="br0">&#40;</span>B y <span c ass="br0">
&#40;</span>C z D<span c ass="br0">&#41;</span><span c ass="br0">&#41;</span><sp
an c ass="br0">&#125;</span><br /><span c ass="br0">&#125;</span><br /><span c a
ss="co1"># Encoding the various permutations of digits</span><br /><span c ass="
kw1">set</span> permutations <span c ass="br0">&#91;</span>struct::<span c ass="
kw2"> ist</span> map <span c ass="br0">&#91;</span>struct::<span c ass="kw2"> is

t</span> permutations <span c ass="br0">&#123;</span>a b c d<span c ass="br0">&#


125;</span><span c ass="br0">&#93;</span> \<br />
<span c ass="br0">&#123
;</span>app y <span c ass="br0">&#123;</span>v <span c ass="br0">&#123;</span> a
ssign <span c ass="re0">$v</span> a b c d<span c ass="sy0">;</span> <span c ass=
"kw2"> ist</span> A <span c ass="re0">$a</span> B <span c ass="re0">$b</span> C
<span c ass="re0">$c</span> D <span c ass="re0">$d</span><span c ass="br0">&#125
;</span><span c ass="br0">&#125;</span><span c ass="br0">&#125;</span><span c as
s="br0">&#93;</span><br /><span c ass="co1"># The permitted operations</span><br
/><span c ass="kw1">set</span> operations <span c ass="br0">&#123;</span>+ - <s
pan c ass="sy0">*</span> /<span c ass="br0">&#125;</span><br />&#160;<br /><span
c ass="co1"># Given a ist of four integers (precondition not checked!) </span>
<br /><span c ass="co1"># return a ist of so utions to the 24 game using those
four integers.</span><br /><span c ass="kw1">proc</span> find24GameSo utions <sp
an c ass="br0">&#123;</span>va ues<span c ass="br0">&#125;</span> <span c ass="b
r0">&#123;</span><br />
<span c ass="kw1">g oba </span> operations patterns p
ermutations<br />
<span c ass="kw1">set</span> found <span c ass="br0">&#123;
</span><span c ass="br0">&#125;</span><br />
<span c ass="co1"># For each pos
sib e structure with numbers at the eaves...</span><br />
<span c ass="kw1">
foreach</span> pattern <span c ass="re0">$patterns</span> <span c ass="br0">&#12
3;</span><br /> <span c ass="kw1">foreach</span> permutation <span c ass="re0">$
permutations</span> <span c ass="br0">&#123;</span><br />
<span c ass=
"kw1">set</span> p <span c ass="br0">&#91;</span><span c ass="kw2">string</span>
map <span c ass="br0">&#91;</span><span c ass="kw2">subst</span> <span c ass="b
r0">&#123;</span><br />
a <span c ass="br0">&#91;</span><span c ass="kw2
"> index</span> <span c ass="re0">$va ues</span> <span c ass="nu0">0</span><span
c ass="br0">&#93;</span>.0<br />
b <span c ass="br0">&#91;</span>
<span c ass="kw2"> index</span> <span c ass="re0">$va ues</span> <span c ass="nu
0">1</span><span c ass="br0">&#93;</span>.0<br />
c <span c ass="b
r0">&#91;</span><span c ass="kw2"> index</span> <span c ass="re0">$va ues</span>
<span c ass="nu0">2</span><span c ass="br0">&#93;</span>.0<br />
d <span c ass="br0">&#91;</span><span c ass="kw2"> index</span> <span c ass="re0
">$va ues</span> <span c ass="nu0">3</span><span c ass="br0">&#93;</span>.0<br /
>
<span c ass="br0">&#125;</span><span c ass="br0">&#93;</span> <span
c ass="br0">&#91;</span><span c ass="kw2">string</span> map <span c ass="re0">$p
ermutation</span> <span c ass="re0">$pattern</span><span c ass="br0">&#93;</span
><span c ass="br0">&#93;</span><br />&#160;<br />
<span c ass="co1">#
For each possib e structure with operators at the branches...</span><br />
<span c ass="kw1">foreach</span> x <span c ass="re0">$operations</span> <spa
n c ass="br0">&#123;</span><br />
<span c ass="kw1">foreach</span>
y <span c ass="re0">$operations</span> <span c ass="br0">&#123;</span><br />
<span c ass="kw1">foreach</span> z <span c ass="re0">$operations</span> <spa
n c ass="br0">&#123;</span><br />
<span c ass="kw1">set</s
pan> e <span c ass="br0">&#91;</span><span c ass="kw2">string</span> map <span c
ass="br0">&#91;</span><span c ass="kw2">subst</span> <span c ass="br0">&#123;</
span>x <span c ass="re0">$x</span> y <span c ass="re0">$y</span> z <span c ass="
re0">$z</span><span c ass="br0">&#125;</span><span c ass="br0">&#93;</span> <spa
n c ass="re0">$p</span><span c ass="br0">&#93;</span><br />&#160;<br />
<span c ass="co1"># Try to eva uate (div-zero is an issue!) and add it to</span>
<br />
<span c ass="co1"># the resu t if it is 24</span><br />
<span c ass="kw1">catch</span> <span c ass="br0">&#123;</span><br />
<span c ass="kw1">if</span> <span c ass="br0">&#123;</span><span c ass="br0"
>&#91;</span><span c ass="kw1">expr</span> <span c ass="re0">$e</span><span c as
s="br0">&#93;</span> == <span c ass="nu0">24.0</span><span c ass="br0">&#125;</s
pan> <span c ass="br0">&#123;</span><br />
<span c
ass="kw2"> append</span> found <span c ass="br0">&#91;</span><span c ass="kw2">s
tring</span> map <span c ass="br0">&#123;</span>.0 <span c ass="br0">&#123;</spa
n><span c ass="br0">&#125;</span><span c ass="br0">&#125;</span> <span c ass="re
0">$e</span><span c ass="br0">&#93;</span><br />
<spa
n c ass="br0">&#125;</span><br />
<span c ass="br0">&#125;
</span><br />
<span c ass="br0">&#125;</span><br />

<span c ass="br0">&#125;</span><br />


<span c ass="br0">&#125;</span><br /
>
<span c ass="br0">&#125;</span><br />
<span c ass="br0">&#125;</span>
<br />
<span c ass="kw1">return</span> <span c ass="re0">$found</span><br /><
span c ass="br0">&#125;</span><br />&#160;<br /><span c ass="co1"># Wrap the so
ution finder into a p ayer</span><br /><span c ass="kw1">proc</span> print24Game
So utionFor <span c ass="br0">&#123;</span>va ues<span c ass="br0">&#125;</span>
<span c ass="br0">&#123;</span><br />
<span c ass="kw1">set</span> found <sp
an c ass="br0">&#91;</span><span c ass="kw2"> sort</span> -unique <span c ass="b
r0">&#91;</span>find24GameSo utions <span c ass="re0">$va ues</span><span c ass=
"br0">&#93;</span><span c ass="br0">&#93;</span><br />
<span c ass="kw1">if</
span> <span c ass="br0">&#123;</span><span c ass="sy0">!</span><span c ass="br0"
>&#91;</span><span c ass="kw2"> ength</span> <span c ass="re0">$found</span><sp
an c ass="br0">&#93;</span><span c ass="br0">&#125;</span> <span c ass="br0">&#1
23;</span><br />
<span c ass="kw2">puts</span> <span c ass="st0">&quot;No
so ution possib e&quot;</span><br />
<span c ass="br0">&#125;</span> <span c
ass="kw1">e se</span> <span c ass="br0">&#123;</span><br />
<span c ass="kw2
">puts</span> <span c ass="st0">&quot;Tota [ ength $found] so utions (may inc
ude ogica dup icates)&quot;</span><br />
<span c ass="kw2">puts</span>
<span c ass="st0">&quot;First so ution: [ index $found 0]&quot;</span><br />
<span c ass="br0">&#125;</span><br /><span c ass="br0">&#125;</span><br />print2
4GameSo utionFor <span c ass="kw2"><span c ass="re0">$argv</span></span></pre>
<div>
<d ><dt>Output:</div>
</dt></d >
<p>Demonstrating it in use:
</p>
<pre><span sty e="co or:si ver"><i>bash$</i></span> <span sty e="co or:brown">tc
sh8.4 24p ayer.tc 3 2 8 9</span>
<b>Tota 12 so utions (may inc ude ogica dup icates)</b>
<b>First so ution: ((9 - 3) * 8) / 2</b>
<span sty e="co or:si ver"><i>bash$</i></span> <span sty e="co or:brown">tc sh8.
4 24p ayer.tc 1 1 2 7</span>
<b>Tota 8 so utions (may inc ude ogica dup icates)</b>
<b>First so ution: (1 + 2) * (1 + 7)</b>
<span sty e="co or:si ver"><i>bash$</i></span> <span sty e="co or:brown">tc sh8.
4 24p ayer.tc 1 1 1 1</span>
<b>No so ution possib e</b>
</pre>
<h2><span c ass="editsection">[<a href="/mw/index.php?tit e=24_game/So ve&amp;ac
tion=edit&amp;section=47" tit e="Edit section: Ursa a">edit</a>]</span> <span c
ass="mw-head ine" id="Ursa a"><a href="/wiki/Category:Ursa a" tit e="Category:Ur
sa a">Ursa a</a></span></h2>
<p>This uses exhaustive search and exact rationa arithmetic to enumerate a so
utions. The a gorithms accommodate data sets with any number of digits and any
target va ue, but wi be imited in practice by combinatoria exp osion as note
d e sewhere. (Rationa s are stored as pairs of integers, hence
<code>("n",1)</code> for n/1, etc..)
</p><p>The <code>tree_shapes</code> function generates a ist of binary trees of
a possib e shapes for a given
number of eaves. The <code>with_ eaves</code> function substitutes a ist of nu
mbers into the eaves of
a tree in every possib e way. The <code>with_roots</code> function substitutes a
ist of operators into the
non-termina nodes of a tree in every possib e way. The <code>va ue</code> funct
ion eva uates a tree and the
<code>format</code> function disp ays it in a readab e form.
</p>
<pre c ass="text high ighted_source">#import std<br />#import nat<br />#import r
at<br />&#160;<br />tree_shapes = &quot;n&quot;. (@vLPiYo //eq iota &quot;n&quo
t;)*~ (rep&quot;n&quot; ~&amp;iiiK0N rNCCVSPTs) {0^:& t;&gt;}<br />with_ eaves =

^|Dr Dr K34SPSL/permutations ~&amp;<br />with_roots = ^Dr Dr K35d PvVoPSPSL\~&


amp;r @ rhvdNCBvLPTo2D S @hiNCSPtCx ~&amp;K0=&gt;<br />va ue
= *^ ~&amp;v?
\(@d ~&amp;\1) ^|H\~&amp;hthPX '+-*/'-$& t;sum,difference,product,quotient&gt;<b
r />format
= *^ ~&amp;v?\-+~&amp;h,%zP@d+- ^H/mat@d *v ~&amp;t?\~&amp;&#160
;:/`(+ --')'<br />&#160;<br />game&quot;n&quot; &quot;d&quot; = format* va ue==(
&quot;n&quot;,1)*~ with_roots/'+-*/' with_ eaves/&quot;d&quot;*-1 tree_shapes e
ngth &quot;d&quot;</pre>
<p>test program:
</p>
<pre c ass="text high ighted_source">#show+<br />&#160;<br />test_games = mat` *
pad` *K7 pad0 game24* & t;& t;2,3,8,9&gt;,& t;5,7,4,1&gt;,& t;5,6,7,8&gt;&gt;</
pre>
<p>output:
</p>
<pre>
8/(2/(9-3)) 1-(5-(7*4)) 6*(5+(7-8))
8*(9-(2*3)) 1-(5-(4*7)) 6*(7+(5-8))
8*(9-(3*2)) 1+((7*4)-5) 6*(7-(8-5))
8*((9-3)/2) 1+((4*7)-5) 6*(5-(8-7))
(8/2)*(9-3) (7*4)-(5-1) 6*(8/(7-5))
(9-3)/(2/8) (7*4)+(1-5) 8*(6/(7-5))
(9-3)*(8/2) (4*7)-(5-1) 6*((5+7)-8)
(8*(9-3))/2 (4*7)+(1-5) 6*((7+5)-8)
(9-(2*3))*8 (1-5)+(7*4) 6/((7-5)/8)
(9-(3*2))*8 (1-5)+(4*7) 6*((7-8)+5)
((9-3)/2)*8 (7*(5-1))-4 6*((5-8)+7)
((9-3)*8)/2 (1+(7*4))-5 8/((7-5)/6)
(1+(4*7))-5 (5+7)*(8-6)
((7*4)-5)+1 (7+5)*(8-6)
((7*4)+1)-5 (6*8)/(7-5)
((4*7)-5)+1 (8-6)*(5+7)
((4*7)+1)-5 (8-6)*(7+5)
((5-1)*7)-4 (8*6)/(7-5)
(6/(7-5))*8
(5+(7-8))*6
(7+(5-8))*6
(7-(8-5))*6
(5-(8-7))*6
(8/(7-5))*6
((5+7)-8)*6
((7+5)-8)*6
((7-8)+5)*6
((5-8)+7)*6
</pre>
<h2><span c ass="editsection">[<a href="/mw/index.php?tit e=24_game/So ve&amp;ac
tion=edit&amp;section=48" tit e="Edit section: zk ">edit</a>]</span> <span c ass
="mw-head ine" id="zk "><a href="/wiki/Category:Zk " tit e="Category:Zk ">zk </a
></span></h2>
<p>A brute for search for a so utions. Lexicographica dup icates are removed.
</p><p>Fi e so ve24.zk :
</p>
<pre c ass="text high ighted_source">var H=Uti s.He pers;<br />fcn u(xs){xs.redu
ce(fcn(us,s){us.ho ds(s) and us or us.append(s)},L())}<br />var ops=u(H.combosK(
3,&quot;+-*/&quot;.sp it(&quot;&quot;)).app y(H.permute).f atten());<br />var fs
=T(<br /> fcn f0(a,b,c,d,x,y,z){Op(z)(Op(y)(Op(x)(a,b),c),d)}, // ((AxB)yC)zD<
br /> fcn f1(a,b,c,d,x,y,z){Op(y)(Op(x)(a,b),Op(z)(c,d))}, // (AxB)y(CzD)<br /
> fcn f2(a,b,c,d,x,y,z){Op(z)(Op(x)(a,Op(y)(b,c)),d)}, // (Ax(ByC))zD<br />
fcn f3(a,b,c,d,x,y,z){Op(x)(a,Op(z)(Op(y)(b,c),d))}, // Ax((ByC)zD)<br /> fcn
f4(a,b,c,d,x,y,z){Op(x)(a,Op(y)(b,Op(z)(c,d)))}, // Ax(By(CzD))<br />);<br />&#1
60;<br />var fts= // format strings for human readab e formu as<br /> T(&quot;(

(d.d).d).d&quot;, &quot;(d.d).(d.d)&quot;, &quot;(d.(d.d)).d&quot;, &quot;d.((d.


d).d)&quot;, &quot;d.(d.(d.d))&quot;)<br /> .app y(T(T(&quot;rep ace&quot;,&quo
t;d&quot;,&quot;%d&quot;),T(&quot;rep ace&quot;,&quot;.&quot;,&quot;%s&quot;)));
<br />&#160;<br />fcn f2s(digits,ops,f){ // formu a (fs[n]) to string<br /> ft
s[f.name[1].toInt()]<br />
.fmt(H. istZip(digits,ops).f atten().xp ode(),di
gits[3]);<br />}<br />&#160;<br />fcn game24So ver(digitsString){<br /> digits
:=digitsString.sp it(&quot;&quot;).app y(&quot;toF oat&quot;);<br /> [[(digits
4,ops3,f); H.permute(digits); ops; <br />
fs,{try{f(digits4.xp ode(),ops3.xp
ode()).c oseTo(24,0.001)}<br />
catch(MathError){Fa se}}; <br />
{f
2s(digits4,ops3,f)}]];<br />}<br />&#160;<br />so utions:=u(game24So ver(ask(0,&
quot;digits: &quot;)));<br />print n(so utions. en(),&quot; so utions:&quot;);<b
r />so utions.app y2(Conso e.print n);</pre>
<p>One trick used is to ook at the so ving functions name and use the digit in
it to index into the formats ist.
</p>
<div>
<d ><dt>Output:</div>
</dt></d >
<pre>
zk so ve24.zk 6795
6 so utions:
6+((7-5)*9)
6-((5-7)*9)
6-(9*(5-7))
6+(9*(7-5))
(9*(7-5))+6
((7-5)*9)+6
zk so ve24.zk 1111
0 so utions:
zk so ve24.zk 3388
1 so utions:
8/(3-(8/3))
zk so ve24.zk 1234
242 so utions:
((1+2)+3)*4
...
</pre>
<!-NewPP imit report
Preprocessor visited node count: 2247/1000000
Preprocessor generated node count: 4279/1000000
Post-expand inc ude size: 9169/2097152 bytes
Temp ate argument size: 1617/2097152 bytes
Highest expansion depth: 5/40
Expensive parser function count: 0/100
-->
<!-- Saved in parser cache with key rosettacode:pcache:idhash:4940-0!1!0!!en!2!*
and timestamp 20151010173809 -->
</div>
<!-- /bodycontent -->
<!-- printfooter
-->
<div c ass="printfooter">
Retrieved from "<a href="http://rosettacode.org/
mw/index.php?tit e=24_game/So ve&amp;o did=210398">http://rosettacode.org/mw/ind
ex.php?tit e=24_game/So ve&amp;o did=210398</a>"

</div>
<!-- /printfooter -->
<!-- cat inks -->
<div id='cat inks' c ass='cat inks'><div id="mwnorma -cat inks" c ass="mw-norma -cat inks"><a href="/wiki/Specia :Categories" t
it e="Specia :Categories">Categories</a>: <u >< i><a href="/wiki/Category:Progra
mming_Tasks" tit e="Category:Programming Tasks">Programming Tasks</a></ i>< i><a
href="/wiki/Category:So utions_by_Programming_Task" tit e="Category:So utions b
y Programming Task">So utions by Programming Task</a></ i>< i><a href="/wiki/Cat
egory:ABAP" tit e="Category:ABAP">ABAP</a></ i>< i><a href="/wiki/Category:Argi
e" tit e="Category:Argi e">Argi e</a></ i>< i><a href="/wiki/Category:AutoHotkey
" tit e="Category:AutoHotkey">AutoHotkey</a></ i>< i><a href="/wiki/Category:BBC
_BASIC" tit e="Category:BBC BASIC">BBC BASIC</a></ i>< i><a href="/wiki/Category
:C" tit e="Category:C">C</a></ i>< i><a href="/wiki/Category:C%2B%2B" tit e="Cat
egory:C++">C++</a></ i>< i><a href="/wiki/Category:C ojure" tit e="Category:C oj
ure">C ojure</a></ i>< i><a href="/wiki/Category:CoffeeScript" tit e="Category:C
offeeScript">CoffeeScript</a></ i>< i><a href="/wiki/Category:Common_Lisp" tit e
="Category:Common Lisp">Common Lisp</a></ i>< i><a href="/wiki/Category:D" tit e
="Category:D">D</a></ i>< i><a href="/wiki/Category:ERRE" tit e="Category:ERRE">
ERRE</a></ i>< i><a href="/wiki/Category:Eu er_Math_Too box" tit e="Category:Eu
er Math Too box">Eu er Math Too box</a></ i>< i><a href="/wiki/Category:F_Sharp"
tit e="Category:F Sharp">F Sharp</a></ i>< i><a href="/wiki/Category:Fortran" t
it e="Category:Fortran">Fortran</a></ i>< i><a href="/wiki/Category:GAP" tit e="
Category:GAP">GAP</a></ i>< i><a href="/wiki/Category:Go" tit e="Category:Go">Go
</a></ i>< i><a href="/wiki/Category:Gosu" tit e="Category:Gosu">Gosu</a></ i><
i><a href="/wiki/Category:Haske " tit e="Category:Haske ">Haske </a></ i>< i>
<a href="/wiki/Category:Icon" tit e="Category:Icon">Icon</a></ i>< i><a href="/w
iki/Category:Unicon" tit e="Category:Unicon">Unicon</a></ i>< i><a href="/wiki/C
ategory:Icon_Programming_Library" tit e="Category:Icon Programming Library">Icon
Programming Library</a></ i>< i><a href="/wiki/Category:J" tit e="Category:J">J
</a></ i>< i><a href="/wiki/Category:Java" tit e="Category:Java">Java</a></ i><
i><a href="/wiki/Category:JavaScript" tit e="Category:JavaScript">JavaScript</a>
</ i>< i><a href="/wiki/Category:Jq" tit e="Category:Jq">Jq</a></ i>< i><a href=
"/wiki/Category:Ju ia" tit e="Category:Ju ia">Ju ia</a></ i>< i><a href="/wiki/C
ategory:Liberty_BASIC" tit e="Category:Liberty BASIC">Liberty BASIC</a></ i>< i>
<a href="/wiki/Category:Lua" tit e="Category:Lua">Lua</a></ i>< i><a href="/wiki
/Category:Mathematica" tit e="Category:Mathematica">Mathematica</a></ i>< i><a h
ref="/wiki/Category:Wo fram_Language" tit e="Category:Wo fram Language">Wo fram
Language</a></ i>< i><a href="/wiki/Category:OCam " tit e="Category:OCam ">OCam
</a></ i>< i><a href="/wiki/Category:Per " tit e="Category:Per ">Per </a></ i><
i><a href="/wiki/Category:Per _6" tit e="Category:Per 6">Per 6</a></ i>< i><a
href="/wiki/Category:Phix" tit e="Category:Phix">Phix</a></ i>< i><a href="/wiki
/Category:PicoLisp" tit e="Category:PicoLisp">PicoLisp</a></ i>< i><a href="/wik
i/Category:ProDOS" tit e="Category:ProDOS">ProDOS</a></ i>< i><a href="/wiki/Cat
egory:Pro og" tit e="Category:Pro og">Pro og</a></ i>< i><a href="/wiki/Category
:Python" tit e="Category:Python">Python</a></ i>< i><a href="/wiki/Category:R" t
it e="Category:R">R</a></ i>< i><a href="/wiki/Category:Racket" tit e="Category:
Racket">Racket</a></ i>< i><a href="/wiki/Category:REXX" tit e="Category:REXX">R
EXX</a></ i>< i><a href="/wiki/Category:Ruby" tit e="Category:Ruby">Ruby</a></ i
>< i><a href="/wiki/Category:Sca a" tit e="Category:Sca a">Sca a</a></ i>< i><a
href="/wiki/Category:Sidef" tit e="Category:Sidef">Sidef</a></ i>< i><a href="/w
iki/Category:Swift" tit e="Category:Swift">Swift</a></ i>< i><a href="/wiki/Cate
gory:Tc " tit e="Category:Tc ">Tc </a></ i>< i><a href="/wiki/Category:Tc ib" t
it e="Category:Tc ib">Tc ib</a></ i>< i><a href="/wiki/Category:Ursa a" tit e=
"Category:Ursa a">Ursa a</a></ i>< i><a href="/wiki/Category:Zk " tit e="Categor
y:Zk ">Zk </a></ i>< i><a href="/wiki/Category:GUISS/Omit" tit e="Category:GUISS
/Omit">GUISS/Omit</a></ i>< i><a href="/wiki/Category:ML/I/Omit" tit e="Category
:ML/I/Omit">ML/I/Omit</a></ i></u ></div></div>
<!-- /ca
t inks -->

<div c ass="visua C ear"></div>


-->

<!-- debughtm -->


<!-- /debughtm
</div>
<!-- /bodyContent -->
</div>
<!-- /content -->
<!-- header -->
<div id="mw-head" c ass="noprint">
<!-- 0 -->
<div id="p-persona " c ass="">
<h5>Persona too s</h5>
<u >
< i id="pt-createaccount"><a href="/mw/index.php?tit e=Specia :U
serLogin&amp;returnto=24+game%2FSo ve&amp;type=signup">Create account</a></ i>
< i id="pt- ogin"><a href="/mw/index.php?tit e=Specia :UserLogin
&amp;returnto=24+game%2FSo ve" tit e="You are encouraged to og in; however, it
is not mandatory [o]" accesskey="o">Log in</a></ i>
</u >
</div>
<!-- /0 -->
<div id=" eft-navigation">
<!-- 0 -->
<div id="p-namespaces" c ass="vectorTabs">
<h5>Namespaces</h5>
<u >
< i id="ca-nstab-main" c ass="se ected"
><span><a href="/wiki/24_game/So ve" tit e="View the content page [c]" accesske
y="c">Page</a></span></ i>
< i id="ca-ta k"><span><a href="/wiki/T
a k:24_game/So ve" tit e="Discussion about the content page [t]" accesskey="t">
Discussion</a></span></ i>
</u >
</div>
<!-- /0 -->
<!-- 1 -->
<div id="p-variants" c ass="vectorMenu emptyPort et">
<h4>
</h4>
<h5><span>Variants</span><a href="#"></a></h5>
<div c ass="menu">
<u >
</u >
</div>
</div>
<!-- /1 -->
</div>
<div id="right-navigation">
<!-- 0 -->
<div id="p-views" c ass="vectorTabs">
<h5>Views</h5>

<u >
< i id="ca-view" c ass="se ected"><span>
<a href="/wiki/24_game/So ve" >Read</a></span></ i>
< i id="ca-edit"><span><a href="/mw/inde
x.php?tit e=24_game/So ve&amp;action=edit" tit e="You can edit this page. P eas
e use the preview button before saving [e]" accesskey="e">Edit</a></span></ i>
< i id="ca-history" c ass="co apsib e">
<span><a href="/mw/index.php?tit e=24_game/So ve&amp;action=history" tit e="Pas
t revisions of this page [h]" accesskey="h">View history</a></span></ i>
</u >
</div>
<!-- /0 -->
<!-- 1 -->
<div id="p-cactions" c ass="vectorMenu emptyPort et">
<h5><span>Actions</span><a href="#"></a></h5>
<div c ass="menu">
<u >
</u >
</div>
</div>
<!-- /1 -->
<!-- 2 -->
<div id="p-search">
<h5>< abe for="searchInput">Search</ abe ></h5>
<form action="/mw/index.php" id="searchform">
<div>
<input type="search" name="search" tit e="Search Rosetta
Code [f]" accesskey="f" id="searchInput" />
<input type="sub
mit" name="go" va ue="Go" tit e="Go to a page with this exact name if exists" id
="searchGoButton" c ass="searchButton" />
<input type="sub
mit" name="fu text" va ue="Search" tit e="Search the pages for this text" id="m
w-searchButton" c ass="searchButton" />
<input t
ype='hidden' name="tit e" va ue="Specia :Search"/>
</div>
</form>
</div>
<!-- /2 -->
</div>
</div>
<!-- /header -->
<!-- pane -->
<div id="mw-pane " c ass="noprint">
<!-- ogo -->
<div id="p- ogo"><a sty e="background-im
age: ur (/mw/tit e.png);" href="/wiki/Rosetta_Code" tit e="Visit the main page"
></a></div>
<!-- / ogo -->
<!-- Community -->
<div c ass="porta " id='p-Community'>
<h5>Community</h5>
<div c ass="body">
<u >
< i id="n-Twitter"><a href="http://twitter.com/rosettaco
de" re ="nofo ow">Twitter</a></ i>

at/IRC</a></ i>

< i id="n-Chat.2FIRC"><a href="/wiki/Specia :WebChat">Ch


< i id="n-P anet"><a href="http://rosettacode.org/p anet
" re ="nofo ow">P anet</a></ i>
< i id="n-The-Vi age-Pump"><a href="/wiki/Rosetta_Code:
Vi age_Pump">The Vi age Pump</a></ i>
< i id="n-Finances"><a href="/wiki/Rosetta_Code:Finances
">Finances</a></ i>
</u >
</div>
</div>
<!-- /Community -->
<!-- Exp ore -->
<div c ass="porta " id='p-Exp ore'>
<h5>Exp ore</h5>
<div c ass="body">
<u >
< i id="n-Languages"><a href="/wiki/Category:Programming
_Languages">Languages</a></ i>
< i id="n-Tasks"><a href="/wiki/Category:Programming_Tas
ks">Tasks</a></ i>
< i id="n-recentchanges"><a href="/wiki/Specia :RecentCh
anges" tit e="A ist of recent changes in the wiki [r]" accesskey="r">Recent cha
nges</a></ i>
< i id="n-Simi ar-sites"><a href="/wiki/He p:Simi ar_Sit
es">Simi ar sites</a></ i>
< i id="n-randompage"><a href="/wiki/Specia :Random" tit
e="Load a random page [x]" accesskey="x">Random page</a></ i>
</u >
</div>
</div>
<!-- /Exp ore -->
<!-- Misc -->
<div c ass="porta " id='p-Misc'>
<h5>Misc</h5>
<div c ass="body">
<!-- P ace this tag where you want the +1 button to render -->
<g:p usone></g:p usone>
<!-- P ace this render ca where appropriate -->
<script type="text/rocketscript">
(function() {
var po = document.createE ement('script'); po.type = 'text/javascript'; po.a
sync = true;
po.src = 'https://apis.goog e.com/js/p usone.js';
var s = document.getE ementsByTagName('script')[0]; s.parentNode.insertBefor
e(po, s);
})();
</script>
<a href="https://twitter.com/share" c ass="twitter-share-button" data- ang="en"
data-size=" arge" data-hashtags="rosettacode">Tweet</a>
<script type="text/rocketscript">!function(d,s,id){var js,fjs=d.getE ementsByTag
Name(s)[0];if(!d.getE ementById(id)){js=d.createE ement(s);js.id=id;js.src="//p
atform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"
script","twitter-wjs");</script>
<script data-rocketsrc="http://www.stumb eupon.com/hostedbadge.php?s=2" type="te

xt/rocketscript"></script>
</div>

</div>

<!-- /Misc -->


<!-- SEARCH -->
<!-- /SEARCH -->
<!-- TOOLBOX -->
<div c ass="porta " id='p-tb'>
<h5>Too box</h5>
<div c ass="body">
<u >
< i id="t-what inkshere"><a href="/wiki/Specia :WhatLink
sHere/24_game/So ve" tit e="A ist of a
wiki pages that ink here [j]" accessk
ey="j">What inks here</a></ i>
< i id="t-recentchanges inked"><a href="/wiki/Specia :Re
centChangesLinked/24_game/So ve" tit e="Recent changes in pages inked from this
page [k]" accesskey="k">Re ated changes</a></ i>
< i id="t-specia pages"><a href="/wiki/Specia :Specia Pa
ges" tit e="A ist of a specia pages [q]" accesskey="q">Specia pages</a></ i
>
< i id="t-print"><a href="/mw/index.php?tit e=24_game/So
ve&amp;printab e=yes" re ="a ternate" tit e="Printab e version of this page [p]
" accesskey="p">Printab e version</a></ i>
< i id="t-perma ink"><a href="/mw/index.php?tit e=24_gam
e/So ve&amp;o did=210398" tit e="Permanent ink to this revision of the page">Pe
rmanent ink</a></ i>
< i id="t-smwbrowse ink"><a href="/wiki/Specia :Browse/24_game-2FSo ve" tit e="S
pecia :Browse/24 game-2FSo ve">Browse properties</a></ i>
</u >
</div>
</div>
<!-- /TOOLBOX -->
<!-- LANGUAGES -->
<!-- /LANGUAGES -->
</div>
<!-- /pane -->
<!-- footer -->
<div id="footer">
<u id="footer-info">
< i id="footer-info- astmod"> This page was ast modified on 26 August 2015, at
18:58.</ i>
< i id="footer-info-copyright">Content is avai ab e under <a c ass="externa " hr
ef="http://www.gnu.org/ icenses/fd -1.2.htm ">GNU Free Documentation License 1.2
</a>.</ i>
</u >
<u id="footer-p aces">
< i id="footer-p aces-privacy"><a href="/wiki/Rosetta_Code:Privacy_po icy" tit e
="Rosetta Code:Privacy po icy">Privacy po icy</a></ i>
< i id="footer-p aces-about"><a href="/wiki/Rosetta_Code:About" tit e="Rosetta C
ode:About">About Rosetta Code</a></ i>

< i id="footer-p aces-disc aimer"><a href="/wiki/Rosetta_Code:Genera _disc aimer


" tit e="Rosetta Code:Genera disc aimer">Disc aimers</a></ i>
</u >
<u id="footer-icons" c ass="noprint">
< i id="footer-copyrightico">
<a href="http://www.gnu.org/ ice
nses/fd -1.2.htm "><img src="/mw/skins/common/images/gnu-fd .png" a t="GNU Free
Documentation License 1.2" width="88" height="31" /></a>
</ i>
< i id="footer-poweredbyico">
<a href="//www.mediawiki.org/"><
img src="/mw/skins/common/images/poweredby_mediawiki_88x31.png" a t="Powered by
MediaWiki" width="88" height="31" /></a>
<a href="http://www.semantic-med
iawiki.org/wiki/Semantic_MediaWiki"><img src="/mw/extensions/SemanticMediaWiki/s
kins/images/smw_button.png" a t="Powered by Semantic MediaWiki" width="88" heigh
t="31" /></a>
</ i>
</u >
<div sty e="c ear:both"></div>
</div>
<!-- /footer -->
<script type="text/rocketscript">if(window.mw){
mw. oader.state({"site":" oading","user":"ready","user.groups":"ready"});
}</script>
<script data-rocketsrc="http://rosettacode.org/mw/ oad.php?debug=fa se&amp; ang=
en&amp;modu es=skins.vector&amp;on y=scripts&amp;skin=vector&amp;*" type="text/r
ocketscript"></script>
<script type="text/rocketscript">if(window.mw){
mw. oader. oad(["mediawiki.user","mediawiki.page.ready","mediawiki.searchSuggest
"], nu , true);
}</script>
<script type="text/rocketscript">/* C oudF are ana ytics upgrade */
</script>
<script data-rocketsrc="http://rosettacode.org/mw/ oad.php?debug=fa se&amp; ang=
en&amp;modu es=site&amp;on y=scripts&amp;skin=vector&amp;*" type="text/rocketscr
ipt"></script>
<!-- Served in 0.378 secs. -->
</body>
</htm >

Potrebbero piacerti anche