================================================================================
 プログラム
		(仮称)十進BASIC(JIS Full BASIC)
================================================================================

REM プログラムはここから

REM ====================================
REM 数学の部屋『第113回』
REM ====================================

REM ------------------------------------
REM (sub)マッチ棒の並んだ状態を作る
REM ------------------------------------

SUB henka2
   LET  a$=""
   LET  c=0

   FOR k=1 TO m*n
      IF a(k) = 0 THEN
         LET  a$=a$ & " "
      ELSE
         IF a(k) = 1 THEN
            LET c=c+1
         END IF
         LET  a$=a$ & STR$(a(k))
      END IF
   NEXT k

END SUB

REM ------------------------------------
REM 初期処理
REM ------------------------------------

REM 最初に並べられるマッチ棒の本数(プログラム上最大本数)
LET tbl=100

DIM a(tbl)
LET  a$=""
LET  l$=""

LET  b = 0
LET  b$=""

REM マッチ棒を何本重ねるか?
INPUT PROMPT "( 2 <= m <= 9 ) ? ":m
LET  m=INT(m)
IF m<2 THEN LET  m=2
IF m>9 THEN LET  m=9

REM 重ねたマッチ棒の束が何組あるか?
INPUT PROMPT "( 4 <= n <= 50) ? ":n
LET  n=INT(n)
IF n<4 THEN LET  n=4
IF (m*n)>tbl THEN LET  n=INT(tbl/m)


REM マッチ棒の並びの初期処理
FOR i=1 TO m*n
   LET  a(i)=1
NEXT i

LET a$=REPEAT$("1",m*n)
LET l$=REPEAT$("-",m*n)

LET sp$=REPEAT$(" ",15)

LET mn10$="         1         2         3         4         5         6         7         8         9         0"
LET mn1$ ="1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"

PRINT sp$;mn10$(1:m*n)
PRINT sp$;mn1$(1:m*n)
PRINT sp$;l$
PRINT "(  0) ---, --  ";a$


REM ------------------------------------
REM
REM    1本ずつの並びが4*m本になるまでの手順
REM ------------------------------------

LET b=0

LET i=m*n
LET imin = m*4
LET c=0
DO WHILE i>imin
   IF c=imin THEN EXIT DO
   IF a(i) = 1 THEN
      LET  a$=""
      LET  cnt=0

      FOR j=i-1 TO 1 STEP -1
         IF (a(j)=1) THEN
            IF cnt=m THEN
               LET  a(i)=a(i)+1
               LET  a(j)=0

               CALL henka2

               LET b=b+1
               PRINT USING"(###) ###, 右  ":b,j;
               PRINT a$

               IF a(i)=m THEN
                  EXIT FOR
               END IF

            ELSE
               LET cnt = cnt+1
            END IF
         END IF
      NEXT j
   END IF

   LET i = i-1

LOOP



REM PRINT



REM ------------------------------------
REM
REM    4*m本からの手順
REM ------------------------------------

REM 1本ずつの並びの位置を記憶しておく

DIM idx(40)

LET c=0
LET j=0

FOR i=1 TO m*n
   IF a(i) = 1 THEN
      LET j=j+1
      LET idx(j)=i
      LET imax = i
   ELSE
      IF a(i) > 1 THEN
         EXIT FOR
      END IF
   END IF
NEXT I

REM --------------------
REM m本の束を2組作る
REM    1本ずつの並び内での、左端・右端から二つ目をまずm本にする
REM --------------------

FOR i=2 TO m
   LET cnt=0
   FOR j=m*4-2 TO 1 STEP -1
      IF a(idx(j))=1 THEN
         IF cnt=m THEN
            LET  a(idx(m*4-1))=a(idx(m*4-1))+1
            LET  a(idx(j))=0

            CALL henka2
            LET b=b+1
            PRINT USING"(###) ###, 右  ":b,idx(j);
            PRINT a$

            EXIT FOR
         ELSE
            LET cnt=cnt+1
         END IF
      END IF
   NEXT j

   LET cnt=0
   FOR j=3 TO m*4 STEP 1
      IF a(idx(j))=1 THEN
         IF cnt=m THEN
            LET  a(idx(2))=a(idx(2))+1
            LET  a(idx(j))=0

            CALL henka2
            LET b=b+1
            PRINT USING"(###) ###, 左  ":b,idx(j);
            PRINT a$

            EXIT FOR
         ELSE
            LET cnt=cnt+1
         END IF
      END IF
   NEXT j

NEXT i



REM PRINT



REM --------------------
REM
REM    1本ずつの並び内での、左端・右端をm本にする
REM --------------------

FOR i=2 TO m
   FOR j=4*m-2 TO 1 STEP -1
      IF a(idx(j))=1 THEN
         LET  a(idx(m*4))=a(idx(m*4))+1
         LET  a(idx(j))=0

         CALL henka2
         LET b=b+1
         PRINT USING"(###) ###, 右  ":b,idx(j);
         PRINT a$

         EXIT FOR

      END IF
   NEXT j

   FOR j=3 TO m*4 STEP 1
      IF a(idx(j))=1 THEN
         LET  a(idx(1))=a(idx(1))+1
         LET  a(idx(j))=0

         CALL henka2
         LET b=b+1
         PRINT USING"(###) ###, 左  ":b,idx(j);
         PRINT a$

         EXIT FOR

      END IF
   NEXT j

NEXT i


END

REM プログラムはここまで




================================================================================
 出力結果
================================================================================

【第112回−問題1】の場合
( 2 <= m <= 9 ) ? 2
( 4 <= n <= 50) ? 4

               12345678
               --------
(  0) ---, --  11111111
(  1)   4, 右  111 1121
(  2)   6, 左  121 1 21
(  3)   5, 右  121   22
(  4)   3, 左  22    22



【第113回−問題1】の場合
( 2 <= m <= 9 ) ? 3
( 4 <= n <= 50) ? 4
                        1
               123456789012
               ------------
(  0) ---, --  111111111111
(  1)   7, 右  111111 11121
(  2)   6, 左  12111  11121
(  3)   5, 右  1211   11131
(  4)   9, 左  1311   1 131
(  5)  10, 右  1311   1  32
(  6)   3, 左  23 1   1  32
(  7)   8, 右  23 1      33
(  8)   4, 左  33        33



【第113回−問題2】の場合
( 2 <= m <= 9 ) ? 3
( 4 <= n <= 50) ? 5
                        1
               123456789012345
               ---------------
(  0) ---, --  111111111111111
(  1)  11, 右  1111111111 1112
(  2)  10, 右  111111111  1113
(  3)   7, 右  111111 11  1213
(  4)   6, 左  12111  11  1213
(  5)   5, 右  1211   11  1313
(  6)   9, 左  1311   1   1313
(  7)  12, 右  1311   1    323
(  8)   3, 左  23 1   1    323
(  9)   8, 右  23 1        333
( 10)   4, 左  33          333



【第113回−おまけ】の場合(マッチ棒4本を一束として、10束作ることを想定)
( 2 <= m <= 9 ) ? 4
( 4 <= n <= 50) ? 10
                        1         2         3         4
               1234567890123456789012345678901234567890
               ----------------------------------------
(  0) ---, --  1111111111111111111111111111111111111111
(  1)  35, 右  1111111111111111111111111111111111 11112
(  2)  34, 右  111111111111111111111111111111111  11113
(  3)  33, 右  11111111111111111111111111111111   11114
(  4)  31, 右  111111111111111111111111111111 1   11124
(  5)  30, 右  11111111111111111111111111111  1   11134
(  6)  29, 右  1111111111111111111111111111   1   11144
(  7)  27, 右  11111111111111111111111111 1   1   11244
(  8)  26, 右  1111111111111111111111111  1   1   11344
(  9)  25, 右  111111111111111111111111   1   1   11444
( 10)  23, 右  1111111111111111111111 1   1   1   12444
( 11)  22, 右  111111111111111111111  1   1   1   13444
( 12)  21, 右  11111111111111111111   1   1   1   14444
( 13)  19, 右  111111111111111111 1   1   1   1   24444
( 14)  18, 右  11111111111111111  1   1   1   1   34444
( 15)  17, 右  1111111111111111   1   1   1   1   44444
( 16)  15, 右  11111111111111 1   1   1   1   2   44444
( 17)  14, 右  1111111111111  1   1   1   1   3   44444
( 18)  13, 右  111111111111   1   1   1   1   4   44444
( 19)  10, 右  111111111 11   1   1   2   1   4   44444
( 20)   7, 左  121111 11 11   1   1   2   1   4   44444
( 21)   9, 右  121111 1  11   1   1   3   1   4   44444
( 22)   8, 左  131111    11   1   1   3   1   4   44444
( 23)   6, 右  13111     11   1   1   4   1   4   44444
( 24)  12, 左  14111     1    1   1   4   1   4   44444
( 25)  20, 右  14111     1    1       4   2   4   44444
( 26)   3, 左  24 11     1    1       4   2   4   44444
( 27)  16, 右  24 11     1            4   3   4   44444
( 28)   4, 左  34  1     1            4   3   4   44444
( 29)  11, 右  34  1                  4   4   4   44444
( 30)   5, 左  44                     4   4   4   44444