打印Pentomino矩形


16

编写一个程序或函数,该程序或函数不输入任何内容,但打印或返回由12种不同的Penminominos组成的矩形的恒定文本描述:

12 pentominoes

矩形可以具有任意尺寸,并且在任何方向上都可以,但是所有12个戊糖都必须精确使用一次,因此其面积为60。每个不同的戊糖都必须由不同的可打印ASCII字符组成(您不必使用上面的字母)。

例如,如果您选择输出此20×3 pentomino矩形解决方案:

3x20 solution

程序的输出可能如下所示:

00.@@@ccccF111//=---
0...@@c))FFF1//8===-
00.ttttt)))F1/8888=-

另外,您可能会发现更容易打高尔夫球这种6×10的解决方案:

000111
203331
203431
22 444
2   46
57 666
57769!
58779!
58899!
5889!!

任何矩形解决方案都可以,您的程序只需打印一个即可。(输出中的尾随换行符就可以了。)

这个出色的网站提供了各种矩形尺寸的解决方案,值得您浏览以确保解决方案尽可能简短。这是代码高尔夫球,最短的答案以字节为单位。


15
如果它是Piet中的“ quine”,则可获赠。
mbomb007

@ mbomb007这几乎是不可能的,只有12个方块可以玩:P
Sp3000

我不认为边界上应该有空格。但是既然如此,我可以省略尾随空格吗?如果打印的垂直5x12解决方案的末尾没有空格,我会获得奖金吗?
John Dvorak 2015年

@ Sp3000完全由pentomino矩形解决方案组成的Piet程序如何?
John Dvorak 2015年

@JanDvorak如果有空格,则不能省略。与其他可打印ASCII字符一样,它们是字符。
加尔文的爱好

Answers:


1

Pyth,37个字节

jc4.HC"&f3ªªwril3:[·)ÌDU[r)ÌDA»

示范

使用非常简单的方法:使用十六进制字节作为数字。转换为十六进制数,以256为基数对其进行编码。这就是上面的魔力线。要进行解码,请使用Pyth的base 256解码器功能,将其转换为十六进制,分为4个块,然后在换行符上合并。


5

CJam(44字节)

鉴于XXD格式,因为它包含控制字符(包括原始标签,发挥真的非常有降价):

0000000: 2202 7e0d 8ef3 570d e085 e168 cf27 092c
0000010: a235 0c22 3235 3662 3562 332f 5f2c 2c2e
0000020: 7b32 2f27 412b 662b 7d7a 4e2a 

可以解码为

"MAGIC STRING"256b5b3/_,,.{2/'A+f+}zN*

略微简化的在线演示,其中不包含控制字符,因此可以很好地与浏览器URI解码库功能配合使用。

基本原理是,由于跨段不超过5行,因此我们可以紧凑地编码行号线性函数的偏移量(实际上,以5为底,尽管我没有尝试确定是否总是这样)。


5

Bash +常见的Linux utils,50

xxd -s20 -p -c2 $0
#<30 bytes of binary data>

要从编码的base64重新创建此代码:

base64 -d <<< eHhkIC1zMjAgLXAgLWMyICQwCiMiImaSaZlmkDAAMwSjRKNEqoGogYhRVVF7UXu7d3s= > pent.sh

由于有12个戊糖,它们的颜色很容易以十六进制的形式编码。

输出:

$ ./pent.sh
2222
6692
6999
6690
3000
3304
a344
a344
aa81
a881
8851
5551
7b51
7bbb
777b
$ 

4

J,49个字节

u:64++/\|:3#.inv 1377859090 1567813024 1337683230

您可以选择字母的方式,使垂直相邻字母之间的最大增量为2。我们使用此事实在base3中编码垂直增量。之后,我们创建运行总和并添加偏移量以获取字母的ASCII码。

绝对可以打高尔夫球。(我尚未找到一种输入扩展精度base36数字的方法,但简单的base36应该单独保存3个字节。)

输出:

AAA
ABA
BBB
DBC
DCC
DCC
DEE
DFE
FFE
FGE
FGG
GGH
HHH
IIH
JII
JJI
JKK
JKL
KKL
LLL

在这里在线尝试。


非常好。使用base-256编码时,在CJam中应用此差异编码可得到33个字节(不带b256的48字节版本)。
彼得·泰勒

这太棒了!它也可以与4x15一起使用,如果您横向存储数据而不是纵向存储数据,则可以很好地将四个数字打包成一个字节。您需要使U pentomino面向正确方式的布局。问题中的链接很多。
水平河圣

@steveverrill您需要一个起始偏移量,因为从第一行开始会有4个以上的段,因此您不能将这些段编码为base4。有了这个额外的偏移量(例如3#i.50 0 0 1 1 1 ... 4 4 4),它可以工作,但可能不会短(至少我的方式尝试过)。
randomra 2015年

2

Microscript II,66个字节

让我们从简单的答案开始。

"00.@@@ccccF111//=---\n0...@@c))FFF1//8===-\n00.ttttt)))F1/8888=-"

Hooray隐式打印。


1

红宝石

Rev 3,55字节

i=1
'S, OJ1*$HCH(#%0'.bytes{|e|puts "%x"%i+=e*130&9011}

作为对Randomra想法的进一步发展,请考虑下面的输出和差异表。可以像以前一样压缩差异表,并通过乘以65 =二进制1000001并应用掩码11001100110011进行扩展。但是,Ruby无法正常使用8位字符(它倾向于将它们解释为Unicode。)

令人惊讶的是,最后一栏完全是偶数。因此,在压缩中我们可以对数据执行右移。这样可以确保所有代码均为7位ASCII。在扩展中,我们只需乘以65 * 2 = 130而不是65。

第一列也完全是偶数。因此,如果需要,我们可以在每个元素上加1(每个字节32个),以避免任何控制字符。使用掩码10001100110011 = 9011代替11001100110011除去不需要的1。

Solution 59 of document linked in question

Start0001

Out  Diff
2223 2222
2433 0210
2433 0000
4445 2012
6555 2110
6577 0022
6687 0110
6887 0200
8897 2010
aa99 2202
caa9 2010
cab9 0010
cbbb 0102
cdbd 0202
cddd 0020

尽管我在表中使用15个字节,但实际上每个字节我只使用6位,总共90位。实际上,每个字节只有36个可能的值,总共为2.21E23个可能性。这将适合77位熵。

Rev 2,58个字节,使用Randomra的增量方法

i=0
'UPEIP@bPHPBETTEPRADT'.bytes{|e|puts "%x"%i+=e*65&819}

最后,比天真的解决方案还短。Randomra的增量方法,具有Rev.1的字节打包方法。

修订版1,72字节,修订版0的修订版

出于对高尔夫的原因,对基线进行了一些更改以适应代码的重新排序,但仍比幼稚的解决方案长。

i=0
'UPUIYD&!)$&V*).);c+*'.bytes{|e|i+=1;puts "%x"%(i/2*273+(e*65&819))}

偏移量以4的格式编码到魔术弦的每个字符中BAC,即1代表右手符号,16代表中间符号,左手符号四角插入4的位置。为了提取它们,将ascii码乘以65(二进制1000001)得到BACBAC,然后与819(二进制1100110011)相加得到.A.B.C

某些ASCII码设置了第7位,即比要求的值高64,以避免控制字符。因为该位被掩码819除去,所以这无关紧要,除非当值C是3时,这会导致残留。这只能在一个地方纠正(而不是g必须使用c。)

Rev 0,未发布版本

a= %w{000 010 000 201 100 100 011 021 110 120 011 112 111 221 211 221 122 123 112 222}
i=2
a.each{|e|puts "%x"%(i/2*273+e.to_i(16));i+=1} 

输出量

111
121
222
423
433
433
455
465
665
675
677
778
888
998
a99
aa9
abb
abc
bbc
ccc

说明

从以下解决方案中,我减去了基线,给出了我存储为数据的偏移量。基线在代码中以十六进制数的形式重新生成i/2*273(273十进制= 111十六进制。)

solution   baseline   offset
AAA        AAA        000
ABA        AAA        010
BBB        BBB        000
DBC        BBB        201
DCC        CCC        100
DCC        CCC        100
DEE        DDD        011
DFE        DDD        021
FFE        EEE        110
FGE        EEE        120
FGG        FFF        011
GGH        FFF        112
HHH        GGG        111
IIH        GGG        221
JII        HHH        211
JJI        HHH        221
JKK        III        122
JKL        III        123
KKL        JJJ        112
LLL        JJJ        222

看起来基本上与我的方法相同,但是您设法避免了4的单个增量,该增量迫使我以5为底进行编码。看起来我为这些片段选择了错误的标签。
彼得·泰勒

发布我的信息后,我看到了您的答案。我无法跟随Cjam,但是从您在回答中说的来,这是一种类似的方法。我实际上3在整个表中只有一个(在底部附近),因此我认为通过将基线每行稍微增加0.5个以上,实际上可以使用基数3。请随意尝试。(出于打高尔夫球的原因,我似乎不得不稍微更改基线,这给了我3个以上的基线,但不幸的是,它看起来比Ruby中的朴素解决方案长1个字节。)
Level River St

如果我之前不太清楚,我的目的是祝贺您做得比我更好,而不是指责您抄袭。而且我不会尝试使用2.5的增长率,因为我认为它不会击败randomra的差异编码方法。
彼得·泰勒

@PeterTaylor谢谢,我的确是你在祝贺我。另一方面,您最初的想法基本相同,但思路却短得多,因此也向您表示祝贺。最终,通过使用randomra的差分方法,我可以比朴素的解决方案变得更短。如果采用正确的pentomino布局,它也可以在4x15上很好地工作。这就是我用C或任何其他适合8.bit字符串的语言编写的方式。由于Ruby支持unicode,因此它将尝试将8位字符串解释为unicode,并且可能会给出一些令人讨厌的错误消息。
水平河圣

0

Foo,66个字节

"00.@@@ccccF111//=---\n0...@@c))FFF1//8===-\n00.ttttt)))F1/8888=-"

这是一个字符对字符,与上面的Microscript II解决方案相同...我假设这些语言是相关的?
Darrel Hoffman 2015年

1
@DatrelHoffman不是真的,富基本上只是打印一切报价
TEOC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.