/* lookandsay.cpp : find the first loop in the "Look and Say" sequence * * http://newsgroups.derkeiler.com/Archive/Rec/rec.puzzles/2007-08/msg00432.html * * Copyright (c) 2007 Daniel Hartmeier * All rights reserved. * */ #include #include #include using namespace std; int main(void) { string s = "LOOK AND SAY"; map m; map n; map t; n[1] = "ONE"; n[2] = "TWO"; n[3] = "THREE"; n[4] = "FOUR"; n[5] = "FIVE"; n[6] = "SIX"; n[7] = "SEVEN"; n[8] = "EIGHT"; n[9] = "NINE"; n[10] = "TEN"; n[11] = "ELEVEN"; n[12] = "TWELVE"; n[13] = "THIRTEEN"; n[14] = "FOURTEEN"; n[15] = "FIFTEEN"; n[16] = "SIXTEEN"; n[17] = "SEVENTEEN"; n[18] = "EIGHTEEN"; n[19] = "NINETEEN"; n[20] = "TWENTY"; n[30] = "THIRTY"; n[40] = "FOURTY"; n[50] = "FIFTY"; n[60] = "SIXTY"; n[70] = "SEVENTY"; n[80] = "EIGHTY"; n[90] = "NINETY"; for (int i = 21; i <= 99; ++i) if (i % 10) n[i] = n[(i / 10) * 10] + n[i % 10]; for (unsigned pass = 1; true; ++pass) { m.clear(); for (int i = 0; s[i]; ++i) if (s[i] != ' ') m[s[i]]++; s = ""; for (map::iterator i = m.begin(); i != m.end(); ++i) { if (n.find(i->second) == n.end()) { cerr << "missing name for " << i->second << endl; return 1; } s += n[i->second] + ' ' + i->first + ' '; } cout << pass << ". " << s << endl; if (t.find(s) != t.end()) { cout << "same as " << t[s] << endl; break; } t[s] = pass; } return 0; }