<snapdata remixID="59804"><project name="U5-TTT-ITIT-TIF" app="Snap! 4.1, http://snap.berkeley.edu" version="1"><notes></notes><thumbnail>data:image/png;base64,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</thumbnail><stage name="Stage" width="480" height="360" costume="0" tempo="60" threadsafe="false" lines="round" ternary="true" codify="false" inheritance="true" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAACtUlEQVR4nO3BMQEAAADCoPVPbQwfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Bo3+AAF/RMkcAAAAAElFTkSuQmCC</pentrails><costumes><list id="2"></list></costumes><sounds><list id="3"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="Square" idx="1" x="-50" y="-100" heading="90" scale="1" rotation="1" draggable="true" hidden="true" costume="1" color="80,80,80" pen="tip" id="8"><costumes><list id="9"><item><ref mediaID="Square_cst_Empty"></ref></item><item><ref mediaID="Square_cst_X"></ref></item><item><ref mediaID="Square_cst_O"></ref></item></list></costumes><sounds><list id="10"></list></sounds><blocks></blocks><variables><variable name="square number"><l>0</l></variable></variables><scripts><comment x="17.333333333333332" y="6.666666666666667" w="380" collapsed="false">ITIT 13 (Let player choose X or O.)&#xD;&#xD;Add a variable HUMAN&apos;S SYMBOL whose value will be X or O, whichever the user chooses.  Another variable COMPUTER&apos;S SYMBOL is the opponent of that one.  (The second variable isn&apos;t really necessary; you could use OPPONENT (HUMAN&apos;S SYMBOL) instead.  This just makes the program a little more self-documenting.)&#xD;If the user chooses O, make the computer&apos;s first move in square 5.  (Note how simple it is to do that: it&apos;s just BROADCAST 5.)&#xD;The only procedure that has to be modified is NEXT MOVE FOR COMPUTER, which has to check HUMAN&apos;S SYMBOL instead of just assuming that the computer is O.&#xD;Most of the effort goes into the interaction in which the user chooses X or O; the actual play is hardly changed.</comment><script x="17.599999999999984" y="258.6000000000001"><block s="receiveGo"></block><block s="doSetVar"><l>board</l><block s="reportNewList"><list><l>1</l><l>2</l><l>3</l><l>4</l><l>5</l><l>6</l><l>7</l><l>8</l><l>9</l></list></block></block><block s="doWait"><l>.1</l></block><block s="doSetVar"><l>human&apos;s symbol</l><l>foo</l></block><block s="doUntil"><block s="reportListContainsItem"><block s="reportNewList"><list><l>X</l><l>O</l></list></block><block var="human&apos;s symbol"/></block><script><block s="doAsk"><l>Do you want to play X (you go first) or O (computer goes first)?</l></block><block s="doSetVar"><l>human&apos;s symbol</l><block s="getLastAnswer"></block></block></script></block><block s="doSetVar"><l>computer&apos;s symbol</l><custom-block s="opponent %s"><block var="human&apos;s symbol"/></custom-block></block><custom-block s="makeBoard"></custom-block><block s="doSetVar"><l>X&apos;s turn?</l><block s="reportBoolean"><l><bool>true</bool></l></block></block><block s="doIf"><block s="reportEquals"><block var="human&apos;s symbol"/><l>O</l></block><script><block s="doBroadcast"><l>5</l></block></script><comment w="178" collapsed="false">If human wants to play O, make computer&apos;s first move in center square.</comment></block></script><script x="20.799999999999994" y="188.66666666666666"><block s="receiveGo"></block><block s="removeClone"></block></script><script x="12.333333333333334" y="706.0666666666666"><block s="receiveMessage"><l><option>any message</option></l></block><block s="doIf"><block s="reportEquals"><block s="getLastMessage"></block><block var="square number"/></block><script><custom-block s="move in this square"></custom-block></script></block></script><script x="15.333333333333334" y="588.7333333333337"><block s="receiveInteraction"><l><option>clicked</option></l></block><block s="doIf"><block s="reportEquals"><block s="reportAttributeOf"><l><option>costume name</option></l><block s="reportGet"><l><option>self</option></l></block></block><l>Empty</l></block><script><custom-block s="move in this square"></custom-block></script></block></script><comment x="8.666666666666666" y="834.4" w="374.6666666666667" collapsed="false">TIF A (beat the computer):  The computer&apos;s minimal strategy turns out to be pretty good!  There is one obscure sequence of moves that can beat it:  Choose X, and /don&apos;t/ make the first move in the center.  Instead, move in square 1.  The computer will then move in square 5.  Now move in square 9.  (This is a really counterintuitive move!  It doesn&apos;t seem to help at all, because the computer has already blocked the diagonal.)  The computer will now move in another corner, let&apos;s say 3.  The player must now take the fourth corner (7) in order to block the computer&apos;s win.  But now there are two different winning edges!  Whichever the computer doesn&apos;t block, you take to win.&#xD;&#xD;But the computer&apos;s strategy is weak in a different sense:  If the user chooses O, the computer starts in the center, and the user moves in an edge square, the computer should win the game, but instead will tie.  This is what the suggestion in TIF B is meant to fix.&#xD;&#xD;The fix for the case of the player moving in a corner and then in the opposite order is made by modifying BEST EMPTY SQUARE to take the ordered list of good moves as an input, and then modifying NEXT MOVE FOR COMPUTER so that if there is an XOX as the only filled triple. then an edge is better than a corner.</comment><script x="12" y="1275.3333333333333"><block s="doIf"><block s="reportGreaterThan"><custom-block s="fork %s"><block var="computer&apos;s symbol"/></custom-block><l>0</l><comment w="254" collapsed="true">Add these rules to NEXT MOVE FOR COMPUTER.</comment></block><script><block s="doReport"><custom-block s="fork %s"><block var="computer&apos;s symbol"/></custom-block></block></script></block><block s="doIf"><block s="reportGreaterThan"><custom-block s="fork %s"><block var="human&apos;s symbol"/></custom-block><l>0</l></block><script><block s="doReport"><custom-block s="fork %s"><block var="human&apos;s symbol"/></custom-block></block></script></block></script><script x="13.666666666666666" y="1241.3333333333333"><custom-block s="fork %s"><l></l><comment w="223.33333333333334" collapsed="true">Look inside this block for the rest of TIF B.</comment></custom-block></script><comment x="6.666666666666667" y="1141.3333333333335" w="373.3333333333333" collapsed="false">TIF B (forking):&#xD;b. If there&apos;s a winning triple in which the computer already has two of the three squares, then there&apos;s no need to think about forking -- the computer can win by playing in the third (empty) square of the triple.  That&apos;s &quot;Rule 1.&quot;&#xD;</comment><script x="19.666666666666668" y="1106.888888888889"><custom-block s="best empty square %l"><l/></custom-block></script><script x="165.66666666666666" y="1107.5555555555557"><custom-block s="next move for computer"><comment w="55.333333333333336" collapsed="true">edit me</comment></custom-block></script></scripts></sprite><watcher var="X&apos;s turn?" style="normal" x="10.000000000000227" y="10" color="243,118,29" hidden="true"/><watcher var="board" style="normal" x="7.473684210526244" y="32.249998000000005" color="243,118,29" extX="120" extY="105"/><watcher var="positions" style="normal" x="10" y="10" color="243,118,29" hidden="true"/><watcher scope="Square" var="square number" style="normal" x="10" y="40.000001999999995" color="243,118,29" hidden="true"/><watcher var="human&apos;s symbol" style="normal" x="10" y="70.00000399999999" color="243,118,29" hidden="true"/><watcher var="computer&apos;s symbol" style="normal" x="13" y="68.00000599999998" color="243,118,29" hidden="true"/></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="label %&apos;text&apos; of size %&apos;size&apos;" type="command" category="pen"><comment x="0" y="0" w="90" collapsed="false">LABEL will stamp text on the stage at the given font size. The direction of the text is the direction the sprite is facing, and color will match the pen color.</comment><header></header><code></code><inputs><input type="%txt">Hello!</input><input type="%n">12</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>text</l><l>size</l></list><l>var stage = this.parentThatIsA(StageMorph),&#xD;    context = stage.penTrails().getContext(&apos;2d&apos;),&#xD;    rotation = radians(this.direction() - 90),&#xD;    trans = new Point(&#xD;      this.center().x - stage.left(),&#xD;      this.center().y - stage.top()&#xD;    ),&#xD;    isWarped = this.Warped,&#xD;    len,&#xD;    pos;&#xD;&#xD;if (isWarped) {endWarp(); }&#xD;context.save();&#xD;context.font = size + &apos;px monospace&apos;;&#xD;context.textAlign = &apos;left&apos;;&#xD;context.textBaseline = &apos;alphabetic&apos;;&#xD;context.fillStyle = this.color.toString();&#xD;len = context.measureText(text).width;&#xD;trans = trans.multiplyBy(1 / stage.scale);&#xD;context.translate(trans.x, trans.y);&#xD;context.rotate(rotation);&#xD;context.fillText(text, 0, 0);&#xD;context.translate(-trans.x, -trans.y);&#xD;context.restore();&#xD;pos = new Point(&#xD;  len * Math.sin(radians(this.direction())),&#xD;  len * Math.cos(radians(this.direction())));&#xD;pos = pos.add(new Point(this.xPosition(), this.yPosition()));&#xD;this.gotoXY(pos.x, pos.y, false);&#xD;this.changed();&#xD;if (isWarped) {this.startWarp(); }&#xD;stage.changed();</l></block><list><block var="text"/><block var="size"/></list></block></script></block-definition><block-definition s="map %&apos;function&apos; over %&apos;lists&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%repRing"></input><input type="%mult%l"></input></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>mapone</l><l>mapmany</l></list></block><block s="doSetVar"><l>mapone</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="evaluate"><block var="mapone"/><list><block s="reportCDR"><block var="data"/></block></list></block></block></block></script><list><l>data</l></list></block></block><block s="doSetVar"><l>mapmany</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportListItem"><l>1</l><block var="data lists"/></block></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><block s="reportListItem"><l>1</l><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block></block><block s="evaluate"><block var="mapmany"/><list><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><block s="reportCDR"><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block></list></block></block></block></script><list><l>data lists</l></list></block></block><block s="doIfElse"><custom-block s="empty? %l"><block s="reportCDR"><block var="lists"/></block></custom-block><script><block s="doReport"><block s="evaluate"><block var="mapone"/><list><block s="reportListItem"><l>1</l><block var="lists"/></block></list></block></block></script><script><block s="doReport"><block s="evaluate"><block var="mapmany"/><list><block var="lists"/></list></block></block></script></block></script></block></script></block-definition><block-definition s="keep items such that %&apos;pred&apos; from %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%predRing"></input><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIfElse"><block s="evaluate"><block var="pred"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="keep items such that %predRing from %l"><block var="pred"/><block s="reportCDR"><block var="data"/></block></custom-block></block></block></script><script><block s="doReport"><custom-block s="keep items such that %predRing from %l"><block var="pred"/><block s="reportCDR"><block var="data"/></block></custom-block></block></script></block></script></block></script></block-definition><block-definition s="combine with %&apos;function&apos; items of %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%repRing"></input><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportCDR"><block var="data"/></block></custom-block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="data"/></block></block></script></block><block s="doReport"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="combine with %repRing items of %l"><block var="function"/><block s="reportCDR"><block var="data"/></block></custom-block></list></block></block></script></block></script></block-definition><block-definition s="if %&apos;test&apos; then %&apos;true&apos; else %&apos;false&apos;" type="reporter" category="control"><header></header><code></code><inputs><input type="%b"></input><input type="%anyUE"></input><input type="%anyUE"></input></inputs><script><block s="doIfElse"><block var="test"/><script><block s="doReport"><block s="evaluate"><block var="true"/><list></list></block></block></script><script><block s="doReport"><block s="evaluate"><block var="false"/><list></list></block></block></script></block></script></block-definition><block-definition s="for %&apos;i&apos; = %&apos;start&apos; to %&apos;end&apos; %&apos;action&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%upvar"></input><input type="%n">1</input><input type="%n">10</input><input type="%cs"></input></inputs><script><block s="doDeclareVariables"><list><l>step</l><l>tester</l></list></block><block s="doIfElse"><block s="reportGreaterThan"><block var="start"/><block var="end"/></block><script><block s="doSetVar"><l>step</l><l>-1</l></block><block s="doSetVar"><l>tester</l><block s="reifyReporter"><autolambda><block s="reportLessThan"><block var="i"/><block var="end"/></block></autolambda><list></list></block></block></script><script><block s="doSetVar"><l>step</l><l>1</l></block><block s="doSetVar"><l>tester</l><block s="reifyReporter"><autolambda><block s="reportGreaterThan"><block var="i"/><block var="end"/></block></autolambda><list></list></block></block></script></block><block s="doSetVar"><l>i</l><block var="start"/></block><block s="doUntil"><block s="evaluate"><block var="tester"/><list></list></block><script><block s="doRun"><block var="action"/><list></list></block><block s="doChangeVar"><l>i</l><block var="step"/></block></script></block></script></block-definition><block-definition s="join words %&apos;words&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%mult%txt"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportCDR"><block var="words"/></block></custom-block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="words"/></block></block></script></block><block s="doIf"><block s="reportEquals"><l></l><block s="reportListItem"><l>1</l><block var="words"/></block></block><script><block s="doReport"><custom-block s="join words %mult%txt"><block s="reportCDR"><block var="words"/></block></custom-block></block></script></block><block s="doIf"><block s="reportEquals"><l></l><block s="reportListItem"><l>2</l><block var="words"/></block></block><script><block s="doReport"><custom-block s="join words %mult%txt"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="words"/></block><block s="reportCDR"><block s="reportCDR"><block var="words"/></block></block></block></custom-block></block></script></block><block s="doReport"><block s="reportJoinWords"><list><block s="reportListItem"><l>1</l><block var="words"/></block><l> </l><custom-block s="join words %mult%txt"><block s="reportCDR"><block var="words"/></block></custom-block></list></block></block></script></block></script><scripts><script x="229.00000300000002" y="196.77778077777774"><block s="reportJoinWords"><list><l></l><l></l></list></block></script></scripts></block-definition><block-definition s="list $arrowRight sentence %&apos;data&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doReport"><custom-block s="join words %mult%txt"><block var="data"/></custom-block></block></script></block></script></block-definition><block-definition s="sentence $arrowRight list %&apos;text&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doWarp"><script><block s="doReport"><block s="reportTextSplit"><block var="text"/><l><option>whitespace</option></l></block></block></script></block></script></block-definition><block-definition s="catch %&apos;tag&apos; %&apos;action&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%upvar"></input><input type="%cs"></input></inputs><script><block s="doCallCC"><block s="reifyScript"><script><block s="doSetVar"><l>tag</l><block var="cont"/></block><block s="doRun"><block var="action"/><list></list></block></script><list><l>cont</l></list></block></block><custom-block s="ignore %s"><l>3</l></custom-block></script></block-definition><block-definition s="throw %&apos;cont&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%s">catchtag</input></inputs><script><block s="doRun"><block var="cont"/><list></list></block></script></block-definition><block-definition s="catch %&apos;tag&apos; %&apos;value&apos;" type="reporter" category="control"><header></header><code></code><inputs><input type="%upvar"></input><input type="%anyUE"></input></inputs><script><block s="doCallCC"><block s="reifyScript"><script><block s="doSetVar"><l>tag</l><block var="cont"/></block><block s="doReport"><block s="evaluate"><block var="value"/><list></list></block></block></script><list><l>cont</l></list></block></block></script></block-definition><block-definition s="throw %&apos;tag&apos; %&apos;value&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%s">catchtag</input><input type="%s"></input></inputs><script><block s="doRun"><block var="tag"/><list><block var="value"/></list></block></script></block-definition><block-definition s="for each %&apos;item&apos; of %&apos;data&apos; %&apos;action&apos;" type="command" category="lists"><header></header><code></code><inputs><input type="%upvar"></input><input type="%l"></input><input type="%cs"></input></inputs><script><block s="doUntil"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doSetVar"><l>item</l><block s="reportListItem"><l>1</l><block var="data"/></block></block><block s="doRun"><block var="action"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="doSetVar"><l>data</l><block s="reportCDR"><block var="data"/></block></block></script></block></script></block-definition><block-definition s="if %&apos;test&apos; do %&apos;action&apos; and pause all $pause-1-255-220-0" type="command" category="control"><header></header><code></code><inputs><input type="%boolUE"></input><input type="%cs"></input></inputs><script><block s="doDeclareVariables"><list><l>breakpoint</l></list></block><block s="doIf"><block s="evaluate"><block var="test"/><list></list></block><script><block s="doSetVar"><l>breakpoint</l><block var="test"/></block><block s="doShowVar"><l>breakpoint</l></block><block s="doRun"><block var="action"/><list></list></block><block s="doPauseAll"></block><block s="doHideVar"><l></l></block></script></block></script></block-definition><block-definition s="word $arrowRight list %&apos;word&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doWarp"><script><block s="doReport"><block s="reportTextSplit"><block var="word"/><l><option>letter</option></l></block></block></script></block></script></block-definition><block-definition s="ignore %&apos;x&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%s"></input></inputs></block-definition><block-definition s="tell %&apos;sprite&apos; to %&apos;action&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%s">Sprite</input><input type="%cs"></input></inputs><script><block s="doRun"><block s="reportAttributeOf"><block var="action"/><block var="sprite"/></block><list></list></block></script></block-definition><block-definition s="ask %&apos;sprite&apos; for %&apos;expression&apos;" type="reporter" category="control"><header></header><code></code><inputs><input type="%s">Sprite</input><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportAttributeOf"><block var="expression"/><block var="sprite"/></block><list></list></block></block></script></block-definition><block-definition s="list $arrowRight word %&apos;list&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doReport"><block s="reportJoinWords"><block var="list"/></block></block></script></block></script></block-definition><block-definition s="makeBoard" type="command" category="other"><header></header><code></code><inputs></inputs><script><block s="doSetVar"><l>square number</l><l>0</l></block><block s="show"></block><block s="doSwitchToCostume"><l>Empty</l></block><block s="gotoXY"><l>-50</l><l>50</l></block><custom-block s="for %upvar = %n to %n %cs"><l>row</l><l>1</l><l>3</l><script><custom-block s="for %upvar = %n to %n %cs"><l>column</l><l>1</l><l>3</l><script><block s="doChangeVar"><l>square number</l><l>1</l><comment w="198" collapsed="false">This is the step that will make sure that each clone will get its own unique square number.</comment></block><block s="createClone"><l><option>myself</option></l></block><block s="changeXPosition"><l>50</l></block></script></custom-block><block s="changeXPosition"><l>-150</l></block><block s="changeYPosition"><l>-50</l></block></script></custom-block><block s="hide"></block><block s="doSetVar"><l>square number</l><l>0</l></block></script></block-definition><block-definition s="TicTacToe wins" type="reporter" category="lists"><header></header><code></code><inputs></inputs><script><block s="doReport"><block s="reportNewList"><list><block s="reportNewList"><list><l>1</l><l>2</l><l>3</l></list></block><block s="reportNewList"><list><l>4</l><l>5</l><l>6</l></list></block><block s="reportNewList"><list><l>7</l><l>8</l><l>9</l></list></block><block s="reportNewList"><list><l>1</l><l>4</l><l>7</l></list></block><block s="reportNewList"><list><l>2</l><l>5</l><l>8</l></list></block><block s="reportNewList"><list><l>3</l><l>6</l><l>9</l></list></block><block s="reportNewList"><list><l>1</l><l>5</l><l>9</l></list></block><block s="reportNewList"><list><l>3</l><l>5</l><l>7</l></list></block></list></block></block></script></block-definition><block-definition s="status of triple %&apos;triple&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%l"></input></inputs><script><block s="doReport"><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><block s="reportListItem"><l></l><block var="board"/></block></autolambda><list></list></block><list><block var="triple"/></list></custom-block></block></script></block-definition><block-definition s="status of winning triples" type="reporter" category="lists"><header></header><code></code><inputs></inputs><script><block s="doReport"><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><custom-block s="status of triple %l"><l/></custom-block></autolambda><list></list></block><list><custom-block s="TicTacToe wins"></custom-block></list></custom-block></block></script></block-definition><block-definition s="won? %&apos;player&apos;" type="predicate" category="operators"><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="reportListContainsItem"><custom-block s="status of winning triples"></custom-block><block s="reportNewList"><list><block var="player"/><block var="player"/><block var="player"/></list></block></block></block></script></block-definition><block-definition s="%&apos;number&apos; copies of %&apos;value&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%n"></input><input type="%s"></input></inputs><script><block s="doIf"><block s="reportLessThan"><block var="number"/><l>1</l></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block var="value"/><custom-block s="%n copies of %s"><block s="reportDifference"><block var="number"/><l>1</l></block><block var="value"/></custom-block></block></block></script></block-definition><block-definition s="index of %&apos;value&apos; in %&apos;list&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%s"></input><input type="%l"></input></inputs><script><block s="doIf"><custom-block s="empty? %l"><block var="list"/></custom-block><script><block s="bubble"><l>INDEX OF: List doesn&apos;t contain value.</l><comment w="90" collapsed="true">Cause an error.</comment></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="list"/></block><block var="value"/></block><script><block s="doReport"><l>1</l></block></script></block><block s="doReport"><block s="reportSum"><custom-block s="index of %s in %l"><block var="value"/><block s="reportCDR"><block var="list"/></block></custom-block><l>1</l></block></block></script></block-definition><block-definition s="go to point %&apos;p&apos;" type="command" category="motion"><header></header><code></code><inputs><input type="%s"></input></inputs></block-definition><block-definition s="winning square for %&apos;player&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doDeclareVariables"><list><l>ready-to-win triple</l></list></block><block s="doSetVar"><l>ready-to-win triple</l><custom-block s="find first item such that %predRing from %l"><block s="reifyPredicate"><autolambda><block s="reportAnd"><block s="reportEquals"><custom-block s="number of %s in %l"><block var="player"/><l/></custom-block><l>2</l></block><block s="reportEquals"><custom-block s="number of %s in %l"><custom-block s="opponent %s"><block var="player"/></custom-block><l/></custom-block><l>0</l></block></block></autolambda><list></list></block><custom-block s="status of winning triples"></custom-block></custom-block></block><block s="doIfElse"><custom-block s="empty? %l"><block var="ready-to-win triple"/></custom-block><script><block s="doReport"><l>0</l></block></script><script><block s="doReport"><custom-block s="find first item such that %predRing from %l"><block s="reifyPredicate"><autolambda><block s="reportIsA"><l></l><l><option>number</option></l></block></autolambda><list></list></block><block var="ready-to-win triple"/></custom-block></block></script></block></script></block-definition><block-definition s="opponent %&apos;player&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doIfElse"><block s="reportEquals"><block var="player"/><l>X</l></block><script><block s="doReport"><l>O</l></block></script><script><block s="doReport"><l>X</l></block></script></block></script></block-definition><block-definition s="number of %&apos;value&apos; in %&apos;triple&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%s"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListLength"><custom-block s="keep items such that %predRing from %l"><block s="reifyPredicate"><autolambda><block s="reportEquals"><l></l><block var="value"/></block></autolambda><list></list></block><block var="triple"/></custom-block></block></block></script></block-definition><block-definition s="can %&apos;player&apos; win now?" type="predicate" category="sensing"><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="reportGreaterThan"><custom-block s="winning square for %s"><block var="player"/></custom-block><l>0</l></block></block></script></block-definition><block-definition s="next move for computer" type="reporter" category="other"><header></header><code></code><inputs></inputs><script><block s="doIf"><custom-block s="can %s win now?"><block var="computer&apos;s symbol"/></custom-block><script><block s="doReport"><custom-block s="winning square for %s"><block var="computer&apos;s symbol"/></custom-block></block></script><comment w="90" collapsed="true">check for wins</comment></block><block s="doIf"><custom-block s="can %s win now?"><block var="human&apos;s symbol"/></custom-block><script><block s="doReport"><custom-block s="winning square for %s"><block var="human&apos;s symbol"/></custom-block></block></script></block><block s="doIf"><block s="reportGreaterThan"><custom-block s="fork %s"><block var="computer&apos;s symbol"/></custom-block><l>0</l></block><script><block s="doReport"><custom-block s="fork %s"><block var="computer&apos;s symbol"/></custom-block></block></script><comment w="90" collapsed="true">check for forks</comment></block><block s="doIf"><block s="reportGreaterThan"><custom-block s="fork %s"><block var="human&apos;s symbol"/></custom-block><l>0</l></block><script><block s="doReport"><custom-block s="fork %s"><block var="human&apos;s symbol"/></custom-block></block></script></block><block s="doIfElse"><block s="reportNot"><custom-block s="empty? %l"><custom-block s="find first item such that %predRing from %l"><block s="reifyPredicate"><autolambda><block s="reportAnd"><block s="reportEquals"><custom-block s="number of %s in %l"><block var="computer&apos;s symbol"/><l/></custom-block><l>1</l></block><block s="reportEquals"><custom-block s="number of %s in %l"><block var="human&apos;s symbol"/><l/></custom-block><l>2</l></block></block></autolambda><list></list></block><custom-block s="status of winning triples"></custom-block></custom-block></custom-block></block><script><block s="doReport"><custom-block s="best empty square %l"><block s="reportNewList"><list><l>5</l><l>2</l><l>4</l><l>6</l><l>8</l><l>1</l><l>3</l><l>7</l><l>9</l></list><comment w="104" collapsed="true">weird XOX case</comment></block></custom-block></block></script><script><block s="doReport"><custom-block s="best empty square %l"><block s="reportNewList"><list><l>5</l><l>1</l><l>3</l><l>7</l><l>9</l><l>2</l><l>4</l><l>6</l><l>8</l></list></block></custom-block></block></script></block></script></block-definition><block-definition s="best empty square %&apos;moves&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l>1</l><custom-block s="keep items such that %predRing from %l"><block s="reifyPredicate"><autolambda><block s="reportListContainsItem"><block var="board"/><l></l></block></autolambda><list></list></block><block var="moves"/></custom-block></block></block></script></block-definition><block-definition s="move in this square" type="command" category="other"><header></header><code></code><inputs></inputs><script><block s="doIfElse"><block var="X&apos;s turn?"/><script><block s="doSwitchToCostume"><l>X</l></block><block s="doReplaceInList"><block var="square number"/><block var="board"/><l>X</l></block></script><script><block s="doSwitchToCostume"><l>O</l></block><block s="doReplaceInList"><block var="square number"/><block var="board"/><l>O</l></block></script></block><block s="doSetVar"><l>X&apos;s turn?</l><block s="reportNot"><block var="X&apos;s turn?"/></block></block><block s="doIfElse"><custom-block s="won? %s"><l>X</l></custom-block><script><block s="bubble"><l>X Won!</l></block></script><script><block s="doIfElse"><custom-block s="won? %s"><l>O</l></custom-block><script><block s="bubble"><l>O Won!</l></block></script><script><block s="doIfElse"><custom-block s="empty? %l"><custom-block s="keep items such that %predRing from %l"><block s="reifyPredicate"><autolambda><block s="reportIsA"><l></l><l><option>number</option></l></block></autolambda><list></list></block><block var="board"/></custom-block></custom-block><script><block s="bubble"><l>Tie Game!</l></block></script><script><block s="doIf"><block s="reportEquals"><block var="X&apos;s turn?"/><block s="reportEquals"><block var="computer&apos;s symbol"/><l>X</l></block></block><script><block s="doBroadcast"><custom-block s="next move for computer"></custom-block></block></script></block></script></block></script></block></script></block></script></block-definition><block-definition s="find first item such that %&apos;pred&apos; from %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%predRing"></input><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>items</l></list></block><block s="doSetVar"><l>items</l><custom-block s="keep items such that %predRing from %l"><block var="pred"/><block var="data"/></custom-block></block><block s="doIf"><custom-block s="empty? %l"><block var="items"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportListItem"><l>1</l><block var="items"/></block></block></script></block-definition><block-definition s="fork %&apos;me&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doDeclareVariables"><list><l>singles</l><l>atoms</l><l>repeated</l></list></block><block s="doSetVar"><l>singles</l><custom-block s="keep items such that %predRing from %l"><block s="reifyPredicate"><autolambda><block s="reportAnd"><block s="reportEquals"><custom-block s="number of %s in %l"><block var="me"/><l/></custom-block><l>1</l></block><block s="reportEquals"><custom-block s="number of %s in %l"><custom-block s="opponent %s"><block var="me"/></custom-block><l/></custom-block><l>0</l></block></block></autolambda><list></list></block><custom-block s="status of winning triples"></custom-block></custom-block><comment w="62.666666666666664" collapsed="true">TIF B(d)</comment></block><block s="doIf"><custom-block s="empty? %l"><block var="singles"/></custom-block><script><block s="doReport"><l>0</l></block></script></block><block s="doSetVar"><l>atoms</l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="append %mult%l"><list><l/><l/></list></custom-block></autolambda><list></list></block><block var="singles"/><comment w="64" collapsed="true">TIF B(e)</comment></custom-block></block><block s="doSetVar"><l>repeated</l><custom-block s="find first item such that %predRing from %l"><block s="reifyPredicate"><autolambda><block s="reportAnd"><block s="reportIsA"><l></l><l><option>number</option></l></block><block s="reportGreaterThan"><custom-block s="number of %s in %l"><l></l><block var="atoms"/></custom-block><l>1</l></block></block></autolambda><list></list></block><block var="atoms"/></custom-block><comment w="64" collapsed="true">TIF B(f)</comment></block><block s="doIf"><custom-block s="empty? %l"><block var="repeated"/></custom-block><script><block s="doReport"><l>0</l></block></script></block><block s="doReport"><block var="repeated"/></block></script></block-definition><block-definition s="append %&apos;lists&apos;" type="reporter" category="lists"><comment x="0" y="0" w="287" collapsed="false">Take any number of input lists, and create a new list containing the items of the input lists.  So&#xD;              APPEND [A B] [C D]&#xD;where the [,,,] are lists reports the list&#xD;              [A B C D]&#xD;not [[A B] [C D]].</comment><header></header><code></code><inputs><input type="%mult%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportEquals"><block var="lists"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportListLength"><block var="lists"/></block><l>1</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="lists"/></block></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="lists"/></block><block s="reportNewList"><list></list></block></block><script><block s="doReport"><custom-block s="append %mult%l"><block s="reportCDR"><block var="lists"/></block></custom-block></block></script></block><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block s="reportListItem"><l>1</l><block var="lists"/></block></block><custom-block s="append %mult%l"><block s="reportCONS"><block s="reportCDR"><block s="reportListItem"><l>1</l><block var="lists"/></block></block><block s="reportCDR"><block var="lists"/></block></block></custom-block></block></block></script></block></script></block-definition><block-definition s="reverse %&apos;data&apos;" type="reporter" category="lists"><comment x="0" y="0" w="223" collapsed="false">Reports a new list containing the items of the input list, but in the opposite order.</comment><header></header><code></code><inputs><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>helper</l></list></block><block s="doSetVar"><l>helper</l><block s="reifyScript"><script><block s="doIf"><block s="reportEquals"><block var="input"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block var="result"/></block></script></block><block s="doReport"><block s="evaluate"><block var="helper"/><list><block s="reportCDR"><block var="input"/></block><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="input"/></block><block var="result"/></block></list></block></block></script><list><l>input</l><l>result</l></list></block></block><block s="doWarp"><script><block s="doReport"><block s="evaluate"><block var="helper"/><list><block var="data"/><block s="reportNewList"><list></list></block></list></block></block></script></block></script></block-definition><block-definition s="remove duplicates from %&apos;data&apos;" type="reporter" category="lists"><comment x="0" y="0" w="209" collapsed="false">Reports a new list whose items are the same as in the input list, except that if two or more equal items appear in the input list, only the last one is kept in the result.</comment><header></header><code></code><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportEquals"><block var="data"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIfElse"><block s="reportListContainsItem"><block s="reportCDR"><block var="data"/></block><block s="reportListItem"><l>1</l><block var="data"/></block></block><script><block s="doReport"><custom-block s="remove duplicates from %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></script><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="remove duplicates from %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></block></script></block></script></block></script></block-definition><block-definition s="sort %&apos;data&apos; ordering with %&apos;function&apos;" type="reporter" category="lists"><comment x="0" y="0" w="204" collapsed="false">Reports a sorted version of the list in its first input slot, using the comparison function in the second input slot.  For a list of numbers, using &lt; as the comparison function will sort from low to high; using &gt; will sort from high to low.</comment><header></header><code></code><inputs><input type="%l"></input><input type="%predRing"></input></inputs><script><block s="doDeclareVariables"><list><l>even items</l><l>odd items</l><l>merge</l></list></block><block s="doSetVar"><l>odd items</l><block s="reifyScript"><script><block s="doIf"><block s="reportEquals"><l></l><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><l/></block><block s="evaluate"><block var="even items"/><list><block s="reportCDR"><l/></block></list></block></block></block></script><list></list></block></block><block s="doSetVar"><l>even items</l><block s="reifyScript"><script><block s="doIf"><block s="reportEquals"><l></l><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="evaluate"><block var="odd items"/><list><block s="reportCDR"><l/></block></list></block></block></script><list></list></block></block><block s="doSetVar"><l>merge</l><block s="reifyScript"><script><block s="doIf"><block s="reportEquals"><block var="#1"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block var="#2"/></block></script></block><block s="doIf"><block s="reportEquals"><block var="#2"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block var="#1"/></block></script></block><block s="doIfElse"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="#1"/></block><block s="reportListItem"><l>1</l><block var="#2"/></block></list></block><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="#1"/></block><block s="evaluate"><block var="merge"/><list><block s="reportCDR"><block var="#1"/></block><block var="#2"/></list></block></block></block></script><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="#2"/></block><block s="evaluate"><block var="merge"/><list><block var="#1"/><block s="reportCDR"><block var="#2"/></block></list></block></block></block></script></block></script><list><l>#1</l><l>#2</l></list></block></block><block s="doIf"><block s="reportEquals"><block var="data"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportCDR"><block var="data"/></block><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block var="data"/></block></script></block><block s="doReport"><block s="evaluate"><block var="merge"/><list><custom-block s="sort %l ordering with %predRing"><block s="evaluate"><block var="odd items"/><list><block var="data"/></list></block><block var="function"/></custom-block><custom-block s="sort %l ordering with %predRing"><block s="evaluate"><block var="even items"/><list><block var="data"/></list></block><block var="function"/></custom-block></list></block></block></script></block-definition><block-definition s="assoc %&apos;key&apos; %&apos;a-list&apos;" type="reporter" category="lists"><comment x="0" y="0" w="289.3333333333333" collapsed="false">The second input is an &quot;association list,&quot; a list of two-item lists.  Each of those smaller lists has a &quot;key&quot; as its first item and a &quot;value&quot; as its second.  ASSOC reports the first key-value pair in the association list whose key matches the first input.</comment><header></header><code></code><inputs><input type="%s"></input><input type="%l"></input></inputs><script><block s="doIf"><block s="reportEquals"><block var="a-list"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="key"/><block s="reportListItem"><l>1</l><block s="reportListItem"><l>1</l><block var="a-list"/></block></block></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="a-list"/></block></block></script></block><block s="doReport"><custom-block s="assoc %s %l"><block var="key"/><block s="reportCDR"><block var="a-list"/></block></custom-block></block></script></block-definition><block-definition s="%&apos;#&apos; map %&apos;function&apos; over %&apos;lists&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%upvar"></input><input type="%repRing"></input><input type="%mult%l"></input></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>mapone</l><l>mapmany</l></list></block><block s="doSetVar"><l>mapone</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doSetVar"><l>#</l><block var="count"/></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="evaluate"><block var="mapone"/><list><block s="reportCDR"><block var="data"/></block><block s="reportSum"><block var="count"/><l>1</l></block></list></block></block></block></script><list><l>data</l><l>count</l></list></block></block><block s="doSetVar"><l>mapmany</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportListItem"><l>1</l><block var="data lists"/></block></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doSetVar"><l>#</l><block var="count"/></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><custom-block s="%upvar map %repRing over %mult%l"><l>#</l><block s="reifyReporter"><autolambda><block s="reportListItem"><l>1</l><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block></block><block s="evaluate"><block var="mapmany"/><list><custom-block s="%upvar map %repRing over %mult%l"><l>#</l><block s="reifyReporter"><autolambda><block s="reportCDR"><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block><block s="reportSum"><block var="count"/><l>1</l></block></list></block></block></block></script><list><l>data lists</l><l>count</l></list></block></block><block s="doIfElse"><custom-block s="empty? %l"><block s="reportCDR"><block var="lists"/></block></custom-block><script><block s="doReport"><block s="evaluate"><block var="mapone"/><list><block s="reportListItem"><l>1</l><block var="lists"/></block><l>1</l></list></block></block></script><script><block s="doReport"><block s="evaluate"><block var="mapmany"/><list><block var="lists"/><l>1</l></list></block></block></script></block></script></block></script></block-definition><block-definition s="empty? %&apos;data&apos;" type="predicate" category="lists"><header></header><code></code><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportEquals"><block var="data"/><block s="reportNewList"><list></list></block></block></block></script></block-definition><block-definition s="%&apos;#&apos; keep items such that %&apos;pred&apos; from %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%upvar"></input><input type="%predRing"></input><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>keep-helper</l></list></block><block s="doSetVar"><l>keep-helper</l><block s="reifyScript"><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doSetVar"><l>#</l><block var="count"/></block><block s="doIfElse"><block s="evaluate"><block var="pred"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><block s="evaluate"><block var="keep-helper"/><list><block s="reportCDR"><block var="data"/></block><block s="reportSum"><block var="count"/><l>1</l></block></list></block></block></block></script><script><block s="doReport"><block s="evaluate"><block var="keep-helper"/><list><block s="reportCDR"><block var="data"/></block><block s="reportSum"><block var="count"/><l>1</l></block></list></block></block></script></block></script></block></script><list><l>data</l><l>count</l></list></block></block><block s="doReport"><block s="evaluate"><block var="keep-helper"/><list><block var="data"/><l>1</l></list></block></block></script></block-definition><block-definition s="%&apos;#&apos; for each %&apos;item&apos; of %&apos;data&apos; %&apos;action&apos;" type="command" category="lists"><header></header><code></code><inputs><input type="%upvar"></input><input type="%upvar"></input><input type="%l"></input><input type="%cs"></input></inputs><script><block s="doSetVar"><l>#</l><l>1</l></block><block s="doUntil"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doSetVar"><l>item</l><block s="reportListItem"><l>1</l><block var="data"/></block></block><block s="doRun"><block var="action"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="doSetVar"><l>data</l><block s="reportCDR"><block var="data"/></block></block><block s="doChangeVar"><l>#</l><l>1</l></block></script></block></script></block-definition></blocks><variables><variable name="X&apos;s turn?"><bool>false</bool></variable><variable name="board"><list id="2078"><item><l>O</l></item><item><l>X</l></item><item><l>X</l></item><item><l>X</l></item><item><l>X</l></item><item><l>O</l></item><item><l>O</l></item><item><l>O</l></item><item><l>X</l></item></list></variable><variable name="positions"><l>0</l></variable><variable name="human&apos;s symbol"><l>o</l></variable><variable name="computer&apos;s symbol"><l>X</l></variable></variables></project><media name="U5-TTT-ITIT-TIF" app="Snap! 4.1, http://snap.berkeley.edu" version="1"><costume name="Empty" center-x="29" center-y="28" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA5CAYAAACMGIOFAAAAx0lEQVRoge3auw3DMBAE0e3snF0bLuU6cQkqQQ0wZ8gSWIKcyIk/kQ0IGu8Am/OBDClJJWmRNKBbtCNXSRt06zNyZOaoqu3My8zHLb4iM3P03sd28nrvY4e+Iqvq6PP9rKp6/1yNPFlGUjKSkpGUjKRkJCUjKRlJyUhKRlIykpKRlIykZCQlIykZSclISkZSMpKSkZSMpGQkJSMp/TcyImZrbR59wG9rrc2ImG+RkmZEzKO/V3+7HfgRSdwqSdcdeoOuJOlC3x3hcHoT7WE99QAAAABJRU5ErkJggg==" mediaID="Square_cst_Empty"/><costume name="X" center-x="29" center-y="29" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA6CAYAAAAKjPErAAACx0lEQVRogd3bO66bQBQG4FPQQ+nOt3JlC3bgLIEdQJHCS6CDMp0rapbg7IDCZQqWgFKnmOJWliL9Ka4nwnOH17y48EtHso2RzjdYgzweE20zgfhCQUQ3Imo3Ur+J6EFE78/HN46siQgbrVpEPjzPe2RZhqIoVlVZlmG3201CgogQRREYY1hT4jh+wR0Ohz+DyLVB0zR96b2qKhRFIb+S4misASoC8zwHgH5kURSoqmo1UBGYJMn/Y4NIAKuADgGBCUhADm2axjFFnjEgMBEJfIYGQbA4dAoQmIEEgLqu4fv+l4CKg94HBGYiAaBpmsWhc4CAAhJYFioCz+fz6DlKSGAZqAgMw3DSTK+MBNxCVYGAJhJwA9UBAgaQgF2oLhAwhATsQJumQRAEWkDAIJI3ZQpqCggYRvLmdKEi0Pd9tG2r1A9gAcmbVIXKgLofeytI3qwIvd1uo+eYBgIWkbzpLpSe39T73msDCFhGAkDbtgjDcBDatq01IOAACQCMsV4oYwxRFFkDAo6QgBxalqV1IOAQCcih3RqbmFTjFAl8QI/H4ydg34RkIosgT6fTdpHiJOMK6hQpAsuyHL29mIgzpGz5Hhi+vZiKE2QfkMc21Dpy6tqoTahV5FQgjwxqog9ryLlAHhk0TVOtXqwgVYE8jDEkSWIMahyZ57kWsBtTUKPIucv3U2ICagxpA8ijCzWCNLE2OhYdqDbSBZBHFaqFdAnkUYEqI5cA8syFKiHrul4MyDMHqvRLs6nle91Mhc5CisD9fr/4dpcp0MlIm4u/uhGhcRy/DP4k5FcG8ojQ7qaqUeQagDzX61UKHUSuCcgj2z2WZZkcmWUZ3t7eVgXkEaGdDb6vSM/z/q4RyCNCn3XnyLt48HK5LL7lWqXEPbtExDjyXTICW6lfREQpEf2kj78Z8MtbbaDuzyqIiL496zsR/eg830z9AzTUtnBHLmDjAAAAAElFTkSuQmCC" mediaID="Square_cst_X"/><costume name="O" center-x="28" center-y="28" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA5CAYAAACMGIOFAAADhUlEQVRoge2a3bGrIBSF6UA60A5MB6QD04F2oB1AB6YD7YAStANLoARKWPchNw6oUVSMmeSsGfMQf9gfbBYCEkKIIIQ0X3wI8v8HX3z8JqTAF2jIZEF+k06BVEqhbVu0bQul1KFlAW+AbNsWRVHgcrks9pnL5YKiKNC2rbfygYMglVLIsgyU0s0mQSlFlmVeWtorpNYaQohFgDAMwRgDYwxhGC5eL4SA1vp8yKqqJlsuDEPkeQ4p5eIzpJTI83wSnFKKqqo2IHqCLIpiFBRjDE3TbAoKAJqmAWNs9NyiKFY/axek1hq3223Uci6t5iop5ahlb7fbqvTdDKm1Hjlmmqa7+s5cWWmajpzYtazNkFmWWYVyzneiLItzbpWZZZnTfZsgh4VtNYQtqqpqdeWuhpRSWoXkee4RwU15nlsxLHnAasgoivqbkiTxHb+zkiTp44iiaPbaVZBlWfY3BEFwiMm4SmuNIAj6eMqyfHmtM6TW2hrs5x76LpmVTil9WenOkOYDwzA8OHx3mWPoq4p3hjTHxHe66ZJMt2WMTV7jBKm1ttzszL44lEtsTpAutXWm4jiezTInSPOV6hMMZyjTL9I0HZ13gjRnA3tmFkepaZrZTPuDfMocHz/JdJ4yzYdSOjrvBGm616dqLsY/yKdMi+667l1xO6vruj6+OI5H53/NeLgTpM/1G18y57ib3dVcCZgabM+W+bIytVLg1JJmzi9NUM+QOcRNeYZTSwKwJqifZD5mA7yaAjpDminxSSnrEpczpOlghJC3bLktSSllxfTK+Z0hAdtlr9frgeG76Xq9zrrqU6sghzV35nAyXH+dy6xVkIDdByilp5hQ13WWoy55xGpIrbX1mhdF0VtnJsNVwziOF8tfDQk8atIcUtZsvuyRUspaUAuCwCmTNkECY7c9OnWHKTrnpkNthgTGnZ9Sivv9vgNlWvf73SqHkHXLorsggXHqPtPXx2ylaZrRHqhripraDQk8+oppRuZYWtf1qhcHpRTqurbGQNNktryEeIEEHq7HOR+1qtm6QggIIVDXdf+xUl3X/f+vvvUJggCc883m5g3ShB1ufe85fGzRe4d8SimFsiytfUTXI0kSlGXp7f34MEhTWmtIKcE5B+ccaZr2Hyuladr/L6U8ZLx9C+TZMiD5L0D+REvakISQ5uzgfIg8PrB/CfmNx09AckIIuX778Q//cwRX84YLFwAAAABJRU5ErkJggg==" mediaID="Square_cst_O"/></media></snapdata>