Language detail: Scala - 's unsolved challenges
以下の積み木のうち4つを、
重複を含めてランダムに選びます。
このとき、それらを4×4の箱に
詰められるかどうかを判定してください。
1.
■■■■
2.
■■
■■
3.
■■■
■
4.
■■■
■
5.
■■
■■
例えば、{ 1, 1, 1, 1 }, { 2, 2, 2, 2 } は箱につめることができますが、
{ 1, 2, 2, 3 } は箱につめることができません。
余力のある方は、以下の値を求めてみてください。
・箱につめることができる積み木の組み合わせの総数
・上記総数を、異なる詰め方の個数別にカウント
(箱の回転・裏返しで一致するものは同一視します)
イントロスペクションおよびメトリックスのお題です。
アジャイル界隈などでは、あまり長くだらだらと書いてはいけない…と言われている 関数 and/or メソッド ですが、ならば実際のところ、洗練された既存のライブラリにおいて、関数 and/or メソッド は平均すると何行くらいで記述されているのか…といった情報を具体的に把握しておきたいと思ったことはありませんか?
そこで、みなさんイチオシの言語それ自身で書かれているライブラリを、それなりの規模になるように集めてきて、1)集めたライブラリ群内に定義されている全 関数 and/or メソッド の合計数(母集団の確認のため)、と 2)関数 or メソッドのソースの平均の行数、を求めるコードと、その結果を示してください。
なお、関数 and/or メソッドに帰属するものであれば、コメント行やアノテーションのたぐいも行数のカウントに含めてください(コードが必要以上に複雑にならない範囲で結構です)。また、関数内関数定義やメソッド内クラス定義(ひいてはその中でのメソッド定義)といった入れ子になったコードの行数をどう解釈するかの判断はお任せします。関数とメソッドが共存する言語では両者を区別してカウントする必要はありません(しても構いません)。平均値を求めるコードを、対象言語で記述することが技術的に困難な場合は、UNIX的なツールを組み合わせたり、IDEなどが提供するメトリックス機能を活用して算出した結果を示すのでもよいと思います。
このお題は、平均行数が 8.4 行(Squeak Smalltalk の組み込みライブラリ+αより、調査メソッド総数 4万)と、一般に簡潔さが美徳とされている Smalltalk からの挑戦(?)でもあります。
コレクションフレームワークに則ってコレクションクラスを実装して下さい.
具体的にどのようなコレクションを実装しても構いませんが,コレクションフレームワークで用意された基本的なメソッドは一通り呼べるようにして下さい. foreach系の構文があれば,それでも使えるとよいです.
例えば,Rubyであれば以下のようなコードで(mapを直接定義することなく)要素を列挙できる必要があるでしょう.
1 2 3 4 5 6 | p MyCollection.new.map {|i| i }
# for でも使える
for i in MyCollection.new
p i
end
|
整数の係数を持つ化学反応式を完成してください。反応前の物質と反応後の物質は与えられる物とします。例えば、
(前) Mg, O 2 (後) Mg O
(答) 2Mg + O 2 -> 2MgO
(前) C 2, H 2, O 2 (後) CO 2 , H 2 O
(答) 2C 2 H 2 + 5O 2 -> 4CO 2 + 2H 2 O
こんな感じです。以前anarchy golf に出題させて貰ったんですが、埋め込み解で解かれてしまったので、今回は埋め込み解はなし、と云うことでおねがいします。
プロセスが作成できない言語では、スレッドやオブジェクトなど適当に読み替えてください。
以下のどちらでもかまいません。下のほうが難しいと思います。
<レベル1> 自分から終了して再起動する。
<レベル2> タスクマネージャーや kill などでいきなり殺されたのち、再起動する。
UTF-16の文字コードを16進(1オクテットごとにスペース区切り)の形で入力します。入力した文字コードを、2進数の形(1オクテットごとにスペース区切り)で出力してください。
入力する文字コードはUCS-2の範囲(サロゲートペアを使わなくてもよい範囲)のみに限定しても構いませんが、可能ならばサロゲートペアにも対応したものに挑戦してください。
-
例1: abc(U+0041 U+0042 U+0043)
- 入力 00 41 00 42 00 43
- 出力 01000001 01000010 01000011
-
例2: あいう(U+3042 U+3044 U+3046)
- 入力 30 42 30 44 30 46
- 出力 11100011 10000001 10000010 11100011 10000001 10000100 11100011 10000001 10000110
正攻法からトリッキーな手段まで、いろいろお待ちしております。
see: 通信用語の基礎知識 UTF-8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned short utf16char; /* sizeof(short) >= 2 octets */
#define UTF8_MAXOCTETS 3 /* UCS-2ではutf-8にしたとき3 octets以内に収まる */
typedef struct{
int len;
char data[UTF8_MAXOCTETS];
} Utf8char;
void encode(Utf8char *utf8, utf16char utf16){
int i, len;
if(!(utf16 & (~0x7f))) len = 1;
else if(!(utf16 & (~0x7ff))) len = 2;
else len = 3;
switch(len){
case 1:
utf8->data[0] = utf16 & 0x7f;
break;
case 2:
utf8->data[0] = (utf16>>6 & 0x1f) | 0xc0;
utf8->data[1] = (utf16 & 0x3f) | 0x80;
break;
case 3:
utf8->data[0] = (utf16>>12 & 0xf) | 0xe0;
utf8->data[1] = (utf16>>6 & 0x3f) | 0x80;
utf8->data[2] = (utf16 & 0x3f) | 0x80;
break;
}
utf8->len = len;
}
void print_bin(char c){
printf("%d%d%d%d%d%d%d%d ", c>>7&1, c>>6&1, c>>5&1, c>>4&1, c>>3&1, c>>2&1, c>>1&1, c&1);
}
int main(int argc, char **argv){
int bytes = argc-1, len = bytes / 2;
int i, j;
utf16char *utf16;
char *utf8;
int u8len = 0;
Utf8char u8char;
if(!bytes) return 0;
if(bytes % 2){
printf("Invalid input.\n");
return 1;
}
utf16 = malloc(sizeof(utf16char)*len);
utf8 = malloc(len*UTF8_MAXOCTETS);
for(i=0,j=1;i<len;i++,j+=2) utf16[i] = strtol(argv[j], NULL, 16)<<8 | strtol(argv[j+1], NULL, 16);
for(i=0;i<len;i++){
encode(&u8char, utf16[i]);
memcpy(utf8 + u8len, u8char.data, u8char.len);
u8len += u8char.len;
}
for(i=0;i<u8len;i++) print_bin(utf8[i]);
putchar('\n');
free(utf16);
free(utf8);
}
|
Twitter(http://twitter.com/)につぶやきを投稿してください。 APIに関しては http://watcher.moe-nifty.com/memo/2007/04/twitter_api.html に日本語訳があるようです。 「update」に投稿の仕様が説明されています。
N個のノードを作り、1番目のノードに送られたメッセージは2番目のノードに、2番目のノードに送られたメッセージは3番目のノードに、・・・、N番目のノードに送られたメッセージは1番目のノードに送られるようにリングを形成し、そのリング上を一つのメッセージがM回まわるのにかかる時間を計測してください。
初期設定を読み書きするプログラムを書いてください。
保存先や形式は問いませんが,OS,ライブラリ,言語等の環境で標準的なものがあれば,なるべくそちらを用いてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | package org.doukaku.ja.preference;
import java.util.prefs.Preferences;
import java.util.prefs.BackingStoreException;
public class HelloPreference {
private static final String MESSAGE_KEY = "message";
private static final String DEFAULT_MESSAGE = "Hello, Preference.";
private String message;
private Preferences pref;
public HelloPreference() {
loadPreference();
}
public void loadPreference() {
setPreference(Preferences.userNodeForPackage(this.getClass()));
setMessage(pref.get(MESSAGE_KEY, DEFAULT_MESSAGE));
}
public void setMessage(String message) { this.message = message; }
public String getMessage() { return this.message; }
public void setPreference(Preferences pref) { this.pref = pref; }
public Preferences getPreference() { return this.pref; }
public void showMessage() {
System.out.println(getMessage());
}
public void storePreference() throws BackingStoreException {
Preferences pref = getPreference();
pref.put(MESSAGE_KEY, getMessage());
pref.flush();
}
public static void main(String[] args) {
try {
HelloPreference hello = new HelloPreference();
if (args.length > 0) {
hello.setMessage(args[0]);
}
hello.showMessage();
hello.storePreference();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
|
通常、作成者以外は、読み書きができないファイルを新規作成してください。 # UNIX的にいうと「0600」のファイルです。 すでに存在していた場合、新しい内容で上書きしてください。 symlinkアタック等を考慮する必要はありません。 余裕のある人はファイルがすでに存在していた場合、 パーミッションを変更してみてください。
手牌を表すのは、mn+h 枚を表す配列です。フォーマットは A, B の2つから任意に選んだものを受け取ってください。以下の2つは同じものです:
handA = [2,1,1,1,1,2,2,1,3] # 牌1が2個、牌2が1個、牌3が1個、牌4が1個、牌5が1個、牌6が2個、牌7が2個、牌8が1個、牌9が3個
handB = [1,1,2,3,4,5,6,6,7,7,8,9,9,9] # 牌1、牌1、牌2、牌3、牌4、牌5、牌6、牌7、牌7、牌8、牌9、牌9、牌9
ある配列が和了形であるとは、手牌が「刻子」「順子」を合計 n 個と「対子」1 個との和であることをいうものとします。
「刻子」とは1種の牌が m 個あることをいいます。
「順子」とは連続したインデクスを持つ牌が m 種各1個あることをいいます。
「対子」とは1種の牌が h 個あることをいいます。
上の例は、和了形です。なぜなら、当該配列が
Bタイプで表記すると、刻子 [9,9,9], 順子 [2,3,4], [5,6,7], [6,7,8], 対子 [1,1] の、
Aタイプで表記すると、刻子 [0,0,0,0,0,0,0,0,3], 順子 [0,1,1,1,0,0,0,0,0], [0,0,0,0,1,1,1,0,0], [0,0,0,0,0,1,1,1,0], 対子 [2,0,0,0,0,0,0,0,0] の、
和だからです。
・ n は任意のものを受け取れるようにしてください。
・ 牌のインデクスの数 (Aタイプの長さ、Bタイプの要素の最大値) M も任意としてください。
・ 1種の牌の最大個数 (Aタイプの要素の最大値、Bタイプの1種の要素の最大重複度) L も任意としてください。
・ 一般の麻雀の場合は、m=3, n=4, h=2, M=9, L=4 です。この条件に特化した高速化が可能なら行ってもかまいません。
擬似コードで、ごく短い例を示します。
1 2 3 4 5 6 7 8 | for 考えられる対子:
対子を手牌から抜く
for 考えられる刻子のパターン:
刻子を手牌から抜く
手牌が順子の和となっていれば、和了形として抜ける
刻子を手牌へ戻す
対子を手牌へ戻す
ここに到達していれば、和了形ではない
|
コピー元フォルダ、コピー先フォルダ、ファイル名(複数)を指定し、
コピー元フォルダ(配下含む)から、指定したファイル名のファイルを探し出し、
コピー先フォルダにツリーごとコピーする処理を実装して下さい。
[実装に際して]
・複数ファイル名を指定できればどのような形式でも構いません。
(例: コマンド引数, 外部ファイル)
・指定したファイル名が複数見つかった場合、すべてコピー対象として下さい。
・コピー先に既にファイルやフォルダが存在する場合、削除して下さい。
(コピー先が指定したファイルのみとなるようにする)
・コピー先フォルダが存在しない場合、新規作成して下さい。
[余裕のある方は]
・除外するファイル名、フォルダ名を指定できるようにして下さい。
・GUIでファイル名の指定やコマンド実行を行えるようにして下さい。
===============================
例) コマンド引数で指定する
(コマンド {コピー元} {コピー先} {コピーファイル名リスト})
>WholeCopy C:\temp C:\temp2 aaa.txt,ddd.txt,ggg.txt,kkk.txt
[フォルダツリーの状態]
C:\temp
| aaa.txt
| bbb.txt
| ccc.txt
|
\---dir1
| ddd.txt
|
+---dir2
| | eee.txt
| |
| \---dir3
| fff.txt
| ggg.txt
|
\---dir4
hhh.txt
iii.txt
jjj.txt
kkk.txt
C:\temp2
| aaa.txt
|
\---dir1
| ddd.txt
|
+---dir2
| \---dir3
| ggg.txt
|
\---dir4
kkk.txt
===============================
余裕があれば、土日祝日を休日として、終了日を後ろにずらした表示にすると良いですね。
開始日 日数
1.2009/1/10 21日間 (#) ←わかり易いように記号を付けています
2.2009/1/15 6日間 (@)
3.2009/1/10 8日間 (*)
4.2009/1/16 1日間 (=)
5.2009/1/16 3日間 (%)
6.2009/1/30 4日間 (=)
結果例:
%
%
%
=
*
*
*
*
*
*
@
@ %
@ @
@ @
# # =
# # =
# # #
* # # #
* # # #
# # # #
# # # #
1/1 1/5 1/12 1/19 1/26
ルール:
・下から上に向かって積み上げて下さい
・結果の表示は、記号でなくても、テキストでなくても構いませんが個々の予定が判別出来るようにして下さい
・表示範囲は1ヶ月(1/1~1/31)とします
表示範囲からはみ出した分は無視します
・1週間は月曜から日曜までとします
・予定は1日単位とします
このお題は、以前仕事で作った機能のほんの一部を抜き出して単純化してみました。
プロジェクト管理等でよくあるグラフですね。
エレベータを制御して、5階建てのビルの各階にいる人たちを、
「効率よく」1階のエントランスまで運んでください。
作成時の条件は次の通りです。
1. 各階において、人が残っていることはわかるが、
あと何人残っているかまではわからないものとする。
# 人が残っているところは常に呼び出しのボタンが押された状態を
# 仮定して問題ありません。
2. 稼働しているエレベータは1機のみとする
3. 降車するたびに、変化がわかるような出力をしてください。
4. すべての人を運搬終わったら、最後に次の情報を出力してください。
- 運搬を始めてからの経過時間(ラウンド数)
- 一番長く放置されていた階の待ち時間(ラウンド数)
- エレベータの移動距離合計数
エレベータの機能は次の通りです。
- 搭載人数は最大3人までとする。
- 移動には、1つの階につき「2」ラウンドかかる。
- 人の乗降には、1回につき「5」ラウンドかかる。
※ 「ラウンド」は包括された時間だと思ってください。
単純に「秒」と読み替えてもよいです
各階の人数は次の通りです。
5階 7人
4階 11人
3階 3人
2階 7人
1階 0人
冒頭では、「効率よく」なんて曖昧な表現をしようしましたが、
何について効率よくしたのか、設計についての見解を
コメントしていただけるとうれしいです。
たとえば、
下記のサンプル出力では、各階の待ち時間を最小とすることで
効率よいとしました。(利用者の視点)
ぱっと思いつくところでは、ほかにも2-3種類あるとおもいます。
さて、あなたならどう書く?(笑
// 自分で作ったやつは250L位になってしまいましたorz
INIT --------------------
[5]th Floor: [ 7] / last_round:[ 0]
[4]th Floor: [11] / last_round:[ 0]
[3]th Floor: [ 3] / last_round:[ 0]
[2]th Floor: [ 7] / last_round:[ 0]
[1]th Floor: [ 0] / last_round:[ 0]
IN(5) [7] → [4] OUT
IN(4) [11] → [8] OUT
IN(3) [3] → [0] OUT
IN(2) [7] → [4] OUT
IN(5) [4] → [1] OUT
IN(4) [8] → [5] OUT
IN(2) [4] → [1] OUT
IN(5) [1] → [0] IN(4) [5] → [3] OUT
IN(2) [1] → [0] OUT
IN(4) [3] → [0] OUT
END --------------------
[5]th Floor: [ 0] / last_round:[ 174]
[4]th Floor: [ 0] / last_round:[ 229]
[3]th Floor: [ 0] / last_round:[ 58]
[2]th Floor: [ 0] / last_round:[ 213]
[1]th Floor: [ 0] / last_round:[ 0]
経過時間:[257]
最大待ち時間:[100]
移動距離合計数:[52]
麻雀ゲームの部分的な作成がお題になります. 以下のメソッド/関数を組み込んで下さい.
- n人のプレーヤでゲームをする機能; n = 2--4.
- 牌をかき混ぜてから山を作成する機能.
- 手牌を理牌する機能.
- 山から牌を取る操作.
- 手配を切る操作 (ツモ切りで構いません).
- 河を保存する機能.
- 3--5を繰り返す機能.
ルールとしては,
- 配牌は親は14枚, 子は13枚.
- 親から順に手牌を切る.
- 自分の手番で始めにツモり, その後手牌を切る.
- 手牌の数は最大14枚.
- 山の牌が残り14枚になったら終了.
- 牌全体としては, (3人プレーヤでも) 日本で通常用いられている34種類136枚を使用.
と考えていただければ結構です.
鳴き, あがり, 自風, 場風などは考慮していただかなくて結構です.
4×4のマスを2×2の4ブロックに区切り、いくつかのマスに1~4の数字を配置します。 以下、空白のマスすべてに数字を補い、縦、横、および各ブロックについて1~4の数字が それぞれ一個ずつ含まれている状態にすることが可能で、かつその方法が一意であるもの、 つまり数独の問題として成立するもののみを考えます。 4 1 | 2 4 1 | 2 3 2 | 4 1 2 3 | 4 1 ----+----- ---> ----+---- 2 | 3 4 1 2 | 3 4 3 4 | 1 3 4 | 1 2 このようなものの総数を「初期配置の数字の個数ごとに」カウントしてください。 余力のある人は、極小な配置に限定してカウントしてみてください。 ただし、極小な配置とは、どの数字を取り除いても数独の問題として 不成立になる配置を指すものとします。 まどろっこしい言い回しになってしまいましたが、 一言で言えば「数独の問題数を数え上げよ」という問題になります。 参考:http://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC
Duff's deviceをinline bytecode assemblyを使って実装してください。C言語ではよくあるinline asmのほかの言語バージョンといったところです。copyのsrcとdstは呼び出し側から渡すようにしてください。(要はbytecode側で閉じていてはならない)
Duff's deviceとは、 http://ja.wikipedia.org/wiki/Duff%27s_device に説明がありますが、ループ展開したコピーのコードです。もちろんbytecodeである時点で速度の話をするのはナンセンスです。
bytecodeで速くするとかいう話よりも、ある言語で書かれたcodeの中にその言語で使用されているbytecodeが埋め込めるかどうか、どのようにできるのかが、このお題の意図です。面白い使い道があるならsiteしていただけると幸いです。
また、1言語につき1種のbytecodeとは限りません。たとえば、PythonならCPythonのbytecode, JythonのJavaVMのbytecode, IronPythonのCIL/CLRなどがあります。 もちろん特定アーキテクチャのasmを呼んでもよいです。x86を書くことができるpyasmなんてものもあるらしいです。 http://members.verizon.net/olsongt/usersGuide.pdf
いわゆる、コマンドライン引数の取得(http://ja.doukaku.org/118/)からの派生です。
やっぱ、自分のコマンドってオプションつけたいですよね(笑
タグに「クックブック」なんてつけてみました
長文なのはご容赦ください^^;;
-----
次の起動インタフェースを持つコマンドを作成してください。
書式:cmdopt -o [-q] -d{0|1|2} 文字列 [文字列 ...]
書式を説明すると
- オプション「o」
必須オプションです。指定されていない場合、異常終了してください。
- オプション「q」
選択オプションです。
省略されていても問題有りません。
- オプション「d」
引数付きオプションです。
「0」「1」「2」のいずかが続いて指定されます。
- 文字列
パラメータです。
1つ以上であればいくつでも指定できます。
指定されていなかった場合、異常終了してください。
オプションの開始が「-」になっていますが
「+」や「/」でもかまいません。
余力があればロングオプションに対応してもよいです。
起動例:(すべて許容されるのが望ましいです)
1. cmdopt -o AAA
2. cmdopt -o AAA BBB CCC
3. cmdopt -oq AAA
4. cmdopt -o -q AAA
5. cmdopt -o -s1 AAA
6. cmdopt -o -s 1 AAA
7. cmdopt -q -s2 -o AAA
出力例:
[オプション情報]
o(output): ON|OFF
q(quote): ON|OFF
d(debug): 0|1|2
[パラメータ情報]
指定数: N
1: 文字列1
2: 文字列2
...
N: 文字列N
TCPのechoクライアントを書いてください。
- サーバのホスト名ないしIPアドレス、およびポートはコマンドライン引数で指定します。
- 標準入力からユーザの入力を受け取り、echoサーバに送信します。
- echoサーバから受信したデータを標準出力に出力します。
Windowsなら、Simple TCP/IP Servicesを起動してやれば、ローカルの確認用echo サーバとして使えます。
my_program localhost 7 < input_file > result_file
のようにしてリダイレクトを行った場合にも、result_fileがinput_fileの内容と一致するようにしてみてください。
スペースやインデントなど、本来は必要なく開発効率を上げるために記述が許可されている項目について、 それらを可能な限り減らし、コードを短くするコード書いてください。 また、投稿時に対象とする言語と、実際の処理結果を記載できるとわかり易いかと思います。 以下詳細 ・全てを行う必要はありません、どこまで行うかは任意です。 ・ローカル宣言など、消しても動作に関係のない構文の削除や置き換えを行っても構いません。 ・必ず同じ入力に同じ結果が返るのであれば処理内容を変えることもかまいませんが、推奨・強制はしません。 ・コンパイラや実行環境に依存する圧縮は避けてください。
ソースコードからコメント部分を削除するプログラム decomment を書いてください. すくなくとも,decomment を記述したのと同じ言語で書かれているソースコードが 扱えるようにしてください.
標準入力から与えられたソースコードの変数名
を置換するプログラムを作ってください。
最近はリファクタリングツールなどの普及でこ
のような需要は少ないかと思われますが、viな
ど貧弱なエディタを使っているときに困る
のが変数名の置換です。さすがに以下の例のよ
うなプログラムは例としてしか書きませんが、
置換しようとしている変数名と同じ綴りの他の
ものがプログラム中に出てくることはまれにあ
ります。そこで、与えられたソースコードに現
れる変数だけを指定された名前に置換してくだ
さい。
置換対象となるソースコードと使用言語は同じ
ものを使ってください。与えられるソースコー
ドは、完全なコンパイル単位、もしくはパース
して意味が通る範囲のものどちらであってもか
まいません。後者の場合、一番外側の変数だけ
置換できるようにしてください。
C言語での解答例をつけたかったのですが、と
ても難しかったためまだ作成できていません。
ご容赦ください。
例
$ cat a.c
/* a */
int foo()
{
struct a {int a;} a;
#if FOO
a.a = 1;
#endif
{ int a; }
return 0;
}
$ alpha -DFOO=1 b a < a.c
/* a */
int foo()
{
struct a {int a;} b;
#if FOO
b.a = 1;
#endif
{ int a; }
return 0;
}
- 標準でついているprintf系関数の使用禁止
- 標準でついているライブラリ以外の使用禁止
- 引数・返り値等の仕様はできるだけ似せればよい
1 2 3 4 5 6 7 | #include <string.h>
// なにもフォーマットしてない
int mysprintf(char *str, const char *format, ... ){
strcpy(str, format);
return strlen(str);
}
|
これは、実例を見た方が簡単だと思います。 CPANにRegexp::Assembleというモジュールがあるのですが、要はこれの簡易版を作って欲しいということです。私自身、同様のことを行うモジュールを過去にいくつか作っています(e.g Regexp::Optimizer)。
ここでは、文字列のリストを受け取って、それをTRIE化した正規表現に出来ればOKです。Regexp::AssembleやRegexp::Optimizerは正規表現を受け取ってそれをTrie化することも可能ですし、Perl 5.10では内部的にTrie Optimizationを行ったりするのですが、そこまでの機能は求めません。
なお、ここで言う「正規表現」は、必ずしもPerl互換のものである必要はありません。それがTrieになっていることをきちんと示せればOKです。
とはいうものの、Perl5互換になっていた方が、サポートしている環境が多くて有用性は高そうです。可能であればそうして下さい。
Dan the Regexp Assembler
see: Trie (en.wikipedia)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #!/usr/local/bin/perl
use strict;
use warnings;
use Regexp::Assemble;
my $ra = Regexp::Assemble->new;
while(<>){
chomp;
next unless $_;
$ra->add($_);
}
print $ra->re, "\n"
__END__
% grep program /usr/share/dict/words
program
programist
programistic
programma
programmar
programmatic
programmatically
programmatist
programmer
% grep program /usr/share/dict/words | perl sample.pl
(?-xism:program(?:m(?:a(?:ti(?:c(?:ally)?|st)|r)?|er)|ist(?:ic)?)?)
|





Akira51 #9856() Rating-8/8=-1.00
年賀はがきの当せん番号について確認する方法をはがき(番号)の整理の仕方も含めて考えよ
[ reply ]