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