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
相关产品推荐
相关产品推荐

