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

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(使用前将#替换为@)

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

  • 如何在某些数据结构中表示奇怪的图

    表示图的一种简单方法是使用以下形式的数据结构 1 2 3 2 1 3 3 1 2 该字典中的键是节点 边由它们连接到的其他节点的列表表示 如果链接不对称 此数据结构也可以轻松表示有向图 1 2 2 3 3 1 我对图论了解不多 所以我要提出
  • 为什么建议在源文件末尾有空行?

    一些代码风格工具推荐这样做 我记得看到一些 unix 命令行工具警告缺少空行 多出一个空行的原因是什么 如果文本文件中的最后一行数据不是以换行符或回车符 换行符组合终止 许多旧工具会出现错误行为 他们忽略该行 因为它以 Z eof 结尾
  • 继承与聚合[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 推荐的在线片段管理器[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个在线片段管理器 用于工作 个人使用和灵感 我的主要需求是谷歌 脸书登录 各种编程语言的字体
  • 如何定义软件的版本号?

    确定软件或组件应使用的版本号的最佳方法是什么 设置版本号有通用规则吗 我很确定这是一个基本问题 但搜索一段时间后我没有找到任何有用的东西 微软有一个约定 major minor revision build 或关注Jeff 的版本控制系统
  • 如何处理复杂的事情?

    您知道代码中对于项目至关重要但可能需要花费大量时间才能完成的特定部分吗 您是否有过这样的感觉 您宁愿做其他事情 可能不太重要 或者根本不写代码 而不是做那部分 你竭尽全力避免并使用你所知道的每一个懒惰技巧来推迟其不可避免的实施的那头野兽 现
  • 计算非图的所有可能突变[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我需要根据非常具体的配方构建一个非图解算器 对于每一行 我需要计算所有可能的突变 然后检查该行是否仍然使谜题有效 对于那些不知道非图的人 这
  • 如何抑制自己重写一切的强烈冲动?

    Setup 您是否有过这样的经历 在一段代码中进行看似简单的更改 然后意识到您刚刚踏入了一片值得认真关注的荒地 这通常会由官方跟进吓坏了那一刻 重写眼前一切的压倒性感觉开始蔓延 值得注意的是 这些糟糕的代码不一定来自其他人 因为它可能确实是
  • 将 Eclipse 的“开放调用层次结构”过滤为仅我的公司/项目

    我最喜欢的 Eclipse 功能之一是能够打开调用者 被调用者层次结构 http eclipse tools sourceforge net call hierarchy index html的一个方法 默认情况下 该视图显示对我的代码库之
  • 如何正确区分树(即嵌套的字符串列表)?

    我正在使用由嵌套字符串列表组成的数据类型的在线编辑器 请注意 如果每次更改单个值时我都要传输整个结构 那么流量可能会变得难以忍受 所以 为了减少流量 我想到了应用 diff 工具 问题是 如何找到并报告两棵树的差异 例如 ah bh ha
  • 3 维装箱算法

    我面临着 3 维装箱问题 目前正在进行一些初步研究 了解哪些算法 启发式方法目前能产生最佳结果 由于问题是 NP 难问题 我不希望在每种情况下都能找到最佳解决方案 但我想知道 1 最好的精确求解器是什么 分支定界 我期望使用合理的计算资源可
  • 有没有办法获取正在运行或新打开的资源管理器窗口的 IExplorerBrowser 接口以供后续 BrowseToXXX 调用?

    这么问是因为在上一个问题 https stackoverflow com questions 6220899 answer 6221898我是指向 IExplorerBrowser 的指针 但是它创建了一个子窗口 而我想模拟资源管理器的 查
  • 基本编程/算法概念[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我即将 与其他程序员一起 在我的高中
  • 有效地将相似的数字分组在一起[重复]

    这个问题在这里已经有答案了 可能的重复 一维数数组聚类 https stackoverflow com questions 11513484 1d number array clustering 我有一个数字数组 例如 1 20 300 4
  • 无扫描器解析器生成器

    序幕 尽管解析器 上下文无关语法 识别的语言集严格大于扫描器 常规语法 识别的语言集 但大多数解析器生成器都需要扫描器 请不要试图解释其背后的原因 我很了解它们 我见过解析器 不需要像这样的扫描仪 Elkhound http scottmc
  • 替代位置基础系统(十六进制、八进制、二进制)如何工作?如何将它们转换为十进制?

    我以前在编程课上没有学过这一点 但现在我需要知道它 有哪些学习这些数字以及如何转换它们的好资源 我几乎会像记住乘法表一样记住这些 在我们日常的十进制系统中 基数或radix http en wikipedia org wiki Radix
  • 如何通用地减少子集平均值的计算?

    Edit 由于似乎没有人阅读此链接的原始问题 因此让我在这里介绍一下它的概要 正如其他人所问的 最初的问题是 给定大量值 总和将超过数据类型的值Double那么如何计算这些值的平均值呢 有几个答案说要按集合计算 比如取50个和50个数字 计
  • 需要帮助解决 Project Euler 问题 200 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试制定一个算法来解决 We
  • “单词的正则表达式”(语义替换)-任何示例语法和库吗?

    我正在寻找在给定过程语言的情况下对单词而不是字符进行正则表达式样式转换的常用技术的语法示例 例如 为了追踪复制 人们可能想要创建一份具有相似含义但具有不同单词选择的文档 我希望能够简洁地定义这些可以应用于文本流的可能的转换 例如 快速地no
  • 如何为抽象工厂创建的类设置特定属性?

    是否可以让具体工厂使用抽象工厂模式为其创建具有特定类型参数的具体类 或者由各自的具体工厂创建的不同具体类是否需要具有相同的字段 例如 在下图中 您将如何使用客户端 应用程序 给出的不同参数集来实例化 WinButton 和 OSXButto

随机推荐