Using Mathematica to solve Smullyan "Scheherazade" puzzle?
- To: mathgroup at smc.vnet.net
- Subject: [mg72281] Using Mathematica to solve Smullyan "Scheherazade" puzzle?
- From: "Kelly Jones" <kelly.terry.jones at gmail.com>
- Date: Mon, 18 Dec 2006 06:55:43 -0500 (EST)
Can Mathematica be used to solve this puzzle from Raymond Smullyan's "The Riddle of Scheherazade"? (isbn://0156006065/page/74) Smullyan defines the following function. It's really a string-based function, not a numerical one, even though it only uses the characters 0-9. In the below, x refers to any string of digits, and "xy" on the left side means the concatenation of the strings x and y, not multiplication. Not all functions are in proper Mathematica form. f["1x2"] = x; (* eg: f["13542"] = "354" *) f["3x"] = StringJoin[f[x], f[x]]; (* eg: f["315432"] = StringJoin[f["15432"], f["15432"]] = StringJoin["543", "543"] = "543543" *) f["4x"] = StringReverse[f[x]]; (* eg: f["4172962"] = StringReverse[f["172962"]] = StringReverse["7296"] = "6927" *) f["5x"] = If[StringLength[f[x]]>1, StringDrop[f[x],1], f[x]]] (* eg: f["513472"] = If[StringLength[f["13472"]]>1, StringDrop[f["13472"],1], f["13472"]]] = If[StringLength["347"]>1, StringDrop["347",1], "347"] = If[True, "47", "347"] = "47" *) f["6x"] = StringJoin["1", f[x]] (* eg: f["615832"] = StringJoin["1", f["15832"]] = StringJoin["1", "583"] = "1583" *) f["7x"] = StringJoin["2", f[x]] (* eg: f["715832"] = StringJoin["2", f["15832"]] = StringJoin["2", "583"] = "2583" *) The rules are, of course, "recursive". Example: f["33x"] = f["3x"]f["3x"] = f[x]f[x]f[x]f[x] The function isn't necessarily defined for every string. Smullyan now asks us to find values such that: f[x] == x; f[x] == StringJoin[x,x]; f[x] == StringReverse[x]; (* StringLength[x] <= 12 if possible *) f[x] == StringDrop[x, -1]; f[f[x]] == x && f[x] != x; f[f[x]] == StringReverse[x]; f[f[x]] == StringJoin[StringTake[x,-1], StringTake[x,{2,-2}], StringTake[x,1]] (* right side is x with first and last digits reversed *) StringTake[f[StringReverse[f[x]]], StringLength[f[StringReverse[f[x]]]]/2] == StringTake[f[StringReverse[f[x]]], -StringLength[f[StringReverse[f[x]]]]/2] && f[StringTake[f[StringReverse[f[x]]], StringLength[f[StringReverse[f[x]]]]/2] == x; (* in other words, f[StringReverse[f[x]]] is of the form "zz", and f["z"] == x) Of course, the answers are in the back of the book, so my general question is: can Mathematica be used to solve puzzles of this sort? Enumerating and testing all possible strings seems tedious (especially given the length of some of the answers). Is there a clever shortcut/methodology here? -- We're just a Bunch Of Regular Guys, a collective group that's trying to understand and assimilate technology. We feel that resistance to new ideas and technology is unwise and ultimately futile.
- Follow-Ups:
- Re: Using Mathematica to solve Smullyan "Scheherazade" puzzle?
- From: "Chris Chiasson" <chris@chiasson.name>
- Re: Using Mathematica to solve Smullyan "Scheherazade" puzzle?
- From: "Chris Chiasson" <chris@chiasson.name>
- Re: Using Mathematica to solve Smullyan "Scheherazade" puzzle?