关闭。这个问题是 off-topic 。它目前不接受答案。
9年前关闭。
锁定。这个问题及其答案是 locked 因为这个问题是题外话但具有历史意义。它目前不接受新的答案或互动。
2009 年即将结束,随着经济和所有方面的发展,我们将节省我们的钱,而不是购买昂贵的烟花,今年我们将用 ASCII 艺术庆祝。
挑战
给定一组烟花和一个时间,拍摄当时烟花的照片并将其绘制到控制台。
在新年前夜 (UTC) 午夜之前输入的最佳解决方案将获得 500 代表的赏金。这是代码高尔夫,所以字符数很重要;然而,社区投票也是如此,我保留最终决定什么是最好的/最酷的/最有创意的/等等。
输入数据
请注意,我们的坐标系是从左到右、从下到上,因此所有烟花都在 y
坐标为 0(零)处发射。
输入数据由以下形式的烟花组成
(x, speed_x, speed_y, launch_time, detonation_time)
在哪里
x
是烟花发射的位置(列),speed_x
和speed_y
是烟花在发射时的水平和垂直速度,launch_time
是这个烟花发射的时间点,detonation_time
是这个烟花爆炸的时间点。 烟花数据可能在您的程序中被硬编码为 5 元组列表(或您语言中的等效项),不计入字符数。但是,更改这些数据必须很容易。
您可以做出以下假设:
-20 <= x <= 820
-20 <= speed_x <= 20
0 < speed_y <= 20
launch_time >= 0
launch_time < detonation_time < launch_time + 50
单个附加输入数据是应该呈现的时间点。这是一个非负整数,通过标准输入或命令行参数(无论您选择哪个)提供给您。
这个想法是(假设您的程序是一个名为
firework.py
的python脚本)这个bash脚本为您提供了一个不错的烟花动画:#!/bin/bash
I=0
while (( 1 )) ; do
python firework.py $I
I=$(( $I + 1 ))
done
(随意将等效的 .BAT 文件放在这里)。
烟花的生活
烟花的生命周期如下:
(x, 0)
,速度向量为 (speed_x, speed_y)
。 但它们的速度不同。每个速度都基于火箭的速度,
speed_x
加上 -20、0 或 20,speed_y
加上 -10、0 或 10。这是九种可能的组合。 speed_y
中减去恰好为 2(二)的重力常数。水平
speed_x
保持不变。 speed_y
位置低于零时,您可能会忘记它。 输出
我们想要的是烟花在给定时间点的样子。我们只查看帧
y
和 0 <= x <= 789
,将其映射到 79x24 字符输出。因此,如果火箭或 Spark 的位置为 (247, 130),我们在第 24 列(从零开始,所以它是第 25 列)、第 13 行(从零开始并从底部开始计数,所以它是第 23 行)绘制一个字符- 13 = 10,第 11 行
输出)。
绘制哪个角色取决于火箭/ Spark 的当前速度:
0 <= y <= 239
,则字符为“speed_y == 0 or abs(speed_x) / abs(speed_y) > 2
”。 -
,则字符为“speed_x == 0 or abs(speed_y) / abs(speed_x) > 2
”。 |
”或“\
”(你猜对了)。 /
”代替。因此,假设您在 X
处有一个 Spark ,在 (536, 119)
处有一个 Spark ,则无论它们的速度如何,您都会绘制“(531, 115)
”。 * 更新:这些是整数除法,因此斜率必须分别至少为 3 或最多 1/3
输出(写入标准输出)为 24 行,每行以换行符结尾。尾随空格将被忽略,因此您可以但不需要填充到 79 的宽度。行的长度不能超过 79 个字符(不包括换行符)。所有内部间距都必须是空格字符 (ASCII 32)。
样本数据
烟花:
fireworks = [(628, 6, 6, 3, 33),
(586, 7, 11, 11, 23),
(185, -1, 17, 24, 28),
(189, 14, 10, 50, 83),
(180, 7, 5, 70, 77),
(538, -7, 7, 70, 105),
(510, -11, 19, 71, 106),
(220, -9, 7, 77, 100),
(136, 4, 14, 80, 91),
(337, -13, 20, 106, 128)]
时间 33 处的输出:
\|/
/\
- |/
- | ——
/\
77 时刻的输出:
\
\
X
\
时间 93 处的输出:
\|/
\//
- - -\
\
/\\
更新: 我已将 0 到 99 时间的预期输出上传到 firework.ü-wie-geek.de/NUMBER.html ,其中 NUMBER 是时间。它包括调试信息;单击一个粒子以查看其当前位置、速度等。是的,它是一个变音域。如果您的浏览器无法处理(显然堆栈溢出也无法处理),请尝试 firework.xn---wie-geek-p9a.de 。
另一个更新: 正如下面评论中所暗示的,现在在 YouTube 上可以使用更长的烟花。它是用 MizardX' entry 的修改版本创建的,烟花总数为 170(是的,这比规范要求的多,但程序优雅地处理了它)。除了颜色、音乐和片尾画面,动画可以通过此代码高尔夫的任何条目重新创建。所以,如果你足够怪异,可以享受 ASCII 艺术烟花(你知道你是):玩得开心,祝大家新年快乐!
最佳答案
这是我在 Python 中的解决方案:
c = [(628, 6, 6, 3, 33),
(586, 7, 11, 11, 23),
(185, -1, 17, 24, 28),
(189, 14, 10, 50, 83),
(180, 7, 5, 70, 77),
(538, -7, 7, 70, 105),
(510, -11, 19, 71, 106),
(220, -9, 7, 77, 100),
(136, 4, 14, 80, 91),
(337, -13, 20, 106, 128)]
t=input()
z=' '
s=([z]*79+['\n'])*23+[z]*79
def p(x,y,i,j):
if 0<=x<790 and 0<=y<240:p=x/10+(23-y/10)*80;I=abs(i);J=abs(j);s[p]='X-|\\/'[[s[p]!=z,I>=3*J,J>=3*I,i*j<0,1].index(1)]
for x,i,j,l,d in c:
T=t-l;x+=i*T
if t>=d:e=t-d;[p(x+X*e,j*T+e*(Y-e+1),i+X,j+Y-2*e)for X in -20,0,20 for Y in -10,0,10]
elif t>=l:p(x,j*T,i,j)
print ''.join(s)
从标准输入中获取时间,它有 342 个字符的数量。我仍在尝试想象 OP 是如何获得 320 的:P
编辑:
这是我能得到的最好的,根据 wc 有 322 个字符
t=input()
s=([' ']*79+['\n'])*24
def p(x,y,i,j):
if 790>x>-1<y<240:p=x/10+(23-y/10)*80;I=abs(i);J=abs(j);s[p]='X-|\\/'[[s[p]>' ',I>=3*J,J>=3*I,i*j<0,1].index(1)]
for x,i,j,l,d in c:
T=t-l;x+=i*T;e=t-d
if t>=d:[p(x+X*e,j*T+e*(Y-e+1),i+X,j+Y-2*e)for X in-20,0,20for Y in-10,0,10]
elif t>=l:p(x,j*T,i,j)
print''.join(s),
关于language-agnostic - 代码高尔夫 : New Year's Fireworks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1947031/