HOME > ETC. > STARTING OVER日記。 > 閑話休題。

STARTING OVER日記。

 
« 3月は放置。 | インデックス | くじびき。 »

 

2008年04月11日(金)

閑話休題。

「人力検索はてな」で「世界のナベアツ」的なプログラムを作る話が出ており、ちょっとお試し。

色々な方法が回答として上がってましたが、ウェブ上にアップして使えるものとして考えてみました。

#!/usr/local/bin/perl

$prog = $ENV{ 'SCRIPT_NAME' };

if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); }
else { $buffer = $ENV{'QUERY_STRING'}; }

print "Content-type: text/html\n\n";
print "<html><head><title>世界のナベアツ</title></head>\n";
print "<body>\n";
if ($buffer eq "") {
 print "<form method=\"post\" action=\"$prog\">\n";
 print<<"EOF";
 <p>幾つまでにしましょうか?<br>
 <input type="text" name="kazu"></p>
 <input type="submit" value="送信"><input type="reset" value="リセット">
</form>
EOF
}

else {
 @pairs = split(/&/,$buffer);
 foreach $pair (@pairs) {
  ( $name,$value ) = split(/=/, $pair);
  $kazu = $value;
 }
 
 if ($kazu =~ /\D/) { print "<p>半角数字以外は入力出来ません。</p>\n"; }

 else {
  print "<p>1から$kazuまでを数える間に、3のつく数字と3の倍数でアホになり、5の倍数で犬っぽくなります。</p>\n";
  print "<ul>\n";
  foreach $num(1 .. $kazu) {
   print "<li>$num";
# 3の倍数・3が付く数字かどうかの判別
   if ((!($num % 3)) || ((index $num,3) >= 0)) { print " アホ"; }
   else { print ""; }
# 5の倍数かどうかの判別
   if (!($num % 5)) { print " 犬"; }
   else { print ""; }
   print "</li>\n";
  }
  print "</ul>\n";
 }
 print <<"EOF";
<p>[<a href="$prog">戻る</a>]</p>
EOF
}
print <<"EOF";
</body>
</html>
EOF
exit;

最初に幾つまでの数にするのか聞いてくるようにしているのですが、ここに半角数字以外を入れるとエラーが表示されます。
3が付く数字かどうかは$kazuの中に「3」という文字が現れるかどうか(index文)で調べています。
※index文
 文字列の中で、指定された文字が最初に出てくる場所を返す命令。
 含まれていなかったら「-1」を返すので「0」以上なら含むということで。

やりようによっては、アホや犬になる数を最初に選べるというようなことも可能ですが、まぁ、お遊びとしてはこんな感じで。

3という数字が現れるかどうかは、indexを使わない方法もあると思います。
ひたすら割り算、多分。
ケタを分解して、3で割って答えが余り無しの1になるかとか。
(あまり考えていない。)