Bash
ProjectEuler
数学

Project Euler Q22 【名前のスコア】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。

問題

5000個以上の名前が書かれている46Kのテキストファイル names.txt を用いる. まずアルファベット順にソートせよ.

のち, 各名前についてアルファベットに値を割り振り, リスト中の出現順の数と掛け合わせることで, 名前のスコアを計算する.

たとえば, リストがアルファベット順にソートされているとすると, COLINはリストの938番目にある. またCOLINは $3 + 15 + 12 + 9 + 14 = 53$ という値を持つ. よってCOLINは $938 × 53 = 49714$ というスコアを持つ.

ファイル中の全名前のスコアの合計を求めよ.

解答

printf "%s\n" {A..Z} |
awk 'BEGIN{printf "sed "} {printf "-e \047s/"$1"/"NR" /g\047 "} END{print "<(cat names.txt | tr \047,\047 \047\\n\047 | sort)"}' |
bash |
tr -d '"' |
awk '{for(i=1;i<=NF;i++){s[NR]+=$i};t+=NR*s[NR]} END{print t}'
871198282

アルファベットを数値に変換する処理をもっとスッキリ書けないかなあ。
\047はシングルクォーテションです。
awkでシングルクォーテションを使いたいときはこのように書いています。

答え合わせ

こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/022.html