# Crytogram # Britton Clay & Bryan Blanchard restart: with(Maplets[Tools]): with(Maplets[Elements]): with(plots): with(StringTools): StartEngine(); randomize(): interface(rtablesize=26): lightorange:="#FFB300": Alphabet:=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]: alphabet:=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]: crypto:=proc(sentence) global sentenceperm, Alphabet, alphabet, Alphaperm; local i; Alphaperm:=combinat[randperm](Alphabet); while Alphaperm[1]=Alphabet[1] or Alphaperm[2]=Alphabet[2] or Alphaperm[3]=Alphabet[3] or Alphaperm[4]=Alphabet[4] or Alphaperm[5]=Alphabet[5] or Alphaperm[6]=Alphabet[6] or Alphaperm[7]=Alphabet[7] or Alphaperm[8]=Alphabet[8] or Alphaperm[9]=Alphabet[9] or Alphaperm[10]=Alphabet[10] or Alphaperm[11]=Alphabet[11] or Alphaperm[12]=Alphabet[12] or Alphaperm[13]=Alphabet[13] or Alphaperm[14]=Alphabet[14] or Alphaperm[15]=Alphabet[15] or Alphaperm[16]=Alphabet[16] or Alphaperm[17]=Alphabet[17] or Alphaperm[18]=Alphabet[18] or Alphaperm[19]=Alphabet[19] or Alphaperm[20]=Alphabet[20] or Alphaperm[21]=Alphabet[21] or Alphaperm[22]=Alphabet[22] or Alphaperm[23]=Alphabet[23] or Alphaperm[24]=Alphabet[24] or Alphaperm[25]=Alphabet[25] or Alphaperm[26]=Alphabet[26] do Alphaperm:=combinat[randperm](Alphabet); end do; sentenceperm:=sentence; for i from 1 to 26 do sentenceperm:=StringTools[SubstituteAll](sentenceperm, Alphabet[i], alphabet[i]); end do: for i from 1 to 26 do sentenceperm:=StringTools[SubstituteAll](sentenceperm, alphabet[i], Alphaperm[i]); end do: end proc: sentencelist:=[ "NOW IS THE TIME FOR ALL GOOD MEN TO COME TO THE AID OF THE PARTY!\n - CHARLES WELLER", "I DO NOT LIKE THEM SAM I AM, I DO NOT LIKE GREEN EGGS AND HAM.\n - GREEN EGGS AND HAM", "YOU BETER CUT THE PIZZA IN FOUR PIECES BECAUSE I'M NOT HUNGRY ENOUGH TO EAT SIX.\n - YOGI BERRA", "THE BEATINGS WILL CONTINUE UNTIL MORALE IMPROVES.\n - ANONYMOUS", "I AM A DEEPLY SUPERFICIAL PERSON.\n - ANDY WARHOL", "NEVER PUT OFF UNTIL TOMMOROW WHAT YOU CAN DO THE DAY AFTER TOMMOROW.\n - MARK TWAIN", "EVERYTHING YOU CAN IMAGINE IS REAL.\n - PABLO PICASSO", "BEFORE YOU EMBARK ON A JOURNEY OF REVENGE, DIG TWO GRAVES.\n - CONFUCIUS", "I WASTED TIME, AND NOW TIME DOTH WASTE ME.\n - WILLIAM SHAKESPEARE", "A WITTY SAYING PROVES NOTHING.\n - VOLTAIRE", "ALL WOULD LIVE LONG, BUT NONE WOULD BE OLD.\n - BENJAMIN FRANKLIN", "I CAN'T LISTEN TO THAT MUCH WAGNER. I START GETTING THE URGE TO CONQUER POLAND.\n - WOODY ALLEN", "ALTHOUGH PREPARED FOR MARTYRDOM, I PREFERRED THAT IT BE POSTPONED.\n - SIR WINSTON CHURCHILL.", "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.\n - ANONYMOUS", NULL ]: randy:=rand(1..nops(sentencelist)): generate:=proc() global junk, modjunk: local l, x: junk:=sentencelist[randy()]: crypto(junk): Set(question=sentenceperm): l:=length(junk); modjunk:=junk; for x from 1 to l do if IsAlphaNumeric(junk[x]) then modjunk:=cat(modjunk[1..(x-1)],"_",modjunk[x+1..l]); end if; end do: Set(answer=modjunk); Set(TF1="", TF2="", TF3="", TF4="", TF5="", TF6="", TF7="", TF8="", TF9="", TF10="", TF11="", TF12="", TF13="", TF14="", TF15="", TF16="", TF17="", TF18="", TF19="", TF20="", TF21="", TF22="", TF23="", TF24="", TF25="", TF26="" ); Set(win=""): end proc: update:=proc() local x, l, U, i; global modjunk; l:=length(junk); for i from 1 to 26 do U:=Get(cat(TF,i)); if U <> "" then U:=UpperCase(U[1]); Set(cat(TF,i)=U); for x from 1 to l do if sentenceperm[x]=Alphabet[i] then modjunk:=cat(modjunk[1..x-1],U,modjunk[x+1..l]); end if; end do; else for x from 1 to l do if sentenceperm[x]=Alphabet[i] then modjunk:=cat(modjunk[1..x-1],"_",modjunk[x+1..l]); end if; end do; end if; end do; Set(answer= modjunk); if LowerCase(modjunk)=LowerCase(junk) then Set(win="Congratulations! You're a winner!"); end if; end proc: show:=proc() Set(answer=junk): Set(TF1="", TF2="", TF3="", TF4="", TF5="", TF6="", TF7="", TF8="", TF9="", TF10="", TF11="", TF12="", TF13="", TF14="", TF15="", TF16="", TF17="", TF18="", TF19="", TF20="", TF21="", TF22="", TF23="", TF24="", TF25="", TF26="" ); Set(win="You are a dirty, dirty cheater"): end proc: FM:=font=Font("Monospaced", bold=true, 16): Cryptogram:=Maplet(onstartup=RunWindow(MAIN), Window[MAIN](title="Cryptogram", defaultbutton=BUpdate, [ valign=none, inset=0, spacing=0, [ halign=none, Button("New Cryptogram", Evaluate(function="generate" ), background=magenta), HorizontalGlue(), Button("Quit",Shutdown(), background=pink) ], [ halign=none, "Solve the Cryptogram:", HorizontalGlue() ], [ halign=none, TextBox[question](width=40, height=4, editable=false, FM) ], [ halign=none, TextBox[answer](width=40, height=4, editable=false, FM) ], [ halign=none, "Enter your substitutions:", HorizontalGlue() #, Button("Hint", Evaluate(function="hint"), background=lightorange) ], [ halign=none, inset=0, spacing=0, HorizontalGlue(), Label("A", FM), HorizontalGlue(), Label("B", FM), HorizontalGlue(), Label("C", FM), HorizontalGlue(), Label("D", FM), HorizontalGlue(), Label("E", FM), HorizontalGlue(), Label("F", FM), HorizontalGlue(), Label("G", FM), HorizontalGlue(), Label("H", FM), HorizontalGlue(), Label("I", FM), HorizontalGlue(), Label("J", FM), HorizontalGlue(), Label("K", FM), HorizontalGlue(), Label("L", FM), HorizontalGlue(), Label("M", FM), HorizontalGlue(), " " ], [ halign=none, inset=0, spacing=0, " ", HorizontalGlue(), TextField[TF1](width=2, FM), HorizontalGlue(), TextField[TF2](width=2, FM), HorizontalGlue(), TextField[TF3](width=2, FM), HorizontalGlue(), TextField[TF4](width=2, FM), HorizontalGlue(), TextField[TF5](width=2, FM), HorizontalGlue(), TextField[TF6](width=2, FM), HorizontalGlue(), TextField[TF7](width=2, FM), HorizontalGlue(), TextField[TF8](width=2, FM), HorizontalGlue(), TextField[TF9](width=2, FM), HorizontalGlue(), TextField[TF10](width=2, FM), HorizontalGlue(), TextField[TF11](width=2, FM), HorizontalGlue(), TextField[TF12](width=2, FM), HorizontalGlue(), TextField[TF13](width=2, FM), HorizontalGlue() ], [ halign=none, inset=0, spacing=0, HorizontalGlue(), Label("N", FM), HorizontalGlue(), Label("O", FM), HorizontalGlue(), Label("P", FM), HorizontalGlue(), Label("Q", FM), HorizontalGlue(), Label("R", FM), HorizontalGlue(), Label("S", FM), HorizontalGlue(), Label("T", FM), HorizontalGlue(), Label("U", FM), HorizontalGlue(), Label("V", FM), HorizontalGlue(), Label("W", FM), HorizontalGlue(), Label("X", FM), HorizontalGlue(), Label("Y", FM), HorizontalGlue(), Label("Z", FM), HorizontalGlue(), " " ], [ halign=none, inset=0, spacing=0, " ", HorizontalGlue(), TextField[TF14](width=2, FM), HorizontalGlue(), TextField[TF15](width=2, FM), HorizontalGlue(), TextField[TF16](width=2, FM), HorizontalGlue(), TextField[TF17](width=2, FM), HorizontalGlue(), TextField[TF18](width=2, FM), HorizontalGlue(), TextField[TF19](width=2, FM), HorizontalGlue(), TextField[TF20](width=2, FM), HorizontalGlue(), TextField[TF21](width=2, FM), HorizontalGlue(), TextField[TF22](width=2, FM), HorizontalGlue(), TextField[TF23](width=2, FM), HorizontalGlue(), TextField[TF24](width=2, FM), HorizontalGlue(), TextField[TF25](width=2, FM), HorizontalGlue(), TextField[TF26](width=2, FM), HorizontalGlue() ], [ Button[BUpdate]("Update", Evaluate(function= "update"), background=turquoise) ], [ halign=none, TextField[win](width=20, editable=false, background=white), HorizontalGlue(), Button("Show Answer", Evaluate(function="show"), background=lightorange), HorizontalGlue() ], [ halign=none, "Programmers: Britton Clay & Bryan Blanchard", HorizontalGlue(), "© copyright P. Yasskin 2007" ] ] ) ): Maplets[Display]( Cryptogram );