そんな今日この頃でして、、、

コード書いたり映画みたり。努力は苦手だから「楽しいこと」を探していきたい。

JOJO問題をPerlで解いてみた

Togetterで話題になっているJOJO問題素数のときだけ"JOJO!"って出力するプログラム - TogetterPerlで解いてみた。

そもそもJOJO問題って?

素数のときだけ"JOJO!"って出力するプログラム - Togetter
FizzBuzzより、「素数のときだけ"JOJO!"って出力する
プログラム」のほうがネタ的にもいいと思う。
[うさみみ*´×`*エンジニア]


とりあえずベタに、入力値について入力値から1引きつつ割り切れるか判定して、
そのフラグでもって出力を分けてみた。
jojo.pl

#/bin/perl
use strict;
use warnings;
my $input = $ARGV[0];
for (my $i = $input; $i > 0 ; $i--){
my $is_jojo = 1;
for (my $j = $i - 1; $j > 1; $j--){
next unless $i % $j == 0;
$is_jojo = 0;
}
print $is_jojo ? "JOJO!\n" : "$i\n";
}

↓出力

12
JOJO!
10
9
8
JOJO!
6
JOJO!
4
JOJO!
JOJO!
JOJO!

OKそう。簡単ですね。
※入力値と同じ値で割り始めちゃったりとか、1で割っちゃったりとかして少し悩んだのはここだけの秘密。


もうちょっと効率を考えて、割る数は小さい方から判定してフラグが立ったら中のループを抜けるようにしてみた。

#/bin/perl
use strict;
use warnings;
my $input = $ARGV[0];
for (my $i = $input; $i > 0 ; $i --){
my $is_jojo = 1;
for (my $j = 2; $j < $i; $j ++){
next unless $i % $j == 0;
$is_jojo = 0;
last;
}
print $is_jojo ? "JOJO!\n" : "$i\n";
}

これもOKっぽい。

12
JOJO!
10
9
8
JOJO!
6
JOJO!
4
JOJO!
JOJO!
JOJO!


あえて正規表現とか使って難しく解くとかサブルーチン化してベンチマークしたりとかもありだと思ったけど、かったるかったので今日はここまでで。


※あとでWikiったら1は厳密には素数じゃないらしい・・・

ジョジョの奇妙な冒険 全63巻完結セット (ジャンプ・コミックス)

ジョジョの奇妙な冒険 全63巻完結セット (ジャンプ・コミックス)

恥知らずのパープルヘイズ ?ジョジョの奇妙な冒険より?

恥知らずのパープルヘイズ ?ジョジョの奇妙な冒険より?