Пазл Мондриана


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)=2, a(4)=4...

OEIS A276523

Связанный - этот связанный вызов позволяет неоптимальные решения, имеет временные ограничения и не является кодом-гольфом.

Для получения дополнительной информации, посмотрите это видео от Numberphile

Ответы:


4

CJam, 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

@ mbomb007 да, вполне ожидаемо для грубого решения. Я фактически включил несколько оптимизаций, чтобы сделать его более эффективным. Если бы я их убрал, я мог бы сделать его немного меньше (и медленнее, и голоднее).
Адицу ушел, потому что SE это ЗЛО

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. Таким образом, вы можете наблюдать, как он пытается разместить различные размеры прямоугольника в доступном пространстве. Если вы хотите «перемотать вперед» до точки, где у него хорошее совпадение, вы можете поставить точку останова 4в последовательности $_40pрядом с серединой десятой строки (9, если начинается с нуля). Значение в верхней части стека в этой точке является текущей разницей площади.

Ниже приведена анимация, показывающая первые несколько кадров этого процесса для 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ɪᴋᴇʀ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.