考虑以下四联症和空洞的比赛场地:
0123456789 I O Z T L S J [ ] [ ] # ## ## ### # ## # [ ] # ## ## # # ## # [ ] # ## ## [ ] # [ ] [==========]
比赛场地的尺寸是固定的。顶部的数字就在这里 表示列号(也见输入)。
1 即可。您将获得一个特定的比赛场地(基于上述内容),该场地已经部分填补 与tetrominoes(这可以在一个单独的文件中或通过stdin提供)。
示例输入:
[ ] [ ] [ ] [ ] [ # # #] [ ## ######] [==========]
2 即可。您将获得一个字符串,用于描述(以空格分隔)要插入的tetromino(和 下拉列表。 Tetrominoes不需要旋转。输入可以从标准输入读取。
示例输入:
T2 Z6 I0 T7
你可以假设输入是'格式良好'(或者当它不是时产生未定义的行为)。
渲染结果字段(“完整”行必须消失)并打印分数 (每条掉线占10分)。
基于上面的示例输入的示例输出:
[ ] [ ] [ ] [# ###] [# ### ] [##### ####] [==========] 10
最短解决方案(按代码字符计数)。用法示例很好。玩得开心!
修改:增加了+500
声誉的赏金,以吸引更多关注回答者已经做出的努力(可能还有一些新的解决方案)...
答案 0 :(得分:27)
没有必要换行。虽然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*
答案 1 :(得分:26)
(对于已定义的或//
运算符,需要Perl 5.10。)
从stdin获取所有输入。 还需要一些严肃的打高尔夫球。
请注意,^ Q表示ASCII 17(DC1 / XON),^ C表示ASCII 3,^ @表示ASCII 0(NUL)。
while(<>){push@A,[split//]if/]/;while(/\w/g){for$i(0..6){for($f=0,$j=4;$j--;){$c=0;map{if($_){$i--,$f=$j=3,redo if$A[$k=$i+$j][$C=$c+$'+1]ne$";$A[$k][$C]="#"if$f}$c++}split//,unpack"b*",chr vec"3^@'^@c^@^Q^C6^@\"^C^Q^Q",index(OTZLSJI,$&)*4+$j,4;$s+=10,@A[0..$k]=@A[$k,0..$k-1],map{s/#/ /}@{$A[0]},$i++if 9<grep/#/,@{$A[$k]}}last if$f}}}print+(map@$_,@A),$s//0,$/
评论版:
while(<>){
# store the playfield as an AoA of chars
push@A,[split//]if/]/;
# while we're getting pieces
while(/\w/g){
# for each line of playfield
for$i(0..6){
# for each line of current piece
for($f=0,$j=4;$j--;){
# for each column of current piece
$c=0;
map{
if($_){
# if there's a collision, restart loop over piece lines
# with a mark set and playfield line decremented
$i--,$f=$j=3,redo if$A[$k=$i+$j][$C=$c+$'+1]ne$";
# if we already found a collision, draw piece
$A[$k][$C]="#"if$f
}
$c++
# pieces are stored as a bit vector, 16 bits (4x4) per piece,
# expand into array of 1's and 0's
}split//,unpack"b*",chr vec"3^@'^@c^@^Q^C6^@\"^C^Q^Q",index(OTZLSJI,$&)*4+$j,4;
# if this playfield line is full, remove it. Done by array slicing
# and substituting all "#"'s in line 0 with " "'s
$s+=10,@A[0..$k]=@A[$k,0..$k-1],map{s/#/ /}@{$A[0]},$i++if 9<grep/#/,@{$A[$k]}
}
# if we found a collision, stop iterating over the playfield and get next piece from input
last if$f
}
}
}
# print everything
print+(map@$_,@A),$s//0,$/
编辑1:一些严肃的打高尔夫球,修复输出错误
编辑2:一些内联,将两个循环合并为一个用于净节省(鼓滚...)3个字符,错误打高尔夫球。
编辑3:一些常见的子表达式消除,一点点不断合并和调整一个正则表达式
编辑4:将四联骨牌的表示改为打包位向量,错误打高尔夫球
编辑5:从tetromino字母到数组索引的更直接的翻译,使用不可打印的字符,misc golfing
编辑6:固定的bug清理顶线,在Nakilon发现的r3(编辑2)中引入。使用更多不可打印的字符
编辑7:使用vec
获取tetromino数据。利用游戏场具有固定尺寸的事实。 if
声明=&gt; if
修饰符,编辑2循环的合并开始得到回报。使用//
表示0分的情况
编辑8:修复了由Nakilon发现的r6(编辑5)中引入的另一个错误
编辑9:清除行时不要创建新的引用,只需通过数组切片移动引用。将两个map
合并为一个。更聪明的正则表达式。 “更聪明”for
。其他高尔夫球场
编辑10:内联tetromino数组,添加了注释版本。
答案 2 :(得分:24)
t=[*$<]
o=0
u=->f{f.transpose}
a=u[t.reverse.join.scan /#{'( |#)'*10}/]
t.pop.split.map{|w|m=(g='I4O22Z0121T01201L31S1201J13'[/#{w[0]}\d+/].scan(/0?\d/).zip a.drop w[1].to_i).map{|r,b|(b.rindex ?#or-1)-r.size+1}.max
g.map{|r,b|b.fill ?#,m+r.size,r.to_i}
v=u[a]
v.reject!{|i|i-[?#]==[]&&(o+=10;v)<<[' ']*10}
a=u[v]}
puts u[a].reverse.map{|i|?[+i*''+?]},t[-1],o
答案 3 :(得分:17)
更新:修复了涉及延伸到顶行的碎片的错误。此外,输出现在发送到标准输出,作为奖励,可以再次运行脚本继续玩游戏(在这种情况下,您必须自己累加总分)。
这包括不可打印的字符,所以我提供了一个十六进制转储。将其另存为tetris.txt
:
0000000: 7461 696c 202d 3120 245f 7c7a 6361 743e tail -1 $_|zcat>
0000010: 753b 2e20 750a 1f8b 0800 35b0 b34c 0203 u;. u.....5..L..
0000020: 5590 516b 8330 10c7 dff3 296e 4c88 ae64 U.Qk.0....)nL..d
0000030: a863 0c4a f57d 63b0 07f7 b452 88d1 b4da .c.J.}c....R....
0000040: 1a5d 5369 91a6 df7d 899a d05d 5e72 bfbb .]Si...}...]^r..
0000050: fbff 2fe1 45d5 0196 7cff 6cce f272 7c10 ../.E...|.l..r|.
0000060: 387d 477c c4b1 e695 855f 77d0 b29f 99bd 8}G|....._w.....
0000070: 98c6 c8d2 ef99 8eaa b1a5 9f33 6d8c 40ec ...........3m.@.
0000080: 6433 8bc7 eeca b57f a06d 27a1 4765 07e6 d3.......m'.Ge..
0000090: 3240 dd02 3df1 2344 f04a 0d1d c748 0bde 2@..=.#D.J...H..
00000a0: 75b8 ed0f 9eef 7bd7 7e19 dd16 5110 34aa u.....{.~...Q.4.
00000b0: c87b 2060 48a8 993a d7c0 d210 ed24 ff85 .{ `H..:.....$..
00000c0: c405 8834 548a 499e 1fd0 1a68 2f81 1425 ...4T.I....h/..%
00000d0: e047 bc62 ea52 e884 42f2 0f0b 8b37 764c .G.b.R..B....7vL
00000e0: 17f9 544a 5bbd 54cb 9171 6e53 3679 91b3 ..TJ[.T..qnS6y..
00000f0: 2eba c07a 0981 f4a6 d922 89c2 279f 1ab5 ...z....."..'...
0000100: 0656 c028 7177 4183 2040 033f 015e 838b .V.(qwA. @.?.^..
0000110: 0d56 15cf 4b20 6ff3 d384 eaf3 bad1 b9b6 .V..K o.........
0000120: 72be 6cfa 4b2f fb03 45fc cd51 d601 0000 r.l.K/..E..Q....
然后,在bash命令提示符下,最好安装elvis
而不是vim
安装为vi
:
$ xxd -r tetris.txt tetris.sh
$ chmod +x tetris.sh
$ cat << EOF > b
> [ ]
> [ ]
> [ ]
> [ ]
> [ # # #]
> [ ## ######]
> [==========]
> EOF
$ ./tetris.sh T2 Z6 I0 T7 2>/dev/null
-- removed stuff that is not in standard out --
[ ]
[ ]
[ ]
[# ###]
[# ### ]
[##### ####]
[==========]
10
代码自我提取自身类似于使用gzexe
脚本压缩的可执行程序的方式。 Tetromino片段表示为vi编辑器命令的序列。字符计数用于检测碰撞,行计数用于计算得分。
解压缩代码:
echo 'rej.j.j.:wq!m'>I
echo '2rejh.:wq!m'>O
echo '2rej.:wq!m'>Z
echo '3rejh1.:wq!m'>T
echo 'rej.j2.:wq!m'>L
echo 'l2rej2h.:wq!m'>S
echo 'lrej.jh2.:wq!m'>J
for t
do for y in `seq 1 5`
do echo -n ${y}jk$((${t:1}+1))l|cat - ${t:0:1}|vi b>0
grep ========== m>0||break
[ `tr -cd '#'<b|wc -c` = `tr -cd '#'<m|wc -c` ]||break
tr e '#'<m>n
done
cat n>b
grep -v '##########' b>m
$((S+=10*(`wc -l < b`-`wc -l < m`)))
yes '[ ]'|head -7|cat - m|tail -7>b
done
cat b
echo $S
打高尔夫球之前的原始代码:
#!/bin/bash
mkpieces() {
pieces=('r@j.j.j.' '2r@jh.' '2r@j.' '3r@jh1.' 'r@j.j2.' 'l2r@j2h.' 'lr@j.jh2.')
letters=(I O Z T L S J)
for j in `seq 0 9`; do
for i in `seq 0 6`; do
echo "jk$(($j+1))l${pieces[$i]}:wq! temp" > ${letters[$i]}$j
done
done
}
counthashes() {
tr -cd '#' < $1 | wc -c
}
droppiece() {
for y in `seq 1 5`; do
echo -n $y | cat - $1 | vi board > /dev/null
egrep '={10}' temp > /dev/null || break
[ `counthashes board` -eq `counthashes temp` ] || break
tr @ "#" < temp > newboard
done
cp newboard board
}
removelines() {
egrep -v '#{10}' board > temp
SCORE=$(($SCORE + 10 * (`wc -l < board` - `wc -l < temp`)))
yes '[ ]' | head -7 | cat - temp | tail -7 > board
}
SCORE=0
mkpieces
for piece; do
droppiece $piece
removelines
done
cat board
echo $SCORE
答案 4 :(得分:13)
(Python 3解决方案) 目前需要以顶部所示的格式设置输入(输入代码不计算在内)。我将扩展为稍后从文件或stdin读取。现在使用提示,只需粘贴输入(总共8行)。
R=range
f,p=[input()[1:11]for i in R(7)],p
for(a,b)in input().split():
t=[' '*int(b)+r+' '*9for r in{'I':'#,#,#,#','O':'##,##','Z':'##, ##','T':'###, # ','L':'#,#,##','S':' ##,##','J':' #, #,##'}[a].split(',')]
for r in R(6-len(t),0,-1):
for i in R(len(t)):
if any(a==b=='#'for(a,b)in zip(t[i],f[r+i])):break
else:
for i in R(0,len(t)):
f[r+i]=''.join(a if b!='#'else b for(a,b)in zip(t[i],f[r+i]))
if f[r+i]=='#'*10:del f[r+i];f[0:0]=[' '*10];p+=10
break
print('\n'.join('['+r+']'for r in f[:7]),p,sep='\n')
不确定我是否可以在那里节省更多。转换到位域时会丢失相当多的字符,但与使用字符串相比,可以节省更多的字符。另外我不确定我是否可以在那里删除更多的空格,但我会稍后再试。
将无法再减少它;在使用基于位域的解决方案之后,我转换回字符串,因为我找到了一种压缩它的方法(在位域上保存了8个字符!)。但是考虑到我忘了包含L
并且里面有点错误,我的字符数只会上升 sigh ...也许我后来发现了一些东西来压缩它多一点,但我想我快要结束了。有关原始和注释的代码,请参阅以下内容:
field = [ input()[1:11] for i in range(7) ] + [ 0, input() ]
# harcoded tetrominoes
tetrominoes = {'I':('#','#','#','#'),'O':('##','##'),'Z':('##',' ##'),'T':('###',' # '),'L':('#','#','##'),'S':(' ##','##'),'J':(' #',' #','##')}
for ( f, c ) in field[8].split():
# shift tetromino to the correct column
tetromino = [ ' ' * int(c) + r + ' ' * 9 for r in tetrominoes[f] ]
# find the correct row to insert
for r in range( 6 - len( tetromino ), 0, -1 ):
for i in range( len( tetromino ) ):
if any( a == b == '#' for (a,b) in zip( tetromino[i], field[r+i] ) ):
# skip the row if some pieces overlap
break
else:
# didn't break, insert the tetromino
for i in range( 0, len( tetromino ) ):
# merge the tetromino with the field
field[r+i] = ''.join( a if b != '#' else b for (a,b) in zip( tetromino[i], field[r+i] ) )
# check for completely filled rows
if field[r+i] == '#' * 10:
# remove current row
del field[r+i]
# add new row
field[0:0] = [' '*10]
field[7] += 10
# we found the row, so abort here
break
# print it in the requested format
print( '\n'.join( '[' + r + ']' for r in field[:7] ) )
# and add the points = 10 * the number of redundant lines at the end
print( str( field[7] ) )
答案 5 :(得分:13)
d=0
e=[*$<]
e.pop.split.map{|f|f="L\003\003\007J\005\005\007O\007\007Z\007\013S\013\007I\003\003\003\003T\017\005"[/#{f[j=0]}(\W*)/,1].bytes.map{|z|?\0+?\0*f[1].hex+z.to_s(2).tr("01"," #")[1,9]}
k,f,i=i,[p]+f,e.zip(f).map{|l,m|l.bytes.zip(m.to_s.bytes).map{|n,o|j|=n&3&q=o||0;(n|q).chr}*""}until j>0
e=[]
e+=k.reject{|r|r.sum==544&&e<<r.tr(?#,?\s)&&d+=10}}
puts e,d
请注意,\000
转义符(包括第三行的空字节)应替换为其实际的非打印等效值。
示例输入:
[ ]
[ ]
[ ]
[ ]
[ # # #]
[ ## ######]
[==========]
T2 Z6 I0 T7
用法:
ruby1.9 tetris.rb < input
或
ruby1.9 tetris.rb input
答案 6 :(得分:12)
这是我的第一个代码高尔夫球,我认为人物数量可以<罢工>多更低,如果经验丰富的高尔夫球手可以给我一些提示,那将是很好的。
当前版本也可以处理不同尺寸的游戏区域。输入可以有DOS / Windows和Unix格式的换行符。
在优化之前代码非常简单,四联体存储在4个整数中,这些整数被解释为(7 * 3)x4位数组,游戏区域按原样存储,图块被丢弃并且在开始时删除完整的行并在每个瓷砖掉落后。
我不确定如何计算字符,因此我使用了代码的文件大小,删除了所有不必要的换行符。
编辑596 =&gt; 581:感谢KitsuneYMG,除%ls
建议之外的所有内容都完美无缺,此外,我注意到putch
代替putchar
可以使用getch
}以某种方式不起作用)并删除#define G
中的所有括号。
编辑581 =&gt; 556:对剩余的for
和嵌套的F
循环不满意,所以有一些合并,更改和删除循环,相当令人困惑,但绝对值得
EDIT 556 =&gt; 517:终于找到了使a
成为一个int数组的方法。有些N;
与c
合并,而不再与break
合并。
编辑496 =&gt; 471:现在修复了运动场宽度和高度。
编辑471 =&gt; 461:次要修改putchar
再次用作putch
不是标准函数。
编辑:修正错误,在平铺删除之前删除了完整的行,而在之后删除了,因此可以在结尾处留下完整的行。修复不会改变字符数。
#define N (c=getchar())
#define G T[j%4]&1<<t*3+j/4
#define X j%4*w+x+j/4
#define F(x,m) for(x=0;x<m;x++)
#define W while
T[]={916561,992849,217,1},C[99],c,i,j,s,t,x,A,a[99],w=13;
main(){F(j,7)C["IJLSTZO"[j]]=j;
F(j,91)a[j]=N;
W(N>w){t=C[c];x=N-86;
W(c){F(j,12)if(G&&X>1?a[X]-32:0)c=0;
F(j,12)if(G&&X>w&&!c)a[X-w]=35;x+=w;}N;
F(i,6){A=0;t=i*w;F(x,w)A|=(a[t+x]==32);
if(!A){s++;F(j,t)a[t+w-j]=a[t-j];
x=1;W(a[x]-93)a[x++]=32;}}}
F(i,91)putchar(a[i]);printf("%i0",s);}
答案 7 :(得分:8)
答案 8 :(得分:6)
...甚至不使用代码拉链式的诡计。
import os
r=os.read
b='[%11c\n'%']'*99+r(0,91)
for k,v in r(0,99).split():
t=map(ord,' -:G!.:; -:; !-.!"-. !". !./')['IJLOSTZ'.find(k)*4:][:4];v=int(v)-31
while'!'>max(b[v+j+13]for j in t):v+=13
for j in t:b=b[:v+j]+'#'+b[v+j+1:]
b=b.replace('[##########]\n','')
print b[-91:],1060-10*len(b)/13
在测试示例
上[ ]
[ ]
[ ]
[ ]
[ # # #]
[ ## ######]
[==========]
T2 Z6 I0 T7
输出
[ ]
[ ]
[ ]
[# ###]
[# ### ]
[##### ####]
[==========]
10
PS。修复了Nakilon指出的错误,费用为+5
答案 9 :(得分:5)
我确信这可以改进,我是Golfscript的新手。
[39 26.2/0:$14{.(}:?~1?15?1?14 2??27?13.!14?2?27?14 1]4/:t;n/)\n*:|;' '/-1%.,:c;~{)18+:&;'XIOZTLSJX'\%~;,1-t\={{.&+.90>{;.}*|\=32=!{&13-:&;}*}%}6*{&+}/|{\.@<'#'+\)|>+}4*{'['\10*']'++}:
;n/0\~n+:|;0\{.'#'
={;)}{n+|+:|;}if\.}do;' '
n+\.@*|+\$+:$;.,1-<:|;}c*|n?$*
行尾是相关的(最后不应该有一行)。无论如何,这里是我使用的一些测试用例:
> cat init.txt [ ] [ ] [ ] [ ] [ # # #] [ ## ######] [==========] T2 Z6 I0 T7> cat init.txt | ruby golfscript.rb tetris.gsc [ ] [ ] [ ] [# ###] [# ### ] [##### ####] [==========] 10 > cat init.txt [ ] [ ] [ ] [ ] [ # # #] [ ## ##### ] [==========] I0 O7 Z1 S4> cat init.txt | ruby golfscript.rb tetris.gsc [ ] [ ] [ ] [# ] [### #### ] [### ##### ] [==========] 10 > cat init.txt [ ] [ ] [ ] [ ## ### ] [ # # ] [ ## ######] [==========] T7 I0 I3> cat init.txt | ruby golfscript.rb tetris.gsc [ ] [ ] [ ] [ ] [# # ] [## # # # ] [==========] 20
请注意,输入文件中没有行尾,行尾会按原样破坏脚本。
答案 10 :(得分:4)
open String let w=length let c s=let x=ref 0in iter(fun k->if k='#'then incr x)s;!x open List let(@),g,s,p,q=nth,ref[],ref 0,(0,1),(0,2)let l=length let u=Printf.printf let rec o x i j=let a=map(fun s->copy s)!g in if snd(fold_left(fun(r,k)(p,l)->let z=c(a@r)in blit(make l '#')0(a@r)(i+p)l;if c(a@r)=z+l then r+1,k else r,false)(j-l x+1,true)x)then g:=a else o x i(j-1)and f x=let s=read_line()in if s.[1]='='then g:=rev x else f(sub s 1 10::x)let z=f [];read_line();;for i=0to w z/3 do o(assoc z.[i*3]['I',[p;p;p;p];'O',[q;q];'Z',[q;1,2];'T',[0,3;1,1];'L',[p;p;q];'S',[1,2;q];'J',[1,1;1,1;q]])(Char.code z.[i*3+1]-48)(l!g-1);let h=l!g in g:=filter(fun s->c s<>w s)!g;for i=1to h-(l!g)do incr s;g:=make 10' '::!g done;done;iter(fun r->u"[%s]\n"r)!g;u"[==========]\n";u"%d\n"(!s*10)
答案 11 :(得分:4)
我第一次尝试代码高尔夫,所以我可能还有许多技巧。我在那里留下了一些换行符以保留一些剩余的“可读性”(我将换行计为2个字节,因此删除6个不必要的换行符会增加12个字符)。
在输入中,首先将形状放在字段中。
(let(b(s 0)m(e'(0 1 2 3 4 5 6 7 8 9)))
(labels((o(p i)(mapcar(lambda(j)(+ i j))p))(w(p r)(o p(* 13 r)))(f(i)(find i b))
(a(&aux(i(position(read-char)"IOZTLSJ")))(when i(push(o(nth i'((0 13 26 39)(0 1 13 14)(0 1 14 15)(0 1 2 14)(0 13 26 27)(1 2 13 14)(1 14 26 27)))(read))m)(a))))
(a)(dotimes(i 90)(if(find(read-char)"#=")(push i b)))(dolist(p(reverse m))
(setf b`(,@b,@(w p(1-(position-if(lambda(i)(some #'f(w p i)))e)))))
(dotimes(i 6)(when(every #'f(w e i))(setf s(1+ s)b(mapcar(lambda(k)(+(if(>(* 13 i)k)13(if(<=(* 13(1+ i))k)0 78))k))b)))))
(dotimes(i 6)(format t"[~{~:[ ~;#~]~}]
"(mapcar #'f(w e i))))(format t"[==========]
~a0"s)))
测试
T2 Z6 I0 T7
[ ]
[ ]
[ ]
[ ]
[ # # #]
[ ## ######]
[==========]
[ ]
[ ]
[ ]
[# ###]
[# ### ]
[##### ####]
[==========]
10
NIL
答案 12 :(得分:2)
第一次尝试。用IronRuby完成了。我相信它可以改进,但我今天真的应该完成一些工作!
p,q,r,s=(0..9),(0..2),(0..6),0
t=[*$<]
f=p.map{|a|g=0;r.map{|b|g+=2**b if t[6-b][a+1]==?#};g}
t.pop.split.map{|x|w,y=[15,51,306,562,23,561,113]["IOZTLSJ"=~/#{x[0]}/],x[1].to_i
l=q.map{|d|r.inject{|b,c|f[d+y]&(w>>(d*4)&15-c+1)>0?c:b}}.max
q.map{|b|f[b+y]|=w>>(b*4)&15-l}
r.map{i=f.inject{|a,b|a&b};f.map!{|a|b=i^(i-1);a=((a&~b)>>1)+(a&(b>>1))};s+=i>0?10:0}}
p.map{|a|r.map{|b|t[6-b][a+1]=f[a]&2**b>0??#:' '}}
puts t,s
测试
cat test.txt | ruby tetris.rb
[ ]
[ ]
[ ]
[ ]
[# ###]
[# ### ]
[##### ####]
[==========]
10
修改强> 现在使用普通的红宝石。得到了墙壁输出..
答案 13 :(得分:1)
Z={I:?#*4,J:'#,###',L:'###,#',O:'##,##',S:'#,##, #',Z:' #,##,#',T:' #,##, #'}
t=[*$<]
R=->s{s.reverse}
T=->m{m.transpose}
a = T[R[t].join.scan /.#{'(\D)'*10}.$/]
t.pop.split.each{|z|
t,o=Z[z[0].to_sym].split(',').map{|x|x.split //},z[1].to_i
r=0..t.size-1
y=r.map{|u|1+a[o+u].rindex(?#).to_i-t[u].count(' ')}.max
(0..3).each{|i|r.each{|j|t[j][i]==?#&&a[o+j][y+i]=t[j][i]}}}
s=0
a.each{|x|s=a.max_by(&:size).size;x[s-=1]||=' 'while s>0}
a=R[T[a].reject{|x|x*''=~/[#]{10}/&&s+=10}.map{|x|?[+x*''+?]}[0..6]]
puts (0..8-a.size).map{?[+' '*10+?]},a,s
测试:
cat test.txt | ruby 3858384_tetris.rb
[ ]
[ ]
[ ]
[ ]
[# ###]
[# ### ]
[##### ####]
[==========]
10