There are plenty of books at your wonderful and kind and pretty public library on the subject, even so, I know how hard it is to walk in there without the promise of cold drinks and hot chicks and there's that guy that smells bad and talks to himself and we can't play pool and act like it's The Real World, all mackin' on the dope phatness n stuff... But I digress.
AND SO... I'm going to go ahead and act like I can get any sort of concept across by trying to explain two techniques that are used for memorizing things. These leet skillz just happen to also have the benefit of helping you keep things in tidy sequential order, which just happens to be important for using the system Mnemisis uses. Happinen.
Use concrete objects and actions for your memorization - that is, if you have the choice of remembering a dog or a dogma, remember the dog.
Along the same lines: embellish and/or rastafy by 30%. Once you've got your concrete object/action, do something memorable to the image. When in doubt, make it chrome.
You must-ah focus. You must-ah train hard, and train well... Take a moment to really imagine it in your mind's eye/ear/pizza. I figure as long as it takes you from when you open the fridge to decide what you want to eat till you close it. For some of you: you may be here awhile.
For the programmers among you, it's the wetware equivalent of a linked list.
Pull the first item from the list, and begin your visualization of same (perhaps in a context that will bring up this chain for you, later).
Example: you visualize a gigantic meteorite (translation: '3141') made into a pie.
Get the next word from the list, and start a monologue for yourself based on those two objects.
Example: you visualize the meteorite turning into an alebench[1] ('3141' turns into '5926')
Stylishly drop the first object (remember the 7 ± 2 rule[2]), and chain the next object to the second.
Example: You picture the alebench beginning to lemel[3] ('5926' turns to '535')
Repeat as necessary or until you trigger a brain overflow.
For the historians among you, it's how the Greeks remembered their speeches.
What you'll need: a location[4] that you know not unlike the back of your hand/other reasonably memorable appendage.
Pull the first item from the list, and begin your visualization of same. By same I mean the item. That we were just talking about. Just now.
Put it in the start point. If you were, for instance, remembering getting up in the morning (and you have a fairly stable routine). You might remember the first object in bed with you. That's right. Let the kinky mnemonics ride!
As you move through your mental landscape (now you see why linearity is important here), place objects that represent what you're trying to remember in the room/hall/closet/bed/way. Back to the example - if you brush your teeth in the morning (and you know you should, if you don't), you could put the next object next to your toothbrush, perhaps. Or in the hallway on the way to the toothbrush. Or in the general direction of A toothbrush. Do you ever brush your teeth? What is that - a whole cigarette butt in there?
Repeat as necessary. Also: Floss.
You're probably also wondering what the stink to do with Mnemisis, or what can be done with it, to maybe justify it to yourself.
If you're here for justifying, uhh... You are probably very very lost and should report to a station attendant for directions. I'm not sure why you're here. This is a little off the beaten path, hombre. Let's not even get into: it doesn't[5] run on XP™.
Not that we don't take kindly to strangers, but Mnemisis does take some (not dissatisfactory) effort.
Also-to-note: I've read some pretty wacky stuff involving the major system... If you love baroque mental constructs - DELVE! Just about every other supre-pronto-gigans-memory book is just the major system (possibly as an adjunct to some other methods) and ways to use it.
Do your schedule!
You heard me! Associate keywords for 0 through 7 and then remember things "under" those words (in chain fashion, of course) for things to do on that day.
Remember important calendar days
Yes, no one loves a smartass like the smartass that can tell you:
What day of the week your birthday fell on.
What day your favorite holiday falls on.
When burn-a-leprechaun day was first celebrated in Nigeria, and why it was quickly driven "underground"[6].
And lets not forget the trivia!
How about the highest building in the world's total mass?
The amount of bacon the average American/Belorussian/Batavian/Gaelic/Bacon-eating-potato eats per year?
How about crypto[7]? The entire adjusted S-box layout for s3DES? Who says a one-time pad has to be written down! Live a life of security with large bit numerical keys!
Computer minutiae your game?
Are you mad about routing tables? Now's the time to stop writing them down! Yes! Freedom from dotted-quad tyranny! And then there's all the opcodes for your favorite retro gaming system - carry the guts of an emulator in your mind! How many chipsets were there for pac-man? And now in hex? Five times fast!
Obsessions, overtake thee!
Bring your favorite pop-star's discography in reach! Now, the domain of the truly slavering fanboy can be yours! How long do your top 100 animes run? Divided by their UPC codes? Don't know? You're living in the past, my friend.
The GA will run until a done.file appears in the directory, SO, because you need to create that file, you'll need either:
Another terminal window open.
A sane shell. Defined as: "with job control"
It may take a bit to shut down once you've created the file:
Please be patient.
(I was just having too much fun with sub-points to stop here. DocBook is just a <blink>candy store</blink> of tags. ... Damn!)
Grimes@Sector7G mnemisis$ make lab (blah blah blah compiling as necessary blah) Making lab... Grimes@Sector7G mnemisis/lab$ ./MNEMISIS.py forever Loading/Grading....... Breeding begun @ 16:39:12 Breeding/Grading......... Ctrl+Z [1]+ Stopped ./MNEMISIS.py forever Grimes@Sector7G mnemisis/lab$ touch done.file Grimes@Sector7G mnemisis/lab$ fg ./MNEMISIS.py forever ......... 617947G.gene : 476.991 / 44.0966% 496391G.gene : 466.459 / 42.8444% 662657B.gene : 465.559 / 42.8444% 375758G.gene : 432.005 / 40.6082% (and so on -- hopefully with a little better scores when you try it...) |
That's all there is to it. Once you see the scores, the breeding is complete and all the Phoneme tables that have been bred are saved in your lab directory.
.gene files in the lab directory starting with a digit are volitile. All others are protected during a forever or once run. This is convenient for trying to beat your previous record-holder. Simply name your current high-scorer (at the top of the ./MNEMISIS.py show list) something like Das_Fluffernutter.gene, let the breeder rip for awhile with ./MNEMISIS.py forever, and when you've finished the run, Das_Fluffernutter.gene will still be lollygagging around on the high-score list (even if, gods of the computron willing, it's at the bottom).
Also, it's possible to protect a middle-performance file from being deleted by doing this. The file doesn't get overwritten, so you can build up a little zombie army to be your genetic foundation. Or something like that... Brains...
Weights are multipliers (many pliers?) for different metrics that the Phoneme files are graded on. You may want to mess with them. I know I don't. But hey. Anyway, you may want to try and get better results out of Mnemisis by toying with their values. In order to do that, you'll need to tinker with your rc file. See the weights section of the "messing with your rc file" section. Section section section.
I supply the vectorlist that I used to breed the current Phoneme.rc table in the GENE-erator directory. I used the fantastically expedient and scientific method of:
Picking some words it would be humiliating to get wrong: My name, "test", "Mnemisis", and of course lots of profanity.
Letting it run for awhile, until I got bored. Then try and figure out how to make tools to find things that the list is getting wrong. Realize that that is really really tough, so just add more cursing.
Anthropomorphisize the bastards.
Make another stab at using analysis to spot failures in translation. The switches wrong and length are the result.
Stumble blindly through the logosphere, trying to pick tricky words such as "chromium" - with the deadly art of beginning with a 'k' sound, but spelled with a 'ch'!
You'll need a vectorlist (either the one packaged with Mnemisis, or you can make your own) in order to breed anything.
Format: each line is separated into left and right halves by a space. Left hand side gets fed to the phoneme table being tested - right hand side is what should come back. Comments at the beginning of the line are allowable, but not recommended because they probably don't work right. It's always something with you, Joe.
Designing a vectorlist is not so hard. Yes, it's easier than ever now more than then!
Let's look at ways of making a more effective vectorlist, shall we? Won't you? Thank you. Hello!
Grimes@Sector7G mnemisis$ ./MNEMISIS.py x Going auto... By the power of greyskull, I have the /usr/share/dict/words! (really insanely long wait)[9] Your bundle is 'bundle.words' Have a nice mnemonic! Grimes@Sector7G mnemisis$ ./MNEMISIS.py length <SNIP> << 1014 / dissatisfactory << 1062 / dissatisfaction >> 1072041275 / disconcertingly >> 1099213210 / disappointments </SNIP> |
length is a microstroke... Forgive me while I digress[10], but I was educating myself on Baysian filters when something must have sunk in... and I thought: "How might statistics help me out?" - or - "What, besides sounding out each translation, points me in the direction of a wrong answer?" - and - "Where did I put that pesky sandwich? Mmm... Fresh Pesky."
"Well!" I screamed to myself, scaring the cat - "I look for translations that are longer or shorter than they should be, for one! I should turn the music down! The music inside my head! Which makes me do things! Things which they must never find out about!" It was a glimmering moment of insight, until I remembered that I had left my sandwich on the wood stove, at which point it turned to a feeling that I cannot describe.
Of course, Baysian filtering would be overkill here, and also I really don't want to look like an ass that puts any old buzzword into his programs. So I did a little graphing...and it looks like there is a bit of a relation[11] between the number of characters going into a hand-checked translation table and the number of characters that should come out. That is, words with three letters, when translated correctly, usually have a translation of zero to three digits.[12]
So, back to the task at hand: interpreting the output of length. Right.
What you're seeing is a SNIP of a much longer ream of information. First on each line is the greater/less than, which indicates which side of the normal the translation has fallen off of, and then some information on who and what, which should be self-explanatory.
Note that the translation for "disconcertingly", above, is actually correct. This is an example of why the results from length need to be treated with some skepticism. I attempted to tune it so that it wouldn't be too obnoxious, but you can just think of it as "slipshod yet eerily nostalgic", if you like.[13]
So how do we use this information so that we can breed more flexible and correct Phoneme.rc files, and also to be mean and kick them in the metaphorical crutch over and over and laughing, oh, we laughed so hard didn't we Jim? Do you think mother will ever come home?[14]
Okay. Stay focussed... We'll see how in a moment.
Grimes@Sector7G mnemisis$ ./MNEMISIS.py wrong asian 02 != 62 ambrosia 3940 != 3946 eurasian 402 != 462 aphasia 80 != 86 Grimes@Sector7G mnemisis$ grep -i sia /usr/share/assjack/words | less[15][16] grep: /usr/share/assjack/words: No such file or directory Grimes@Sector7G mnemisis$ ^assjack^dict ambrosial Anastasia Andalusia Andalusian Andalusians anesthesia aphasia Asia Asian Asians Asiatic Asiaticization Asiaticizations Asiaticize Asiaticizes Asiatics (and so on) Grimes@Sector7G mnemisis$ alias fup="^assjack^dict"[17] |
wrong is quick and fun for the whole family! You don't need to wait geologial amounts of time for a bundle file to get built, among other endearing features. As you can see (somewhere amongst all the footnotes), you'll need to do some extrapolating here, too.
In the example, we've honed in on the marginally obvious "sia" sequence as being one of many sources of our translational pain. Checking the dictionary gives us new words that we could then in turn add to the vectorlist. But why?
Well, the more things to test against in the vectorlist, the better. If we go organic, we'd say that we're "training" the Phoneme.rc files on how to answer. Which should mean that a bit of hard work on our part making percentage points go down, will be rewarded by us sitting on our ass[18] watching percentage points automagically go up.
So, fire up your fave text editor and add some more lines to the GENE-erator/vectorlist (such as "aphasia 86" and "ambrosial 39465", for instance). Then, just give a make vectors, which will sort it and make sure there aren't any dupe entries. Run ./MNEMISIS.py forever for awhile, and you're innem.
Grimes@Sector7G mnemisis$ make traceable (like you have no idea what 'make' looks like...) Grimes@Sector7G mnemisis$ ./MNEMISIS.py n test test st==0t te0t te0t t==)1 t )1 te0)1 t 101 Grimes@Sector7G mnemisis$ ./MNEMISIS.py n "Be seeing you."[19] be b==se9 se9e seeing n==*2 seei*2g seei*2g se==0 0ei*2g 0ei*2g g==7 0ei*27 9027 Grimes@Sector7G mnemisis$ make (ditto) Grimes@Sector7G mnemisis$ cd .. ; rm -rf mnemisis[20] Grimes@Sector7G mnemisis$ lynx http://asciipr0n.com[21] |
Here we turn on trace, which puts a view of what's going on inside the Phoneme.rc file. Every time a line from the Phoneme.rc actually runs on the input (the regular expression on that line matches), then a short status line is printed to STDERR. On the left is the line's old state, then the regex that matched, and finally the result of the match. Comprende vu?
Note that on "Be seeing you.", each word is handed to the translator in turn, rather than in a single line. Also, capital letters are lowercased, and all non-digits are stripped out. This is not shown (though it should be assumed (correctly (I warned you there'd be nested parens!)) at the beginning and end of processing, respectively, forthwith, heretofore, unbeknownst, etc...).
This is more of just a fun thing to look at, than something that I'd expect you to actually extrapolate anything from. If anyone finds a use for it, let me know.
I find it amusing to see how it seems to only just get things translated correctly. Like the line "t==1 t" -- could easily lead to ballooning insanity if there were another line involving a "t" later on[22]. So I'm easily amused. That doesn't make me any less troubled and deep, nope.
Note also that the final make returns you to normal operation. Please note that I will never test what happens if you try breeding things or running the GUI with the trace on. I don't care. You've been warned. I'd rather spend my time elsewhere, trying to get things to work in a sane manner, thanks. You and your crazy uses for things. You should be ashamed.
Also, running MNEMISIS.py x with trace on is... Exciting! Like reading raw Venona intercepts!
Yes, as well as extended POSIX Regular Expressions in your Phoneme.rc file, you also have the kinda nifty ZWPA frankensteined in in an unorthodox and inelegant way. Like staples and syrup. But what the hell are they and why would I use them when I could be all tore up and crying in bed? Let's watch!
Let us begin some the example of for you, to having as by the translating from the language of the Non-Occidental Peoples -- Today Yum Yum Tasty Blast 180 Thousand Percent!! Oi!:
If the Input you would be for to giving | Then the Output should be for you to have |
arcing | 4727 |
conscious | 7260 |
cinema | 023 |
Vinci | 826 |
Closer inspection of "ci" reveals that it can't be hardcoded as six, seven, or zero[23] without hilarious results. So, do we have to do a whole bunch of special cases? Maybe we can come up with a more general RegEx... Well, how about putting "cin==7" in the Phoneme file above "ci==6"? Bonk! Now "cinema" will come up as "723". Oh, the pain! In fact, this is the pain of the 9000 Chambers of Special Cases in English Alone Not To Mention Words Of Saxon Origin. At this point, the stronger of you may need a moment to cry, begging forgiveness for a language that seems to have evolved while under the influence of some really good blunts. I'll wait. To our left, French, and the most horrifying of test vectors: "bourgeoisie"! Fear the madness of the silent R soft G-ness of it! Get out! The test vectors are coming from inside your very language! The horror! Dogs and cats living together!
What are we to do? Do we scrap the whole project and move in with an intelligent, low-maintainance girlfriend? (snaps fingers) Over here! Ahem... No - the answer, gentlemen, is: We impliment - The ZWPA! (comfy chair theme) They are well suited for this application, and eagerly await your reply - they're willing to relocate!
And now for a totally rigged demo. Let's turn on trace mode and see what the ZWPA "ci<[mn]>==0" does...
Grimes@Sector7G mnemisis$ make traceable make[1]: Entering directory `/mnemisis/Cpp' (blah blah blah you're not really reading this, are you?) make[1]: Leaving directory `/mnemisis/Cpp' Grimes@Sector7G mnemisis$ ./MNEMISIS.py n cinema cinema ci<[mn]>==0 0nema 0nema n==2 02ema 02ema m==3 02e3a 023 Grimes@Sector7G mnemisis$ ./MNEMISIS.py n decimal decimal ci<[mn]>==0 de0mal de0mal m==3 de03al de03al d==1 1e03al 1e03al l==5 1e03a5 1035 |
Using angle brackets as the delimiter, the line "ci<[mn]>==0" is our ZWPA. Plain-English-ified, that means "ci followed by m or n but leave behind the m or n if you find a match, ya hear?". As you can see in the lines above, the translation did just that.
If you're hacking your own Phoneme.rc file, this is a wicked cool thing to have, as it helps in sewing up those damn special cases that inevitably come up and attempt to strangle you. Maybe "wicked cool" isn't quite the right turn of phrase...
With this, we should get a bit better result. And we do. To an extent. But for purposes of this rigged demo, we'll say that we increased the correctness of the Phoneme.rc file by 150 to 297 percent! That's some improvement!!
You'll find this in the GENE-erator directory. It's an alternative starting point for breeding - like if you wanted to start from scratch. Also, it provides a solid building block for unit testing of the CLI. As soon as there's a test suite...
Why should you care and how would you make your own? Uhh... Well, really all I was shooting for was to have at least one translation for each number, so that it would at least have a foundation to build on... Then I got a little crazy and tried to do it in as few characters as possible. So, those are good guidelines (because I always do the right thing). Why you should care? Hmm. Well, it's better to have something like this documented than not. Ugh. How depressing. I can't even think of a good [24] to make it a little less painful.
To what use might you put this?
Grimes@Sector7G lab$ mv MyWhizzoSuperGene GENE-erator/Base.gene Grimes@Sector7G mnemisis$ make lab Making lab... |
Violet Viola!
You've now got a lab that has been seeded with your WhizzoSuperGene. It is evidently Miller time, at this point. Congratulations.
Used to safely shut down a forever run. Allows it to save state and close all friendly-like. Which is good, if you're into that sort of thing. The only way to fly if you want to keep your lab directory from getting hosed. Well, you'd probably lose some work. Hosed is maybe too strong. But I love saying it. Hosed hosed hosed. And "Smoked". There's another good one.
If you use Mnemisis daily, or have it start when you start X, you may want to set some defaults. Also, if your system has a grep workalike that Mnemisis is not familiar with (Mnemisis tries to locate one when you ./configure it, but isn't the quickest bulb in the bucket for non-Unix setups), you'll need to jimmy an rc file into working order.
To begin with, let's get a skeleton rc file that we can hack on.
Grimes@Sector7G mnemisis$ ./MNEMISIS.py dumprc Verbosity = 1 Belligerence = 0 Borken = 0.2 BundleFile = bundle.words Capitals = 1 DictionaryFile = /usr/share/dict/words DoneFile = done.file GeneDir = GENE-erator Greps = {'grep.exe': ['grep.exe ^SEARCH\\ BUNDLE', 'grep.exe ^SEARCH\\ BUNDLE | grep.exe -v [A-Z]'], 'grep': ['grep ^SEARCH\\ BUNDLE', 'grep ^SEARCH\\ BUNDLE | grep -v [A-Z]']} LabDir = lab Length = 0.5 MaxGeneSize = 3000 MutationRate = 10 NumberOfMogs = 3 OffBy = 0.3 PhonemeFile = Phoneme_Table Population = 20 RestartRate = 10 VectorFile = GENE-erator/vectorlist |
You can either copy and paste that mess into a file, or just redirect the output with ./MNEMISIS.py dumprc >> someRCfilename. If you'd like to have this default run automagically on each startup, go ahead and name it Defaults, otherwise, you'll need to specify the defaults file with the -c filename switch.
If you've got a grep workalike, and Mnemisis could not find it, you'll need to put its command line into the Greps line in order for Mnemisis to work. Important things to get right:
SEARCH -- put this in the spot on the command line where what you're searching for normally goes.
BUNDLE -- put this in the spot on the command line where the file to search normally goes.
The second entry -- This command will result in only lowercased results being returned.
An example, using the imaginary grep workalike egrep:
Greps = {'egrep': ['egrep ^SEARCH\\ BUNDLE', 'egrep ^SEARCH\\ BUNDLE | egrep -v [A-Z]']} |
Note that the second entry (starting at the comma) uses this egrep command to find uncapitalized words. You can farm this job out to a different program, if you wish. This was only done to limit the amount of external programs that Mnemisis depends on, which is already pretty damn unmanageable, seeing as I had to write this section.
The weights used to grade a Phoneme_Table file are the Length, Borken, and OffBy entries. These weights are subtracted from the raw score - which is the number of correct answers to the vectorlist the table returns.
Roughly:
Length: Multiplied by the table's size.
Borken: Multiplied by the number of lines that form invalid Regexes.
OffBy: If a table doesn't provide the right answer, and in fact returns something wildly larger or smaller than the correct answer, it gets this factor subtracted from its raw score, for each character over or under.
The only requirement here is that the values are valid floating points. Have a blast!
[1] | You know, alebench. A bench in or before an alehouse. C'mon. I heard you say it yesterday | ||||
[2] | We're talking about George Miller's "rule". We are not (I think) talking about the Dr. George Miller that directed Mad Max Beyond Thunderdome (No colon in there - which is odd. I would have put one in there. After all, Max is the protagonist - as far as that goes. Well, maybe Tina Turner's hair is supposed to be the protagonist.). And now, a quick callback: Master-Blaster: Who run Thunderdome?! Aunty Entity: Master-Blaster! Master-Blaster: Say louder! Aunty Entity: Master-Blaster! Master-Blaster: Master-Blaster run thunderdome! Aunty Entity: Master-Blaster runs thunderdome! It just crackles, eh? Ahh, for fun. | ||||
[3] | What, you don't know this one, either? Maybe you should go back to that scrabble game with a helmet on. It means: Travelling haphazardly. | ||||
[4] | Preferably a path, somewhere linear... You don't want to wander into the wrong area of your memory, do you? | ||||
[5] | AFAIK - there's probably some traitor-ware that you give a general outline of what you think the program does and it writes up the patent and bills your CCN while converting it into a DRM-positive format that's only runnable on custom hardware that catches fire if you try to do anything unexpected with it. Oh wait, that's Flamedisk™. Real men burn to Magnesium! Hey, the new Thermite system 2.0 drives are out! Order now! (Trampling of innocents (sheeple)) ...Profit! | ||||
[6] | Though it's still a national holiday falling on the...? BEEP Oop! I'm sorry. Would you like to double your wager in round two, the round of the silly hats and too-tight pants? | ||||
[7] | Speaking of: Does anyone really understand Cockney rhyming slang? Could this be the one-way function that people with enough math degrees to choke a paper shredder, the kind of people that you would be ashamed to even say the word "clever" around - in reference to yourself, be searching for? Can I stop adding confusing run-on sentences to this revision of the manual this evening? no. And much much, muchmuch more. | ||||
[8] | While reading the volumes of documentation out there, I realize that I just don't get it if there's no example code, so there's going to be a lot of it here. Just a caveat. You may also experience a few footnotes. | ||||
[9] | Recent timing measurements on the Imperial™ Mnemisis build on a Duron gave the underwhelming result of ~6 minutes. Which isn't so bad, considering that it used to take ~15". But I know how it is. | ||||
[10] | As if, viz these footnotes, you're not used to it. | ||||
[11] | Which - if I could figure out how to work MathML, would go right here. Instead, suffer me this lame text-only version: x : Characters in y : Digits out 1.8x+4.5 < y < 1.8x-4.5 Forgive me that that's probably not standard notation for what I'm trying to express (Think of the havoc I'd wreak if I could get MathML to work (*shudder*)). I'm only lately a fan of math. | ||||
[12] | Yes, I realize that should read "zero to nine digits", the function I whipped up really clumsily fits the data - hopefully someone else with mad math skills will be able to get something that fits a little better. My case is really broken for small values of x, and gets progressively less broken for nominal values. It should at least spot really egregious cases. | ||||
[13] | Did you do it? Good, I knew you could. You're a very good imaginer, and you're the only imaginer in the whole world like you. Let's see what Mr. Trolley has to say about that. Oh, sweet mercy! The drapes! Get an extinguisher! Oh, the humanity! | ||||
[14] | Reverie. From the French for "Was that you?" | ||||
[15] |
| ||||
[16] | Nope, I never get tired of typing. Love it. Great sport. Oh, who am I kidding!? After wearing down my hands, I had to move to typing with my face. I'm a powerful mess. Please, someone send a care package of some moleskin. Anything. | ||||
[17] | Here's a two-cent tip! Include this alias line in your .bashrc file so that every time you mistype "dict" you can quickly recover! Until next time! Three - Two - One - Contact! | ||||
[18] | Plural: "Assi" | ||||
[19] | "I just thought that was so dangerously witty, I couldn't help but footnote it!" -- Number 41 | ||||
[20] | Here's another two-cent tip! Another way to enlargen your drive space: get another drive and use it like a sock puppet to shame your current drive into better performance! Or, you can simply fashion a terabyte RAID by pounding strips of zinc into a potato! We'll show you how, next time, on The A-Team. If you have a problem, and no one else can help... | ||||
[21] |
| ||||
[22] | For example - if I add two lines of "t==tt" in the middle of the Phoneme.rc file and call it da_bom, here's what pops out:
I had to be a bit strategic about placing the lines, as I found that putting them at the beginning or end of the file didn't give an incorrect result. The table actually (if I may be sensational and journalistically irresponsible for a moment...) compensated for the doubled "t"s with the line "t{2,}==t" toward the top of the file, and near the bottom would drop excess "t"s by not translating them. Wonderful! I believe the real-science-person's term for this is "resilience", which is what we get in exchange for small file size. It's tied into mutation somehow or other. There are better books on the topic out there. | ||||
[23] | That's "Zed", for the Clive Andersons among you. | ||||
[24] |