蒙德里安拼图序列


11

将一个n X n正方形划分为多个非一致的整数边矩形。a(n)是最大和最小面积之间最小的差异。

 ___________
| |S|_______|
| | |   L   |
| |_|_______|
| |     |   |
| |_____|___|
|_|_________| (fig. I)

最大的矩形(L)的面积为2 * 4 = 8,最小的矩形(S)的面积为1 * 3 = 3。因此,差异为8 - 3 = 5

给定一个整数n>2,输出最小可能的差异。

发布时序列的所有已知值:

2, 4, 4, 5, 5, 6, 6, 8, 6, 7, 8, 6, 8, 8, 8, 8, 8, 9, 9, 9, 8, 9, 10, 9, 10, 9, 9, 11, 11, 10, 12, 12, 11, 12, 11, 10, 11, 12, 13, 12, 12, 12

所以a(3)=2a(4)=4...

OEIS A276523

相关 -此相关挑战允许非最佳解决方案,具有时间限制并且不是代码高尔夫。

有关更多信息,请通过Numberphile观看此视频

Answers:


4

果酱,178

ri_1a*a*L{_:+1&{_[3{_\zW%}*]{_z}%:e<_@={:A0=_1#:X0<{;A1>j}{X>0+0#AzX=0+0#,\,m*1ff+{[_$\~1a*0aX*\+a*A\..-_])s'-&{;}&}%{~j\:X;{Xa&!},Xaf+:$~}%_&}?}{j}?}{;La}?}j{,(},{::*$)\0=-}%:e<

在线尝试。不过这很慢,我不建议超过6。

为了验证它是否确实在工作,您可以检查此稍作修改的程序,该程序会打印所有可能的分区(每个分区都显示为矩形尺寸对的数组)。


哇,运行时间急剧增加。
mbomb007 '01

@ mbomb007是的,非常希望得到一种蛮横的解决方案。实际上,我进行了大量优化以提高效率。如果删除它们,我可以使它变小很多(并且变慢和饥饿)。
aidtsu退出是因为SE为EVIL,2015年

6

Befunge,708个字节

p&>:10p1-:>20p10g:20g\`v`\g02:-1\p00+1g<>g-#v_10g:*30p"~":40p50p060p070p$>^
1#+\#1<\1_^# !`0::-1$  _:00g3p\:00g2p00^^00:>#:


>>:2-#v_$30p50p60p70g1-70p
^<<<<<:#<<<<<<$$$_v#:!g87g78g79$  _v#!\-1:g88$<_ 98p87g97g*00 v:+!\`*84g++7<
^>$1-:77p1g:2g\3g1>78p97p87p10g97g->88p10g87g-0^!\-1:g89_v#-!\_$1-:v>/88g+7^
^|!-3$<   >\87g/88g+77++p:#v_$
^>:5->v   ^+g89%g78:\g77:-1<>98g88g48*577g387g97g98g88v ^>77g87g97v:^g78\+g<
^ v-4:_$77p88p98p:97p\:87p*^^g79g7>#8\#$_40pv5+"A"g77g< ^14g88g89g<>:87g%98^
^v_$88p98p97p87p:77p60g50g-:40g\`#^_$$>>>>>>>
 >#4!_::80p2g\3g*:90p30g`!v>>>#@>#.>#g^#0
^v:g06p03:-g09\2:g03g05g06_^^_7#<0#<g#<3#<1#<<`g04_$00g1->:#-8#10#\g#1`#:_>$
^>90g\-:0`*+:60p50g:90g-:0`*-:50p-80g70g:1+70p1p\!^

在线尝试!

这显然不会赢得任何规模的奖项,但是考虑到它是一种深奥的语言中的基本布鲁斯力实现方式,因此实际上相当快。在Befunge参考解释程序上,它可以在几秒钟内处理n = 6。使用编译器,它在开始变慢之前最多可以处理n = 8。n = 9需要花费几分钟,而n = 10则需要2小时才能关闭。

从理论上讲,在内存用完之前,上限为n = 11(即,运动场中没有足够的空间来容纳更大的正方形)。但是,到那时,即使是编译后,计算最佳解所需的时间也可能比任何人都愿意等待的时间更长。

观察算法工作原理的最佳方法是在Befunge“可视调试器”之一中运行它。这样,您就可以观察它试图将各种矩形大小适合可用空间的情况。如果要“快进”到匹配良好的点,可以在第十行中间(如果从零开始,则为9)附近的4序列中的上放置一个断点$_40p。此时堆栈顶部的值是当前面积差。

下面的动画显示了此过程的前几帧(n = 5):

动画显示矩形拟合过程

每个不同的矩形由字母的不同字母表示。但是,请注意,最终的矩形永远不会被写出,因此正方形的一部分将只是空白。

我还编写了代码的调试版本,该代码每次找到新的最佳匹配时都会输出当前布局(在线尝试!)。对于较小的尺寸,第一个匹配通常是最佳解决方案,但是一旦超过n = 6,您可能会看到一些有效但非最佳的布局,然后才最终解决。

找到的最佳布局n = 10看起来像这样:

H F F F A A A C C I
H F F F A A A C C I
H J G G A A A C C I
H J G G A A A C C I
H J D D D D D C C I
H J D D D D D C C I
H J K K K K K K K I
H J B B B E E E E I
H J B B B E E E E I
H J B B B L L L L L

12 - 4 = 8

1
你是在真菌中的神。
Rɪᴋᴇʀ
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.