Here's my paraphrase of the puzzle: What is special about the numbers (and the spellings)
in this list: 4, 6, 12, 30, 33, 36, 40, 45, 50, 54, 56, 60, 70, 81, 88, 90, 100?
The order is not important, and the property we're talking about is met by no other
numbers between 1 and 100. I'll put a little space here so if you don't want to
know the answer quite yet, you don't need to see it :)
OK, so I thought, "H'm, why 'four' but not 'five'? Well 'four' and 'five' are both
4 letters long; 4 is a factor of 4 but isn't a factor of 5. 'six' is three letters,
3 is a factor of 6."
So I typed this little list into a file, which I imaginatively called tmp/cartalk-number-puzzler:
four six twelve thirty thirty-three thirty-six forty forty-five fifty fifty-four fifty-six sixty seventy eighty-one eighty-eight ninety one hundredNow, rather than counting letters by hand, I did this:
$ while read X; do echo $X ${#X}; done < tmp/cartalk-number-puzzler four 4 six 3 twelve 6 thirty 6 thirty-three 12 thirty-six 10 …Let me explain that.
- while read X; do means "read a line and assign it to $X, then execute the following."
- echo $X ${#X} means to echo (on the terminal display) the values of $X and the length of $X (which is the translation of ${#X})
- done is the other end of the do we saw above
- < tmp/cartalk-number-puzzler means "and read from this file, not from what I'm typing"
$ while read X; do Y=${X// /}; Y=${Y//-/}; echo $X ${#Y}; done < tmp/cartalk-number-puzzler four 4 six 3 twelve 6 thirty 6 thirty-three 11 thirty-six 9 forty 5 forty-five 9 fifty 5 fifty-four 9 fifty-six 8 sixty 5 seventy 7 eighty-one 9 eighty-eight 11 ninety 6 one hundred 10The two new things here are... Y=${X// /}, which means "replace all the 'blank' characters from $X by '' (nothing) and put the result into $Y — and Y=${Y//-/}; which takes $Y (i.e., the de-blanked version of $X) and replaces all the hyphens by '', storing the result back into $Y
We then print the length of $Y -- the de-blanked, de-hyphen'd version of $X -- and by inspection I think these all match the hypothesis: 10 goes evenly into 100, 6 goes evenly into 90, 11 goes evenly into 88, etc.
But wait, that's not enough! The puzzler specified that these are the only numbers between 1 and 100 with that property. I'm way too lazy to type 'twenty-one' and 'seventeen' and 'eleven' in, and I thought somebody must have written a routine to do this, so I googled "python numbers to text" (no quotes) and downloaded "Convert Numbers to Words (Python)", which works like a champ. I coded this little thing which uses num2word, like this:
import num2word for i in range(1,101): tweaked = num2word.to_card(i).replace(' ', '').replace('-', '') if i % len(tweaked) == 0: print i, tweaked, 'len =', len(tweaked)What this says is, take all positive integers up to and including 100, and calculate "tweaked" -- which is the de-blanked, de-hyphen'd version of the textual representation (i.e., num2word.to_card(i)( of the number. Then, display a message on the terminal if the length of tweaked is a factor of i. The result was:
4 four len = 4 6 six len = 3 12 twelve len = 6 30 thirty len = 6 33 thirtythree len = 11 36 thirtysix len = 9 40 forty len = 5 45 fortyfive len = 9 50 fifty len = 5 54 fiftyfour len = 9 56 fiftysix len = 8 60 sixty len = 5 70 seventy len = 7 81 eightyone len = 9 88 eightyeight len = 11 90 ninety len = 6 100 onehundred len = 10which was the list we started with.
"You've done it again—you've wasted another perfectly good hour listening to Car Talk."
No comments:
Post a Comment