Sequência de quebra-cabeças Mondrian

11

Particione um n X nquadrado em vários retângulos do lado inteiro não congruentes. a(n)é a menor diferença possível entre a maior e a menor área.

 ___________
| |S|_______|
| | |   L   |
| |_|_______|
| |     |   |
| |_____|___|
|_|_________| (fig. I)

O maior retângulo ( L) tem uma área de 2 * 4 = 8, e o menor retângulo ( S) tem uma área de 1 * 3 = 3. Portanto, a diferença é 8 - 3 = 5.

Dado um número inteiro n>2, produza a menor diferença possível.

Todos os valores conhecidos da sequência no momento da postagem:

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

Então a(3)=2, a(4)=4...

OEIS A276523

Relacionado - esse desafio relacionado permite soluções não ideais, possui restrições de tempo e não é código-golfe.

Para mais informações, assista a este vídeo da Numberphile

mbomb007
fonte

Respostas:

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<

Experimente online . É muito lento, porém, eu não recomendaria ir acima de 6.

Para verificar se realmente está fazendo o trabalho, você pode verificar este programa ligeiramente modificado que imprime todas as partições possíveis (cada partição é mostrada como uma matriz de pares de dimensões retangulares).

aditsu sair porque SE é MAU
fonte
Uau, o tempo para correr sobe abruptamente.
mbomb007
@ mbomb007 sim, bastante esperado para uma solução bruta. Na verdade, incluí várias otimizações para torná-lo mais eficiente. Se eu removê-los, poderia torná-lo um pouco menor (e mais lento e com mais fome).
aditsu encerrou porque SE é MAU 26/01
6

Anterior, 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\!^

Experimente online!

Obviamente, isso não vai ganhar nenhum prêmio por tamanho, mas na verdade é razoavelmente rápido, considerando que é uma implementação básica de força bruta em uma linguagem esotérica. No intérprete de referência Befunge, ele pode suportar até n = 6 em alguns segundos. Com um compilador, ele pode lidar com n = 8 antes de começar a ficar lento; n = 9 leva alguns minutos e n = 10 é fechado em 2 horas.

Em teoria, o limite superior é n = 11 antes de ficarmos sem memória (ou seja, não há espaço suficiente no campo de jogo para caber em um quadrado maior). No entanto, nesse ponto, o tempo necessário para calcular a solução ideal provavelmente é mais longo do que qualquer um estaria disposto a esperar, mesmo quando compilado.

A melhor maneira de ver como o algoritmo funciona é executando-o em um dos "depuradores visuais" do Befunge. Dessa forma, você pode assistir enquanto tenta ajustar os vários tamanhos de retângulo no espaço disponível. Se você quiser "avançar rapidamente" até o ponto em que ele tenha uma boa correspondência, poderá colocar um ponto de interrupção na 4sequência $_40ppróxima ao meio da décima linha (9 se for baseado em zero). O valor no topo da pilha nesse ponto é a diferença de área atual.

Abaixo está uma animação mostrando os primeiros quadros desse processo para n = 5:

Animação mostrando o processo de ajuste do retângulo

Cada retângulo distinto é representado por uma letra diferente do alfabeto. No entanto, observe que o retângulo final nunca é gravado, de modo que a seção do quadrado fique em branco.

Também escrevi uma versão de depuração do código que gera o layout atual toda vez que ele encontra uma nova melhor correspondência ( Experimente online! ). Para tamanhos menores, a primeira correspondência geralmente é a solução ideal, mas depois de passar n = 6, é provável que você veja vários layouts válidos, mas não ideais, antes de escolher a solução final.

O melhor layout encontrado para n = 10 é assim:

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
James Holderness
fonte
1
Você é um deus entre os befunge-rs.
Rɪᴋᴇʀ