データの並べ替えについて

 投稿者:k.t.  投稿日:2016年10月20日(木)12時24分37秒
  こんにちは.はじめて書き込ませていただきます.
私は大学の工学部に所属している学部4年の研究生です.
皆さんに折り入ってお願いがあります.
メモ帳に並んでいるm行n列の数字を,任意のp行q列の並びに変換し,変換後の数字の並びを表示するプログラムを考えてはいただけないでしょうか.m×n=p×qとなるように変換したいです.
はじめての投稿でこのようなお願いをしてしまうのは大変恐縮なのですがどうかよろしくお願いします.
 

Re: データの並べ替えについて

 投稿者:白石 和夫  投稿日:2016年10月20日(木)13時04分59秒
  > No.4131[元記事へ]

k.t.さんへのお返事です。
十進BASICだと,(不可能ではないかもしれませんが,)メモ帳から数値を読み取るのが難しいと思います。
テキストファイルとして保存したものを読み込むか,
十進BASICの表示メニューで表示されるTextWindow1,2をメモ帳の代用とするか検討してみてください。

> こんにちは.はじめて書き込ませていただきます.
> 私は大学の工学部に所属している学部4年の研究生です.
> 皆さんに折り入ってお願いがあります.
> メモ帳に並んでいるm行n列の数字を,任意のp行q列の並びに変換し,変換後の数字の並びを表示するプログラムを考えてはいただけないでしょうか.m×n=p×qとなるように変換したいです.
> はじめての投稿でこのようなお願いをしてしまうのは大変恐縮なのですがどうかよろしくお願いします.
>
 

Re: データの並べ替えについて

 投稿者:k.t.  投稿日:2016年10月20日(木)14時50分39秒
  > No.4132[元記事へ]

白石 和夫先生
御返信ありがとうございます.
テキストファイルから数値を読み取り,並び替えるプログラムを書いてみたいと思います.
プログラムができたらすぐにこの掲示板に投稿させていただきます.
お礼だけ述べさせていただきたいと思い返信いたしました.

> k.t.さんへのお返事です。
> 十進BASICだと,(不可能ではないかもしれませんが,)メモ帳から数値を読み取るのが難しいと思います。
> テキストファイルとして保存したものを読み込むか,
> 十進BASICの表示メニューで表示されるTextWindow1,2をメモ帳の代用とするか検討してみてください。
>
> > こんにちは.はじめて書き込ませていただきます.
> > 私は大学の工学部に所属している学部4年の研究生です.
> > 皆さんに折り入ってお願いがあります.
> > メモ帳に並んでいるm行n列の数字を,任意のp行q列の並びに変換し,変換後の数字の並びを表示するプログラムを考えてはいただけないでしょうか.m×n=p×qとなるように変換したいです.
> > はじめての投稿でこのようなお願いをしてしまうのは大変恐縮なのですがどうかよろしくお願いします.
> >
 

Re: データの並べ替えについて

 投稿者:しばっち  投稿日:2016年10月23日(日)17時58分37秒
  > No.4131[元記事へ]

k.t.さんへのお返事です。

> m行n列の数字を,任意のp行q列の並びに変換し,変換後の数字の並びを表示するプログラムを考えてはいただけないでしょうか.m×n=p×qとなるように変換したいです.

下記のプログラムでいいのでしょうか?

DATA "11111111111111111111"
DATA "22222222222222222222"
DATA "33333333333333333333"
DATA "44444444444444444444"
DATA "55555555555555555555"
DATA "66666666666666666666"
DATA "77777777777777777777"
DATA "88888888888888888888"
DATA "99999999999999999999"
DATA "00000000000000000000"
DO
   READ IF MISSING THEN EXIT DO:A$
   LET N=N+1
   PRINT N;":";A$
   LET S$=S$&A$
LOOP
LET M=LEN(S$)/N
PRINT N;"行";M;"列"
INPUT  PROMPT "列=": Q
LET P=LEN(S$)/Q
PRINT P;"行";Q;"列"
FOR I=1 TO LEN(S$) STEP Q
   LET C=C+1
   PRINT C;":";S$(I:I+Q-1)
NEXT I
END
 

Re: データの並べ替えについて

 投稿者:k.t.  投稿日:2016年10月24日(月)16時58分17秒
  > No.4140[元記事へ]

しばっちさんへのお返事です。

しばっちさん,御返事本当にありがとうございます.
返信が遅れてしまい申し訳ありません.

しばっちさんが書いてくださったプログラムを実際に走らせてみて驚きました.
まさにこのような動きをするプログラムを考えていたからです.

しかし,本当に申しあげにくいのですが,文字列の並べ替えを行うのではなく

15,210,33,64,55,21
120,146,25,37,88,91

のように,テキストファイルに大量に並べられた数値を

15,210,33
64,55,21
120,146,25
37,88,91

のように並べ替え,表示することはできないでしょうか.

私の説明不足のためにしばっちさんに大変な御迷惑をおかけしてしまい
本当に申し訳ありませんでした.

不躾なお願いであることは分かっているのですが,
この問題を共に考えてはいただけないでしょうか.
よろしくお願いします.

> k.t.さんへのお返事です。
>
> 下記のプログラムでいいのでしょうか?
>
> DATA "11111111111111111111"
> DATA "22222222222222222222"
> DATA "33333333333333333333"
> DATA "44444444444444444444"
> DATA "55555555555555555555"
> DATA "66666666666666666666"
> DATA "77777777777777777777"
> DATA "88888888888888888888"
> DATA "99999999999999999999"
> DATA "00000000000000000000"
> DO
>    READ IF MISSING THEN EXIT DO:A$
>    LET N=N+1
>    PRINT N;":";A$
>    LET S$=S$&A$
> LOOP
> LET M=LEN(S$)/N
> PRINT N;"行";M;"列"
> INPUT  PROMPT "列=": Q
> LET P=LEN(S$)/Q
> PRINT P;"行";Q;"列"
> FOR I=1 TO LEN(S$) STEP Q
>    LET C=C+1
>    PRINT C;":";S$(I:I+Q-1)
> NEXT I
> END
>
 

Re: データの並べ替えについて

 投稿者:しばっち  投稿日:2016年10月24日(月)17時48分49秒
  > No.4148[元記事へ]

k.t.さんへのお返事です。

> 15,210,33,64,55,21
> 120,146,25,37,88,91
>
> のように,テキストファイルに大量に並べられた数値を
>
> 15,210,33
> 64,55,21
> 120,146,25
> 37,88,91
>
> のように並べ替え,表示することはできないでしょうか.

例えば下記のようなことでしょうか?

DATA 15,210,33,64,55,21
DATA 120,146,25,37,88,91
LET N=3
DO
   FOR I=1 TO N-1
      READ IF MISSING THEN EXIT DO:A
      PRINT STR$(A);",";
   NEXT I
   READ IF MISSING THEN EXIT DO:A
   PRINT STR$(A)
LOOP
END
 

Re: データの並べ替えについて

 投稿者:しばっち  投稿日:2016年10月24日(月)20時35分22秒
  > No.4150[元記事へ]

k.t.さんへのお返事です。

> テキストファイルからINPUT文でデータを読み込んでのやり方ではやはり難しいでしょうか。

> 15,210,33,64,55,21
> 120,146,25,37,88,91
>
> のように,テキストファイルに大量に並べられた数値を
>
> 15,210,33
> 64,55,21
> 120,146,25
> 37,88,91
>
> のように並べ替え,表示することはできないでしょうか.

単純にINPUT #1 文では読み出せないのですね。勘違いしていました。
INPUT #1 ではエラーが出るようなので、LINE INPUT #1 で一行分読み出してから
SUB TOKUN() で配列変数に入れ指定分 N個ずつ表示させています。

    sample.txt (※わざとデタラメにしています)
------------------------------------
+1, X2 ,3 ,4,++5 -, 6/
7, '8, 9,10  ,1C1  ,12',    13  ,
14,-15,16, *17,18
,  ,19,--20, L2 1 A ,22,, +2 3 ,
-,24 ,25, , 26,,,,,=27M,28\, 29,,.,
, 30-
------------------------------------
DIM X$(100)
LET N=3 !'N個ずつ表示させる
OPEN #1:NAME "sample.txt"
DO
   LINE INPUT #1,IF MISSING THEN EXIT DO:A$
   MAT X$=NUL$
   CALL TOKUN(A$,X$,K)
   LET I=1
   DO UNTIL I>K
      LET X$(I)=FILTER$(X$(I))
      IF X$(I)<>"" THEN
         LET COUNT=COUNT+1
         IF MOD(COUNT,N)=0 THEN
            PRINT X$(I)
         ELSE
            PRINT X$(I);",";
         END IF
      END IF
      LET I=I+1
   LOOP
LOOP
CLOSE #1
END

EXTERNAL  FUNCTION FILTER$(X$) !'フィルター処理
DO
   LET FL=0
   FOR I=1 TO LEN(X$)
      IF POS("0123456789-.",X$(I:I))=0 OR (I<>1 AND X$(I:I)="-") THEN
         LET X$(I:I)=""
         LET FL=1
         EXIT FOR
      END IF
   NEXT I
LOOP UNTIL FL=0
IF X$="." THEN LET X$=""
IF X$="-" THEN LET X$=""
IF X$="+" THEN LET X$=""
LET FILTER$=X$
END FUNCTION

EXTERNAL SUB TOKUN(A$,X$(),K) !'トークン取り出し
LET B$=A$
LET K=0
DO
   LET N=POS(B$,",") !'区切り文字 ","
   IF N>0 THEN
      LET K=K+1
      LET X$(K)=FRONTSTRING$(B$,",")
      LET B$=BEHINDSTRING$(B$,",")
   END IF
LOOP UNTIL N=0
LET K=K+1
IF RIGHT$(B$,1)="," THEN
   LET X$(K)=LEFT$(B$,LEN(B$)-1)
ELSE
   LET X$(K)=B$
END IF
END SUB

EXTERNAL FUNCTION FRONTSTRING$(A$,B$) !'前方取り出し
LET N=POS(A$,B$,1)
IF N=0 THEN
   LET FRONTSTRING$=A$
ELSE
   LET FRONTSTRING$=A$(1:N-1)
END IF
END FUNCTION

EXTERNAL FUNCTION BEHINDSTRING$(A$,B$) !'後方取り出し
LET N=POS(A$,B$,1)
IF N=0 THEN
   LET BEHINDSTRING$=A$
ELSE
   LET BEHINDSTRING$=A$(N+LEN(B$):LEN(A$))
END IF
END FUNCTION
 

Re: データの並べ替えについて

 投稿者:島村1243  投稿日:2016年10月24日(月)21時22分6秒
  > No.4131[元記事へ]

k.t.さんへのお返事です。

> メモ帳に並んでいるm行n列の数字を,任意のp行q列の並びに変換し,変換後の数字の並びを表示するプログラムを考えてはいただけないでしょうか.m×n=p×qとなるように変換したいです.

しばっちさんと同じような考え方ですが、素人が作成したので分り易いのでは。。。
数百万個のデータに対応できるかは不明です。

!***元の文字配列条件指定***
LET m=1 !m行
LET n=6 !n列
!***変更後の文字配列条件指定***
LET p=3 !p行
LET q=2 !q列
!-----------------------------
!
LET mn=m*n
DIM b$(m,n)
DIM c$(mn)
DIM d$(p,q)

!OPEN #1:NAME "c:\temp\データファイル.txt",ACCESS INPUT

FOR g=1 TO m
!LINE INPUT #1:a$
   LET a$="12,34,56,78,9,10"!<---for_test_data
   print a$
   LET mlen=LEN(a$)
   LET r=1
   LET b$(g,r)=""
   FOR i=1 TO mlen
      LET nuki$=MID$(a$,i,1)
      IF nuki$<>"," then
         LET b$(g,r)=b$(g,r) & nuki$
      ElseIF nuki$="," then
         LET r=r+1
         LET b$(g,r)=""
      End IF
   NEXT I
NEXT G
PRINT

LET mn=0
FOR g=1 TO m
   FOR r=1 TO n
      LET mn=mn+1
      LET c$(mn)=b$(g,r)
   next R
NEXT G
LET mn=0
FOR g=1 TO p
   FOR r=1 TO q
      LET mn=mn+1
      LET d$(g,r)=c$(mn)
      IF r=q THEN
         PRINT d$(g,r)
      else
         PRINT d$(g,r);",";
      end if
   NEXT R
NEXT G

END

 

Re: データの並べ替えについて

 投稿者:nagram  投稿日:2016年10月25日(火)10時42分31秒
  > No.4131[元記事へ]

k.t.さんへのお返事です。

元データの大きさがわかっている場合と、未知の場合の2種類のプログラムを作りました。
PRINT文の出力は遅いので、大量データの出力にはファイルを利用することをお勧めします。

LET m=4       ! 元データの行数m
LET n=6       ! 元データの列数n (1行のデータ数)
LET q=8       ! 変換後の列数q
LET p=m*n/q   ! 変換後の行数p
IF p<>INT(p) THEN PRINT "ERROR!!"
DIM row0(n)
!DIM A(p,q)  ! p*qの配列Aに変換
!OPEN #1 : NAME "***.txt"  ! 元データのファイル名
!OPEN #2 : NAME "C:data1.txt"  ! 変換後のファイル
!ERASE #2
LET row1$=""
LET k,l=1
FOR i=1 TO m
!MAT INPUT #1 : row0   ! ファイルから1行入力
   MAT READ row0   ! DATA文1行の読み込み
   FOR j=1 TO n
      IF l<q THEN
         LET row1$=row1$&STR$(row0(j))&","
         !LET A(k,l)=row0(j)
         LET l=l+1
      ELSE
      !PRINT #2 : row1$&STR$(row0(j))  ! ファイルに1行出力
         PRINT row1$&STR$(row0(j))  ! PRINT文は遅い
         !LET A(k,q)=row0(j)
         !LET k=k+1
         LET row1$=""
         LET l=1
      END IF
   NEXT j
NEXT i
!MAT PRINT A;
!CLOSE #1
!CLOSE #2
DATA 11,12,13,14,15,16
DATA 21,22,23,24,25,26
DATA 31,32,33,34,35,36
DATA 41,42,43,44,45,46
END


元データの大きさがわからない場合
LET n=10000       ! 元データの列数n。未知の場合は十分に大きな値を指定。
LET mn=5000000    ! データ総数 mn=m*n。未知の場合は十分に大きな値を指定。
DIM row0(n),data0(mn)
SET ECHO "OFF"
OPEN #1 : NAME "***.txt"  ! 元データのファイル名
OPEN #2 : NAME "C:data2.txt"  ! 変換後のファイル
ERASE #2
LET total=0   ! データ総数 total=m*n
DO
   MAT INPUT #1, IF MISSING THEN EXIT DO : row0(?)  ! nが既知ならrow0(?)をrowに
   FOR i=1 TO UBOUND(row0)  ! nが既知ならUBOUND(row0)をnに
      LET data0(total+i)=row0(i)
   NEXT i
   LET total=total+i-1
   MAT row0=ZER(n)  ! 配列の再定義(1行のデータ数が一定ならば,この命令は不要)
LOOP
MAT REDIM data0(1 TO total)
DO
   INPUT PROMPT "行数pを入力(データ総数"&STR$(total)&")":p
LOOP UNTIL p>0 AND total/p=INT(total/p)
LET q=total/p
!DIM A(p,q)  ! p*qの配列Aに変換
LET i=1
FOR k=1 TO p
   LET row1$=""
   FOR l=1 TO q-1
      LET row1$=row1$&STR$(data0(i))&","
      !LET A(k,l)=data0(i)
      LET i=i+1
   NEXT l
   PRINT #2 : row1$&STR$(data0(i))  ! ファイルに1行出力
   PRINT row1$&STR$(data0(i))  ! PRINT文は遅い
   !LET A(k,q)=data0(i)
   LET i=i+1
NEXT k
!MAT PRINT A;
CLOSE #1
CLOSE #2
END
! 下記のように元データが不揃いでも読み込み可能
! 11,12,13,14,15,16
! 21,22,23,24,25
! 31,32,33,34,35,36,37
! 41,42,43,44,45,46
 

Re: データの並べ替えについて

 投稿者:たろさ  投稿日:2016年10月29日(土)22時31分52秒
  > No.4151[元記事へ]

しばっちさんへのお返事です。

何時もお世話になります。program重宝しています。

私は、これまで読み込めなかった。txt DATA が読めました。

sample.txt (※わざとデタラメにしています)
-----------------------------------------------------------
1415926535 8979323846 2643383279 5028841971 6939937510

14159 26535 89793 23846 26433 83279 50288 41971 69399 37510

58209749445923078164 06286208998628034825
58209 74944 59230 78164 06286 20899 86280 34825 34211 70679
82148 08651 32823 06647 09384 46095 50582 23172 53594 08128

005820974944592307816406286208998628034825123456789
-----------------------------------------------------------
失礼なお願いですが、programが読めません。

;","; の部分を" " 変更しました。間違っていたら教えてください。

DIM X$(100)
LET N=3 !'N個ずつ表示させる
OPEN #1:NAME "sample.txt"
OPEN #2:NAME "pi_s.txt" !,RECTYPE INTERNAL
ERASE #2
DO
   LINE INPUT #1,IF MISSING THEN EXIT DO:A$
   MAT X$=NUL$
   CALL TOKUN(A$,X$,K)
   LET I=1
   DO UNTIL I>K
      LET X$(I)=LTRIM$(RTRIM$(X$(I)))
      IF X$(I)<>"" THEN
         LET COUNT=COUNT+1
         IF MOD(COUNT,N)=0 THEN
            WRITE #2:X$(I)
         ELSE
            WRITE #2:X$(I)!;",";
         END IF
      END IF
      LET I=I+1
   LOOP
LOOP
CLOSE #1
CLOSE #2

END

EXTERNAL SUB TOKUN(A$,X$(),K) !'トークン取り出し
LET B$=A$
LET K=0
DO
   LET N=POS(B$," ") !'区切り文字 ","
   IF N>0 THEN
      LET K=K+1
      LET X$(K)=FRONTSTRING$(B$," ")
      LET B$=BEHINDSTRING$(B$," ")
   END IF
LOOP UNTIL N=0
LET K=K+1
IF RIGHT$(B$,1)=" " THEN
   LET X$(K)=LEFT$(B$,LEN(B$)-1)
ELSE
   LET X$(K)=B$
END IF
END SUB

EXTERNAL FUNCTION FRONTSTRING$(A$,B$) !'前方取り出し
LET N=POS(A$,B$,1)
IF N=0 THEN
   LET FRONTSTRING$=A$
ELSE
   LET FRONTSTRING$=A$(1:N-1)
END IF
END FUNCTION

EXTERNAL FUNCTION BEHINDSTRING$(A$,B$) !'後方取り出し
LET N=POS(A$,B$,1)
IF N=0 THEN
   LET BEHINDSTRING$=A$
ELSE
   LET BEHINDSTRING$=A$(N+LEN(B$):LEN(A$))
END IF
END FUNCTION
--------------------------------------------------
近藤さんの円周率計算ソフト算出DATA 読み込み成功

円周率小数点以下30万桁の一致を目視で確かめるのは大変なので
0から9の個数を数えました。30万桁までの一致を確認

円周率 #4138
BASIC Acc i7_4790k 1時間36分08.56秒

円周率 300001個   3が入る為
0 : 30001 個
1 : 30034 個
2 : 29879 個
3 : 30139 個
4 : 29844 個
5 : 30273 個
6 : 29890 個
7 : 30226 個
8 : 29926 個
9 : 29789 個


よろしくお願いします。


http://blogs.yahoo.co.jp/donald_stinger

 

Re: データの並べ替えについて

 投稿者:しばっち  投稿日:2016年10月30日(日)19時27分8秒
  > No.4165[元記事へ]

たろささんへのお返事です。

> 円周率小数点以下30万桁の一致を目視で確かめるのは大変なので
> 0から9の個数を数えました。30万桁までの一致を確認

数字をカウントするだけなら下記のプログラムで十分かと思います。

DIM COUNT(0 TO 9)
FILE GETNAME F$,"ファイル|*.*"
IF F$="" THEN STOP
OPEN #1:NAME F$
DO
   CHARACTER INPUT #1,IF MISSING THEN EXIT DO:A$
   IF A$>="0" AND A$<="9" THEN
      LET NUM=NUM+1
      LET P=VAL(A$)
      LET COUNT(P)=COUNT(P)+1
      !'IF NUM>1000000 THEN EXIT DO
   END IF
LOOP
CLOSE #1
FOR I=0 TO 9
   PRINT I;":";COUNT(I)
   LET SUM=SUM+COUNT(I)
NEXT I
PRINT "SUM:";SUM
END
 

Re: データの並べ替えについて

 投稿者:たろさ  投稿日:2016年10月31日(月)20時25分40秒
  > No.4166[元記事へ]

しばっちさんへのお返事です。


とても便利に使えてます。言葉にできませんが、感謝しています。


PIPIPIH.EXE(Windows用:LZH圧縮:222KB)

近藤さんのPIPIPIH.EXEを使用して
2億6843万桁   4時間 44分 03秒
■ パソコン環境
 ウィンドウズ : Microsoft Windows 8.1
 システムの種類 : 32 ビット
 プロセッサー : AMD Athlon(tm) 64 Processor 3800+
 周波数 : 2.40 GHz
 メモリー : 3.00 GB

pi.dat で

0 : 19997437
1 : 20003774
2 : 20002185
3 : 20001411
4 : 19999846
5 : 19993031
6 : 19999161
7 : 20000287
8 : 20002307
9 : 20000562
SUM: 200000001

1166.27秒

19分26.27秒
■ パソコン環境
 ウィンドウズ : Microsoft Windows 7
 システムの種類 : 32 ビット
        メモリー : 3.00 GB
   プロセッサー :Intel Core i7 4790K

http://blogs.yahoo.co.jp/donald_stinger

 

Re: データの並べ替えについて

 投稿者:たろさ  投稿日:2016年12月12日(月)21時07分36秒
  > No.4166[元記事へ]

しばっちさんへのお返事です。

> たろささんへのお返事です。
>
> > 円周率小数点以下30万桁の一致を目視で確かめるのは大変なので
> > 0から9の個数を数えました。30万桁までの一致を確認
>
> 数字をカウントするだけなら下記のプログラムで十分かと思います。
>
> DIM COUNT(0 TO 9)
> FILE GETNAME F$,"ファイル|*.*"
> IF F$="" THEN STOP
> OPEN #1:NAME F$
> DO
>    CHARACTER INPUT #1,IF MISSING THEN EXIT DO:A$
>    IF A$>="0" AND A$<="9" THEN
>       LET NUM=NUM+1
>       LET P=VAL(A$)
>       LET COUNT(P)=COUNT(P)+1
>       !'IF NUM>1000000 THEN EXIT DO
>    END IF
> LOOP
> CLOSE #1
> FOR I=0 TO 9
>    PRINT I;":";COUNT(I)
>    LET SUM=SUM+COUNT(I)
> NEXT I
> PRINT "SUM:";SUM
> END
>


オンライン整数列大辞典

Decimal expansion of imaginary part of first nontrivial zero of Riemann zeta function.

[LINKS]

Fredrik Johansson, The first nontrivial zero to over 300000 decimal digits



14.1347251417346937904572519835624702707842571156992431756855674601499634298092
5676494901039317156101277920297154879743676614269146988225458250536323944713778
--------------------------------------------------------------------------------
途中省略
123456789a123456789a123456789a123456789a123456789a123456789a123456789a123456789a
--------------------------------------------------------------------------------
3719756156130075575048966124960842092790209200711188108919196806737889737926378
3443113344026809675744009981758448560390412



計算結果

0 : 30242
1 : 30002
2 : 30186
3 : 30595
4 : 30331
5 : 30172
6 : 30580
7 : 30305
8 : 30385
9 : 30209
SUM: 303007


重宝しています。

http://blogs.yahoo.co.jp/donald_stinger

 

戻る