编程高尔夫:玩俄罗斯方块

2024-03-14

基础知识:

考虑以下四格骨牌和空的比赛场地:



                                            0123456789
    I   O    Z    T    L    S    J         [          ]
                                           [          ]
    #   ##   ##   ###  #     ##   #        [          ]
    #   ##    ##   #   #    ##    #        [          ]
    #                  ##        ##        [          ]
    #                                      [          ]
                                           [==========]
  

比赛场地的尺寸是固定的。顶部的数字就在这里 指示列号(另请参阅输入)。

Input:

1。您将获得一个特定的比赛场地(基于上述内容),该场地已经可以部分填充 与四格骨牌(这可以在单独的文件中或通过标准输入提供)。

输入示例:



[          ]
[          ]
[          ]
[          ]
[ #    #  #]
[ ## ######]
[==========]
  

2。您将获得一个字符串,用于描述(用空格分隔)要插入的四联骨牌(以及 下拉)在哪一列。四联骨牌不需要旋转。可以从标准输入读取输入。

输入示例:

T2 Z6 I0 T7

您可以假设输入是“格式良好”的(如果不是,则产生未定义的行为)。

Output

渲染结果字段(“完整”行必须消失)并打印分数计数 (每掉线计10分)。

基于上面示例输入的示例输出:



[          ]
[          ]
[          ]
[#      ###]
[#     ### ]
[##### ####]
[==========]
10
  

Winner:

最短的解决方案(按代码字符数)。用法示例很好。祝你打高尔夫球愉快!

Edit: 添加了赏金+500声誉来吸引更多人关注回答者已经做出的努力(可能还有这个问题的一些新解决方案)......


GolfScript - 181 个字符

换行符不是必需的。输出为标准输出,但 stderr 中存在一些错误。
\10应替换为相应的 ASCII 字符,程序长度为 181 个字符。

{):X!-{2B{" #"=}%X" ":f*+-1%}%:P;:>.{\!:F;>P{\(@{3&\(@.2$&F|:F;|}%\+}%\+F![f]P+:P
;}do;{"= "&},.,7^.R+:R;[>0="#"/f*]*\+}0"R@1(XBc_""~\10"{base}:B/3/~4*"nIOZTLSJR "
";:"*~;n%)n*~ 10R*+n*

输入/输出示例:

$ cat inp
[          ]
[          ]
[          ]
[          ]
[ #    #  #]
[ ## ######]
[==========]
T2 Z6 I0 T7
$ cat inp|golfscript tetris.gs 2>/dev/null
[          ]
[          ]
[          ]
[#      ###]
[#     ### ]
[##### ####]
[==========]
10

Tetromino 压缩:
棋子存储为三个 8 位基数。这是一个简单的二进制表示,例如T=[7,2,0], S=[6,3,0], J=[2,2,3]. [1]用于I压缩中的片段,但这被明确设置为[1,1,1,1]稍后(即4*在代码中)。所有这些数组都连接成一个数组,该数组被转换为一个整数,然后是一个字符串(基数为 126 以最小化不可打印字符、长度,并且不会遇到 utf8)。这个字符串很短:"R@1(XBc_".

然后解压就很简单了。我们首先进行基数 126 转换,然后进行基数 8 转换("~\10"{base}/,即迭代"~\10"并对每个元素进行基本转换)。结果数组被分成 3 组,数组为I是固定的(3/~4*)。然后,我们将每个元素转换为基数 2,并(在删除零之后)将每个二进制数字替换为字符串中该索引的字符" #" (2base{" #"=}%...-1%- 请注意,否则我们需要反转数组2会成为"# "代替" #").

棋盘/棋子格式,掉落棋子
棋盘只是一个字符串数组,每一行一个字符串。最初没有对此进行任何工作,因此我们可以使用以下命令生成它n/(在输入上。片段也是字符串数组,在其 X 位置左侧填充空格,但没有尾随空格。通过预先添加到数组中并不断测试是否存在碰撞来丢弃碎片。

碰撞测试是通过迭代片段中的所有字符并与棋盘上相同位置的字符进行比较来完成的。我们想要重视#+= and #+#作为碰撞,所以我们测试 ((piecechar&3)&boardchar) 是否非零。在进行此迭代时,我们还使用 ((piecechar&3)|boardchar) 更新棋盘(的副本),这会正确设置对的值#+, +#, +[。如果将棋子移至另一行后发生碰撞,我们将使用此更新的棋盘。

删除填充的行非常简单。我们删除所有行"= "&返回假。填充的行将两者都没有= or ,因此连词将是一个空字符串,相当于 false。然后我们计算已删除的行数,将计数添加到分数中并在前面添加这些行数"[ ... ]"s。我们通过获取网格的第一行并替换来紧凑地生成它# with .

Bonus
由于我们计算棋子落下时棋盘在每个位置的样子,因此我们可以将它们保留在堆栈中而不是删除它们!对于总共三个字符,我们可以输出所有这些位置(如果我们将棋盘状态设置为单倍行距,则可以输出两个字符)。

{):X!-{2B{" #"=}%X" ":f*+-1%}%:P;:>.{>[f]P+:P(!:F;{\(@{3&\(@.2$&F|:F;|}%\+}%\+F!}
do;{"= "&},.,7^.R+:R;[>0="#"/f*]*\+}0"R@1(XBc_""~\10"{base}:B/3/~4*"nIOZTLSJR "
";:"*~;n%)n*~ ]{n*n.}/10R*
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程高尔夫:玩俄罗斯方块 的相关文章

  • 什么是样板代码、热点代码和热点?

    我知道这些术语是在性能实现 优化的背景下使用的 最近一直在研究这个问题 并尝试过搜索 但没有得到任何例子 清楚地阐述 描述这些概念以及在现实世界开发场景中实现这些问题 概念 有人可以彻底解释这些术语 示例场景以及可能使用这些概念和术语的地方
  • 哪种数据聚类算法适合检测时间序列事件中未知数量的聚类?

    这是我的场景 考虑在不同地点和时间发生的一组事件 例如 考虑有人在高空记录暴风雨期间城市中的雷击 就我的目的而言 闪电是瞬时的 只能击中某些位置 例如高层建筑 还可以想象每次雷击都有一个唯一的 ID 以便以后可以参考该雷击 这个城市大约有1
  • 编程语言语法中尾随逗号的历史

    许多编程语言允许在其语法中在列表中的最后一项后面使用尾随逗号 据说这样做是为了简化自动代码生成 这是可以理解的 作为示例 以下是 Java 中完全合法的数组初始化 JLS 10 6 数组初始值设定项 http java sun com do
  • 如何通用地减少子集平均值的计算?

    Edit 由于似乎没有人阅读此链接的原始问题 因此让我在这里介绍一下它的概要 正如其他人所问的 最初的问题是 给定大量值 总和将超过数据类型的值Double那么如何计算这些值的平均值呢 有几个答案说要按集合计算 比如取50个和50个数字 计
  • Windows 应用程序事实上的标准键盘快捷键列表?

    假设我正在为 Windows 开发一个新的桌面应用程序 是否有我可以查阅的所有 Windows 应用程序都应支持的键盘快捷键列表 来自 Microsoft 或第三方 注意 当我在这里说 所有 Windows 应用程序 时 我的真正意思是 特
  • 包围一组点的多边形

    我有一组 S 点 2D 由 x 和 y 定义 我想找到 P 包围该组所有点的最小 含义 具有最少数量的点 多边形 P 是S 有没有已知的算法来计算这个 我在这个领域缺乏文化令人惊讶 感谢您的帮助 对于这个问题有很多算法 它被称为 最小边界框
  • 快速约会算法

    我在一家咨询公司工作 大部分时间都在客户所在地 正因为如此 我很少见到同事 为了更好地了解彼此 我们将安排一个晚宴 会有很多小桌子 方便人们聊天 为了在聚会期间与尽可能多的不同的人交谈 每个人都必须每隔一段时间 比如每小时 换一张桌子 如何
  • 哪些不同的术语表示相同的事物(或不同的术语,但人们认为它们表示相同的意思)? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 什么是拉姆达?

    有人可以很好地描述什么是 Lambda 吗 我们为它们设置了一个标签 它们涉及 C 问题的秘密 但我还没有找到一个很好的定义和解释来解释它们是什么 闭包 lambda 和匿名函数不一定是同一件事 匿名函数是任何没有 或者至少不需要 自己名称
  • 组合 min() 和 max() 的函数是否有“规范”名称?

    我发现我经常最终编写一个我总是调用的函数 clamp 这是一种组合min and max 该函数有标准的 规范 名称吗 它总是看起来像这样 function clamp val lower upper if val lt lower ret
  • 实践中的私有成员与公共成员(封装有多重要?)[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 面向对象编程的最大优点之一是封装 我们 或者至少是我 学到的 真理 之一是成员应该始终设为私有并通过访问器和修改器提供方法 从而确保验证和验证更
  • 广度优先搜索:检查访问状态的时机

    在有向图的广度优先搜索中 可能循环 当一个节点出队时 其所有尚未访问的子节点都会入队 并且该过程将继续 直到队列为空 有一次 我以相反的方式实现它 将节点的所有子节点排队 并在节点出队时检查访问状态 如果正在出队的节点之前已被访问过 则该节
  • 如何为所有语言创建字母数字正则表达式?

    我今天遇到了这个问题 此正则表达式仅匹配英语 a zA Z0 9 如果我需要支持这个世界上的任何语言 我应该编写什么正则表达式 如果您使用字符类简写和 Unicode 识别正则表达式引擎 您就可以做到这一点 这 wclass 匹配 单词字符
  • 安全网络登录示例/教程[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 为 Web 应用程序创建登录表单的方法有很多种 但大多数方法都存在这样或那样的缺陷 密码以明文形式传输
  • 如何命名变量

    您使用什么规则来命名变量 哪里允许使用单字母变量 你在名字中加入了多少信息 例如代码怎么样 你最喜欢的无意义变量名是什么 在 foo 和 bar 之后 为什么它们被拼写为 foo 和 bar http en wikipedia org wi
  • Win32:是否可以构建一个容纳其他应用程序的应用程序?

    我想知道 您将如何编写一个基本上包含其他应用程序的应用程序 我问这个问题的原因是我想构建一个应用程序来 征服 我目前打开的窗口数量激增的情况 我以前使用过虚拟窗口管理器 它们非常好 但是我可以使用我提到的应用程序做很多事情 或者 有人知道有
  • 加密单个int的方法

    如何以廉价的方式对 32 位 int 进行双向加密 使每个数字都映射到该空间中的其他 int 并以难以预测的方式映射回来 当然 并且不需要在映射表中预先存储 42 9 亿个整数 您想要的是 32 位分组密码 不幸的是 大多数分组密码都是 6
  • 使用对象列表构建树

    我有一个带有属性 id 和parent id 的对象列表 我想建造一棵树来连接那些孩子和父母 1 个父对象可以有多个子对象 并且有一个对象将成为所有对象的祖先 实现该功能最快的算法是什么 我使用 C 作为编程语言 但其他语言也可以 像这样的
  • 如何计算某物是否位于某人的视野中

    我有一个对象 它在 2D 空间中具有位置和速度 两者都由向量表示 对象的视野每侧均为 135 度 它看起来与移动的方向相同 速度矢量 我有一些对象 其在 2D 空间中的位置由向量表示 在图中 蓝色背景上的对象是可见的 红色背景上的对象对主体
  • 如何将惰性变量传递给函数参数而不对其求值,除非返回

    这个问题是针对python的 尽管我不介意用户分享其他语言的经验 基本上我的问题是尝试将惰性变量传递给函数 就我而言 我可能无法控制该函数 因此无法更改它以将生成器作为输入 示例 请注意 dict get 是函数的示例 但它很可能是 foo

随机推荐