これは「文字列アルゴリズム Advent Calendar 2016」25日目の記事です。
はじめに
12月21日は回文の日です。
12月21日は「回文の日」。「回文」とは、上から読んでも下から読んでも同じ読みになる文章で、「1221」が回文のようになっていることから、回文俳句などを展開している宮崎二健氏が制定した。
回文の日 | SmartNews 今日は何の日
1221が回文ということは疑いようもない事実ですが、1月1日や1月11日など、他に回文になる日があるにも関わらず、なぜその中から12月21日が選ばれたのかその理由がはっきりとしません。
真相は宮崎二健氏に聞くよりありませんが、本記事では客観的な事実を元に最も納得の行く理由を探ってみたいと思います。
回文日の列挙
12月21日のように月の数字と、日の数字を連結した文字列が回文となる日を回文日と呼ぶことにします。
まずは、365日のうち、どれだけ回文日があるか列挙してみましょう。
# python3
# palindrome_day.py
import collections
days = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
def gen_days():
for month in range(1, 13):
for day in range(1, days[month]+1):
yield str(month) + str(day)
def isPalindrome(x):
for i in range(len(x)//2):
if x[i] != x[len(x)-i-1]:
return False
return True
if __name__=='__main__':
palindromes = [md for md in gen_days() if isPalindrome(md)]
print(palindromes)
num_days = sum(days)
num_palindrome_days = len(palindromes)
print(num_days, num_palindrome_days, num_palindrome_days / num_days)
count = collections.Counter(map(len, palindromes))
print(count)
$ python palindrome_day.py
['11', '111', '121', '131', '22', '212', '222', '33', '313', '323', '44', '414', '424', '55', '515', '525', '66', '6
16', '626', '77', '717', '727', '88', '818', '828', '99', '919', '929', '101', '111', '1111', '121', '1221']
365 33 0.09041095890410959
Counter({3: 22, 2: 9, 4: 2})
上記のプログラムを実行すると365日の内、回文日は33日あり、全体の9%を占めることがわかりました。
(111のように2回現れる文字列は1月11日と、11月1日のように異なる日をそれぞれ示しています)
約10日に一度の割合で出現するので、回文日はそれほど珍しい日ではないといえるでしょう。
また、回文の長さは2文字が9、3文字が22、4文字が2という結果が得られました。
考察
ある性質を持つ要素の中からその代表となる代表値を選ぶ場合には、以下のような基準を満たす要素が代表値としてより適しています。
- 他の性質と重複しない
- 希少性が高い
例えば、11, 22, ...などは回文ですが、ゾロ目でもあり代表値としては適しません。
また、121や212などの3文字の回文は回文日のなかでも2/3を占めることから、希少性が低く代表値としては適しません。
このような観点から考えると、12月21はたった2つしかない希少性の高い4文字回文であり、またその中でもゾロ目でない唯一の回文であることから、回文日の代表値として適した値と結論付けることが出来ます。
おわりに
本記事では12月21日が回文の日に選ばれた理由を以下のように結論づけました。
- ゾロ目など他の性質を含まない
- 文字列の長さが4文字で回文日の中で希少
回文についてより詳しく知りたい方は文字列アルゴリズム Advent Calendar 2016」21日目、@Shiho_tksam さんの記事「回文を列挙する - Qiita」を参照してみて下さい。
そもそも本記事を書いたのは、上記記事を読んで、回文の日の存在を知った事がきっかけとなっています。