404 motivation not found | t_ishidaのブログ

1月/08

22

レイトン教授

能書き

レイトン教授の不思議な街の公式サイトを見てたら、以下のようなクイズが有った。

http://www.layton.jp/

以下、引用 + 要約。

3,4,7,8の数字がある

(□ - □ / □) * □ = 10

が成り立つように、数字を当てはめろ。

と言う問題を見て、解こうと思ったんだけど、面倒くさくなったので、プログラムに解かせる事にした。で、どうせならば汎用的にって感じで、式と、数字のリストと解を可変に出来るように、かつなるべく短く書いてみたが、解けないパターンを渡すと永久ループになってしまうのと、何も考えずに書いたのでやたらに効率が悪いのと、あんまり短くないので再考の余地有りも、黙って仕事しろと言う感じなので、とりあえず、ここに記録だけしとく。けど、これ使って何が有っても知りません。

使い方

  • 適当なファイルに保存する
  • 引数を以下の順番に渡す
    • 回答(上の例なら、”10″)
    • 式(上の例なら、”(? – ? / ?) * ?”と言う感じ)
    • 数字リストをカンマ区切りで(上の例なら”3,4,7,8″)
      • とりあえず、引数はそれぞれ、ダブルクォートで囲ってください

ソース

use strict;
my ( $ANSWER, $SHIKI, $i ) = ( $ARGV[0], $ARGV[1], 0 );
$SHIKI =~s/\?/\$data->[$i]/ and $i++ while $SHIKI =~/\?/;
while( 1 ){
my ( $ret, $data ) = ( undef, undef );
eval "\$data = SelectNum( [$ARGV[2]] )";
eval "\$ret = $SHIKI;";
print "前から順に、" . join(',', @{$data}) and last if $ret == $ANSWER;
}
sub SelectNum{
my ( $src ) = @_;
my $ret = [];
for( 0..$#{$src} ){
while( 1 ){
my $idx = int( rand( @{$src} ) );
( $ret->[$_], $src->[$idx] ) = ( $src->[$idx], undef ) and last if $src->[$idx];
}
}
$ret;
}
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< 最近のネットってどうよ?

正規表現 >>

Find it!

Theme Design by devolux.org

Tag Cloud