結果

問題 No.193 筒の数式
コンテスト
ユーザー ゴリポン先生
提出日時 2026-01-19 17:07:17
言語 D
(dmd 2.111.0)
結果
AC  
実行時間 2 ms / 1,000 ms
コード長 1,567 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 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
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

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);
}
0