Послідовність головоломки Мондріана


11

Partition собою 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 так, цілком очікувано для грубого рішення. Я фактично включив купу оптимізацій, щоб зробити її більш ефективною. Якщо я їх видаляю, я міг би зробити його трохи менше (і повільніше, і голодніше).
aditsu кинути, тому що SE - EVIL

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.