読者です 読者をやめる 読者になる 読者になる

初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

Project Euler - Problem 22

Problem 22

テキスト処理系の問題. Perlの得意分野ですね!

テキストには5000個以上の名前が書いてあって, リスト中の出現順と名前の各アルファベットのスコア(Aは1, Bは2...)をスコアとした時の全名前のスコアの和を求める, という問題です.
但しリスト中の出現順はソート後の出現順になります.

use strict;
use warnings;

open my $fh, '<', 'names.txt' or die $!;
my @names = sort map { /"(.+)"/ } split(/,/, <$fh>);
close $fh;

my %point;
my $p = 1;

for my $alphabet ('A'..'Z') {
    $point{$alphabet} = $p;
    $p++;
}

my $total;
$total += score($_, $names[$_-1]) for 1..@names;
print "$total\n";

sub score {
    my ($i, $name) = @_;

    my $score;
    for my $word (split //, $name) {
        $score += $point{$word};
    }
    return $i * $score;
}

こんな感じでどうでしょう!

ファイルは, 一旦区切り文字(,)でsplitした後, mapで前後のダブルクォーテーション(")を抜き取って, sortしています.
この辺りは特に, もう少し綺麗に書けそうな気がしますね...