介绍
考虑一个字符网格,f A\/
例如
f f f
A
A / \
\ / A
A \/
/
\/
哪里:
f
代表向下方倒水的水龙头A
将上面的水分叉,所以正好有一半左,右又有一半\
将水流向右上方移动一个单位/
将上方的水流向左移动一个单位- 组合
\/
产生了一个容量无限的槽,可以收集上方的水流 [space]
是空荡荡的空间,水无法通过
从中我们可以想象水(*
)从水龙头流出并落入水槽或网格区域时所走的路径:
f f f <-- first second and third faucets
* * *A*
* *A*/ \*
\*/ * *A <-- a '*' is not drawn to the right of this A because it would be out of the 9×7 bounds
* *A*\/ <-- upper trough
**/ *
\/ * <-- lower trough
假设3个水龙头一次输出相同量的水,我们可以看到
- 所有第一个水龙头的水都进入较低的水槽。
- 第二个水龙头的一半水流到下部水槽,另一半流到下部水槽和落水网格之间。
- 第三龙头的水的四分之一流到下部水槽,四分之一从网格底部掉落,四分之一进入上部水槽,四分之一从右边的网格掉落。
由此我们可以看出,(1 + 3/4 + 1/4 + 1/4) / 3 = 75%
水被水槽捕获并(1/4 + 1/4 + 1/4) / 3 = 25%
从网格上掉下。
挑战性
您可以完成与此ASCII水流设置有关的任何或所有这些挑战。它们都是代码高尔夫,每个挑战的最短答案是获胜者。接受的答案将是完成最多挑战的人,并且总代码长度是决胜局。
挑战1
编写一个程序,为给定的网格输出流入槽中的水量。上面示例的输出将仅仅是0.75
。
挑战2
编写一个程序,给定一个网格,*
像我上面所做的那样在水流过的地方绘制。除空格字符外,您不应覆盖任何内容,并且网格不应更改大小。所以对于像
f
/A
不需要做任何事情,因为尽管水确实在A的两侧流动,但是如果不移除A,就不能向左抽水,/
而没有扩大2×2网格也就不能向右抽水。
挑战3(已更新)
编写一个程序,该程序使用两个非负整数,即总T和保持K的数量(T> = K)。生成并绘制一个正好为网格的网格,f
以便当该龙头倒出T单位的水时,恰好K会流入槽中。如果不可能在特定(T,K)对的有限网格中执行此操作,则输出“不可能”。
澄清(适用于所有挑战)
- 输入可以通过stdin或文件,甚至可以通过网格的字符串表示形式进行的函数调用。只要弄清楚如何运行不同的输入即可。
- 输出必须转到stdout。
\A
和A/
和AA
也波谷你所期望的。- w x h网格将始终是w * h字符的格式良好的矩形,不包括换行符。不会缺少尾随空格,也不会出现
*
。 - 网格尺寸可以小至1×1,也可以大。(在合理范围内任意大,可以使用int.maxValue之类的限制。T和K也是如此。)
- 流上方的
f
流直接流过它。 - 水龙头可以在任何地方,而不仅限于第一行。
A
总是将倒在上面的水量精确地分成两半。
注意:/A
和之类的事情//
都是完全有效的。水不字符之间自由流动(尽管挑战2有没有足够的空间来绘制)。
因此,在设置中
ff
/A
左f
流倾泻而下,撞到/
并向左移动。正确的f
流倾泻而下,撞击A
,半顺利,和左半之间那张A
和/
。
例如
ff
**
*/A*
** *
** *
/A
如果水掉到上A
。对于所有挑战,最好弄清是否\A
是低谷。对于第三个挑战,是否应该A
假设落在a上的3个单位是分裂的1.5 / 1.5
(因此输入实际上是一个有理数)还是2 / 1
在这种情况下,哪一方接收2
?
A
那么双方都将获得1.5。这取决于编码器,以确保浮动精度不是问题。)
f
s,因此不是一个有效的答案