File ru.yaml of Package sudoku-cpp

locale: ru
name: Русский

strings:
  # Application
  app.title: "Судоку"

  # Menu items
  menu.game: "Игра"
  menu.new_game: "Новая игра"
  menu.reset_puzzle: "Reset Puzzle"
  menu.save: "Сохранить"
  menu.load: "Загрузить"
  menu.statistics: "Статистика"
  menu.export_aggregate: "Export Aggregate Stats to CSV"
  menu.export_sessions: "Export Game Sessions to CSV"
  menu.exit: "Выход"
  menu.edit: "Правка"
  menu.undo: "Отменить"
  menu.redo: "Повторить"
  menu.clear_cell: "Очистить клетку"
  menu.help: "Помощь"
  menu.get_hint: "Получить подсказку"
  menu.about: "Об игре"
  menu.training_mode: "Режим обучения"
  menu.analyze_position: "Анализ позиции"
  menu.resume_game: "Продолжить игру"
  menu.settings: "Настройки..."
  menu.third_party_licenses: "Сторонние лицензии"

  # Toolbar
  toolbar.new_game: "\u25b6 Новая игра"
  toolbar.difficulty: "Уровень:"
  toolbar.hints: "Подсказки:"
  toolbar.rating: "Рейтинг:"
  toolbar.help_icon: "[?]"

  # Difficulty names
  difficulty.easy: "Лёгкий"
  difficulty.medium: "Средний"
  difficulty.hard: "Сложный"
  difficulty.expert: "Эксперт"
  difficulty.master: "Мастер"
  difficulty.unknown: "Неизвестный"

  # Action buttons
  button.check_solution: "Проверить решение"
  button.reset_puzzle: "Сбросить пазл"
  button.undo: "Отменить"
  button.redo: "Вернуть"
  button.undo_to_valid: "Отменить действие"
  button.auto_notes_on: "Авто заметки: ВКЛ"
  button.auto_notes_off: "Авто заметки: ВЫКЛ"
  button.fill_notes: "Заполнить заметки"
  button.undo_until_valid: "Отменить до необратимости"

  # Input modes
  mode.normal: "Цифры"
  mode.notes: "Заметки"
  mode.color: "Цвет"

  # Training mode
  training.title: "Training Mode"
  training.analyze_title: "Analyze Position"
  training.select_technique: "Select a technique to practice:"
  training.back_to_game: "Back to Game"
  training.group.foundations: "Foundations"
  training.group.subset_basics: "Subset Basics"
  training.group.intersections: "Intersections & Quads"
  training.group.basic_fish: "Basic Fish & Wings"
  training.group.links: "Links & Rectangles"
  training.group.advanced_fish: "Advanced Fish & Wings"
  training.group.finned_fish: "Advanced Fish (Finned)"
  training.group.chains: "Chains & Set Logic"
  training.group.inference: "Inference Engines"
  training.what_it_is: "What It Is:"
  training.what_to_look_for: "What to Look For:"
  training.start_exercises: "Start Exercises"
  training.back: "Back"
  training.difficulty_points: "{0} difficulty points"
  training.prerequisites: "Prerequisites: "
  training.exercise_header: "Exercise {0} / {1}  -  {2}"
  training.color: "Color:"
  training.submit: "Submit"
  training.hint: "Hint"
  training.skip: "Skip"
  training.quit_lesson: "Quit Lesson"
  training.next_exercise: "Next Exercise"
  training.retry: "Retry"
  training.show_solution: "Show Solution"
  training.score: "Score: {0} / {1}"
  training.correct: "Correct!"
  training.partially_correct: "Partially Correct"
  training.incorrect: "Incorrect"
  training.lesson_complete: "Lesson Complete!"
  training.try_again: "Try Again"
  training.pick_technique: "Pick Technique"
  training.return_to_game: "Return to Game"
  training.technique: "Technique: {0}"
  training.hints_used: "Hints used: {0}"
  training.mastery: "Mastery: {0}"
  training.points_fmt: "{0} ({1} pts)"
  training.prereq_not_met: "Prerequisites not met"
  training.recommended: "Recommended next technique"
  training.applicable: "Applicable at current position"
  training.excellent: "Excellent! You've mastered this technique."
  training.good_progress: "Good progress. Try again for a higher score."
  training.keep_practicing: "Keep practicing! Review the theory and try again."
  training.error_backtracking: "Cannot practice Backtracking — it is not a logical technique."
  training.error_no_step: "No applicable step found for this technique."
  training.correct_continue: "Correct! {0} Find the next one."
  training.feedback_correct: "Correct! {0}"
  training.feedback_partial: "Partially correct. {0}"
  training.feedback_incorrect: "Not quite. {0}"
  training.feedback_unknown: "Unknown result."
  mastery.beginner: "Beginner"
  mastery.intermediate: "Intermediate"
  mastery.proficient: "Proficient"
  mastery.mastered: "Mastered"

  # Status bar
  status.completed: "Completed!"
  status.playing: "Playing"
  status.ready: "Ready"
  status.press_f1: "Press F1 to show menu"
  status.in_progress: "In Progress"

  # Game board
  board.no_game_loaded: "No game loaded. Start a new game!"

  # Dialogs — New Game
  dialog.new_game: "Новая игра"
  dialog.select_difficulty: "Select difficulty:"
  dialog.start_game: "Старт игры"
  dialog.cancel: "Отменить"
  dialog.new_game_confirm: "Start a new {0} game?\nCurrent progress will be lost."

  # Dialogs — Reset
  dialog.reset_puzzle: "Reset Puzzle"
  dialog.reset_warning: "All progress on this puzzle will be lost, including placed numbers, notes, and hints. The timer will restart."
  dialog.reset: "Reset"

  # Dialogs — Save
  dialog.save_game: "Save Game"
  dialog.enter_save_name: "Enter save name:"
  dialog.save: "Save"
  save.preview_title: "Current Game"
  save.preview_difficulty: "Уровень"
  save.preview_time: "Time"
  save.preview_moves: "Moves"
  save.preview_mistakes: "Mistakes"
  save.name_placeholder: "Enter save name..."
  save.name_empty: "Please enter a save name."
  save.overwrite_confirm: "A save named \"{0}\" already exists. Overwrite it?"

  # Dialogs — Load
  dialog.load_game: "Load Game"
  dialog.recent_saves: "Recent saves:"
  load.col_name: "Name"
  load.col_difficulty: "Уровень"
  load.col_date: "Last Modified"
  load.col_time: "Elapsed"
  load.col_rating: "Rating"

  # Dialogs — Statistics (parameterized with fmt-style {0})
  dialog.statistics: "Statistics"
  dialog.close: "Close"
  stats.games_played: "Games Played: {0}"
  stats.games_completed: "Games Completed: {0}"
  stats.completion_rate: "Completion Rate: {0:.1f}%"
  stats.best_time: "Best Time: {0}"
  stats.average_time: "Average Time: {0}"
  stats.current_streak: "Current Streak: {0}"
  stats.best_streak: "Best Streak: {0}"
  stats.time_na: "N/A"
  stats.tab_overview: "Overview"
  stats.tab_per_difficulty: "Per Difficulty"
  stats.tab_recent_games: "Recent Games"
  stats.total_moves: "Total Moves"
  stats.total_hints: "Total Hints Used"
  stats.total_mistakes: "Total Mistakes"
  stats.total_time: "Total Time Played"
  stats.row_played: "Played"
  stats.row_completed: "Completed"
  stats.row_best_time: "Best Time"
  stats.row_avg_time: "Avg Time"
  stats.row_avg_rating: "Avg SE Rating"
  stats.col_date: "Date"
  stats.col_difficulty: "Уровень"
  stats.col_time: "Time"
  stats.col_rating: "Rating"
  stats.col_moves: "Moves"
  stats.col_mistakes: "Mistakes"

  # Dialogs — About
  dialog.about: "Об игре"
  about.sudoku_game: "Игра Судоку"
  about.built_with: "Создана с помощью:"
  about.description: "Приложение для игры в судоку."

  # Dialogs — Settings
  dialog.settings: "Настройки"
  dialog.third_party_licenses: "Сторонние лицензии"
  settings.tab_gameplay: "Gameplay"
  settings.tab_display: "Display"
  settings.max_hints: "Maximum Hints:"
  settings.auto_save_interval: "Auto-save Interval:"
  settings.default_difficulty: "Default Difficulty:"
  settings.seconds_suffix: " seconds"
  settings.highlight_conflicts: "Highlight Conflicts"
  settings.show_hints: "Show Hints"
  settings.collect_detailed_stats: "Collect detailed match statistics"
  settings.encrypt_detailed_stats: "Encrypt session data"
  settings.encrypt_detailed_stats_tooltip: "Session data is encrypted by default for privacy. Disable to inspect the raw data file yourself."
  settings.tab_statistics: "Statistics"
  stats.delete_prompt: "Disabling session tracking will stop recording per-game statistics. Would you like to delete existing session history?"
  stats.sessions_deleted: "Session history deleted."

  # Dialogs — Puzzle Difficulty
  dialog.puzzle_difficulty: "Puzzle Difficulty"
  dialog.puzzle_rating: "Puzzle Rating: SE {0}"
  dialog.techniques_required: "Techniques required to solve:"
  dialog.no_technique_details: "No technique details available."

  # Toolbar — Rating button format
  toolbar.rating_with_techniques: "SE {0} ({1} techniques)"
  toolbar.rating_simple: "SE {0}"

  # Tooltips — Rating scale
  tooltip.rating_scale: "Sudoku Explainer Rating Scale:"
  tooltip.techniques_required: "Techniques Required:"
  tooltip.input_mode: "Input mode (Space to cycle, N for Notes)"
  tooltip.place_digit: "Place {0} in selected cell"
  tooltip.eliminate_digit: "Eliminate {0} from selected cell"

  # Toast notifications
  toast.game_saved: "Game saved successfully"
  toast.aggregate_exported: "Aggregate stats exported to CSV"
  toast.sessions_exported: "Game sessions exported to CSV"
  toast.export_failed: "Export failed: {0}"
  toast.no_strategies: "No logical strategies found at this position."

  # Sidebar
  sidebar.difficulty: "Уровень: {0}"
  sidebar.rating: "Рейтинг: {0}"
  sidebar.language: "Язык"

  # ViewModel — Error messages
  error.generate_puzzle: "Failed to generate puzzle"
  error.load_game: "Failed to load game"
  error.no_active_game: "No active game to save"
  error.save_game: "Failed to save game"
  error.export_stats: "Failed to export statistics"
  error.export_aggregate: "Failed to export aggregate stats"
  error.export_sessions: "Failed to export game sessions"
  error.file_access: "File access error"
  error.serialization: "Serialization error"
  error.unknown: "Unknown error"

  # ViewModel — Status messages
  status.no_valid_state: "No valid state in history"
  status.board_valid: "Board is already valid"
  status.undone_to_valid: "Undone to last valid state"
  status.puzzle_completed: "Puzzle completed in {0}:{1}! New game started."
  status.solution_errors: "Solution has errors. Keep trying!"

  # ViewModel — Hint messages
  hint.no_remaining: "No hints remaining (0/10 used)"
  hint.select_cell: "Please select a cell first"
  hint.cannot_reveal_given: "Cannot reveal hint for given cells"
  hint.cell_has_value: "Cell already has a value"
  hint.no_technique: "No logical technique found for this puzzle"
  hint.suggestion_place: "Suggestion: Place {0} at R{1}C{2}"

  # ViewModel — Technique formatting
  technique.points_fmt: "{0} (SE {1})"
  technique.backtracking: "Backtracking (trial & error)"

  # ViewModel — Statistics error strings
  stats_err.invalid_data: "Invalid game data"
  stats_err.file_access: "File access error"
  stats_err.serialization: "Serialization error"
  stats_err.invalid_difficulty: "Invalid difficulty"
  stats_err.game_not_started: "Game not started"
  stats_err.game_already_ended: "Game already ended"
  stats_err.unknown: "Unknown statistics error"

  # Technique names
  tech.naked_single: "Naked Single"
  tech.hidden_single: "Hidden Single"
  tech.naked_pair: "Naked Pair"
  tech.naked_triple: "Naked Triple"
  tech.hidden_pair: "Hidden Pair"
  tech.hidden_triple: "Hidden Triple"
  tech.pointing_pair: "Pointing Pair"
  tech.box_line_reduction: "Box/Line Reduction"
  tech.naked_quad: "Naked Quad"
  tech.hidden_quad: "Hidden Quad"
  tech.x_wing: "X-Wing"
  tech.xy_wing: "XY-Wing"
  tech.swordfish: "Swordfish"
  tech.skyscraper: "Skyscraper"
  tech.two_string_kite: "2-String Kite"
  tech.xyz_wing: "XYZ-Wing"
  tech.unique_rectangle: "Unique Rectangle"
  tech.w_wing: "W-Wing"
  tech.simple_coloring: "Simple Coloring"
  tech.finned_x_wing: "Finned X-Wing"
  tech.remote_pairs: "Remote Pairs"
  tech.bug: "BUG"
  tech.jellyfish: "Jellyfish"
  tech.finned_swordfish: "Finned Swordfish"
  tech.empty_rectangle: "Empty Rectangle"
  tech.wxyz_wing: "WXYZ-Wing"
  tech.finned_jellyfish: "Finned Jellyfish"
  tech.xy_chain: "XY-Chain"
  tech.multi_coloring: "Multi-Coloring"
  tech.als_xz: "ALS-XZ"
  tech.sue_de_coq: "Sue de Coq"
  tech.forcing_chain: "Forcing Chain"
  tech.nice_loop: "Nice Loop"
  tech.x_cycles: "X-Cycles"
  tech.three_d_medusa: "3D Medusa"
  tech.hidden_unique_rectangle: "Hidden Unique Rectangle"
  tech.avoidable_rectangle: "Avoidable Rectangle"
  tech.als_xy_wing: "ALS-XY-Wing"
  tech.death_blossom: "Death Blossom"
  tech.vwxyz_wing: "VWXYZ-Wing"
  tech.franken_fish: "Franken Fish"
  tech.grouped_x_cycles: "Grouped X-Cycles"
  tech.sashimi_x_wing: "Sashimi X-Wing"
  tech.sashimi_swordfish: "Sashimi Swordfish"
  tech.sashimi_jellyfish: "Sashimi Jellyfish"
  tech.unit_forcing_chain: "Unit Forcing Chain"
  tech.region_forcing_chain: "Region Forcing Chain"
  tech.mutant_fish: "Mutant Fish"
  tech.kraken_fish: "Kraken Fish"
  tech.als_chain: "ALS Chain"
  tech.junior_exocet: "Junior Exocet"
  tech.unique_loop: "Unique Loop"
  tech.continuous_nice_loop: "Continuous Nice Loop"
  tech.grouped_nice_loop: "Grouped Nice Loop"
  tech.backtracking_name: "Backtracking"
  tech.unknown: "Unknown Technique"

  # Region names
  region.row: "Row"
  region.column: "Column"
  region.box: "Box"
  region.unknown: "Unknown Region"

  # Position format (R=Row, C=Column, 1-indexed)
  position.fmt: "R{0}C{1}"

  # Explanation templates
  explain.naked_single: "Naked Single at {0}: only value {1} is possible"
  explain.hidden_single: "Hidden Single at {0}: value {1} can only appear in this cell within its region"
  explain.naked_pair: "Naked Pair [{0}] at {1} in {2} eliminates candidates from other cells"
  explain.naked_triple: "Naked Triple [{0}] at {1} in {2} eliminates candidates from other cells"
  explain.hidden_pair: "Hidden Pair [{0}] at {1} in {2} eliminates other candidates from these cells"
  explain.hidden_triple: "Hidden Triple [{0}] at {1} in {2} eliminates other candidates from these cells"
  explain.pointing_pair: "Pointing Pair: {0} in Box {1} confined to {2} {3} eliminates {0} from other cells in {2} {3}"
  explain.box_line_reduction: "Box/Line Reduction: {0} in {1} {2} confined to Box {3} eliminates {0} from other cells in Box {3}"
  explain.naked_quad: "Naked Quad [{0}] at {1} in {2} eliminates candidates from other cells"
  explain.hidden_quad: "Hidden Quad [{0}] at {1} in {2} eliminates other candidates from these cells"
  explain.x_wing_row: "X-Wing on value {0} in Rows {1} and {2}, Columns {3} and {4} eliminates {0} from other cells in those columns"
  explain.x_wing_col: "X-Wing on value {0} in Columns {1} and {2}, Rows {3} and {4} eliminates {0} from other cells in those rows"
  explain.xy_wing: "XY-Wing: pivot {0} {{{1},{2}}}, wing {3} {{{1},{4}}}, wing {5} {{{2},{4}}} eliminates {4} from cells seeing both wings"
  explain.swordfish_row: "Swordfish on value {0} in Rows {1}, {2}, {3} and Columns {4}, {5}, {6} eliminates {0} from other cells in those columns"
  explain.swordfish_col: "Swordfish on value {0} in Columns {1}, {2}, {3} and Rows {4}, {5}, {6} eliminates {0} from other cells in those rows"
  explain.skyscraper: "Skyscraper on value {0}: conjugate pairs in {1} and {2} share endpoint {3} — eliminates {0} from cells seeing both {4} and {5}"
  explain.two_string_kite: "2-String Kite on value {0}: row pair {1},{2} and column pair {3},{4} connected through shared box — eliminates {0} from cells seeing both endpoints"
  explain.xyz_wing: "XYZ-Wing: pivot {0} {{{1},{2},{3}}}, wing {4} and wing {5} eliminate {3} from cells seeing all three"
  explain.unique_rectangle: "Unique Rectangle: cells {0} with values {{{1},{2}}} — eliminates {1},{2} from {3} to avoid deadly pattern"
  explain.w_wing: "W-Wing: cells {0} and {1} {{{2},{3}}} connected by strong link on {2} — eliminates {3} from cells seeing both"
  explain.simple_coloring_contradiction: "Simple Coloring on {0}: same-color cells see each other — eliminates {0} from all cells of that color"
  explain.simple_coloring_exclusion: "Simple Coloring on {0}: cell {1} sees both colors — eliminates {0} from {1}"
  explain.unique_rectangle_type2: "Unique Rectangle Type 2: cells {0} with values {{{1},{2}}} — extra candidate {3} eliminated from cells seeing both floor cells in shared {4}"
  explain.unique_rectangle_type3: "Unique Rectangle Type 3: cells {0} with values {{{1},{2}}} — floor extras form naked subset in {3}, eliminating from other cells"
  explain.unique_rectangle_type4: "Unique Rectangle Type 4: cells {0} with values {{{1},{2}}} — strong link on {3} in {4} eliminates {5} from floor cells"
  explain.unique_rectangle_type6: "Unique Rectangle Type 6: cells {0} with values {{{1},{2}}} — {3} is conjugate in both parallel lines of the rectangle, locking the pattern — eliminates extras from floor cells"
  explain.finned_x_wing_row: "Finned X-Wing on value {0} in Rows {1} and {2}, Columns {3} and {4} with fin at {5} — eliminates {0} from cells in fin's box"
  explain.finned_x_wing_col: "Finned X-Wing on value {0} in Columns {1} and {2}, Rows {3} and {4} with fin at {5} — eliminates {0} from cells in fin's box"
  explain.sashimi_x_wing_row: "Sashimi X-Wing on value {0} in Rows {1} and {2}, Columns {3} and {4} with fin at {5} — eliminates {0} from cells in fin's box"
  explain.sashimi_x_wing_col: "Sashimi X-Wing on value {0} in Columns {1} and {2}, Rows {3} and {4} with fin at {5} — eliminates {0} from cells in fin's box"
  explain.remote_pairs: "Remote Pairs: chain of {{{0},{1}}} cells from {2} to {3} (length {4}) — eliminates {0},{1} from cells seeing both endpoints"
  explain.bug: "BUG: all cells bivalue except {0} — value {1} must be placed to avoid deadly pattern"
  explain.jellyfish_row: "Jellyfish on value {0} in Rows {1}, {2}, {3}, {4} and Columns {5}, {6}, {7}, {8} eliminates {0} from other cells in those columns"
  explain.jellyfish_col: "Jellyfish on value {0} in Columns {1}, {2}, {3}, {4} and Rows {5}, {6}, {7}, {8} eliminates {0} from other cells in those rows"
  explain.finned_swordfish_row: "Finned Swordfish on value {0} in Rows {1}, {2}, {3} with fin at {4} — eliminates {0} from cells in fin's box"
  explain.finned_swordfish_col: "Finned Swordfish on value {0} in Columns {1}, {2}, {3} with fin at {4} — eliminates {0} from cells in fin's box"
  explain.sashimi_swordfish_row: "Sashimi Swordfish on value {0} in Rows {1}, {2}, {3} with fin at {4} — eliminates {0} from cells in fin's box"
  explain.sashimi_swordfish_col: "Sashimi Swordfish on value {0} in Columns {1}, {2}, {3} with fin at {4} — eliminates {0} from cells in fin's box"
  explain.empty_rectangle: "Empty Rectangle on value {0}: ER in Box {1} with conjugate pair in {2} — eliminates {0} from {3}"
  explain.wxyz_wing: "WXYZ-Wing: pivot {0} with wings {1}, {2}, {3} — eliminates {4} from cells seeing all four"
  explain.finned_jellyfish_row: "Finned Jellyfish on value {0} in Rows {1}, {2}, {3}, {4} with fin at {5} — eliminates {0} from cells in fin's box"
  explain.finned_jellyfish_col: "Finned Jellyfish on value {0} in Columns {1}, {2}, {3}, {4} with fin at {5} — eliminates {0} from cells in fin's box"
  explain.sashimi_jellyfish_row: "Sashimi Jellyfish on value {0} in Rows {1}, {2}, {3}, {4} with fin at {5} — eliminates {0} from cells in fin's box"
  explain.sashimi_jellyfish_col: "Sashimi Jellyfish on value {0} in Columns {1}, {2}, {3}, {4} with fin at {5} — eliminates {0} from cells in fin's box"
  explain.xy_chain: "XY-Chain: chain of {0} bivalue cells from {1} to {2} — eliminates {3} from cells seeing both endpoints"
  explain.multi_coloring_wrap: "Multi-Coloring on {0}: color sees both colors of another cluster — eliminates {0} from all cells of that color"
  explain.multi_coloring_trap: "Multi-Coloring on {0}: cell {1} sees complementary colors from two clusters — eliminates {0}"
  explain.als_xz: "ALS-XZ: ALS {0} and ALS {1} linked by restricted common {2} — eliminates {3} from cells seeing both ALSs"
  explain.sue_de_coq: "Sue de Coq: intersection of {0} and Box {1} — eliminates candidates from rest of line and box"
  explain.forcing_chain: "Forcing Chain: assuming each candidate in {0} leads to the same conclusion — {1}"
  explain.nice_loop: "Nice Loop: alternating inference chain from {0} to {1} — eliminates {2}"
  explain.x_cycles_type1: "X-Cycles on value {0}: continuous loop — eliminates {0} from cells seeing weak link endpoints"
  explain.x_cycles_type2: "X-Cycles on value {0}: strong-strong discontinuity at {1} — places {0}"
  explain.x_cycles_type3: "X-Cycles on value {0}: weak-weak discontinuity at {1} — eliminates {0} from {1}"
  explain.three_d_medusa: "3D Medusa: multi-digit coloring — {0}"
  explain.hidden_unique_rectangle: "Hidden Unique Rectangle: cells {0} with values {{{1},{2}}} — eliminates {3} from {4} to avoid deadly pattern"
  explain.avoidable_rectangle: "Avoidable Rectangle: cells {0} with solved values {{{1},{2}}} — eliminates {3} from {4} to avoid deadly pattern"
  explain.als_xy_wing: "ALS-XY-Wing: ALS {0}, ALS {1}, ALS {2} linked by X={3} and Y={4} — eliminates {5} from cells seeing Z-cells in A and C"
  explain.death_blossom: "Death Blossom: stem {0} with petals {1} — eliminates {2} from cells seeing all petal Z-cells"
  explain.vwxyz_wing: "VWXYZ-Wing: pivot {0} with wings {1}, {2}, {3}, {4} — eliminates {5} from cells seeing all Z-cells"
  explain.franken_fish: "Franken {0} on value {1}: base {2}, cover {3} — eliminates {1} from cover cells outside base"
  explain.mutant_fish: "Mutant Fish on value {0}: base {1}, cover {2} — eliminates {0} from {3} cover cell(s) outside base"
  explain.grouped_x_cycles: "Grouped X-Cycles on value {0}: chain with grouped nodes — {1}"
  explain.kraken_fish: "Kraken Fish on value {0}: finned fish with chain-verified eliminations from {1}"
  explain.als_chain: "ALS Chain ({0} ALSs): eliminates {1} from cells seeing Z-cells in first and last ALS at {2}"
  explain.junior_exocet: "Junior Exocet: base cells {0} and {1} with candidates {{{2}}} — targets {3} and {4} can only contain base candidates"
  explain.unique_loop: "Unique Loop: cells {0} with values {{{1},{2}}} — eliminates {1},{2} from {3} to avoid deadly pattern"
  explain.continuous_nice_loop: "Continuous Nice Loop: loop of {0} nodes — eliminates {1} candidate(s) via weak link logic"
  explain.grouped_nice_loop: "Grouped Nice Loop: alternating inference chain from {0} to {1} — eliminates {2}"
openSUSE Build Service is sponsored by