首页
学习
活动
专区
圈层
工具
发布

ASCII水厂
EN

Code Golf用户
提问于 2014-07-16 06:12:04
回答 2查看 1.6K关注 0票数 19

Intro

考虑字符f A\/的网格,如

代码语言:javascript
复制
f  f  f  
      A  
   A / \ 
\ /     A
    A \/ 
   /     
 \/         

其中:

  • f代表着一个水龙头,它把水流往下倒。
  • A把上面的水流分岔,所以一半向左,一半向右。
  • \将上方的水流向右移动一个单位。
  • /将上方的水流向左移动一个单位。
  • 组合\/创造了一个无限容量的水槽,收集上面的水流。
  • [space]是空旷的空间,水无法通过。

由此,我们可以想象水(*)从水龙头出来并掉进沟槽或从栅格区域掉下来时所走的道路:

代码语言:javascript
复制
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。除了空格字符之外,您不应该覆盖任何东西,网格不应该改变大小。

代码语言:javascript
复制
 f
/A

没有什么需要做的,因为虽然水确实在A的两边流动,但如果不移除/,它就不能被吸引到左边,并且在不使2×2网格变大的情况下,它也不能被吸引到右边。

挑战3(更新)

编写一个程序,接受两个非负整数,总T和保持K的数量(T >= K)。用一个f生成并绘制一个网格,这样当水龙头排出T单位的水时,精确的K就会流入槽中。如果在有限网格中对(T,K)对不可能做到这一点,那么输出“不可能”。

澄清(适用于所有挑战)

  • 输入可以通过stdin,或文件,甚至是网格的字符串表示形式上的函数调用。只需清楚地说明如何运行不同的输入。
  • 输出必须输出到标准输出。
  • \AA/AA也是你所期望的低谷。
  • W×h网格将始终是格式良好的w*h字符矩形,不包括换行符。不会有遗漏的尾随空间,也不会出现*
  • 网格尺寸可以小到1×1,任意大。(在合理范围内任意大,int.maxValue等是一个可接受的限制。T和K也是如此)
  • f上方的流直接流过它。
  • 水龙头可以在任何地方,而不只是在最上面的一排。
  • A总是把倒在上面的水分成两半。

注意:像/A//这样的东西是完全有效的。水在角色之间是自由流动的(尽管对于挑战2来说,没有足够的空间来绘制它)。

所以,在设置中

代码语言:javascript
复制
ff

/A

左边的f流倾泻而下,命中/并向左移动。右边的f流倾泻而下,到达A,一半在A/之间,另一半在左。

例如:

代码语言:javascript
复制
 ff
 **
*/A*
** *
** *
EN

回答 2

Code Golf用户

发布于 2014-07-21 13:41:22

首先,我有一个关于挑战的问题。由于我没有足够的声誉来评论这个问题,所以我在这里写道:

  • /A (水在A上流动)、// (向右流动)的行为以及这个原理的变化是什么?水是流到旁边的第一个“自由点”,还是“下面”它的邻居?

只是一个简单的尝试,它可以被简化(我稍后将通过编辑这篇文章)。

编辑:第二个版本,稍微小一点。我采用了一种不同的方法:不是寻找每个单元格来检查从顶部和侧面开始的是什么,而是从水龙头开始,然后用递归向下“流”。

Javascript,226个字节(挑战1)

代码语言:javascript
复制
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)};

Javascript,204个字节(挑战2)

代码语言:javascript
复制
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)};

Javascript,238个字节(挑战1+ 2)

代码语言:javascript
复制
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)};

如何使用

提供地图的二维表示。以下是问题中提供的例子:

代码语言:javascript
复制
var input = [["f"," "," ","f"," "," ","f"," "," "],[" "," "," "," "," "," ","A"," "," "],[" "," "," ","A"," ","/"," ","\\"," "],["\\"," ","/"," "," "," "," "," ","A"],[" "," "," "," ","A"," ","\\","/"," "],[" "," "," ","/"," "," "," "," "," "],[" ","\\","/"," "," "," "," "," "," "]];
f(input);

输出

挑战1:它将简单地创建一个对话框(警报),其结果(上面的示例为0.75)。

挑战2:它将直接修改地图。我应该打印出来吗?如果是,是否接受console.log?作为一个有效的输出?

挑战1+2:以上两者的结合,显然.

票数 3
EN

Code Golf用户

发布于 2014-07-22 18:38:23

Python3,186个字节(挑战3)

我从VisualMelon的回答那里获得了网格的想法。该函数应该打印一个有效的网格,以标出任意大的T和K,当然,这是可能的(有限大小的网格)。

代码语言:javascript
复制
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函数。

代码语言:javascript
复制
>>> c(24, 9)
 f 
/A 
///
AA 
///
AA 
///

>>> c(6, 2)
Impossible
票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/34609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档