如何修复J语言中'noun result was required'错误(AoC第4题)
问题分析与修复
错误提示|noun result was required: loop指向condicion,说明condicion的计算结果不是J能识别的合法数值(0/1布尔值),无法用于if.判断。核心问题出在数据解析阶段没有将字符串转换为整数,导致后续的比较操作<:/>:无法生成正确的布尔值。
具体问题点
你的concatIntegers函数将数据拼接成带x的字符串(比如2x4),但后续没有把这些字符串转换成整数类型。当你用<:比较字符串时,J会按字符顺序比较,结果不是0/1的布尔值,而是非预期的字符串或结构,最终导致condicion不符合if.的语法要求。
修复方案
1. 修正数据解析,转换为整数
在生成matriz时,添加J的".(名词化,即字符串转数字)操作,把解析后的字符串转换为整数:
matriz =. 250 4 $ ". > lista_2 NB. 关键修复:将字符串转为整数
2. 可选:简化循环逻辑(更符合J的风格)
原显式循环可以用J的向量操作简化,避免手动循环的冗余,同时减少出错概率:
loop =: monad : 0 'a b c d' =. |: y NB. 把矩阵四列拆分到四个变量 condicion =. ((a <: c) *. (b >: d)) +. ((c <: a) *. (d >: b)) +/ condicion NB. 直接求和满足条件的行数 )
完整修复后的代码
fn =. < 'D:/PyCharm/AOC/output4.txt' data =. freads fn concatIntegers =. ,&'x'@,&.&": separado =. ;: data lista =. > ((i.(#separado)%2)*2) {separado n_lista =. #lista n_2 =. n_lista % 4 lista_2 =. concatIntegers each/|:lista matriz =. 250 4 $ ". > lista_2 NB. 转换为整数 loop =: monad : 0 res =. 0 for_i. i.250 do. fila =. i { matriz elfo11 =. 0 {fila elfo12 =. 1 {fila elfo21 =. 2 {fila elfo22 =. 3 {fila condicion =. ((elfo11 <: elfo21) *. (elfo12 >: elfo22)) +. ((elfo21 <: elfo11) *. (elfo22 >: elfo12)) if. condicion do. res =. >: res end. end. res ) loop matriz
验证步骤
- 运行前先测试
matriz的类型:输入# matriz确认是250 4的矩阵,输入0 { matriz确认每行都是整数而非字符串。 - 测试
condicion的计算:取任意一行数据,手动执行比较逻辑,确认返回结果是0或1的布尔值。
内容的提问来源于stack exchange,提问作者Oqueo34
相关产品推荐
相关产品推荐

