/* * http://ledyba.ddo.jp/2006/03/28034103.php */ #include #define EUC /*#define UNIX_STYLE */ char *items[] = { "下心", "微妙さ", "優雅さ", "華麗さ", "かわいさ", "やさしさ", "やましさ", "やらしさ", "むなしさ", "ツンデレ", "厳しさ", "世の無常さ", "ハッタリ", "ビタミン", "努力", "気合", "根性", "砂糖", "食塩", "愛", "電波", "毒電波", "元気玉", "怨念", "大阪のおいしい水", "明太子", "勇気", "運", "電力", "小麦粉", "汗と涙(化合物)", "覚悟", "大人の都合", "見栄", "欲望", "嘘", "真空", "呪詛", "信念", "夢", "記憶", "鉄の意志", "カルシウム", "魔法", "希望", "不思議", "勢い", "度胸", "乙女心", "罠", "花崗岩", "宇宙の意思", "犠牲", "毒物", "鉛", "海水", "蛇の抜け殻", "波動", "純金", "情報", "知識", "知恵", "魂の炎", "媚び", "保存料", "着色料", "税金", "歌", "苦労", "柳の樹皮", "睡眠薬", "スライム", "アルコール", "時間", "果物", "玉露", "利益", "赤い何か", "白い何か", "鍛錬", "月の光", "回路", "野望", "陰謀", "雪の結晶", "株", "黒インク", "白インク", "カテキン", "祝福", "気の迷い", "マイナスイオン", "濃硫酸", "ミスリル", "お菓子", "言葉", "心の壁", "成功の鍵", "理論", "血" }; #ifdef EUC #define SS2 0x8e #define IS_HANKATA(c) ((unsigned char)(c) >= 0xa1 && (unsigned char)(c) <= 0xdf) #define IS_EUC(c) ((unsigned char)(c) >= 0xa1 && (unsigned char)(c) <= 0xfe) int euc2sjis(int c) { int c1 = (c >> 8) & 0x7f; int c2 = c & 0x7f; int rowOffset = c1 < 95 ? 112 : 176; int cellOffset = c1 % 2 ? (c2 > 95 ? 32 : 31) : 126; return ((((c1 + 1) >> 1) + rowOffset) << 8) | (c2 + cellOffset); } #endif long code(const char *s) { long x = 0; int i; #ifdef EUC /*XXX i > 127 とか i > 255 の場合は大丈夫? */ #define X(c, i) (((c) & 0xff) << (((i) & 3) << 3)) for (i = 0; *s != '\0'; ) { if (IS_EUC(s[0]) && IS_EUC(s[1])) { int c = euc2sjis(((s[0] & 0xff) << 8) | (s[1] & 0xff)); x += X(c >> 8, i); x += X(c, i + 1); i += 2; s += 2; } else if ((unsigned char) s[0] == SS2 && IS_HANKATA(s[1])) { x += X(s[1], i); i++; s += 2; } else { x += X(*s, i); i++; s++; } } #else for (i = 0; *s != '\0'; i++, s++) x += *s << ((i & 3) << 3); #endif return x & 0xffffffffL; } long seed; int rnd(void) { seed = seed * 214013 + 2531011; return (seed >> 0x10) & 0x7fff; } void ex(const char *s) { int r = 100; int item[100], ratio[100]; int n, i; seed = code(s); for (n = 0; r > 0; n++) { do { item[n] = rnd() % 100; for (i = 0; i < n; i++) if (item[i] == item[n]) break; } while (i < n); ratio[n] = rnd() % r + 1; r -= ratio[n]; } for (i = n - 1; i > 0; i--) { int min = 0; int j; int tmp; for (j = 1; j <= i; j++) if (ratio[j] < ratio[min]) min = j; tmp = item[i], item[i] = item[min], item[min] = tmp; tmp = ratio[i], ratio[i] = ratio[min], ratio[min] = tmp; } for (i = 0; i < n; i++) #ifdef UNIX_STYLE printf("%s %d\n", items[item[i]], ratio[i]); #else if (ratio[i] == 100) printf("%sはすべて%sで出来ています。\n", s, items[item[i]]); else if (ratio[i] == 50) if (i == 0) printf("%sの半分は%sで出来ています。\n", s, items[item[i]]); else printf("%sのもう半分は%sで出来ています。\n", s, items[item[i]]); else printf("%sの%d%%は%sで出来ています。\n", s, ratio[i], items[item[i]]); #endif } int main(int argc, char **argv) { for (++argv; *argv != NULL; argv++) ex(*argv); return 0; }