gpt4 book ai didi

language-agnostic - Code Golf : Playing Tetris

转载 作者:行者123 更新时间:2023-12-03 05:09:34 27 4
gpt4 key购买 nike

基础知识:

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

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

The dimensions of the playing field are fixed. The numbers at the top are just hereto indicate the column number (also see input).

Input:

1. You are given a specific playing field (based on the above) which can already be filled partlywith tetrominoes (this can be in a separate file or provided via stdin).

Sample input:

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

2. You are given a string which describes (separated by spaces) which tetromino to insert (anddrop down) at which column. Tetrominoes don't need to be rotated. Input can be read from stdin.

Sample input:

T2 Z6 I0 T7

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

输出

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

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

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

获胜者:

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

编辑:添加了 +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*

示例 I/O:

$ 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 位置,但没有尾随空格。通过预先添加到数组中来丢弃碎片,并不断测试是否存在碰撞。

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

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

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

{):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*

关于language-agnostic - Code Golf : Playing Tetris,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3858384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com