• ベストアンサー

perlで虫食い算を解く

moon_piyoの回答

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.1

10個のforですけど どうでしょう... chomp($exp = join("", <DATA>)); $exp =~ s/\n/+/g; @data = (0..9); @used[@data] = (0)x@data; foreach $n (grep $used[$_]==0 && $_, @data) { local($used[$n])=1; foreach $c (grep $used[$_]==0 && $_, @data) { local($used[$c])=1; foreach $m (grep $used[$_]==0 && $_, @data) { next unless ($m == $n + $c || $m == $n + $c + 1); local($used[$m])=1; foreach $a (grep $used[$_]==0 && $_, @data) { local($used[$a])=1; foreach $d (grep $used[$_]==0 && $_, @data) { local($used[$d])=1; foreach $i (grep $used[$_]==0 && $_, @data) { local($used[$i])=1; foreach $o (grep $used[$_]==0 && $_, @data) { local($used[$o])=1; foreach $r (grep $used[$_]==0, @data) { local($used[$r])=1; foreach $s (grep $used[$_]==0 && $_, @data) { local($used[$s])=1; foreach $t (grep $used[$_]==0, @data) { eval "(\$e=\$exp) =~ tr/ACDIMNORST/".join("", $a, $c, $d, $i, $m, $n, $o, $r, $s, $t)."/"; next if (eval $e); print "A:$a C:$c D:$d I:$i M:$m N:$n O:$o R:$r S:$s T:$t\n"; }}}}}}}}}} <STDIN>; __DATA__ INTO ONTO CANON INTACT AMMONIA OMISSION DIACRITIC STATISTICS ASSOCIATION ANTIMACASSAR CONTORTIONIST NONDISCRIMINATION CONTRADISTINCTION - MISADMINISTRATION

Firena
質問者

お礼

moon_piyoさん ご回答ありがとうございました。 上記のコードをそのまま実行したところ見事に正しい答えが表示されました。 コードの中の知らないコマンド、書式を調べました。  →大変勉強になりました。 どうもありがとうございました。 今後もどうぞよろしくお願い致します。

関連するQ&A

  • perlスクリプト内の変数を別のCプログラム中の変数に代入するには?

    次のようなことは可能でしょうか。もし可能でしたらどのようなスクリプトを書けばよいでしょうか。 test.cというCプログラムがあってこの中ではprintf("x=%d",k);と出力するようになっています。 perlスクリプト内で同様に変数kを定義してforループでまわします。そのループ内でtest.cファイルを開きtest.c内の変数kにperlで定義した変数kの値が代入されてコンパイル・実行するようなスクリプトを組みたいのですが。 なぜこのようなことをしているかというと太郎君がk歳のときのj月のときの身長を記録すると言うようなことをやっているためです。身長の計算は別のCプログラムでやっています。perlスクリプトで1歳、2歳、3歳というディレクトリを作って、各ディレクトリに1月身長.dat、2月身長.dat、・・・12月身長.datというデータをおくことを考えています。

  • 入れ子ループで、外側のループ変数$_を、内側のループ内から使えるか??

    入れ子ループで、外側のループ変数$_を、内側のループ内から使えるか?? ループ変数を指定しない場合、自動的に$_が使われますが、例えば、 BIG: for(0..9) { SML: for(0..9) { expr } } のようなステートメントを書いた場合、SMLループ内でBIGのループ変数$_を参照する手だてはあるのでしょうか? イメージ的には、 $BIG::_ とやれば、出来そうだと思ったのですがダメでした^^; ださいコードでスミマセン m(__)m;;

    • ベストアンサー
    • Perl
  • ループ中でのmy宣言と処理速度

    こんにちは、Perl入門者ですがよろしくお願いします。 質問内容はループ中にmy宣言をいちいちすると処理速度は落ちてしまうのかということです。 ソースを例に挙げると まず、$lenをループの外に書く方法と my $i; my $len; for( $i=0 ; $i<1024 ; $i++){ $len = length($str[$i]; } $lenをループの中に書く方法 my $i; for($i=0 ; $i<1024 ; $i++){ my $len; $len = length($str[$i]); } の2種類です(その他の変数については特に言及していません) 使いやすさでいえば、ループ内で宣言をした方が自動的に初期化されるのでうれしいのですが ふと、いちいちメモリの解放と確保を行っているわけですからOS(?)に負荷がかかって遅くなっているのではと考えました。 Perlで処理速度を測ることもできるようですが恥ずかしいながらスキル不足です。すいません。 どなたかご存知の方、自分なりの考えがある方はご教授頂きたく存じます。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • ファイル操作について

    パールを使っています. ファイルをオープンする際に,forループでまわして 「1.txt」,「2.txt」,「3.txt」・・・ というファイルを連続でオープンさせたいのですが, どうすればいいのでしょうか? 数字を変数$aとして, ="./$a.txt" とやってもできませんでした. まったくわからないので,よろしくお願いします.

  • perlの比較、ループの使い方について質問です。

    perlの比較、ループの使い方について質問です。 perlの初心者でperlを使っていろいろと勉強しているのですが、以下のような場合、簡単に書ける方法ってないでしょうか? 比較、ループなど調べてみたのですが、なかなか思うようにいきません。 よろしくお願いします。 なお、以下のスクリプトではエラーが出て動きませんが、その点は今回の説明の為ご了承願います。 my @hoge(1,10,100,1000,10000,100000,1000000); my $no=☆ ←☆については1~5の間でランダムに設定します。 my(@test); for (my $i=0; $i<$no; $i++) { @test[$i]=@hoge[$i]; } 例えば$noが2の場合、@test[0]と@test[1]を比較(@test[0]<@test[1])して偽の場合は、エラーを出し、$noが3の場合、@test[0]と@test[1]と@test[2]を比較(@test[0]<@test[1]<@test[2])して偽の場合は、エラーを出し、$noが4の場合、@test[0]と@test[1]と@test[2]と@test[3]を比較(@test[0]<@test[1]<@test[2]<@test[3])して偽の場合は、エラーを出し……以下同じような感じで進めたいのですが、簡単な書き方ってないでしょうか? if ($no==2){ unlss (@test[0]<@test[1]){エラー} }elsif($no==3){ unless (@test[0]<@test[1]<@test[2]){エラー} }elsif($no==4){ unless (@test[0]<@test[1]<@test[2]<@test[3]){エラー} } 上記のような書き方となるかと思いますが、$noが2の場合、test配列に@test[2]と@test[3]が変数としてない為上記の書き方ではスクリプト自体エラーとなります。 説明が分かりにくい点については申し訳ありませんが、どなたかご教授願えないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • perl+shiftjisで5c文字化けの対処方法について

    DoCoMoの携帯向けサイト(shiftjis)をレンタルサーバのPerl+Mysqlで作成中ですが、特定文字(ソ、表など)で文字化けが発生します。今日も丸一日格闘しています。 ソや表などの5c系の文字化けの存在は分かるのですが、 Perlでの対処方法が良く分かりません。 いろいろ検索してみたら対処法として、 1.ソースのエンコードをshiftjisからEUCに変える 2.対象文字列をシングルクォーテーションで囲む 3.対象文字の後ろに¥記号をつけてエスケープする というのが一般的なようでした。しかし、 1.はDoCoMoの携帯はshiftjis指定なので除外になり、 2.は変数にHTMLデータを格納してその変数をprintしているため、シングルクォーテーションで囲うとHTMLタグが正常に表示されません 3.は膨大なデータの当該文字に直接¥マークをつけることは現実的ではありませんし、データベース内のデータは弄らずに設計した方が良いと思います。 上記の理由から今考えている対処方法は、5c系の40個の文字をループで回して、生成されるHTMLデータの入った変数の対象文字を置き換える方法になるのかとも思いましたが、冗長で処理が重くならないか心配です。 ちなみにphp版の場合は、Magic Quote GPCの値をONにして、 $正常な文字列 = stripslashes("Magic Quote された文字列"); としてやることで実現できました。 文字コードはHTML、perl、Mysqlすべてshiftjisで統一されています。 perlでこのような処理をする場合、1,2,3以外の対処法では、どのようにコーディングするのが良いでしょうか。perlと文字化けに詳しい方がおられましたら、お知恵をお貸しください。 【環境】レンタルサーバ,Apache:2.0.59, MySQL:4.0.26, PHP:5.2.1

    • ベストアンサー
    • Perl
  • use strictを用いた際のmy,our,local の使い分け

    perl-5.6.1でuse strictを使っていますが、 あるループで定義した変数値を、その後にでてくるいくつかのループで 参照したい場合は、my,our,localのどれを用いればよいのでしょうか? 例えば、 for ( my $x=0; $x<$n; $x++) { my $b= $x*2+1; ??? @a[$x]=$b;  ← our? local? } と定義をし、その後幾つかのループで以下のように参照する場合です。 for (my $z=0; $z<$n; $z++) { if ($z == ($n-1)) { print $a[$z], "\n"; } else{ print $a[$z], "\t"; } } よろしくお願いいたします。

  • 全ての変数を一気にリセットする方法はありますか?

    全ての変数を一気にリセットする方法はありますか? Sub test() Dim i As Integer Dim int1 As Integer Dim int2 As Integer int1 = 1 int2 = 2 For i = 1 To 100 'プロシージャー int1 = 0 'リセット int2 = 0 'リセット Next End Sub みたいなコードがあり、 ループが終わる度に変数をリセットしたい場合 int1 = 0 'リセット int2 = 0 'リセット のように一つ一つ変数に値を入れてリセットするしかないですか? 例のコードは二つしか変数が有りますが 実際100個くらいの変数が有る場合も、 一個一個リセットするしかないのでしょうか? 理想としては、VBAを中断したら全ての変数がリセットされますが それと同じようなコードが有れば、楽だなと思います。

  • perl 配列名変数指定するには

    perlプログラムで for文で ループ分の配列定義するには どうしたらよいですか? 下記のようなことができないかと 考えております。 for(my $i = 0; $i < $file_no; $i++){ my @{"segments$i"} =(); #配列定義 my ${"line$i"}="";     #変数定義 my %{"hash$i"}= ();    #ハッシュ定義 open(ARG1,$ARGV[$i]); while(<ARG1>){ ${'line'.$i} = $_; chomp ${'line'.$i}; @{'segments'.$i} = split(/\t/,${'line'.$i});        ${'hash'.$i}{${'segments'.$i}[0]}=${'segments'.$i}[1];     } close(ARG1); } #下記で、その後 各ハッシュに設定したデータをもとに いろいろ計算したい foreach my $a (keys %{'hash'.$i}){ ・・・ } 今は、Can't declare array dereference in "my" at test.pl line XX, near "} =" と 配列定義でエラーとなり処理できません。

    • ベストアンサー
    • Perl
  • どうやってもFor文を抜けてしまいます…(VBA)

    いつもお世話になっております。 VBAで作業をしていたところ、とある箇所でずっと詰まってしまい、 また皆様のお力を借りたいと思い・・・。 おそらく、基礎中の基礎かもしれませんが、お付き合い頂ければ助かります;; 【質問内容】 Functionが2つあったとします。 現在のFunctionから、別のFunctionに飛んで、また元のFunctionに戻ってきた際に、 Forでループ中でも抜けてしまうのでしょうか? おそらく、何を言ってるか分からないと思いますので、以下にコード例を記載します。 _________________________________ 【コード例】 function sample1() Dim roop as Long ’シート1のCell(7,4)には「100」と入力されており、「roopが2~100」の間ループさせます。 for roop + 2 To sheets("シート1").cells(7,4) 処理2 ’特定条件を満たしたら、「sample2」に飛びます。 if 条件 then call sample2 End If next End function _________________________________________________________________________________________ function sample2() ’sample1()で使用していたroop変数をそのまま使用します for roop + 1 To 50 処理2 roop + 1 next ’処理が終わりsample1()のnextに戻ります。 ’roopには、仮に50が格納されているとします。 End function _________________________________________________________________________________________ 上記のコードとなります。 最初はSample1()で処理を行い、特定条件を満たしたらSample2()に移行。 Sample2()の処理が終わったら、元のSample1()に戻る。 2つのFunction内で使用していた「roop」変数は、まだ80にも関わらず、 Sample1()のFor文を抜けてしまいます。 Sample1()のForのループ条件は「2~100」としていますが、 これは別のFunctionに飛ぶと、無くなってしまうのでしょうか? 何を言っているのか分からないなどございましたら、ご指摘ください・・・;; 以上、よろしくお願いします。