#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