[過去ログ] プログラミングのお題スレ Part21 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
898(2): 638 [sage] 2023/07/08(土) 18:46:12.49 ID:fDz284w7(1/4) AAS
>>884884(6): デフォルトの名無しさん [] 2023/07/04(火) 22:31:52.02 ID:0YaO2gnD(2/2) AAS
お題:62進数の計算
62進数の整数の加・減・乗算から成る式の文字列が入力される。計算結果を62進数の文字列で出力せよ。
ただし、10進数の0〜9, 10〜35, 36〜61に相当する数字にはそれぞれ0〜9, A〜Z, a〜zを用い、
計算の途中経過と最終結果は64ビット符号付き整数の範囲内に収まると想定して良い。
[例]
入力: 123 + ABC
出力: 123 + ABC = BDF
[問題]
2023-7-4
printf - (Hello + world)
Windows * 11
The - quick - brown * fox + jumped - over + the - lazy * dog
ABCDEFG + HIJKLMNOP + QRSTUV + WXYZ
Perl5、見易くするためインデントは全角スペースに置換してあります。
use feature qw{signatures}; no warnings 'experimental';
use Parse::RecDescent;
sub ope($valp, @args) { my $val = $valp->();
while (@args) { my ($op, $parm) = splice @args, 0, 2; $op->($val, $parm->()); } $val }
%d = map{$_ => $i++} 0..9,'A'..'Z','a'..'z';
%e = map{$d{$_} => $_} keys %d;
use List::Util 'reduce';
sub dec($d62) { reduce {$a*62 + $b} map{$d{$_}} split '', $d62 }
my $parse = new Parse::RecDescent <<'End';
expr: <leftop:term addsub term> {sub { ::ope @{$item[1]} }}
addsub: '+' {sub { $_[0] += $_[1] }} | '-' {sub { $_[0] -= $_[1] }}
term: <leftop:factor muldiv factor> { sub {::ope @{$item[1]} }}
muldiv: '*' {sub { $_[0] *= $_[1] }} | '/' {sub { $_[0] /= $_[1] }}
factor: dig62 | '(' expr ')' { $item[2] }
dig62: /[0-9A-Za-z]+/ {sub { ::dec $item[1] }}
End
sub enc($d) { my $r = $d % 62; $d = int(($d - $r) / 62); $d ? (enc($d) . $e{$r}) : $e{$r}; }
for (<DATA>) {
$n = $parse->expr($_)->();
$n = $n < 0 ? '-' . enc(-$n) : enc($n);
print "$_ = $n\n";
}
__DATA__
123 + ABC
4 - K
2023-7-4
printf - (Hello + world)
Windows * 11
The - quick - brown * fox + jumped - over + the - lazy * dog
ABCDEFG + HIJKLMNOP + QRSTUV + WXYZ
899: 638 [sage] 2023/07/08(土) 18:47:35.93 ID:fDz284w7(2/4) AAS
>>898 の実行結果:
$ perl 21_884_calc_dig26.pl
123 + ABC
= BDF
4 - K
= -G
2023-7-4
= 201s
printf - (Hello + world)
= odFAME
Windows * 11
= XFWRSlos
The - quick - brown * fox + jumped - over + the - lazy * dog
= -Q1YGAW2x
ABCDEFG + HIJKLMNOP + QRSTUV + WXYZ
= HITvzYcgj
※ Parse::RecDescentという再帰降下型Parser generatorのperl moduleを使用したので、
動作させるにはそのインストールされている必要がありますが、ideonなどのオンライン
プログラムサービスには多分インストールされていなくて動作しないんじゃないかなともいます
903: 638 [sage] 2023/07/08(土) 22:09:14.33 ID:fDz284w7(3/4) AAS
四則演算の式評価なら1数十stepでParserを手書きできるということでそれもありじゃね?
905: 638 [sage] 2023/07/08(土) 22:16:05.45 ID:fDz284w7(4/4) AAS
GCCやCLangも何とparserはyaccなど使わずに手書きなんだそうだ。
理由は下記サイトなど参照。きめ細かいエラー処理など可能になるかもしれないがコードはとても込み入って大変そうだわ。
c - Are GCC and Clang parsers really handwritten? - Stack Overflow
外部リンク:stackoverflow.com
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.050s