 So, I have four goals today with this talk. And my first goal is to introduce you to something called polyforms. Let's see if this thing works. So, polyforms are shapes that are made from, they're constructed by combining identical base shapes, like squares or triangles or cubes. And the most famous ones are tetrominoes. You've seen that before in Tetris, right? These are tetrominoes. These are all possible shapes that you can make with four squares joined together by the edges. But there are lots of other ones. These are polyominos. These are examples of the five polyominos up to order five. There's the monomino here, one square, and it's named after the domino. See, that's where the name comes from. A domino is two squares, right? So that's a monomino. There's a triomino, a tetromino, and a pentomino. And it goes up as high as you like. Practically speaking, it goes up to about heptominoes, seven, but then you get holes in the middle of the shapes and it gets messy and it gets really, really big. It's really interesting at the pentomino stage. And I brought some aids as well. Here's a set of pentominos that my wife brought back to me from Japan, which is pretty cool. Pass it around. Try not to get a greasy thing. So many sets of polyforms can combine to fill certain shapes. For example, in the pentominos, the five squares, there are 12 different pentominos, and they combine to form a 6 by 10, or here are the 12 pentominos. And these are their common names. So you can spell Filipino and then T through Z with the pentominos. And those are all 12 of them. So they're 12. Each of them is five squares. They can combine to make a 6 by 10 rectangle. All right? These are all 12 of them and they fit together perfectly. Now, what these are called polyform puzzles or dysentoric dissection puzzles. Different names for it. And wait a second. Oh, it pretty sure double-sided. I thought there were only four pages. Okay. So in the case of this puzzle, there are actually 2,339 different ways to solve it. Completely different ways to solve it. But the trick is try to find one. It's not so easy. There's a hang of it. It's not so bad, but it's not that easy. I first learned about pentominos from this book, Arthur C. Clarke's Imperial Earth. I read that when I was about 11 or 12 years old. And the main character has a set of those that he was given by his aunt or something, and it plays a part in the book. And, you know, a lot of people got into it because of this book. And I picked up a set of pentominos, like the one that's going around back when I was about 12 or 13, at Ted's hobby shop out in Point Clare. And I spent many an hour in my teenage years solving pentomino puzzles. So, yes, you know that I am a true geek. Now, if you've ever played the game Blockus, you've played with polyominos. These are all the polyominos of order one through five are in Blockus. And there are lots of other polyforms as well. These are heximons. They're named after the diamond. So, the purple is here, the diamond shape. Diamond is two triangles. So, this is a heximon, which is six triangles. And I think there are 12 of these shapes. So, this is one puzzle. And if you've ever played Blockus Trigon, you've played with polyimons. All polyimons have order one through six. And, yeah, these games are a lot of fun. You should try them. There's polyhexes made of hexagons, like a honeycomb. This is pentahex. So, there are five hexagons. And these are all 22 possible shapes. In this case, it makes a 10 by 11 hexagon lozenge kind of shape. And you can also get into three dimensions, like solid pentominos. Solid pentominos are the regular flat pentomino, but they're one unit thick. And they make a 3 by 4 by 5 solid. And I think there are over 3,000 different solutions for this. But I have yet to find one on my own. And I've got a set of pentaminos here, solid pentaminos. This one, I bought at the Valais de Coeur over on St. Denis. So, pass that around. You can see that they're one unit thick as well, so they go in sideways as well. A solution, meaning take those 12 shapes and put them together into this solid. You can do it over 3,000 different ways. So, these ones can go into that shape? Yes, they can. But try to find just one. This one, trying to do this, I get very frustrated, so I don't spend very long. The regular flat ones, it's not so bad. It's not so bad. But it's fun. It's a mental challenge, a mental thing. You've got a puzzle called soma cubes, which was invented by a gentleman named Piet Hein. I think he was a Danish architect, something like that. He also invented the super ellipse, if you've ever heard of that. No? Well, it's pretty cool. These are all of the non-convex shapes you can make with cubes up to three dimensions. It means that if you try to... It's up to four cubes. And if you try to go to five, then suddenly you can get into the fourth dimension and you didn't want to go there. Sorry? What do you mean by non-convex? Well, convex means that if you go around, it's always... You never have an inside... A convex one will always have outside corners. But non-convex has inside corners. So a convex shape would be like just two together as convex. So two doesn't exist in soma cubes. It's only three or four. You can put these together into a three by three by three cube, 240 different ways. And it's pretty easy to find one. You've got... This is pentacubes. This is if you take the pentaminos, but you extend it into three dimensions. They're not flat anymore. And you've got 29 different ones of these. You can make some very interesting shapes. And then there's another puzzle, which I've never even touched. These are called polysticks. And what these are, instead of putting squares together, you take line segments on a grid. So the little segments on your graph paper. And these are all the possible shapes from one up to four polysticks. And they fit together into this lattice. And I just look at that and I say, wow, that's really cool that they all fit together like that. Maybe that's just me. I hope you find it interesting. I hope you find it interesting, too. So this one I don't know. I don't know. At least I don't know offhand. I don't know if anybody actually knows this one. Some of the puzzles I've done, I've devised for this software, haven't been explored fully and I haven't let the computer run long enough to actually find all of them. Some of these puzzles can take days, weeks to find, especially because it's written in Python, which is not known for its speed. It's known for its speed of writing the code. That's what I'm interested in. My time is more valuable than the computer's time. So my second goal is to introduce you to some of the algorithms and some techniques. First I'm going to tell you about the first time I implemented this. It was back in Sajapur University. I didn't want to study, so I started writing this software. I was using Object Pascal, an object-oriented variant of Pascal. So the algorithm was using brute force and with some heuristics. The heuristics being things like the brute force would place every piece everywhere it possibly could and the heuristics would be the program would look at the remaining space and make sure that it's a multiple of five. So it wouldn't break up a space and three on one side and two on the other. Well that doesn't work. If it found a space that was exactly five squares it would try to figure out which piece fits in that space and if that piece was available it would put it there and if it wasn't it would backtrack. It would check for bottlenecks like a thin area where because of the thinness even though it wasn't exactly five squares still only one shape could possibly fit. So basically I made the computer solve the puzzle the way I was solving the puzzle and that should ring warning bells. It didn't with me but I was very naive and it never worked. And I gave up. So when I first learned Python in 1998 this was my this was my project to learn the language. It never well it had bugs I never got a you know what I think I might no no I shouldn't say it. I never got a solution out of it. It was a good learning experience when I wrote it in Pascal, object Pascal but I never got an actual solution out of the thing. So that's my definition of not work. I can't remember at this point whether it ever you know compiled I'm sure it compiled properly but I can't remember if I got all the bugs out of it or if it was just a time thing. Back in those days that would have been that would have been let's say Sage up I was in Sage up from 85 to 87 computers were really slow back then even if you're writing in Pascal it was slower than writing in Python today. So back to Python so I used it as a test bed to learn how to how to use this interesting language and I fixed it up I got it to work but it was still it was very very slow and so I sort of I gave up I even went so far as to register a project on source forage and it's a four-digit project which tells you something I was in the very early days of source forage before they had 10,000 projects and but it remained dormant for many years until 2006 so then I came across a very interesting paper by Donald Knuth who does not know who Donald Knuth is okay learn he's a professor or professor emeritus at Stanford and he wrote the art of computer programming he's still writing it is the series of books all about algorithms he's the father of the analysis of algorithms he wrote the tech computer typesetting program TEX it's actually it's Greek letter it's a chi it's not an X sorry? Tao Epsilon Chi a lot of people call it TEX but it's actually TECH and he also wrote the one of the first literate programming systems called web so he wrote this paper called Dancing Links it was published in 2000 I read it in 2006 and he discusses this algorithm called algorithm X and that's what I want to talk to you about and this algorithm finds all the solutions to the exact cover problem there's a lot of big words a lot of big concepts I'll explain them so here's the exact cover problem so what have I got here so this is the statement given a matrix of zeros and ones does the matrix contain a set of rows which together contain exactly one one in each column so it's a sparse matrix of zeros and ones you want to find a set of the rows when squished together have ones all across but no twos, no zeros and to find every solution we must find all such sets of rows so the trick is to construct a matrix that corresponds to the puzzle so the first thing you need to do is you name the columns and you name the columns after the names of the pieces and I showed you that pentaminos all have names and other puzzles do too with some of them I just made up names and then also the coordinates of your puzzle, your space that you're trying to fill so this is what a header could look like for a hypothetical puzzle it has three pieces A, B, and C and it fits into a three by three array so these are the I can try laser it's not working you've got oh, laser light, there you go the puzzle piece names and then the coordinates here and then you need a row for every possible position of every piece so you've got a piece and you can go here, here, here, here like that everywhere in the puzzle that it can go and it can also go here, here, here, here and then here, here, here, here like that and so every possible position you make a row and the rows would look like this there would be you put a one under the name of the piece that you're representing and a one under each coordinate that the piece exists in so this is in 0, 0, 0, 1, and 1, 1 and then you'd have a then you'd try to find solutions where you'd find a set of rows such that you add them all together and you get ones all across and one such solution might look like this so you see there's one piece A, one piece B, one piece C and every coordinate has one, one in it so there's a solution to this hypothetical puzzle so I'll give you a trivial example here so here's a puzzle of two pieces A and B into a space that's three squares big trivial, right? Very trivial and here's the puzzle matrix that results from that there are three possible positions for A here, here, and here and two possible positions for B here and here if you allow rotation which in this case we do and so if you look at this matrix you can see well okay you need one of A so let's choose this one this one doesn't work if you put A here you take this one there's no B row that matches but if you put A say up here on 0, 1 which is here then you try to find, so that's this one taken you try to find a B where it's the other two there it is, the bottom row so this row here and this row here combine to make a solution so that's the kind of thing we're dealing with was there a question? no? okay so the problem is that matrices for these kinds of puzzles can get really really big for the six by ten pentaminos puzzle the matrix is 72 columns wide there are 12 pieces and 60 coordinates and it is 2032 rows long which is pretty big and even that, that's not so big if you take a pentacubes puzzle which has 29 pieces it is there's 29 pieces there's 145 coordinates to fill so there's 174 columns and over 6,000 rows so it gets pretty big pretty quickly it's like square of the number or the cube of the number or something like that I haven't figured it out so that's the exact cover problem and then Knuth outlined this algorithm he called Algorithm X this is how you solve the problem how are we on time here? probably want to speed it up I won't bother going through all of this just believe me it works okay if you're interested in the details read the paper and then the other part of the paper is this concept called Dancing Links so in order to well I'll go back once one of the things you do in this algorithm is you cover columns cover means to remove a column from the matrix and remove all the rows that have a one in that column that you just removed so you end up removing a column and a bunch of rows as one operation and you do that here and then you do that here again so you end up messing with this matrix a lot so even though, okay 175 by 6000 doesn't seem that big when you got gigabytes when you have to do a backtracking recursive algorithm and you have to slice and dice this matrix all the time it gets you don't want to be copying this matrix a lot because it's pretty big so you need an efficient data structure so newt's algorithm uses doubly linked lists like this so every node has a left link and a right link his algorithm actually uses quadruple linked lists they actually also have an uplink and a downlink we'll just deal with doubly linked lists for now so say you've got a linked list like this and you want to remove node B you know what node B is you want to remove it from the list it's easy to remove it you just say okay say B dot left dot right equals B dot right what does that mean B dot left is A make its dot right the same as B's dot right so A now points to C you're the same with C C now points to A so this is what you get right now B is out of the list but this is a backtracking algorithm you've got to put them back again so how are you going to keep track of all this stuff well the really cool thing about this paper which was actually Knuth popularized it but somebody else came up with it was that there's something to remember B remembers who its neighbors are B knows B still points to A and C right A and C don't point to B anymore but B still points to A and C right so you can to reinsert B into the list you say B dot left right equals B and B dot right dot left equals B and suddenly it's back the way it was back to the original state so this is called dancing links because the links dance around they turn off and on and they dance so you call it dancing links and yeah it's very very useful for recursive backtracking so so then we have this algorithm he calls DLX which is dancing links algorithm X and it uses quadruple linked lists which have left right up and down as I said and it represents a two dimensional sparse matrix so you don't need nodes for all the zeros you only need the nodes for the ones actually if you only are representing the ones you don't even need ones you just need nodes right so it's an efficient use of of space and this algorithm when I read this it was so different from what I had done myself and so obviously superior that you know it sort of blew my mind what it does is it adapts the puzzles to the computers way of thinking not to my way of thinking computers think differently than people computers don't actually think right they're dumb stupid machines we have to tell them what to do well I couldn't teach it to think the way I do so this way it can do it's work the way it does it and it's a very efficient and flexible system answer the phone let's see and it's also applicable it's applicable to other other puzzle like problems like the eight queens problem you're familiar with that you've got eight queens on a chess board and you don't want any of them to be able to take any of the other ones and it also can be used for Sudoku by just very carefully arranging the columns and then after that you just let it run any kind of any kind of packing problem that kind of thing it'll work on so Sudoku works quite well as well and I've already written the module to do the solvings all you have to do is make the matrix and feed it to it and it'll do the work so after I read Knuth's paper my old itch resurfaced and polyform puzzler is the result and that's what my third goal is to talk to you about polyform puzzler so it's a set of tiny little front end applications which are two or three lines long and they call a bunch a Python package some libraries the exact cover algorithm coordinate systems polyforms themselves and the puzzles so they describe all this stuff and it's easy to it's easy to add new puzzles and even polyforms and it's not incredibly difficult to even add new coordinate systems to it that makes it easy okay where am I I'll use a puzzle to keep my place so we've got over 100 puzzles in the project made of 12 polyforms I showed you a few already and I'll show you some more but it's not an interactive program yet that would be really cool what it does have though is it has SVG scalable vector graphics and X3D rendering of all the solutions the pictures you've seen so far almost all of them have been drawn by my software and it's not that difficult SVG is just a XML so you just have templates and slice and dice and it works the project has a bunch of it has a gallery of puzzles and solutions so conclusion was anybody counting so my fourth and final goal was to show you some pretty pictures along the way I've shown you some here a couple more so here's Heptaim and Snowflake here's another Snowflake this is one my wife got me and I don't know about you but I look at this and I just think that's so beautiful it's like Snowflake's in real life it's amazing that nature works the way it does even mathematically that this could be possible it just blows my mind and then we've got this one here this is pentacubes corner crystal so you've got three walls here floor and two walls then you've got crystal staircase in the corner and this is interesting a gentleman in New Zealand had devised this puzzle something like 20 years ago and he's been working on it for 20 years so you have a single coordinate system is a coordinate system to actually build the matrix it goes into the exact number over the same yes as long as you make the coordinate system as long as you make a coordinate system you can make the matrix do we have like two algorithms now for 2G and 3G? no, just one algorithm creating the matrix is kind of the hard part that's the part where you have to really think hard and like when you go back to this one I'm assuming that you can show us that algorithm actually well that algorithm that one is per puzzle it is per puzzle or it's per polyform type so there's one for polyominoes it's a grid that's easy then when you get to polyomins which are triangles then it gets tricky and I actually use a pseudo 3D coordinate system for this if a triangle is pointing up it's a zero and if it's pointing down it's a one but other than that it's a skewed grid it's like a grid like this and I also use a 2D coordinate system for polyhexes the honeycomb shapes the polysticks which are the line segments that's also a pseudo 3D where I use zero for horizontal and one for vertical and then it's just XY after that but what you have to do is translate from some format that makes sense to you as a human to a format that makes sense to the computer and the computer in this case doesn't know anything about the underlying puzzle what the software does is it takes the puzzle description turns it into ones and zeros matrix the exact cover algorithm turns away and delivers the solutions and then the software has to translate it back into something that we can understand usually the output is ASCII text and then graphics like this Martin I have a few questions now so one part is creating the background from the part that shape you want into the matrix but the second part is also generating each of the possible variants of the pieces of the patient the translation should be trivial the rotation depends on the domain it's interesting do you do that with the computer or do you actually manually when I first implemented it I did it manually but now I've got the computer doing all that stuff and it makes me wish that I'd paid more attention back in linear algebra because all of that stuff comes into play matrices and multiplying matrices and groups and all that stuff it's all useful here and I wish I I'm sure I've done stuff in the software that has names that it's a recognized transformation in mathematics but I don't know what it's called because I forgot because it was 20 years ago that I learned it which goes to Google that you can say my problem is like this and like that and like that it's funny that it's a similar problem well it's probably all on math world or something but you know so my second question is more fundamental but maybe I missed that part I'm sure you must have mentioned it not necessarily and it seems clear to me that you don't have an infinite number of pieces to choose from because that would be a trigger problem of cutting out the domain well it's not a trivial problem but it's easier you have an inventory of shapes now given an inventory a specific inventory of shapes it's possible that there is no solution about the domain so what's the input of your program do you actually start from the domain generate the pieces without someone here's a puzzle what does it do exactly you start from a puzzle from somebody who created and then solve it I start from a puzzle somebody created or I created myself in idle moments at work I'll do it along graph paper you'll cut out the pieces like I said I've never actually done this physically even though I've got a set of these pieces I've never actually done this particular puzzle physically it's only in the computer that's actually done it you should generate the inventory of pieces yes the inventory of pieces all the combinations of in this case seven equilateral triangles that I have done manually and actually enumerating poly polyforms is a hard problem in and of itself there's different kinds of inventories you can say you can't have more than two pieces that are the same basic shape and when you get into that you get into some tricky areas I've done a couple of puzzles like that and it's one of those cases where I have to sit down and think hard how am I going to represent this as a matrix and I'll be happy to talk about it after but I don't think we can so when you start an inventory of pieces it turns away depending on how big the puzzle is for anywhere from milliseconds to weeks and then spits out zero solutions found it didn't find a row that had no links no I haven't found any bugs recently Francois this snowflake this picture this picture this picture this snowflake this picture my software did that yes well I designed the shape there's a website where you can make graph paper I don't know if you've ever seen this you can make graph paper in a regular grid or triangular or hexagonal and other ways as well and I printed out a bunch of triangular graph paper and I started doodling pictures just for fun just for fun basically what I do is I start with a hexagon say a hexagon like this and realize that okay this set of shapes doesn't fit in that hexagon I like to start with the simplest basic shapes first squares triangles, hexagons and then if it doesn't fit I'll play with it make holes add appendages I like symmetry so I would just play with it and pull it out until I could find one that fit or sometimes I couldn't find one that fit stuff like that so in this case I can't remember if I made this one up or if I found it on a website about these polyforms polyforms out there there are some websites that are just incredible the scope of these things the amount of work that's that would be a hard problem an NP hard or whatever you call it was there another question from over here this particular one I can tell you let's see puzzler solutions hep diamonds snowflake 2 dot text let's see how many have I got here I didn't solve them all I only got a couple of I only got one so far this is part of what the program gives me I did some ASCII art to print it out and I think that's the same is that the same one yeah it's the same solution and my software will also it'll generate the ASCII art and then you can feed it the ASCII art and it'll generate a graphic it doesn't actually parse the ASCII art although I've done that in the past it parses this data here so here at the end you've got the names of the pieces the coordinates they fill and it'll read out that block in and turn it into a piece of SVG graphics yes it can be parallelized well yes you'd have to duplicate the matrix you'd have to duplicate the matrix across each process would have to have its own copy but basically at the beginning of the algorithm there's a starting point deterministically you say well to keep the see what you try to do is you try to keep the search tree narrow and deep as opposed to broad and bushy right and so you choose the column in the matrix which has the fewest ones in it that'll give you the fewest that'll give you the narrowest search tree after that and so you choose the first one and then non-deterministically in other words one at a time you go through all of the rows in that column exhaustively you just do a for loop over them so you could feed each iteration to a different process a different computer whatever and if you had lots more computers level down and another level down I haven't done it but you know you could how long did it take which take this computation you know what it doesn't say usually I have it let's see I'll try to find one here let's see penta cubes corner crystal so this is the one I showed you a moment ago you can't even see it here darn some of them are if you take some like pentaminos the 6 by 10 pentaminos that took you can see here 2339 solutions it took 19 minutes in this case some of them take minutes some of them take microseconds some of them take weeks I've actually run it on my computer work left it on overnight nice down the the process so it didn't bother me when I was there during the day and left it running for weeks and also the software saves states so you can cancel it you can control C out of it and then resume it and pick it up later and it'll pick up from where it was you can write a C W named list structure I am using pythons that's a good point I'm glad you brought that up well no it sure you just have references to objects what's a real list well no I'm actually not using I'm not using python lists I'm using each one is an object with attributes left and right which point to other objects so if anybody is interested in writing a C extension module I've got a great project for you the hard work is all done already but my C is very rusty and I have no desire to polish it up okay well I haven't actually learned Pyrex so what I have done with it is I've used Psycho and that's spitted up like three times but yeah I could do that I just never got around to it to me it doesn't really matter how fast it runs I'm just interested in reaching the solutions and finding the solutions when there's 2,000 solutions it's cool to see them all when I reach 10,000 solutions I don't care anymore and if I get just one solution after a week that's enough for me hey there is a solution that's cool when you say city of state do you use pickle? yeah use pickle that's right just pickle objects that's all it is and there's that one there and there's this one and I can show you something do we have time? run out of time okay this is let's see let's see if I can zoom it out here and this is a program called Free WRL and so this my software also generates 3D data and so you can play with it in 3D so you can see behind it and see what the actual pieces are if you want to build it so I was saying about this puzzle here this was an interesting one this gentleman in New Zealand devised this puzzle like 20 years ago and he's been trying to solve it ever since for 20 years he's been trying to solve this puzzle he got as close as all but one piece fitting can you imagine? all the way he gets all excited it doesn't fit and the problem is with this puzzle is that the pieces go flat and then this way and so all of the 3D pieces have to be on the edges, on the corners or here in the middle the flat ones have to be here and so he found my project and he wrote to me and asked me if Polyform Puzzler could solve this puzzle and I said yeah I think so and I was busy that week so I wrote it up a week later and it took a few days I think for it to come up with a solution but it found a solution he was very happy I don't know I don't know I think there are a lot of solutions but I don't know how many and in the future I hope to explore some as yet unexplored polyforms that I've thought up in my head some 3D ones that don't seem to be explored very well and maybe even work on a GUI but if you'd like to help if you find this kind of thing interesting and why wouldn't you then I'd be happy to have your help you should build a really wicked one and send it to a guy and use it in pieces in pieces he also came up with the he also came up with another one which I the one back around slide 6 or so he came up with this one also this fortress kind of looks like a video game and I was able to help him solve that one too so it was pretty cool so your experience this guy spent 20 years trying to find a solution so you had the intuition that there was a solution how would you know you had the possibility how would you you generally have an intuition whether or not there is a solution well you can there was a solution there was a puzzle I came up with sort of similar to this you take three planes the x y plane the y z plane and the x z plane three intersecting planes and you make sort of an octahedron out of them it's like you take this one and duplicate it there and duplicate it there and smaller and I tried to come up with I tried that it wasn't working well and so I thought okay I'll think about this and one thing you can do is you can use you can use parity to see if you can solve a puzzle so for example if you color each of these cubes like a checkerboard so black black black and then white white white like that and if you can determine if there is an overabundance of one color over the other and there often is especially a puzzle like this this puzzle probably has an overabundance of about 10 of one color over the other and then you look at your pieces each individual piece and you color each piece and you see is there an overabundance on each piece and then you add up all the overabundances of the pieces and if they do not at least match the overabundance of the puzzle is not solvable at all there are some some kind of simple rules of thumb yeah there are there are some simple rules of thumbs and there are some very complex rules of thumb that people have come up with that are smarter than me but that's one of them so that that puzzle which was the crossed planes I figured out that I think the overabundance in the puzzle was about 25 so it was like 27 so it was not very likely that there would ever be a solution so it's left on the in the project it's left unsolved I haven't had time to run the computer long enough and that puzzle would one of these puzzles to run into completion under Python not Pyrex sorry, not yet anyway one of these puzzles would probably take weeks, months to run the solution space is so huge that it would just take a long time you should write one of those screen savers yeah it would be cool yeah and you know farm it out among the world it could be done the solution the solver the exact cover algorithm I wrote it as a generator so it could be done that way I wrote it as a generator so that I could monitor it as it went along and it's a re-entrant generator so that you can cancel the process and then go back into it stuff like that optimizing my own Python a little bit but not too much, I'm not really an optimizer I don't really care about speed too much that's true, I just wanted to check yeah look at docketills, it's dirt slow I don't care one of our participants sped it up by about 30% through some simple profiling and he likes doing that I'm not interested really parts of Python well the generator generators were useful it meant that I could isolate one part of the algorithm from the rest of it just Python's dynamicity itself the fact that you can have an attribute just point to anything Python fits my brain because I don't care about all the bookkeeping and all the little details so that certainly helped I mean the algorithm in code I can show you exact cover here's the here's the solving this this method here at the top from here to here that is the expression of the algorithm I showed you in pseudo code and it's only about half again as long as the pseudo code now of course there are dot uncover and dot cover and stuff like that which are methods elsewhere but if you can take an algorithm even if it's an 18-point type then you're doing pretty well exactly it's executable pseudo code as opposed to executable line noise that looks like an artifact of maybe the vertical line that was an artifact of I think that was anti-aliasing that's just an anti-aliasing artifact I didn't even notice that there's probably a mode you know Emacs there's a mode Emacs has everything everything I mean back when I used to use it on Unix workstations the icon was a kitchen sink has everything including the kitchen sink that's the end of my talk nobody's asleep I hope you found that interesting thanks for watching