You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

F#读取Console.In重复返回旧值:CodeGame《The Descent》解谜异常

解决F# CodeGame《The Descent》循环重复输出相同索引的问题

看起来你遇到的问题大概率是输入读取的逻辑位置不对——你可能把读取8个数字的代码放在了循环外部,导致程序只在启动时读取一次输入,后续循环一直复用第一次的数组,自然每次输出相同的索引。而你在交互式环境测试idxWithHighestValue时,每次都传入了新数组,所以结果是对的,这也验证了函数本身没问题,问题出在循环和输入读取的结合上。

问题代码的典型错误结构

比如你可能写了类似这样的代码:

open System

let idxWithHighestValue (arr: int array) =
    arr |> Array.indexed |> Array.maxBy snd |> fst

// 错误:只读取一次输入,后续循环复用这个数组
let heights = [| for _ in 1..8 -> Console.ReadLine() |> int |]

let rec gameLoop () =
    let maxIdx = idxWithHighestValue heights
    printfn "%d" maxIdx
    gameLoop ()

gameLoop ()

这里heights数组在程序启动时就被初始化了,后续的gameLoop每次都用这个固定数组,不管你后续输入什么新值,程序根本没去读新的输入。

修正后的正确代码

把读取输入的逻辑移到循环内部,确保每次循环都重新读取8个新的数字:

open System

let idxWithHighestValue (arr: int array) =
    arr |> Array.indexed |> Array.maxBy snd |> fst

let rec gameLoop () =
    // 每次循环都重新读取8个输入值
    let heights = [| for _ in 1..8 -> Console.ReadLine() |> int |]
    let maxIdx = idxWithHighestValue heights
    printfn "%d" maxIdx
    gameLoop ()

gameLoop ()

为什么这样能解决问题?

  • 现在每次调用gameLoop时,都会重新执行Console.ReadLine()8次,获取最新的输入值组成新数组。
  • 你的idxWithHighestValue函数本身是正确的,因为它只处理传入的数组,没有依赖外部状态,所以在交互式环境测试时每次传新数组都能得到正确结果。

另外要注意CodeGame的输入机制:每次游戏回合都会给你8个新的数字,你必须在每个回合都读取这8个值,不能跳过或者复用旧值,否则就会出现你遇到的输出重复的问题。

内容的提问来源于stack exchange,提问作者Boris Callens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:45:06