object B{
def main(a: Array[String]):Unit={
val v=false
val (m,l,k,r,n)=(()=>print("\033[H\033[2J\n"),a(0)toInt,a(1)toInt,scala.util.Random,print _)
val e=Seq.fill(k, l)(v)
m()
(0 to (l*k)/2-(l*k+1)%2).foldLeft(e){(q,_)=>
val a=q.zipWithIndex.map(r => r._1.zipWithIndex.filter(c=>
if(((r._2 % 2) + c._2)%2==0)!c._1 else v)).zipWithIndex.filter(_._1.length > 0)
val f=r.nextInt(a.length)
val s=r.nextInt(a(f)._1.length)
val i=(a(f)._2,a(f)._1(s)._2)
Thread.sleep(1000)
m()
val b=q.updated(i._1, q(i._1).updated(i._2, !v))
b.zipWithIndex.map{r=>
r._1.zipWithIndex.map(c=>if(c._1)n("X")else if(((r._2 % 2)+c._2)%2==0)n("O")else n("_"))
n("\n")
}
b
}
}
}
怎么运行的
该算法首先用错误值填充2D序列。它根据所输入的命令行参数确定存在多少次迭代(打开的框)。它使用此值作为上限创建折叠。fold的整数值仅隐式用作计算算法应运行多少次迭代的方式。我们之前创建的填充序列是折叠的起始序列。它用于生成带有对应指数的新2D假值序列。
例如,
[[false, true],
[true, false],
[true, true]]
将变成
[[(false, 0)], [(false, 1)]]
请注意,结果列表中将省略所有完全正确的列表(长度为0)。然后,算法获取此列表,并从最外面的列表中选择一个随机列表。选择随机列表作为我们选择的随机行。从该随机行中,我们再次找到一个随机数,即列索引。一旦找到了这两个随机索引,我们就将进入的线程休眠1000毫秒。
睡眠完成后,我们清除屏幕并创建一个新板,并在创建true
的随机索引中更新其值。
为了正确打印出来,我们使用map
地图索引并将其与地图索引一起压缩,以便在上下文中使用。我们使用序列的真值决定是否打印an X
或O
or或_
。要选择后者,我们使用索引值作为指导。
有趣的事情要注意
要确定是否应打印an O
或an _
,请使用条件((r._2 % 2) + c._2) % 2 == 0
。r._2
引用当前行索引,而c._2
引用当前列。如果一个在奇数行上,r._2 % 2
将为1,因此c._2
在条件中偏移一。这样可以确保在奇数行上,列按预期移动1。
"\033[H\033[2J\n"
根据我阅读的一些Stackoverflow答案,打印出字符串可以清除屏幕。它正在向终端写入字节,并做一些我不太了解的时髦事情。但是我发现它是最简单的方法。但是,它在Intellij IDEA的控制台模拟器上不起作用。您必须使用常规终端运行它。
第一次查看此代码时,可能会发现另一个方程式很奇怪(l * k) / 2 - (l * k + 1) % 2
。首先,让我们对变量名称进行神秘化。l
引用传递给程序的第一个参数,而k
引用第二个。要翻译它,(first * second) / 2 - (first * second + 1) % 2
。该方程式的目的是提出获得所有X序列所需的确切迭代次数。我第一次这样做,就是那样(first * second) / 2
做。对于n
每个子列表中的每个元素,都有n / 2
气泡可以弹出。但是,在处理诸如(11 13)
。我们需要计算两个数字的乘积,如果它是偶数,即使它是奇数,也要使其为奇数,然后将其乘以2。这是可行的,因为奇数的行和列将需要更少的迭代以获得最终结果。
map
用代替a,forEach
因为它的字符较少。
可能需要改进的地方
关于此解决方案的真正困扰我的一件事是频繁使用zipWithIndex
。它占用了很多字符。我试图这样做,以便可以定义自己的一个字符函数,该函数仅zipWithIndex
使用传入的值来执行。但是事实证明,Scala不允许匿名函数具有类型参数。不使用zipWithIndex
我可能正在做的事情还有另一种方法,但是我没有想过一个聪明的方法。
当前,代码分两步运行。第一个生成一个新板,而第二个遍将其打印出来。我认为,如果将这两个通道合并为一个通道,则将节省几个字节。
这是我完成的第一个代码高尔夫球,因此我确信还有很多改进的空间。如果您想在我尽可能优化字节之前看到代码,就在这里。
1
和0
代替O
andX
吗?