|
|
|
2012/12/15(Sat) 13:09:03|NO.51168
再び質問させていただきますがよろしくお願いします
test.txtとtest2.txtの2つがあるとして、test.txtの内容は
A
A
A
B
B
test2.txtは
Z
X
C
V
N
とした場合、この2つのtxtファイルを使って
test.txtの1行目2行目3行目が"A"なのでtest2.txtの1行目2行目3行目を関連付け、
同じようにtest.txtの4行目5行目は"B"なのでtest2.txtの4行目5行目を関連付ける
図を作成したいと思っています
1
/ /|
1 2 3
2
/|
4 5
ずれていたら申し訳ありません。
このように図示したいと考えてますが、1-1,2-4間のように関連付けをして
ラインの引く、というところで詰まっております…何か良い書き方はあるでしょうか…
screen 0,1000,600,0,150,150
exist "test.txt"
exist "test2.txt"
if strsize=-1:mes "ファイルがありません!":stop
//下段数字の描写
notesel test
noteload "test.txt"
count = 0
ct=1
a=100
b=50
randomize
repeat notemax
pos a-35,310
color 0,0,0
font "MS ゴシック",40
mes ct
ct++
a=a+70
b=b+70
loop
repeat notemax
noteget target,cnt
repeat notemax-cnt-1,cnt+1
noteget out,cnt
if target=out : z=1
loop
if z=0 : count++
z=0
loop
//上段の数字の描写
ct2 = 1
v=0
repeat count
color 255,0,0
pos v+340,50
mes ct2
ct2++
v = v + 200
loop
//ライン描写
noteload "test2.txt"
a = 100
repeat notemax
color 0,0,0
line a-20,300,350,100
a = a+70
loop
自分なりに作ったコードはこのようになっています。
冗長な箇所などがあるかもしれませんが、よろしければご指摘お願いします。
| |
|
2012/12/15(Sat) 14:42:42|NO.51170
やっぱりtextの文法が悪いと思う
textに
A,Z,X,C
B,V,N
と書けばもっと楽にできるのでは
行ごとがグループで、一文字目は親、二文字目以降は関連付ける子
「,」で区切っていて、split関数で抜き出せる
|
|
2012/12/15(Sat) 16:49:25|NO.51174
>@keyさん
いや、test.txtがtest2.txtに対する「フィルタ」として機能する場合、
1ファイルに纏められない可能性もあるのでは?
ところでありすさん、例えば「1\n1\n2\n2\n1」(\nは改行)とtest.txtに書かれていた場合、
・1,2,5行目と3,4行目を纏めて考える(何行目でも同じ内容なら同じグループとして扱う)
・1,2行目と3,4行目と5行目を纏めて考える(同じ行内容でも連続していないと別扱い)
のどちらですか? 書くコードがそれで全然違ってくるので。
|
|
2012/12/15(Sat) 17:19:41|NO.51180
@keyさん、split関数について調べてみました。これならできそう、かもしれません
情報ありがとうございます。もう少し勉強してみます
YSRさん、お返事ありがとうございます。
そうですね、1ファイルにまとめるのは少し難しいです…自分で書き換えればいい話なんけども。
それと私が考えているのは前者の
・1,2,5行目と3,4行目を纏めて考える(何行目でも同じ内容なら同じグループとして扱う)
です。
|
|
2012/12/15(Sat) 17:49:56|NO.51185
>・1,2,5行目と3,4行目を纏めて考える
なら、どう考えても@keyさん式にデータを書いて、それを読み出す方向の方が楽
それも、test.txtもtest2.txtもあらかじめ用意するタイプなら尚更
「両方行数が多い or test2.txtの一行辺りのサイズが大きい から合体させるのが面倒」
というのなら、なんとかプログラム側で処理する必要がありそうですね……
例(例外処理省略Ver):
fontsize=40 :ysize=200
//test.txtを読み出し
notesel buf :noteload "test.txt"
;行データの種類数・位置を取得
;(仮に一行を64バイト、行数を500行程度までだとする)
maxdatasize=notemax
sdim linestr,64,maxdatasize
sdim linepos,1024,maxdatasize
dim linesize,maxdatasize
datasize=0
repeat maxdatasize
n=cnt :noteget getline,n
flg=-1
repeat datasize
if linestr(cnt)=getline :flg=cnt :break
loop
if flg=-1 {
;新規登録
linestr(datasize)=getline
linepos(datasize)=str(n)
linesize(datasize)=1
datasize+
}
else {
;既出追加
linepos(flg)+=","+n
linesize(flg)+
}
loop
//test2.txtを読み出し
notesel buf2 :noteload "test2.txt"
;テキストを読み込みながら、『縦向き』で文字を表示+線引き
;(test.txt、test2.txtの一行は1文字だけだとする)
screen 0,(fontsize*2)*maxdatasize,ysize :title "サンプル"
font msgothic,fontsize,16
xpos=0
repeat datasize
pos xpos*fontsize*2,0
mes linestr(cnt)
linestrsize=strlen(linestr(cnt))
split linepos,",",gline
for n,0,linesize(cnt)
noteget getline,int(gline(n))
pos (xpos+n)*fontsize*2,ysize-fontsize
mes getline
getlinesize=strlen(getline)
line (xpos+n)*fontsize*2+fontsize/4*getlinesize,ysize-fontsize,xpos*fontsize*2+fontsize/4*linestrsize,fontsize
next
xpos+=linesize(cnt)
loop
stop
| |
|
2012/12/15(Sat) 17:51:45|NO.51186
・・・投稿してから、
>一行辺りのサイズが大きい
と
>一行は1文字だけ
が矛盾していることに気がついたorz
仕様も目的も割りと曖昧なので、以降の修正は他の人にお願いします
|
|
2012/12/15(Sat) 19:39:59|NO.51193
screen 0,1000,600,0,150,150
oya=""
sdim ko,50,50
mesx=10;描画ソート用
mesy=10;描画ソート用
//下段数字の描写
notesel buf
;noteload "test.txt"
buf={"A,Z,X,C
B,V,N"}
repeat notemax
noteget strn,cnt
split strn,",",oya,ko;oyaに親、koに子を区切って入れる
pos mesx,mesy : mes oya
repeat stat-1;子の数でループ
pos mesx+cnt*10,mesy+50 : mes ko(cnt)
line mesx+4,mesy+17,mesx+cnt*10+5,mesy+50
loop
mesy+=80
loop
textの文法を変えただけで驚きの完成の速さと短さ
|
|
2012/12/15(Sat) 19:46:44|NO.51194
必要最低限にしてあるので使うなら好きに改変して下さい
|
|
2012/12/15(Sat) 22:18:45|NO.51200
@keyさん、YSRさん、本当にありがとうございます
txtファイルの文法1つでこんなにも変わるんですね…
とても参考になりました!
|
|