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