<snapdata remixID="9113414"><project name="U5L1p3" app="Snap! 5.4, http://snap.berkeley.edu" version="1"><notes></notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAADT0lEQVR4Xu3VIY5icRDE4X44cAhAYklwCA6DQyBxCBQX4BpYBJfgBFwCQYLCkMBmR4xaZtVQFer39D/p7qovec3z+XwWHwmIEmgAKEqesV8JABAI0gQAKI2f4QDEgDQBAErjZzgAMSBNAIDS+BkOQAxIEwCgNH6GAxAD0gQAKI2f4QDEgDQBAErjZzgAMSBNAIDS+BkOQAxIEwCgNH6GAxAD0gQAKI2f4QDEgDQBAErjZzgAMSBNAIDS+BkOQAxIEwCgNH6GAxAD0gQAKI2f4QDEgDQBAErjZzgAMSBNAIDS+BkOQAxIEwCgNH6GAxAD0gQAKI2f4QDEgDQBAErjZzgAMSBNAIDS+BkOQAxIEwCgNH6GAxAD0gQAKI2f4QDEgDQBAErjZzgAMSBNAIDS+BkOQAxIEwCgNH6GAxAD0gQAKI2f4QDEgDQBAErjZzgAMSBNAIDS+BkOQAxIEwDgi/hvt1t1Oh1pOQnDAfii5dPpVJvNplqtVi2Xy5pOp9VutxNMvPVGAP4Q9263q/1+//3ifr/XaDSq2WxWk8nkrUV96jAA/qfZ+Xxe1+v1n6/O53MdDofq9Xqf6uPX7wLgDxEfj8fabrffLx6PR3W73RqPx7Varappml8v6NMHAPBFw5fLpRaLxRey4XBY6/W6+v3+p3t4+30AfBH539/rYDB4eyFpAwGY1rjZvQA0KyRtHQCmNW52LwDNCklbB4BpjZvdC0CzQtLWAWBa42b3AtCskLR1AJjWuNm9ADQrJG0dAKY1bnYvAM0KSVsHgGmNm90LQLNC0tYBYFrjZvcC0KyQtHUAmNa42b0ANCskbR0ApjVudi8AzQpJWweAaY2b3QtAs0LS1gFgWuNm9wLQrJC0dQCY1rjZvQA0KyRtHQCmNW52LwDNCklbB4BpjZvdC0CzQtLWAWBa42b3AtCskLR1AJjWuNm9ADQrJG0dAKY1bnYvAM0KSVsHgGmNm90LQLNC0tYBYFrjZvcC0KyQtHUAmNa42b0ANCskbR0ApjVudi8AzQpJWweAaY2b3QtAs0LS1gFgWuNm9wLQrJC0dQCY1rjZvQA0KyRtHQCmNW52LwDNCklbB4BpjZvdC0CzQtLWAWBa42b3AtCskLR1/gC0JQu3CR0hzAAAAABJRU5ErkJggg==</thumbnail><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="true" codify="false" inheritance="false" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAOhUlEQVR4Xu3VwQkAAAjEMN1/abewn7jAQRC64wgQIECAAIF3gX1fNEiAAAECBAiMAHsCAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQIHLFxAWmhEwHPAAAAAElFTkSuQmCC</pentrails><costumes><list struct="atomic" id="2"></list></costumes><sounds><list struct="atomic" id="3"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="Sprite" idx="1" x="0.5660377358490223" y="-1.6981132075470953" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="8"><costumes><list struct="atomic" id="9"></list></costumes><sounds><list struct="atomic" id="10"></list></sounds><blocks></blocks><variables></variables><scripts><script x="13.333333333333343" y="10"><custom-block s="are the numbers of %l distinct?"><l/><comment w="53.333333333333336" collapsed="true">5.1.3.1</comment></custom-block></script><comment x="13.333333333333343" y="40.33333333333371" w="454.6666666666667" collapsed="false">This first example, which is also inside the block, is one your students are not likely to come up with. It uses recursion, which is taught in later units. We include it here for its elegance.&#xD;&#xD;Below follow a few examples of other possible correct solutions.</comment><script x="13.333333333333343" y="125.66666666666674"><block s="doIfElse"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><script><block s="doIfElse"><block s="reportListContainsItem"><block s="reportCDR"><block var="data"/></block><block s="reportListItem"><l>1</l><block var="data"/></block><comment w="251.6666676666667" collapsed="false">CONTAINS is a primitive block.  Students who remember that will have a much easier time writing this procedure than those who don&apos;t remember it.  </comment></block><script><block s="doReport"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script><script><block s="doReport"><custom-block s="are the numbers of %l distinct?"><block s="reportCDR"><block var="data"/><comment w="327.3333333333333" collapsed="false">Another thing that may complicate the solution is if the students have programmed before in another language and try to use index variables to find their way through the list instead of using ALL BUT FIRST OF.</comment></block></custom-block></block></script></block></script></block></script><script x="13.333333333333343" y="327.66666666666674"><block s="doIf"><block s="reportLessThan"><block s="reportListLength"><block var="data"/></block><l>2</l></block><script><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script></block><custom-block s="for %upvar = %n to %n %cs"><l>i</l><l>1</l><block s="reportDifference"><block s="reportListLength"><block var="data"/></block><l>1</l></block><script><custom-block s="for %upvar = %n to %n %cs"><l>j</l><block s="reportSum"><block var="i"/><l>1</l></block><block s="reportListLength"><block var="data"/></block><script><block s="doIf"><block s="reportEquals"><block s="reportListItem"><block var="i"/><block var="data"/></block><block s="reportListItem"><block var="j"/><block var="data"/></block></block><script><block s="doReport"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script></block></script></custom-block></script></custom-block><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><script x="13.333333333333343" y="573.0000000000003"><block s="doRepeat"><block s="reportListLength"><block var="data"/></block><script><block s="doIf"><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"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script></block><block s="doSetVar"><l>data</l><block s="reportCDR"><block var="data"/><comment w="303.3846153846154" collapsed="false">IMPORTANT:  If this SET block were instead DELETE (1) OF (DATA) it would be wrong.  That would change the list belonging to the caller.  This SET block changes only the script-local value of DATA, not the original list.&#xD;</comment></block></block></script></block><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><script x="13.333333333333343" y="768.666668666668"><block s="doRepeat"><block s="reportListLength"><block var="data"/></block><script><custom-block s="for each %upvar of %l %cs"><l>item</l><block s="reportCDR"><block var="data"/></block><script><block s="doIf"><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="data"/></block><block var="item"/></block><script><block s="doReport"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script></block></script></custom-block><block s="doSetVar"><l>data</l><block s="reportCDR"><block var="data"/></block></block></script></block><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><comment x="13.333333333333343" y="969.6666686666679" w="378.4615384615384" collapsed="false">5.3.2.2:  If you double the length of the list, you quadruple the runtime, in the worst case.&#xD;&#xD;Timing this is a little tricky, because repetitions early in the list cause the block to report FALSE very quickly.  For worst case timing, the list items /should/ be distinct, or distinct except for the last two items.  You can use the LIST FROM () THROUGH () block to make lists of distinct numbers.&#xD;&#xD;If the students enjoy timing experiments, have them work out the /average/ time for arbitrary lists as a function of size.  This can be done by making lists of random numbers (but make sure the range of possible numbers is a lot bigger than the length of the list), or more systematically by constructing a list whose first item is equal to its second item, another list whose first item is equal to its third item (but not its second), and so on.</comment><script x="13.333333333333343" y="1175.0000020000007"><custom-block s="duplicates in %l"><l/><comment w="151.53846153846155" collapsed="true">5.1.3.3  duplicates in (data)</comment></custom-block></script><script x="13.333333333333343" y="1205.3333353333337"><block s="doIfElse"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script><script><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"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="duplicates in %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></block></script><script><block s="doReport"><custom-block s="duplicates in %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></script></block></script></block></script><comment x="13.333333333333343" y="1421.3333353333317" w="447.99999999999983" collapsed="false">This has the same structure as ARE THERE ANY DUPLICATES (5.3.2.1), but with lists as the reported values instead of Booleans.  Similarly, the alternate solutions to 5.3.2.1 work here too:</comment><script x="13.333333333333343" y="1482.6666686666656"><block s="doDeclareVariables"><list><l>result</l></list></block><block s="doSetVar"><l>result</l><block s="reportNewList"><list></list></block></block><block s="doIf"><block s="reportLessThan"><block s="reportListLength"><block var="data"/></block><l>2</l></block><script><block s="doReport"><block var="result"/></block></script></block><custom-block s="for %upvar = %n to %n %cs"><l>i</l><l>1</l><block s="reportDifference"><block s="reportListLength"><block var="data"/></block><l>1</l></block><script><custom-block s="for %upvar = %n to %n %cs"><l>j</l><block s="reportSum"><block var="i"/><l>1</l></block><block s="reportListLength"><block var="data"/></block><script><block s="doIf"><block s="reportEquals"><block s="reportListItem"><block var="i"/><block var="data"/></block><block s="reportListItem"><block var="j"/><block var="data"/></block></block><script><block s="doAddToList"><block s="reportListItem"><block var="i"/><block var="data"/></block><block var="result"/></block></script></block></script></custom-block></script></custom-block><block s="doReport"><block var="result"/></block></script><script x="13.333333333333343" y="1764.6666686666656"><block s="doDeclareVariables"><list><l>result</l></list></block><block s="doSetVar"><l>result</l><block s="reportNewList"><list></list></block></block><block s="doRepeat"><block s="reportListLength"><block var="data"/></block><script><block s="doIf"><block s="reportListContainsItem"><block s="reportCDR"><block var="data"/></block><block s="reportListItem"><l>1</l><block var="data"/></block></block><script><block s="doAddToList"><block s="reportListItem"><l>1</l><block var="data"/></block><block var="result"/></block></script></block><block s="doSetVar"><l>data</l><block s="reportCDR"><block var="data"/></block></block></script></block><block s="doReport"><block var="result"/></block></script><script x="13.333333333333343" y="1971.6666686666656"><block s="doDeclareVariables"><list><l>result</l></list></block><block s="doSetVar"><l>result</l><block s="reportNewList"><list></list></block></block><block s="doRepeat"><block s="reportListLength"><block var="data"/></block><script><custom-block s="for each %upvar of %l %cs"><l>item</l><block s="reportCDR"><block var="data"/></block><script><block s="doIf"><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="data"/></block><block var="item"/></block><script><block s="doAddToList"><block s="reportListItem"><l>1</l><block var="data"/></block><block var="result"/></block></script></block></script></custom-block><block s="doSetVar"><l>data</l><block s="reportCDR"><block var="data"/></block></block></script></block><block s="doReport"><block var="result"/></block></script><comment x="13.333333333333343" y="2214.0000019999998" w="433.3333333333333" collapsed="false">The timing experiment in the previous problem would be easier with this procedure because it has to examine every pair of items even if a duplicate is found early on.</comment><script x="13.333333333333343" y="2275.333335333333"><custom-block s="remove duplicates %l"><l/><comment w="117.6923076923077" collapsed="true">5.1.3.4</comment></custom-block></script><script x="13.333333333333343" y="2305.666668666666"><block s="doIfElse"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script><script><block s="doIfElse"><block s="reportNot"><block s="reportListContainsItem"><block s="reportCDR"><block var="data"/></block><block s="reportListItem"><l>1</l><block var="data"/></block></block></block><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="remove duplicates %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></block></script><script><block s="doReport"><custom-block s="remove duplicates %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></script></block></script></block></script><script x="13.333333333333343" y="2533.6666686666667"><block s="doDeclareVariables"><list><l>result</l></list></block><block s="doSetVar"><l>result</l><block s="reportNewList"><list></list></block></block><block s="doRepeat"><block s="reportListLength"><block var="data"/></block><script><block s="doIf"><block s="reportNot"><block s="reportListContainsItem"><block s="reportCDR"><block var="data"/></block><block s="reportListItem"><l>1</l><block var="data"/></block></block></block><script><block s="doAddToList"><block s="reportListItem"><l>1</l><block var="data"/></block><block var="result"/></block></script></block><block s="doSetVar"><l>data</l><block s="reportCDR"><block var="data"/></block></block></script></block><block s="doReport"><block var="result"/></block></script><comment x="13.333333333333343" y="2744.6666686666695" w="446.00000000000017" collapsed="false">The versions of DUPLICATES IN that use CONTAINS are easy to turn into a remove duplicates function: Just put a NOT around the CONTAINS in the script.  (The recursive version could be written without NOT by swapping the &apos;then&apos; part and &apos;else&apos; part of the IF/ELSE block, but we did it this way to make the relationship clearer.)</comment></scripts></sprite></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="are the numbers of %&apos;data&apos; distinct?" type="predicate" category="operators"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doIfElse"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><script><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"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script><script><block s="doReport"><custom-block s="are the numbers of %l distinct?"><block s="reportCDR"><block var="data"/></block></custom-block></block></script></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><translations></translations><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="catch %&apos;tag&apos; %&apos;action&apos;" type="command" category="control"><header></header><code></code><translations></translations><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></script></block-definition><block-definition s="throw %&apos;cont&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%s">catchtag</input></inputs><script><block s="doRun"><block var="cont"/><list></list></block></script></block-definition><block-definition s="empty? %&apos;data&apos;" type="predicate" category="lists"><header></header><code></code><translations></translations><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="for each %&apos;item&apos; of %&apos;data&apos; %&apos;action&apos;" type="command" category="lists"><header></header><code></code><translations></translations><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="duplicates in %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doIfElse"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script><script><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"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="duplicates in %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></block></script><script><block s="doReport"><custom-block s="duplicates in %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></script></block></script></block></script></block-definition><block-definition s="remove duplicates %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doIfElse"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script><script><block s="doIfElse"><block s="reportNot"><block s="reportListContainsItem"><block s="reportCDR"><block var="data"/></block><block s="reportListItem"><l>1</l><block var="data"/></block></block></block><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="remove duplicates %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></block></script><script><block s="doReport"><custom-block s="remove duplicates %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></script></block></script></block></script></block-definition></blocks><variables></variables></project><media name="U5L1p3" app="Snap! 5.4, http://snap.berkeley.edu" version="1"></media></snapdata>