From 422e78d2db9cf8b8a5507fd92745e96164d920b3 Mon Sep 17 00:00:00 2001 From: JiWoong Sul Date: Mon, 24 Nov 2025 19:03:33 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B2=B4=ED=81=AC=ED=8F=AC=EC=9D=B8=ED=8A=B8?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=20=EC=A3=BC=EA=B8=B0=201=EB=A0=88?= =?UTF-8?q?=EB=B2=A8=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program.cs | 18 ++++++++++++++++-- README.md | 4 ++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Program.cs b/Program.cs index 62ea7e6..15f27e9 100644 --- a/Program.cs +++ b/Program.cs @@ -195,8 +195,7 @@ internal static class Program void SaveCheckpoint(List snapshot, int lastId) { if (!checkpointEnabled) return; - // 10단위(또는 마지막 레벨)마다 누적 JSON을 디스크에 기록한다. - if (lastId % 10 != 0 && lastId != endId) return; + // 매 레벨마다(또는 마지막 레벨) 누적 JSON을 디스크에 기록한다. try { var json = JsonSerializer.Serialize(snapshot, options); @@ -288,6 +287,7 @@ internal static class Program var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = true }; @@ -484,6 +484,7 @@ internal sealed class LevelGenerator { var band = ResolveBand(id); var level = BuildSingle(id, band); + level = TrimLevel(level); output.Add(level); onCheckpoint?.Invoke(output, id); } @@ -830,6 +831,19 @@ internal sealed class LevelGenerator if (sink == null) return; sink[reason] = sink.TryGetValue(reason, out var count) ? count + 1 : 1; } + + // 생성된 레벨을 자동으로 트림하여 외곽 void(0) 패딩을 제거한다. + private static GeneratedLevel TrimLevel(GeneratedLevel level) + { + var trimmed = LevelTrimmer.Trim(level.Grid); + return new GeneratedLevel + { + Id = level.Id, + Grid = trimmed, + LowestPush = level.LowestPush, + PushLimit = level.PushLimit + }; + } } internal static class LevelTrimmer diff --git a/README.md b/README.md index 4bdd328..dc37afd 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,16 @@ dotnet run -- [startId] [endId] > output.json # 개별/범위 검증: 생성된 JSON이 풀리는지 확인 dotnet run -- --verify [endId] dotnet run -- --verify-all +# 외곽 트림: JSON의 외부 void(0) 행/열 제거 +dotnet run -- --trim <입력 json> [출력 json] [startId] [endId] ``` - 예: `dotnet run -- 12345 3 20 > stage.json` - 예: `dotnet run -- --verify stage.json 210 220` +- 예: `dotnet run -- --trim stage.json trimmed.json 200 260` - `seed`가 없으면 기본값(12345)을 사용합니다. - `startId/endId`가 없으면 `levelbalance.json`에 정의된 밴드 범위를 사용합니다. - 검증 모드에서는 지정한 JSON의 레벨을 솔버로 풀어보고, 성공/실패와 함께 `moves/ pushes/ turns`를 리포트합니다. +- 트림 모드는 지정한 범위(id)만 외곽의 '0' 패딩을 걷어내서 저장합니다(기본 출력 경로: `trimmed_output.json`). - 진행 상태는 stderr에 한 줄로 갱신됩니다(벽 생성중/박스 배치중/검증중/생성완료). ## 설정