考虑字符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假设三个水龙头一次输出一个相同的水量,我们可以看到
由此我们可以看出,水的(1 + 3/4 + 1/4 + 1/4) / 3 = 75%是被凹槽捕获的,(1/4 + 1/4 + 1/4) / 3 = 25%从网格上掉下来。
您可以完成与ASCII水流量设置相关的任何或所有这些挑战。他们都是暗号--高尔夫,每个挑战的最短答案都是赢家。公认的答案将是谁完成了最大的挑战,总代码长度作为平局。
挑战1
编写一个程序,输出在给定网格中流入沟槽的水的比例。上面示例的输出将仅仅是0.75。
挑战2
编写一个程序,在给定网格的情况下,像我上面所做的那样,在水流的地方绘制*'s。除了空格字符之外,您不应该覆盖任何东西,网格不应该改变大小。
f
/A没有什么需要做的,因为虽然水确实在A的两边流动,但如果不移除/,它就不能被吸引到左边,并且在不使2×2网格变大的情况下,它也不能被吸引到右边。
挑战3(更新)
编写一个程序,接受两个非负整数,总T和保持K的数量(T >= K)。用一个f生成并绘制一个网格,这样当水龙头排出T单位的水时,精确的K就会流入槽中。如果在有限网格中对(T,K)对不可能做到这一点,那么输出“不可能”。
\A、A/和AA也是你所期望的低谷。*。f上方的流直接流过它。A总是把倒在上面的水分成两半。注意:像/A和//这样的东西是完全有效的。水在角色之间是自由流动的(尽管对于挑战2来说,没有足够的空间来绘制它)。
所以,在设置中
ff
/A左边的f流倾泻而下,命中/并向左移动。右边的f流倾泻而下,到达A,一半在A和/之间,另一半在左。
例如:
ff
**
*/A*
** *
** *发布于 2014-07-21 13:41:22
首先,我有一个关于挑战的问题。由于我没有足够的声誉来评论这个问题,所以我在这里写道:
/A (水在A上流动)、// (向右流动)的行为以及这个原理的变化是什么?水是流到旁边的第一个“自由点”,还是“下面”它的邻居?只是一个简单的尝试,它可以被简化(我稍后将通过编辑这篇文章)。
编辑:第二个版本,稍微小一点。我采用了一种不同的方法:不是寻找每个单元格来检查从顶部和侧面开始的是什么,而是从水龙头开始,然后用递归向下“流”。
function f(c){function h(b,a,d,e){b<c.length&&0<=a&&a<c[0].length&&("\\"==c[b][a]?"/"==e||"A"==e?g+=d:h(b,a+1,d,"\\"):"/"==c[b][a]?"\\"==e||"A"==e?g+=d:h(b,a-1,d,"/"):"A"==c[b][a]?"A"==e||"\\"==e||"/"==e?g+=d:(h(b,a-1,d/2,"A"),h(b,a+1,d/2,"A")):h(b+1,a,d,c[b][a]))}for(var g=0,m=0,k=0;k<c.length;k++)for(var l=0;l<c[k].length;l++)"f"==c[k][l]&&(h(k+1,l,1),m++);alert(g/m)};function f(c){function e(b,a,d){b<c.length&&0<=a&&a<c[0].length&&("\\"==c[b][a]?"/"!=d&&"A"!=d&&e(b,a+1,"\\"):"/"==c[b][a]?"\\"!=d&&"A"!=d&&e(b,a-1,"/"):"A"==c[b][a]?"A"!=d&&"\\"!=d&&"/"!=d&&(e(b,a-1,"A"),e(b,a+1,"A")):(" "==c[b][a]&&(c[b][a]="*"),e(b+1,a,c[b][a])))}for(var g=0;g<c.length;g++)for(var h=0;h<c[g].length;h++)"f"==c[g][h]&&e(g+1,h)};function f(c){function h(b,a,d,e){b<c.length&&0<=a&&a<c[0].length&&("\\"==c[b][a]?"/"==e||"A"==e?g+=d:h(b,a+1,d,"\\"):"/"==c[b][a]?"\\"==e||"A"==e?g+=d:h(b,a-1,d,"/"):"A"==c[b][a]?"A"==e||"\\"==e||"/"==e?g+=d:(h(b,a-1,d/2,"A"),h(b,a+1,d/2,"A")):(" "==c[b][a]&&(c[b][a]="*"),h(b+1,a,d,c[b][a])))}for(var g=0,m=0,k=0;k<c.length;k++)for(var l=0;l<c[k].length;l++)"f"==c[k][l]&&(h(k+1,l,1),m++);alert(g/m)};提供地图的二维表示。以下是问题中提供的例子:
var input = [["f"," "," ","f"," "," ","f"," "," "],[" "," "," "," "," "," ","A"," "," "],[" "," "," ","A"," ","/"," ","\\"," "],["\\"," ","/"," "," "," "," "," ","A"],[" "," "," "," ","A"," ","\\","/"," "],[" "," "," ","/"," "," "," "," "," "],[" ","\\","/"," "," "," "," "," "," "]];
f(input);挑战1:它将简单地创建一个对话框(警报),其结果(上面的示例为0.75)。
挑战2:它将直接修改地图。我应该打印出来吗?如果是,是否接受console.log?作为一个有效的输出?
挑战1+2:以上两者的结合,显然.
发布于 2014-07-22 18:38:23
我从VisualMelon的回答那里获得了网格的想法。该函数应该打印一个有效的网格,以标出任意大的T和K,当然,这是可能的(有限大小的网格)。
from fractions import*
def c(T,K):
p=print;g=gcd(T,K);K//=g;T//=g
if T&(T-1):p('Impossible')
else:
p(' f ')
while T-1:
T//=2;p('A/'[K<T]+'A \n///')
if K>=T:K-=T
p('AAA'*K)使用要保留的总量和金额作为参数调用c函数。
>>> c(24, 9)
f
/A
///
AA
///
AA
///
>>> c(6, 2)
Impossiblehttps://codegolf.stackexchange.com/questions/34609
复制相似问题