Language detail: 秀丸マクロ
Coverage: 15.00%
|
number of '+' ratings |
contribution for coverage |
Unsolved challenges
- LL Golf Hole 9 - トラックバックを打つ (Nested Flatten)
- 2^i * 3^j * 5^k なる整数 (Nested Flatten)
- 起動オプションの解析 (Nested Flatten)
- 文字列型日時ののN秒後時間取得 (Nested Flatten)
- LL Golf Hole 8 - 横向きのピラミッドを作る (Nested Flatten)
codes
ビンゴの結果を整形表示
(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 サブルーチンの引数 )
see: 良い乱数・悪い乱数
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)
next >>
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;
|





fujidig
#5116()
[
秀丸マクロ
]
Rating1/1=1.00
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;Rating1/1=1.00-0+
[ reply ]