結果
| 問題 | No.193 筒の数式 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-01-19 17:07:17 |
| 言語 | D (dmd 2.111.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 1,000 ms |
| コード長 | 1,567 bytes |
| 記録 | |
| コンパイル時間 | 11,119 ms |
| コンパイル使用メモリ | 337,308 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2026-01-19 17:07:32 |
| 合計ジャッジ時間 | 12,249 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 16 |
ソースコード
module main;
// リングバッファ、数式処理
import std;
// stringで表された式の値を求める
struct Eval(T) {
private:
static string expr;
// 因子
static T factor()
{
if (expr[0] != '(') return parse!T(expr);
expr = expr[1 .. $]; // (を除去
T x = expression();
expr = expr[1 .. $]; // )を除去
return x;
}
// 項
static T term()
{
T x = factor();
while (expr != "") {
if (expr[0] == '*') {
expr = expr[1 .. $];
x *= factor();
} else if (expr[0] == '/') {
expr = expr[1 .. $];
T y = factor();
if (y == 0) throw new Exception("Eval: 0では割れません");
x /= y;
} else
break;
}
return x;
}
// 式
static T expression()
{
T x = term();
while (expr != "") {
if (expr[0] == '+') {
expr = expr[1 .. $];
x += term();
} else if (expr[0] == '-') {
expr = expr[1 .. $];
x -= term();
} else
break;
}
return x;
}
public:
static T opCall(string expr)
{
if (!balancedParens(expr, '(', ')'))
throw new Exception("Eval: かっこが対応していません");
this.expr = replace(expr, regex(`[\s\t\v\n\r]`, "g"), ""); // 空白、タブ、改行文字を除去
return expression();
}
}
void main()
{
// 入力
auto S = readln.chomp;
// 答えの計算
int N = S.length.to!int;
S ~= S[0 .. $ - 1];
long ans = -10L ^^ 9;
foreach (i; 0 .. N) {
auto expr = S[i .. i + N];
if (!isDigit(expr[0]) || !isDigit(expr[$ - 1]))
continue;
auto res = Eval!long(expr);
ans = max(ans, res);
}
// 答えの出力
writeln(ans);
}