問題
-
By converting each letter in a word to a number corresponding to its alphabetical position and adding these values we form a word value. For example, the word value for SKY is 19 + 11 + 25 = 55 = t10. If the word value is a triangle number then we shall call the word a triangle word.
Using words.txt (right click and 'Save Link/Target As...'), a 16K text file containing nearly two-thousand common English words, how many are triangle words?
-
単語中のアルファベットを数値に変換した後に和をとる. この和を「単語の値」と呼ぶことにする. 例えば SKY は 19 + 11 + 25 = 55 = t10である. 単語の値が三角数であるとき, その単語を三角語と呼ぶ.
16Kのテキストファイルword.txt中に約2000語の英単語が記されている. 三角語はいくつあるか?
解答
42問目!
ちょっと拍子抜けするほど簡単です。三角数を片っ端から計算して連想配列に入れておき、文字列の値を計算して照合するだけです。
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;
use List::Util qw/sum/;
sub word_value($) {
my $offset = ord('A') - 1;
sum map { ord($_) - $offset } split //, uc shift;
}
sub tri_num($) {
my $n = shift;
$n * ($n + 1) / 2;
}
open my $words, '<', 'words.txt' or die $!;
my @words = map { /\"(\w+)\"/ } split /,/, do { local $/ = undef; <$words> };
my $n = 0;
my $curr_max = tri_num $n++;
my %tri_nums = ($curr_max => 1);
say 0 + grep {
my $word_val = word_value $_;
$tri_nums{$curr_max = tri_num $n++} = 1 while $curr_max < $word_val;
$tri_nums{$word_val};
} @words;
コメント
コメントを投稿