language-agnostic - 代码高尔夫 : New Year's Fireworks

标签 language-agnostic

关闭。这个问题是 off-topic 。它目前不接受答案。




9年前关闭。










锁定。这个问题及其答案是 locked 因为这个问题是题外话但具有历史意义。它目前不接受新的答案或互动。








2009 年即将结束,随着经济和所有方面的发展,我们将节省我们的钱,而不是购买昂贵的烟花,今年我们将用 ASCII 艺术庆祝。

挑战

给定一组烟花和一个时间,拍摄当时烟花的照片并将其绘制到控制台。

在新年前夜 (UTC) 午夜之前输入的最佳解决方案将获得 500 代表的赏金。这是代码高尔夫,所以字符数很重要;然而,社区投票也是如此,我保留最终决定什么是最好的/最酷的/最有创意的/等等。

输入数据

请注意,我们的坐标系是从左到右、从下到上,因此所有烟花都在 y 坐标为 0(零)处发射。

输入数据由以下形式的烟花组成

(x, speed_x, speed_y, launch_time, detonation_time)

在哪里
  • x 是烟花发射的位置(列),
  • speed_xspeed_y是烟花在发射时的水平和垂直速度,
  • launch_time 是这个烟花发射的时间点,
  • detonation_time 是这个烟花爆炸的时间点。

  • 烟花数据可能在您的程序中被硬编码为 5 元组列表(或您语言中的等效项),不计入字符数。但是,更改这些数据必须很容易。

    您可以做出以下假设:
  • 有合理数量的烟花(比如少于一百)
  • 对于每个烟花,所有五个数字都是合理范围内的整数(例如,每个 16 位就足够了),
  • -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)
  • 对于每个时间步长,速度向量被添加到位置。对牛顿定律稍加拉伸(stretch),我们假设速度保持不变。
  • 引爆时,火箭爆炸成九个 Spark 。所有九个 Spark 在这个时间点的位置相同(如果火箭没有爆炸,它就会有这个位置),
    但它们的速度不同。每个速度都基于火箭的速度,speed_x 加上 -20、0 或 20,speed_y 加上 -10、0 或 10。这是九种可能的组合。
  • 爆炸时间过后,重力开始拉动:随着每个时间步长,从每个 Spark 的 speed_y 中减去恰好为 2(二)的重力常数。
    水平 speed_x 保持不变。
  • 对于引爆时间后的每个时间步,你 首先 将速度向量添加到位置, 243145 23145 23145 23145 23145 23145
  • 当 Spark 的 speed_y 位置低于零时,您可能会忘记它。

  • 输出

    我们想要的是烟花在给定时间点的样子。我们只查看帧 y0 <= 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/

    相关文章:

    language-agnostic - 依赖注入(inject)最佳实践和反模式

    math - float 学有问题吗?

    c# - Read 和 Load 的语义差异

    unit-testing - 可以在不更改任何代码的情况下对最初未设计的单元测试代码进行测试吗?

    python - 随机选择一个 5 位数字和单独选择每个数字有什么区别?

    algorithm - 针对多种模式进行高效字符串匹配的数据结构

    language-agnostic - SRP 不违反封装

    language-agnostic - 实现插件系统有哪些不同的方法?

    algorithm - Ant 的战斗策略

    unit-testing - 摆脱子组件对象的 'new' 运算符