argv - 读取多位命令行参数

标签 argv j

我正在学习 J,并已将教程修改为由 ./knight.j N 调用的 jconsole 脚本,以返回 Knight's tour 作为输出。对于 NxN 板。

#!/usr/local/bin/j

kmoves=: 3 : 0
 t=. (>,{;~i.y) +"1/ _2]\2 1 2 _1 1 2 1 _2 _1 2 _1 _2 _2 1 _2 _1
 (*./"1 t e. i.y) <@#"1 y#.t
)

ktour=: 3 : 0
 M=. >kmoves y
 p=. k=. 0
 b=. 1 $~ *:y
 for. i.<:*:y do.
  b=. 0 k}b
  p=. p,k=. ((i.<./) +/"1 b{~j{M){j=. ({&b # ]) k{M
 end.
 assert. ~:p
 (,~y)$/:p
)

echo ktour 0".>2}.ARGV
exit''

但是,我在处理大于 9 的数字的 ARGV 时遇到困难。该脚本可以在单位数字输入下正常工作:

$ ./knight.j 8
 0 25 14 23 28 49 12 31
15 22 27 50 13 30 63 48
26  1 24 29 62 59 32 11
21 16 51 58 43 56 47 60
 2 41 20 55 52 61 10 33
17 38 53 42 57 44  7 46
40  3 36 19 54  5 34  9
37 18 39  4 35  8 45  6

但在两位数输入时失败:

$ ./knight.j 10
|length error: kmoves
|   (*./"1 t e.i.y)<@#"1 y    #.t
   ARGV
┌─────────────────┬──────────┬──┐
│/Users/v64/.bin/j│./knight.j│10│
└─────────────────┴──────────┴──┘

如果我将参数的数字分成不同的参数,它就会起作用:

$ ./knight.j 1 0
 0 17 96 67 14 19 84 35 12 21
99 64 15 18 97 68 13 20 37 34
16  1 98 95 66 85 36 83 22 11
63 92 65 86 81 94 69 72 33 38
 2 87 90 93 76 71 82 39 10 23
91 62 53 78 89 80 75 70 73 32
44  3 88 61 52 77 40 59 24  9
47 50 45 54 79 60 27 74 31 58
 4 43 48 51  6 41 56 29  8 25
49 46  5 42 55 28  7 26 57 30
   ARGV
┌─────────────────┬──────────┬─┬─┐
│/Users/v64/.bin/j│./knight.j│1│0│
└─────────────────┴──────────┴─┴─┘

我从概念上理解为什么这样做有效,但我不知道如何修改脚本以接受“10”作为单个参数。

最佳答案

感谢有关 ARGV 的附加信息。我认为问题在于 0 ". > 2}.ARGV 是一个长度为 1 的列表,当 ' 10' 是第三个盒子,当 '9' 位于第三个盒子中时,原子的形状为空。

  ARGV=: '/Users/v64/.bin/j';'./knight.j';'10'
   ARGV
┌─────────────────┬──────────┬──┐
│/Users/v64/.bin/j│./knight.j│10│
└─────────────────┴──────────┴──┘
     $ 0 ".>2}. ARGV      NB. 1 item list
1
     0 ".>2}. ARGV
10
   ARGV=: '/Users/v64/.bin/j';'./knight.j';'9'
     $ 0 ".>2}. ARGV      NB. atom with empty shape

     0 ".>2}. ARGV
9

您可以通过在长度为 1 的列表上使用 {. 来更改 '10' 结果的形状,使其成为一个原子,我想您会发现您的动词现在适用于两位数。

     ARGV=: '/Users/v64/.bin/j';'./knight.j';'10'
     ARGV
┌─────────────────┬──────────┬──┐
│/Users/v64/.bin/j│./knight.j│10│
└─────────────────┴──────────┴──┘
     $ {. 0 ".>2}. ARGV    NB. Atom with empty shape

     {. 0 ".>2}. ARGV
10 

我不认为这是您所期望的原因,但有时确实会发生看起来像原子的结果实际上是 1 项列表,这可能会导致长度错误。

希望这有帮助。

关于argv - 读取多位命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49156481/

相关文章:

c - 了解 C 中的取消引用、地址和数组下标运算符

input - 如何使用 J 编程语言获取用户输入

j - 将动词应用于子数组,就位?

j - J 中给定长度的所有 bool 可能性

function - 您如何称呼这种函数式语言功能?

c - 进入main之前的段错误

python - 在 Python 中使用命令行参数 : Understanding sys. argv

C:通过 argv[] 将文件名加载到结构中,但我不想要文件类型(例如 .txt)?

j - 将 csv 文件导入 J 并将它们用作变量