週間チャレンジ111


Challenge , My solutions

タスク・チェン1

タスク
あなたは、各行の左から右にソートされ、各行の最初の整数は、前の行の最後の整数よりも大きいように5 x 5行列が整数でいっぱい与えられている.
効率的な探索アルゴリズムを使用して、行列内の与えられた整数を見つけるスクリプトを書く.

マイソリューション
このタスクのために考慮する2つのものがあります.最初にどのようにマトリックスの入力とターゲットの回答を受け入れることです.グリッドが5×5であることを知っているので、入力は正確に26の数字でなければならないことを知っています.それで、私は単にコマンドラインからすべての数で急ぎます、そしてpop としての最後の値$target 値.
つ目の考慮は、「効率的な探索アルゴリズム」を使う方法です.それが25の数字だけであると仮定して、私は最も効率的な方法が配列(私が上で言及した)ですべての25の数字をこすっていて、次に、リストany メソッド.これは、コンパイルされた呼び出しを使用していない場合は、純粋なPerlのバージョンを使用しているので、できるだけ早くPerlプログラムではありません.そして、現実の世界では、私はおそらくそうするでしょう.
もちろんこれはターゲット番号と25の比較をすることができます.リストが既にソートされていることを知っているので、呼び出しの数を最小にするためにbinary search . 私たちは中間の数から始めます.ターゲットが見つかったら、ビンゴ!ターゲットが低い場合、0と11(6番目の要素)から中間の数を取ります.それが高いならば、私たちは13から24(18)要素から中間の数をとります.ターゲット番号が見つかるまで、このパターンを繰り返します.このメソッドは、マトリックスの5つ以上の値が比較されることを意味します.
このようにするのは、グリッドが変更された場合、コードに変更が必要ない場合です.


» ./ch-1.pl "[  1,  2,  3,  5,  7 ]" "[  9, 11, 15, 19, 20 ]" "[ 23, 24, 25, 29, 31 ]" "[ 32, 33, 39, 40, 42 ]" "[ 45, 47, 48, 49, 50 ]" 25
Answer is 1, in 1 check(s)

» ./ch-1.pl "[  1,  2,  3,  5,  7 ]" "[  9, 11, 15, 19, 20 ]" "[ 23, 24, 25, 29, 31 ]" "[ 32, 33, 39, 40, 42 ]" "[ 45, 47, 48, 49, 50 ]" 35
Answer is 0, in 5 check(s)

» ./ch-1.pl "[  1,  2,  3,  5,  7 ]" "[  9, 11, 15, 19, 20 ]" "[ 23, 24, 25, 29, 31 ]" "[ 32, 33, 39, 40, 42 ]" "[ 45, 47, 48, 49, 50 ]" 39
Answer is 1, in 5 check(s)

- 1 - 2

タスク
単語を指定すると、アルファベット順に大文字小文字を区別できます.例えば、“Beekeeper”は“Beeeeeekpr”になり、“辞書”は“acdiinorty”になります.
文字をソートするときに変更されない最長の英語の単語を見つけるためにスクリプトを書く.

マイソリューション
大部分のLinuxシステムが辞書ファイルを持っているという良い知らせ(そして、私の場合では、それは英語です)、そして、DebianとRhelベースのディストリビューションの両方で/usr/share/dict/words . この仕事をより簡単にするために、私は英語のアルファベット(A - Z)を含んでいる語を使っています.私も小文字比較をしています.
このファイル行を読み、順序のない単語をスキップします.我々は、単語を比較することによって、これを見つけることができますjoin '', sort split '', $word アルファベット順に各文字を注文します.
私はそれから単語の最大の長さを$max_length そして、その長さのすべての語@words 配列.我々が新しいものを見つけるならば$max_length , 配列をリセットしました.
辞書ファイルが異なる場所(または単に別の単語リストを使用したい)にある場合は、オプションでコマンドラインオプションとしてファイル名を指定できます.


RHELベースシステム
$ ./ch-2.pl 
Longest words are: aegilops
Debianベースのシステムで
» ./ch-2.pl
Longest words are: billowy
MYMV .