Befunge, 708 Bytes
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\!^
Probieren Sie es online aus!
Dies wird natürlich keine Preise für Größe gewinnen, aber es ist tatsächlich ziemlich schnell, wenn man bedenkt, dass es sich um eine grundlegende Implementierung von Bruce Force in einer esoterischen Sprache handelt. Auf dem Befunge-Referenzinterpreter kann er in wenigen Sekunden bis zu n = 6 verarbeiten. Mit einem Compiler kann er bis zu n = 8 verarbeiten, bevor er träge wird. n = 9 dauert ein paar Minuten und n = 10 ist knapp 2 Stunden.
Theoretisch ist die Obergrenze n = 11, bevor uns der Speicher ausgeht (dh es ist nicht mehr genügend Platz auf dem Spielfeld vorhanden, um auf ein größeres Quadrat zu passen). Zu diesem Zeitpunkt ist die Zeit, die zur Berechnung der optimalen Lösung benötigt wird, wahrscheinlich länger, als irgendjemand bereit wäre zu warten, selbst wenn er kompiliert wurde.
Der beste Weg, um zu sehen, wie der Algorithmus funktioniert, besteht darin, ihn in einem der Befunge "Visual Debugger" auszuführen. Auf diese Weise können Sie beobachten, wie versucht wird, die verschiedenen Rechteckgrößen in den verfügbaren Platz einzupassen. Wenn Sie bis zu dem Punkt "schnell vorspulen" möchten, an dem eine gute Übereinstimmung vorliegt, können Sie einen Haltepunkt 4
in der Sequenz $_40p
nahe der Mitte der zehnten Zeile setzen (9, wenn nullbasiert). Der Wert am oberen Rand des Stapels an diesem Punkt ist die aktuelle Flächendifferenz.
Unten sehen Sie eine Animation, die die ersten Frames dieses Prozesses für n = 5 zeigt:
Jedes einzelne Rechteck wird durch einen anderen Buchstaben des Alphabets dargestellt. Beachten Sie jedoch, dass das endgültige Rechteck niemals ausgeschrieben wird, sodass der Abschnitt des Quadrats nur leer ist.
Ich habe auch eine Debug-Version des Codes geschrieben, die jedes Mal das aktuelle Layout ausgibt, wenn eine neue beste Übereinstimmung gefunden wird ( Online testen! ). Für die kleineren Größen ist die erste Übereinstimmung oft die optimale Lösung, aber sobald Sie n = 6 überschritten haben, werden Sie wahrscheinlich mehrere gültige, aber nicht optimale Layouts sehen, bevor Sie sich für die endgültige Lösung entscheiden.
Das beste Layout für n = 10 sieht folgendermaßen aus:
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