Estabilizar uma estrutura de tijolo

8

Tijolos e estabilidade definidos

Esta pergunta usa a mesma definição de tijolos e estabilidade que a estrutura de tijolos é estável?

Vamos [__]representar um tijolo de alvenaria e

         .
         .
         .
  BRK?BRK?BRK?BRK?  
BRK?BRK?BRK?BRK?BRK?
  BRK?BRK?BRK?BRK?  
BRK?BRK?BRK?BRK?BRK? . . .
  BRK?BRK?BRK?BRK?  
BRK?BRK?BRK?BRK?BRK?

representam um arranjo ou estrutura arbitrária desses tijolos, com todas as outras linhas deslocadas por meio tijolo, como é habitual na construção de tijolos. A estrutura pode se estender para cima e para a direita indefinidamente, mas a representação da string sempre será um bloco de texto perfeitamente retangular (com espaços finais, quando necessário) cuja largura é divisível por 4.

Cada um BRK?na estrutura pode ser um tijolo ( [__]) ou um espaço vazio (4 espaços).

Por exemplo, uma estrutura possível (instável - continue a ler) é

[__]    [__]    [__]
  [__]        [__]  
[__][__]    [__]    

A estabilidade de uma estrutura é importante, e uma estrutura só é estável se cada um de seus tijolos for estável.

Existem três maneiras pelas quais um tijolo individual pode ser estável:

  1. Qualquer tijolo no chão (a linha mais baixa de tijolos) é estável.
  2. Qualquer tijolo que tenha dois tijolos diretamente abaixo é estável:

      [__]   <- this brick is stable
    [__][__] <- because these bricks hold it up
    
  3. Qualquer tijolo que tenha um tijolo acima e abaixo do mesmo lado é estável:

      [__]  [__]
    [__]      [__] <- these middle bricks are stable
      [__]  [__]      because the upper and lower bricks clamp them in
    
    [__]          [__]
      [__]      [__]   <- these middle bricks are NOT stable
        [__]  [__]
    

(Sim, eu sei que essas regras não são fisicamente precisas.)

O último desafio foi determinar se uma estrutura era estável. Este é sobre estabilizar aqueles que não são.

Desafio

Escreva um programa que inclua um arranjo potencialmente instável de tijolos e adicione novos tijolos a espaços vazios de tijolos para tornar tudo estável, imprimindo o resultado. Isso deve ser feito sem aumentar as dimensões gerais do bloco de texto de entrada.

O objetivo é criar um algoritmo que torne a estrutura estável, adicionando o mínimo possível de tijolos.

Este JSFiddle ( fonte ) permite gerar arranjos aleatórios de tijolos para uso durante o teste do seu programa. (Gostaria de poder empilhar trechos .) WidthÉ o número de tijolos na camada base, Heighto número de camadas de tijolos e Densitya fração dos espaços de tijolos preenchidos.

Por exemplo, com Width = 5, Height = 3, Density = 0.6uma saída possível é

....[__]....[__]....
..[__]....[__]......
[__]............[__]

Uma maneira de estabilizar isso com 4 novos tijolos é

....[__]....[__]....
..[__][__][__][__]..
[__][__]....[__][__]

Seu programa deve ser capaz de estabilizar qualquer estrutura de blocos que o JSFiddle possa gerar.

  • Isso inclui a cadeia vazia (que é considerada estável).
  • O tijolo sempre será [__]. Os pontos ( .) são usados ​​apenas para maior clareza. Seu programa pode usar pontos ou espaços para espaço vazio.
  • A estrutura já pode estar estável, caso em que nada precisa ser feito (além de imprimi-lo).
  • O JSFiddle sempre gera estruturas que podem ser estabilizadas (evitando Width = 1e tijolos nos cantos superiores). Você pode confiar nisso. (Preencher todos, exceto os cantos superiores, certamente estabilizará as coisas, mas isso claramente não é o ideal.)
  • Suponha que não haja entrada inválida. Tome a entrada como string como quiser. Imprima a estrutura estabilizada em stdout ou similar.
  • Lembre-se de que as dimensões do bloco de texto não devem mudar de tamanho.
  • Tijolos pré-existentes não podem ser movidos ou removidos. A colocação de novos tijolos deve seguir o padrão de grade de deslocamento em todas as outras linhas. Todos os tijolos devem estar completamente dentro dos limites.
  • É recomendável (mas não obrigatório) que você imprima os tijolos preexistentes em [XX]vez de [__], para que as pessoas possam ver melhor como sua solução funciona.

Pontuação

Na parte inferior do JSFiddle, existem 8 arranjos instáveis ​​pré-definidos de tijolos. (Eles usam [__]e .devem permanecer assim, a menos que você esteja usando [XX]e / ou não.) Alguns são aleatórios e outros que eu mesmo criei. Para calcular sua pontuação, execute o programa em cada uma delas e some o número de novas peças adicionadas a cada uma delas.

Quanto menos novos tijolos você adicionar, melhor. A finalização com a menor pontuação vence. Em caso de empate, a resposta mais antiga vence.

Se as coisas ficarem controversas, posso adicionar mais alguns casos predefinidos e julgar o vencedor com base neles.

Notas adicionais

  • Seu programa precisa ser executado na ordem dos minutos em um computador moderno, para largura e altura da grade inferior a 100. (Máximo de 10 minutos em um computador como este .)
  • Você não pode codificar sua saída para as 8 estruturas predefinidas. Seu programa deve tratá-los como trataria qualquer outro arranjo.
  • Inclua um exemplo de saída ou dois, ou qualquer estrutura interessante que você queira compartilhar. :)
  • Esse problema está relacionado à localização de uma árvore de abrangência mínima .
Passatempos de Calvin
fonte
Devo salientar que o exemplo "estabilizado" em "Desafio" não é realmente estável de acordo com os critérios estabelecidos.
COTO
@COTO Realmente. Fixo.
Calvin's Hobbies
no seu exemplo, o tijolo do meio não é necessário para estabilizar a estrutura.
John Dvorak
@JanDvorak: Ele afirma "uma maneira" de estabilizar, não "a maneira ideal", então tecnicamente não é um erro. Mas concordo que tirar o tijolo do meio do caminho pode ajudar a esclarecer o fato de que a intuição física não é nossa amiga nesse problema. ;)
COTO
O @JanDvorak COTO está certo, não importava que não fosse o ideal, mas mesmo assim eu mudei.
Calvin's Hobbies

Respostas:

3

Java - 5.056 tijolos

  • 20x20, 0,03 - 75
  • 15x81, 0,05 - 431
  • 50x50, 0,20 - 882
  • 99x99, 0,01 - 2.567
  • Pedestal liso - 269
  • Casa Simples - 129
  • Torre Criss-Cross - 323
  • Começos da ponte - 380

O código fonte é visível aqui .

O código é executado em alguns milissegundos para qualquer uma das 8 entradas de pontuação. Existem algumas saídas visivelmente abaixo do ideal, particularmente na torre cruzada e nos casos de 99x99. Tenho várias idéias sobre como melhorar a rotina, mas é bastante volumosa como está e, portanto, deixarei em paz por enquanto.

Os resultados massacram as leis da física em uma extensão cômica. : D

Algumas amostras são mostradas abaixo.

Saída 20x20, 0,03

................................................................................
..........[XX]..................................................................
........[  ][  ]................................................................
..........[  ]..................................................................
............[  ]................................................................
..........[  ]..................................................................
............[  ]....................[XX]........................................
..........[  ]....................[  ][  ]......................................
....[XX]....[  ]....................[  ]........................................
..[  ][  ][  ][  ]................[  ]..........................................
....[XX]....[  ][XX]................[  ]........................................
..[  ]........[  ]................[XX]..........................................
....[  ]........[  ]............[  ][  ]........................................
..[  ]........[  ]................[  ]..........................................
....[  ]........[  ]............[XX]................................[XX]........
..[  ]........[  ]....[XX]........[  ]................[XX]........[  ][XX][  ]..
....[  ]........[  ][  ][  ]....[  ]....[XX]........[  ][  ]........[  ][  ][XX]
..[  ][  ]....[  ]....[  ]........[XX][  ][  ]........[  ]........[  ]....[  ]..
....[  ]........[  ]....[  ]....[  ]....[  ]............[  ]........[  ]....[  ]
......[XX]....[  ]....[  ]........[  ][  ]............[  ]........[  ]....[  ]..
....[  ]........[  ]....[  ]....[  ]....[  ]....[XX]....[  ]........[  ]....[  ]

Saída simples da casa

................................................................................
................................................................................
................................................................................
......................................[XX]......................................
....................................[XX][XX]....................................
..................................[XX][  ][XX]..................................
................................[XX][  ][  ][XX]................................
..............................[XX][  ]....[  ][XX]..............................
............................[XX][  ]........[  ][XX]............................
..........................[XX][  ]............[  ][XX]..........................
........................[XX][  ]................[  ][XX]........................
......................[XX][  ]....................[  ][XX]......................
....................[XX][  ]........................[  ][XX]....................
..................[XX][  ]............................[  ][XX]..................
................[XX][  ]................................[  ][XX]................
..............[XX][  ]....................................[  ][XX]..............
............[XX][  ]........................................[  ][XX]............
..........[XX][  ]............................................[  ][XX]..........
........[XX][  ]................................................[  ][XX]........
......[XX][  ]................................................[  ][  ][XX]......
....[XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX]....
......[XX][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]....[XX]......
....[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]........[XX]....
......[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[XX]......
....[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]........[XX]....
......[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[XX]......
....[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]........[XX]....
......[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ][  ][  ]....[XX]......
....[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ][  ][  ]........[XX]....
......[XX]....[XX][XX][XX][XX][  ]....[XX][XX][XX][XX][XX][XX]........[XX]......
....[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ][  ]............[XX]....
......[XX]....[XX]....[  ][XX]........[XX]....[  ]....[  ][XX]........[XX]......
....[XX]....[  ]....[  ][  ][  ]....[  ]....[  ]........[  ]............[XX]....
......[XX]....[XX]....[  ][XX]........[XX]....[  ]........[XX]........[XX]......
....[XX]....[  ]........[XX]........[  ]....[  ]........[  ]............[XX]....
......[XX]....[XX]........[XX]........[XX][XX][XX][XX][XX][XX]........[XX]......
....[XX]....[  ]........[  ]........[  ]....[  ][  ][  ][  ]............[XX]....
......[XX]....[XX]........[XX]........[  ]....[  ]....[  ]............[XX]......
....[XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX]....
COTO
fonte
2

Python, 18992

Essa é a solução mais simplista e a pior pontuação possível. É apenas para referência; a coisa a ser batida. Preenche todos os espaços vazios, exceto os dois cantos superiores, com tijolos, garantindo estabilidade.

s = '''
....[__]....[__]....
..[__]....[__]......
[__]............[__]
'''

def brickify(structure):
    structure = filter(lambda x: x, s.replace('__', 'XX').split('\n'))
    if not structure:
        return '', 0
    if len(structure) > 1 and len(structure) % 2:
        structure[0] = '----' + structure[0][4:-4] + '----'
    added = 0
    offset = False
    for i in range(len(structure)-1,-1,-1):
        line = structure[i]
        if offset:
            line = line[2:-2]
        added += line.count('....')
        line = line.replace('....', '[__]')
        if offset:
            line = '..' + line + '..'
        structure[i] = line
        offset = not offset
    structure[0] = structure[0].replace('----', '....')
    return structure, added

s, a = brickify(s)

#print '\nNew bricks:', a

for line in s:
    print line

Para usar, copie a estrutura inicial entre aspas triplas na parte superior do programa.

Aqui é executado na casa, adicionando 609 tijolos:

..[__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__]..
[__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__]
..[__][__][__][__][__][__][__][__][__][XX][__][__][__][__][__][__][__][__][__]..
[__][__][__][__][__][__][__][__][__][XX][XX][__][__][__][__][__][__][__][__][__]
..[__][__][__][__][__][__][__][__][XX][__][XX][__][__][__][__][__][__][__][__]..
[__][__][__][__][__][__][__][__][XX][__][__][XX][__][__][__][__][__][__][__][__]
..[__][__][__][__][__][__][__][XX][__][__][__][XX][__][__][__][__][__][__][__]..
[__][__][__][__][__][__][__][XX][__][__][__][__][XX][__][__][__][__][__][__][__]
..[__][__][__][__][__][__][XX][__][__][__][__][__][XX][__][__][__][__][__][__]..
[__][__][__][__][__][__][XX][__][__][__][__][__][__][XX][__][__][__][__][__][__]
..[__][__][__][__][__][XX][__][__][__][__][__][__][__][XX][__][__][__][__][__]..
[__][__][__][__][__][XX][__][__][__][__][__][__][__][__][XX][__][__][__][__][__]
..[__][__][__][__][XX][__][__][__][__][__][__][__][__][__][XX][__][__][__][__]..
[__][__][__][__][XX][__][__][__][__][__][__][__][__][__][__][XX][__][__][__][__]
..[__][__][__][XX][__][__][__][__][__][__][__][__][__][__][__][XX][__][__][__]..
[__][__][__][XX][__][__][__][__][__][__][__][__][__][__][__][__][XX][__][__][__]
..[__][__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__][__]..
[__][__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__][__]
..[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]..
[__][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][__]
..[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][XX][XX][XX][XX][__][__][XX][XX][XX][XX][XX][XX][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][XX][__][__][XX][__][__][XX][__][__][__][__][XX][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][XX][__][__][XX][__][__][XX][__][__][__][__][XX][__][__][XX][__]..
[__][XX][__][__][__][__][XX][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][XX][__][__][XX][__][__][XX][XX][XX][XX][XX][XX][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][XX][__][__][XX][__][__][__][__][__][__][__][__][__][__][XX][__]..
[__][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][__]

O número de tijolos adicionados a cada uma das 8 estruturas predefinidas em ordem é

374 1107 2041 9627 506 609 1088 3640 (sum to 18992)
Passatempos de Calvin
fonte
Linha 20, tijolo 19, está faltando um suporte esquerdo.
golfer9338
@ golfer9338 Obrigado por perceber. Corrigido no post e no jsfiddle.
Calvin's Hobbies
Para não torná-lo muito inteligente, mas você precisa adicionar tijolos à linha superior?
Sparr
@ Sparr Não, você não. Mas isso pretende dar a pior pontuação possível apenas como demonstração.
Calvin's Hobbies