#11 Article 1432 Posted at 1988/05/13 02:13:15 by アルルカン (MAP475) [PRG.NL3]

Subject: NL3データ ブンリ プログラム

おっ久しぶりです、アルルカンです。(もう誰も憶えてないかなぁ)
 絵が書けないMapletownの住民ですが、今回画期的な(一説には「あほらし
い」)ログファイルからのNL3分離アルゴリズムを思い付き、早速作ってみました。
 何が画期的かと言うと、結構早いんです、これが。
 何で早いかと言うと、これが手抜きの極致なんです。

 以前アップしたNT3(NL3用アーティクル分離プログラム)で分離できないパタ
ーン(最初のカラーデータの1行が78文字の物や、カラーデータの最後にハンドルを
入れてる物)にも対応するようにしました。

 ヘッダーサーチの方法は、以前と同じカラーデータの妥当性で行っていますが、以前
の1行64パターン(128文字)に加えて、1行78文字でもチェックを行います。
 更に64パターン(128文字)全てをチェックする方法から、先頭の39パターン
(78文字)のチェックにしました。(これで、後ろにハンドルを入れてもOK)

 次に絵のデータの終了の判断ですが、ここに今回の画期的な(あほらしい)、終了判
断アルゴリズムを使いました。
 以前はちゃんと16000(160*100)ドットを数えてたんですが、これがな
かなか遅いんですよねぇ。
 で、ふっと気づいたんですが、大概の絵のデータの後ろは、リターンだけの1行が入
っているんですよね。もしも空白が入って無くても、次のアーティクルとの境には、シ
ステムがリターンだけの1行を入れるので、後ろにゴミがくっつく事があっても、最低
限次のアーティクルとの境はわかるんじゃないか・・・
 で、できたプログラムがこれです。

 一応MS-DOS上のn88basic用として作りましたが、ファイル関係の部分を書き換えれば、ほとんどの機種で動くと思います。

 最近はNTTの魔の手におびえて、ほとんど絵のデータをダウンしていないので、完
動は保証できませんが、どなたかこのプログラムの感想をお聞かせ下さい。

 ちなみにファイル名はアーティクルの番号+”.NL3”になります。
 後でリネームしてください。

                         MAP475 アルルカン

10 ' SAVE"NT3",A
11 ' NL3データ ブンリ プログラム
100 '
110 '   init
120 DEFINT A-Z
130 DIM N(255)
140 FOR I=0 TO 255:N(I)=-1:NEXT
150 P=0
160 FOR I=&H20 TO &H7E:N(I)=P:P=P+1:NEXT
170 FOR I=&HA0 TO &HDF:N(I)=P:P=P+1:NEXT
180 N(&HFD)=P:P=P+1:N(&HFE)=P
190 CHKL=39  '<- カラーデータ ノ チェックスウ.  ヘラスト ハヤクナルガ、 ドジル カノウセイガ フエマス
1000 '
1010 '  main
1020 INPUT "Log File Name = ",SF$
1030 OPEN SF$  FOR INPUT AS #1 ' <== キシュニ ヨッテ カエテ クダサイ
1100 '
1110 GOSUB 2000 : IF EOF(1) THEN 1140
1120 IF F THEN GOSUB 3000
1130 GOTO 1100
1140 CLOSE #1
1150 END
2000 '
2010 '  check color data
2020 F=0
2030 WHILE NOT(F OR EOF(1))
2040   IF EOF(1) THEN 2080
2050   LINE INPUT #1,D$  ':PRINT D$
2060   IF LEN(D$)>7 THEN IF LEFT$(D$,7)="Article" THEN GOSUB 2100
2070   IF (LEN(D$)=78) OR (LEN(D$)=128) THEN GOSUB 2200
2080 WEND
2090 RETURN
2100 '
2110 F$=MID$(STR$(VAL(MID$(D$,8))),2)
2120 PRINT:PRINT "Find Article ";F$;
2130 RETURN
2200 '
2210 IF LEFT$(D$,4)="    " THEN RETURN
2220 I=1:A1=0:A2=0 : ER=0
2230 WHILE NOT((I>=CHKL) OR ER)
2240   A1=N(ASC(MID$(D$,I  ,1))):IF A1=-1 THEN ER=-1
2250   A2=N(ASC(MID$(D$,I+1,1))):IF A2=-1 THEN ER=-1
2260   IF A1+A2*128>729 THEN ER=-1
2270   I=I+2
2280 WEND
2290 IF NOT ER THEN F=-1
2300 RETURN
3000 '
3010 '  output data
3020 PRINT " Write";
3030 OPEN F$+".NL3" FOR OUTPUT AS #2 ' <== キシュニ ヨッテ カエテ クダサイ
3040 GOSUB 3100
3050 CLOSE #2
3060 RETURN
3100 '
3110 IF LEN(D$)=0  THEN RETURN
3120 PRINT #2,D$  ':PRINT D$
3130 LINE INPUT #1,D$
3140 GOTO 3110