Language detail: 秀丸マクロ

Coverage: 15.00%
number of '+' ratings
contribution for coverage

Unsolved challenges

codes

Feed

Used modules

next >>

BFコンパイラー (Nested Flatten)
一番手間がかかったのはgetcharの実装です。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
begingroupundo;
gofiletop;
$code['>'] = "#ptr=#ptr+1;";
$code['<'] = "#ptr=#ptr-1;";
$code['+'] = "#buf[#ptr]=#buf[#ptr]+1;";
$code['-'] = "#buf[#ptr]=#buf[#ptr]-1;";
$code['.'] = "insert char(#buf[#ptr]);";
$code[','] = "call get;";
$code['['] = "while(#buf[#ptr]){";
$code[']'] = "}";
#isUsedGetchar = false;
while( code != eof ) {
    if( code == ',' ) #isUsedGetchar = true;
    insert $code[code];
    delete;
}
if( #isUsedGetchar ) {
    insert "endmacro;get:if($get==\"\"&&#c<=0)$get=input(\"入力\");#c=ascii($get);if($get==\"\")#c=-1;$get=rightstr($get,strlen($get)-strlen(char(#c)));#buf[#ptr]=#c;return;";
}
endgroupundo;
ビンゴの結果を整形表示 (Nested Flatten)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
    call srand tickcount;
    call bingo 35;
    endmacro;

bingo:
    ##i = 0;
    while( ##i < ##1 ) {
        ##dest[##i] = ##i + 1;
        ##i = ##i + 1;
    }
    ##i = 0;
    while( ##i < ##1 ) {
        call rand;
        ##r = ##return % ( ##1 - ##i ) + ##i;
        ##tmp = ##dest[##r];
        ##dest[##r] = ##dest[##i];
        ##dest[##i] = ##tmp;
        ##i = ##i + 1;
    }
    ##keta = strlen( str( ##1 ) );
    ##i = 0;
    while( ##i < ##1 ) {
        ##next = ##i + 10;
        if ( ##next > ##1 ) {
            ##next = ##1;
        }
        ##ii = ##i;
        while( ##ii < ##next ) {
            if ( ##ii > ##i ) {
                insert " ";
            }
            call KetaSoroe ##ii+1, ##keta;
            insert $$return;
            ##ii = ##ii + 1;
        }
        insert "\n";
        ##ii = ##i;
        while( ##ii < ##next ) {
            if ( ##ii > ##i ) {
                insert " ";
            }
            call KetaSoroe ##dest[##ii], ##keta;
            insert $$return;
            ##ii = ##ii + 1;
        }
        insert "\n\n";
        ##i = ##next;
    }
    return;

KetaSoroe:
    ##i = ##2 - strlen( str( ##1 ) );
    $$result = "";
    if ( ##i >= 0 ) {
        while( ##i > 0 ) {
            $$result = $$result + " ";
            ##i = ##i - 1;
        }
    }
    $$result = $$result + str( ##1 );
    return $$result;

rand:
    #rand_x = #rand_x * 214013 + 2531011;
    if ( #rand_x < 0 ) {
        return ( ( #rand_x + 1 ) / 65536 - 1 ) & 32767;
    }
    return #rand_x / 65536 & 32767;

srand:
    #rand_x = ##1;
    return;
重複無し乱数 (Nested Flatten)

乱数を発生させる関数がなかったのでそこから実装。

HSP ( #4289 ) と同じ結果になるように Visual C++ の rand と同じアルゴリズム・定数を使いました。 #4289 と乱数の種を同じにしたら同じ結果になるでしょう。 ( HSP の randomize の引数、秀丸マクロの srand サブルーチンの引数 )

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    call srand tickcount;
    call bingo 10;
    call bingo 3;
    call bingo 3;
    call bingo 10;
    endmacro;

bingo:
    ##i = 0;
    while( ##i < ##1 ) {
        ##dest[##i] = ##i + 1;
        ##i = ##i + 1;
    }
    ##i = 0;
    while( ##i < ##1 ) {
        call rand;
        ##r = ##return % ( ##1 - ##i ) + ##i;
        ##tmp = ##dest[##r];
        ##dest[##r] = ##dest[##i];
        ##dest[##i] = ##tmp;
        ##i = ##i + 1;
    }
    ##i = 0;
    while( ##i < ##1 ) {
        if ( ##i > 0 ) {
            insert " ";
        }
        insert str( ##dest[##i] );
        ##i = ##i + 1;
    }
    insert "\n";
    return;

rand:
    #rand_x = #rand_x * 214013 + 2531011;
    if ( #rand_x < 0 ) {
        return ( ( #rand_x + 1 ) / 65536 - 1 ) & 32767;
    }
    return #rand_x / 65536 & 32767;

srand:
    #rand_x = ##1;
    return;
文字列のセンタリング (Nested Flatten)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    if ( getconfig( "AutoAdjustOrikaeshi" ) == 2 ) {
        #width = windowwidth;
    } else {
        #width = getconfig( "Orikaeshi" );
    }
    disabledraw;
    begingroupundo;
    if ( !selecting ) {
        selectall;
    }
    #i = seltoplineno;
    #end = selendlineno;
    escape;
    while( #i <= #end ) {
        movetolineno 1, #i;
        #margin = #width - linelen2;
        if ( #margin >= 0 ) {
            #j = #margin / 2;
            while( #j > 0 ) {
                insert " ";
                #j = #j - 1;
            }
        } else {
            while( linelen2 > #width ) {
                golineend2;
                backspace;
                if ( !linelen2 > #width ) {
                    break;
                }
                golinetop2
                delete;
            }
        }
        #i = #i + 1;
    }
    endgroupundo;
    enabledraw;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
    begingroupundo;
    if ( getconfig( "AutoAdjustOrikaeshi" ) == 2 ) {
        #width = windowwidth;
    } else {
        #width = getconfig( "Orikaeshi" );
    }
    if ( !selecting ) {
        #top = 1;
        #end = linecount2;
    } else {
        #top = seltoplineno;
        #end = selendlineno;
        escape;
    }
    #i = #top;
    while( #i <= #end ) {
        movetolineno 1, #i;
        #margin = #width - linelen2;
        if ( #margin >= 0 ) {
            #j = #margin / 2;
            $margin = "";
            while( #j > 0 ) {
                $margin = $margin + " ";
                #j = #j - 1;
            }
            insert $margin;
        } else {
            beginsel;
            movetolineno linelen2 + 1, #i;
            $text = gettext( seltopx, seltopy, selendx, selendy, 1 );
            delete;
            call cutstr, $text, #width;
            insert $$return;
        }
        #i = #i + 1;
    }
    endgroupundo;
    endmacro;

cutstr:
    $$src = $$1;
    ##width = ##2;
    if ( ##width < 0 ) {
        ##width = 0;
    }
    if ( ##width > strlen( $$src ) ) {
        ##width = strlen( $$src );
    }
    ##start = strlen( $$src ) - ##width;
    ##end = strlen( $$src ) + ##width;
    ##i = 0;
    $$dest = "";
    $$left = "";
    $$right = "";
    while( ##i * 2 < ##end ) {
        ##char = ascii( $$src );
        ##bytes = strlen( char( ##char ) );
        if ( ##i * 2 < ##start ) {
            $$left = char( ##char );
        }
        if ( ( ( ##i + ##bytes ) * 2 > ##end ) && ( $$right == "" ) ) {
            $$right = char( ##char );
        }
        if ( ( ##i * 2 >= ##start ) && ( ( ##i + ##bytes ) * 2 <= ##end ) ) {
            $$dest = $$dest + char( ##char );
        }
        $$src = rightstr( $$src, strlen( $$src ) - ##bytes );
        ##i = ##i + ##bytes;
    }
    if ( $$right == "" ) {
        $$right = char( ascii( $$src ) );
    }
    if ( strlen( $$dest ) >= ##width ) {
        return $$dest;
    }
    if ( ( strlen( $$left + $$dest ) <= ##width ) && ( $$left != "" ) ) {
        return $$left + $$dest;
    }
    if ( ( strlen( $$dest + $$right ) <= ##width ) && ( $$right != "" ) ) {
        return $$dest + $$right;
    }
    return $$dest;
文字列として取得して整形。
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
    begingroupundo;
    if ( getconfig( "AutoAdjustOrikaeshi" ) == 2 ) {
        #width = windowwidth;
    } else {
        #width = getconfig( "Orikaeshi" );
    }
    if ( !selecting ) {
        selectall;
    } else {
        #l1 = seltoplineno;
        #l2 = selendlineno;
        movetolineno 1, #l1;
        beginsel;
        movetolineno 1, #l2;
        movetolineno linelen2 + 1, #l2;
        endsel;
    }
    $text = gettext( seltopx, seltopy, selendx, selendy, 1 );
    delete;
    call center $text, #width;
    insert $$return;
    endgroupundo;
    endmacro;

center:
    $$result = "";
    while( $$1 != "" ) {
        ##lineLen = strstr( $$1, "\x0d\x0a" );
        ##isLastLine = ##lineLen == -1;
        if ( ##isLastLine ) {
            ##lineLen = strlen( $$1 );
        }
        $$line = leftstr( $$1, ##lineLen );
        call center_line $$line, ##2;
        $$result = $$result + $$return;
        $$1 = rightstr( $$1, strlen( $$1 ) - ##lineLen );
        if ( !##isLastLine ) {
            $$1 = rightstr( $$1, strlen( $$1 ) - strlen( "\x0d\x0a" ) );
            $$result = $$result + "\n";
        }
    }
    return $$result;

center_line:
    ##margin = ##2 - strlen( $$1 );
    if ( ##margin >= 0 ) {
        $$result = "";
        ##i = ##margin / 2;
        while( ##i > 0 ) {
            $$result = $$result + " ";
            ##i = ##i - 1;
        }
        $$result = $$result + $$1;
    } else {
        ##idx = -##margin / 2;
        call midstr2, $$1, ##idx, ##2;
        $$result = $$return;
        // ±1バイトとる範囲をずらして、その中から一番長いテキストをとる
        if ( strlen( $$result ) < ##2 ) {
            call midstr2, $$1, ##idx + 1, ##2;
            if ( strlen( $$return ) > strlen( $$result ) ) {
                $$result = $$return;
            }
            if ( strlen( $$result ) < ##2 ) {
                call midstr2, $$1, ##idx - 1, ##2;
                if ( strlen( $$return ) > strlen( $$result ) ) {
                    $$result = $$return;
                }
            }
        }
    }
    return $$result;

midstr2: // マルチバイトを考慮した midstr
    $$src = $$1;
    ##idx = ##2;
    ##len = ##3;
    if ( ##idx < 0 ) {
        ##idx = 0;
    }
    if ( ##idx > strlen( $$src ) ) {
        ##idx = strlen( $$src );
    }
    if ( ##len < 0 ) {
        ##len = 0;
    }
    if ( ##len > strlen( $$src ) - ##idx ) {
        ##len = strlen( $$src ) - ##idx ;
    }
    
    ##end = ##idx + ##len;
    ##i = 0;
    $$dest = "";
    while( ##i < ##end ) {
        ##char = ascii( rightstr( $$src, strlen( $$src ) - ##i ) );
        ##byte = strlen( char( ##char ) );
        if ( ( ##i >= ##idx ) && ( ##i + ##byte <= ##end ) ) {
            $$dest = $$dest + char( ##char );
        }
        ##i = ##i + ##byte;
    }
    return $$dest;
税込み価格への修正 (Nested Flatten)
searchdown2 で。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
    disabledraw;
    begingroupundo;
    gofiletop;
    while( true ) {
        searchdown2 "[0-9]", regular;
        if( !result ) {
            break;
        }
        #figX = x;
        #figY = y;
        searchdown "[^0-9]", regular;
        if( !result ) {
            gofileend;
        }
        #figure = val( gettext( #figX, #figY, x, y ) );
        beginsel;
        moveto #figX, #figY;
        insert str( #figure * 105 / 100 );
    }
    endgroupundo;
    enabledraw;
/*コメント*/を取り除く (Nested Flatten)
searchdown2 を使えばもっと簡潔にできましたね。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
    disabledraw;
    begingroupundo;
    gofiletop;
    while( true ) {
        searchdown2 "/*";
        if ( !result ) {
            break;
        }
        #commentStartX = x;
        #commentStartY = y;
        movetolineno column + 1 + strlen( "/*" ), lineno;
        searchdown2 "*/";
        if( !result ) {
            gofileend;
        }
        movetolineno column + 1 + strlen( "*/" ), lineno;
        beginsel;
        moveto #commentStartX, #commentStartY;
        delete;
    }
    endgroupundo;
    enabledraw;
文字列からの情報抽出 (Nested Flatten)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    $output = "";
    disabledraw;
    gofiletop;
    while( true ) {
        searchdown2 "[A-Za-z]+(-hidden)?(-(small|big))?\\.[A-Za-z]+", regular;
        if ( !result ) {
            break;
        }
        #x = x;
        #y = y;
        searchdown "[-.]", regular;
        $name = gettext( #x, #y, x, y );
        $size = "normal";
        $hidden = "False";
        while( code == '-' ) {
            movetolineno column + 1 + strlen( "-" ), lineno;
            #x = x;
            #y = y;
            searchdown "[-.]", regular;
            $option = gettext( #x, #y, x, y );
            if ( $option == "big" ) {
                $size = "big";
            }
            if ( $option == "small" ) {
                $size = "small";
            }
            if ( $option == "hidden" ) {
                $hidden = "True";
            }
        }
        movetolineno column + 1 + strlen( "." ), lineno;
        #x = x;
        #y = y;
        searchdown "[^A-Za-z]", regular;
        if ( !result ) {
            gofileend;
        }
        $ext = gettext( #x, #y, x, y );
        $output = $output + "name:'" + $name + "', ext:'" + $ext+"', size: " + $size+" hidden: " + $hidden + "\n";
    }
    enabledraw;
    newfile;
    insert $output;
/*コメント*/を取り除く (Nested Flatten)
開いている文書から取り除く。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    disabledraw;
    begingroupundo;
    gofiletop;
    while( true ) {
        if ( gettext2( column, lineno, column + strlen( "/*" ), lineno ) != "/*" ) {
            searchdown "/*";
            if ( !result ) {
                break;
            }
        }
        #commentStartX = x;
        #commentStartY = y;
        movetolineno column + 1 + strlen( "/*" ), lineno;
        if ( gettext2( column, lineno, column + strlen( "*/" ), lineno ) != "*/" ) {
            searchdown "*/";
            if( !result ) {
                gofileend;
            }
        }
        movetolineno column + 1 + strlen( "*/" ), lineno;
        #commentEndX = x;
        #commentEndY = y;
        beginsel;
        moveto #commentStartX, #commentStartY;
        delete;
    }
    endgroupundo;
    enabledraw;
税込み価格への修正 (Nested Flatten)
開いている文書から変換。
「与えられた文字列の中から見つけ出し、変更した文字列を返す関数を作る」には沿っていませんが、この方が秀丸マクロらしいと思います。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    disabledraw;
    begingroupundo;
    gofiletop;
    while( true ) {
        if ( code < '0' || code > '9' ) {
            searchdown "[0-9]", regular;
            if( !result ) {
                break;
            }
        }
        #figX = x;
        #figY = y;
        searchdown "[^0-9]", regular;
        if( !result ) {
            gofileend;
        }
        #figure = val( gettext( #figX, #figY, x, y ) );
        beginsel;
        moveto #figX, #figY;
        delete;
        insert str( #figure * 105 / 100 );
    }
    endgroupundo;
    enabledraw;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    call IncludeTax "ダイコン150円、ハクサイ120円、ジャガイモ30円";
    message $$return;
    endmacro;

IncludeTax:
    $$figure = "";
    $$result = "";
    while( $$1 != "" ) {
        ##char = ascii( $$1 );
        if ( ##char >= '0' && ##char <= '9' ) {
            $$figure = $$figure + char( ##char );
        } else {
            if ( $$figure != "" ) {
                $$result = $$result + str( val( $$figure ) * 105 / 100 );
                $$figure = "";
            }
            $$result = $$result + char( ##char );
        }
        
        $$1 = rightstr( $$1, strlen( $$1 ) - strlen( char( ##char ) ) );
    }
    if ( $$figure != "" ) {
        $$result = $$result + str( val( $$figure ) * 105 / 100 );
        $$figure = "";
    }
    return $$result;
文字列の反転 (Nested Flatten)
unichar 、 unicode でなく、 char と ascii でもマルチバイト文字に対応していましたので以下のコードでも動きました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
    call reverse_string "Hello";
    message $$return;
    call reverse_string "こんにちは";
    message $$return;
    call reverse_string "濁点(だくてん)";
    message $$return;
    endmacro;

reverse_string:
    $$result = "";
    while( $$1 != "" ) {
        $$char = char( ascii( $$1 ) );
        $$result = $$char + $$result;
        $$1 = rightstr( $$1, strlen( $$1 ) - strlen( $$char ) );
    }
    return $$result;
変形Fizz-Buzz問題 (Nested Flatten)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    #i = 1;
    #a[0] =  1; $b[0] = "hoge";
    #a[1] =  3; $b[1] = "Fizz";
    #a[2] =  5; $b[2] = "Buzz";
    #a[3] = 15; $b[3] = "FizzBuzz";
    while( #i <= 20 ) {
        call KetaSoroe #i, 2;
        insert $$return + ":";
        #j = 3;
        while( #j >= 0 ) {
            if( #i % #a[#j] == 0 ) {
                insert $b[#j];
                break;
            }
            #j = #j - 1;
        }
        insert "\n";
        #i = #i + 1;
    }
    endmacro;

KetaSoroe:
    ##i = ##2 - strlen( str( ##1 ) );
    $$result = "";
    if ( ##i >= 0 ) {
        while( ##i > 0 ) {
            $$result = $$result + " ";
            ##i = ##i - 1;
        }
    }
    $$result = $$result + str( ##1 );
    return $$result;
ダブル完全数 (Nested Flatten)
処理速度がありえないくらい遅いです...
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
    #i = 2;
    while( #i <= 10000 ) {
        call IsDoubleCompleteNumber #i;
        if ( ##return ) {
            insert str( #i ) + "\n";
        }
        #i = #i + 1;
    }
    insert "以上";
    endmacro;

IsDoubleCompleteNumber:
    ##sum = 0;
    ##i = ##1 - 1;
    while( ##i >= 1 ) {
        if ( ( ##1 % ##i ) == 0 ) {
            ##sum = ##sum + ##i;
        }
        ##i = ##i - 1;
    }
    return ( ##sum == ( ##1 * 2 ) );
文字列の反転 (Nested Flatten)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
    call reverse_string "Hello";
    message $$return;
    call reverse_string "こんにちは";
    message $$return;
    call reverse_string "濁点(だくてん)";
    message $$return;
    endmacro;

reverse_string:
    $$result = "";
    while( $$1 != "" ) {
        $$char = unichar( unicode( $$1 ) );
        $$result = $$char + $$result;
        $$1 = rightstr( $$1, strlen( $$1 ) - strlen( $$char ) );
    }
    return $$result;
与えられた数字のケタ数 (Nested Flatten)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
    #val = val( input( "数値を入力", "2469" ) );
    if ( #val < 0 ) {
        #val = -#val;
    }
    #keta = strlen( str( #val ) );
    message str( #keta ) + "桁";
    $kurai = "1";
    #i = #keta - 1;
    while( #i > 0 ) {
        $kurai = $kurai + "0";
        #i = #i - 1;
    }
    message "最大桁の位:"+$kurai;
アルファベットの繰り上がり (Nested Flatten)

	
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
    #i = 1;
    while( #i <= 100 ) {
        call excelalpha #i;
        if ( #i != 1 ) {
            insert ", ";
        }
        insert $$return;
        #i = #i + 1;
    }
    endmacro;

excelalpha:
    $$result = "";
    while ( ##1 != 0 ) {
        ##1 = ##1 - 1;
        $$result = char( ##1 % 26 + 'A' ) + $$result;
        ##1 = ##1 / 26;
    }
    return $$result;
リストを逆順に表示 (Nested Flatten)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    #list[0] = 1;
    #list[1] = 2;
    #list[2] = 3;
    #list[3] = 4;
    #list[4] = 5;

    #i = 4;
    while( #i >= 0 ) {
        message str( #list[#i] );
        #i = #i - 1;
    }
倍数になる13進数 (Nested Flatten)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
    #i = 10;
    while( true ) {
        call convert #i;
        if ( ##return == ( #i * 2 ) ) {
            break;
        }
        #i = #i + 1;
    }
    message str( #i );
    endmacro;

convert:
    $$val = str( ##1 );
    ##result = 0;
    ##i = 0;
    while( ##i < strlen( $$val ) ) {
        ##result = ##result * 13 + val( midstr( $$val, ##i, 1 ) );
        ##i = ##i + 1;
    }
    return ##result;
next >>

Index

Feed

Other

Link

Pathtraq

loading...