Uma parede de tijolos é um retângulo feito de tijolos horizontais de 1 por n empilhados em linhas. Aqui está uma parede de altura 4 e largura 8, com tamanhos de tijolo mostrados à direita.
[______][______] 4 4
[__][____][__][] 2 3 2 1
[][______][____] 1 4 3
[____][______][] 3 4 1
Essa parede é instável porque possui uma falha , um local onde duas fendas verticais entre os tijolos se alinham, mostradas abaixo com parênteses nos tijolos ao redor.
[______][______]
[__][____)(__][]
[][______)(____]
[____][______][]
Mas, as rachaduras que cercam os tijolos tamanho 1 à direita não formam uma falha porque são separadas por uma linha.
Escreva um código que encontre e exiba uma parede firme construída com tijolos de tamanhos especificados. Menos bytes ganha.
Entrada
Uma lista não vazia de tamanhos de tijolos (números positivos) e uma altura de pelo menos 2. Essa lista pode ser classificada se você desejar. Como alternativa, você pode obter uma contagem de tijolos de cada tamanho.
Saída
Uma imagem de uma parede retangular estável da altura necessária que usa todos os tijolos fornecidos. Imprima ou retorne como uma sequência com novas linhas.
Desenhe um tijolo de tamanho n como 2n caracteres, sublinhados entre colchetes.
1: []
2: [__]
3: [____]
4: [______]
...
A entrada é garantida para ter pelo menos uma solução. Se houver vários, você ainda deve desenhar apenas uma parede.
Não há restrição de tempo; use a força bruta que quiser. Seu algoritmo deve, em teoria, trabalhar com entradas de qualquer tamanho.
Casos de teste:
Existem várias soluções, portanto, suas saídas podem ser diferentes.
>> [1, 1, 2, 2], 2
[][__]
[__][]
>> [1, 1, 1, 2, 2, 2, 2, 3], 2
[__][____][__]
[][__][][__][]
>> [1, 1, 2, 2, 3, 3, 3, 3], 3
[][__][____]
[__][____][]
[____][____]
>> [1, 2, 3, 4, 5, 6, 7, 8, 9], 5
[][______________]
[__][____________]
[________________]
[____][__________]
[______][________]
>> [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 5
[][__][__]
[__][__][]
[][__][__]
[__][__][]
[][__][__]
n>1
e não gostei de como isso restringia os casos de teste. Além disso, aparentemente há precedentes .Respostas:
Perl, 166
170 194Uma tarefa perfeita para um idioma criado por Larry Wall.
Força bruta, mas bastante rápida nos casos de teste (<1s). Uso:
Teste- me .
fonte
CJam,
94 9282 bytesEsta é a versão de 92 bytes. Versão de 82 bytes a seguir.
Isso divide os tijolos de todas as formas possíveis e leva apenas o que é válido. Força bruta por enquanto, mas ainda executa o último caso de teste em cerca de 10 segundos no Java Interpreter na minha máquina.
Explicação :
O código é dividido em 5 partes:
1) Dada uma variedade de comprimentos
L
, como todos podemos particioná-lo emH
partes.Depois disso, temos todas as formas possíveis de dividir nossa matriz de entrada em camadas de tijolo H.
2) Obtenha todas as permutações da matriz de entrada e depois obtenha ainda mais todas as partições para todas as permutações
Depois disso, temos todos os layouts possíveis dos tijolos de entrada em uma
H
parede de tijolos de camadas.3) Filtre apenas os layouts cujos comprimentos de tijolo sejam iguais
Após o final desse filtro, todos os layouts restantes seriam retângulos perfeitos.
4) Retire o primeiro layout de tijolo que corresponda aos critérios de estabilidade
Após esta etapa, basta imprimir o layout
5) Imprima o layout
Experimente online aqui
82 bytes
Isso é quase semelhante à versão de 92 bytes, exceto pelo fato de ter um toque de aleatoriedade. Se você leu a explicação para a versão de 92 bytes, na versão de 82 bytes, as partes 3, 4 e 5 são exatamente iguais, enquanto em vez de iterar todas as permutações das partes 1 e 2, essa versão simplesmente gera aleatoriamente um dos permutação de cada vez, testa usando as partes 3 e 4 e, em seguida, reinicia o processo se os testes das partes 3 e 4 falharem.
Isso imprime os resultados muito rapidamente para os três primeiros casos de teste. O caso de teste height = 5 ainda não deu uma saída no meu computador.
Explicação da diferença
A idéia para esta versão foi dada por randomra (Entendeu?)
Experimente este online
fonte
Python 2,
680670660 bytesNão sei por que insisto em ter esses "golfinhos" super longos ... mas, enfim, aqui está.
Isso requer a saída em ordem crescente classificada e é chamado via
b(brick_sizes, height)
.Casos de teste:
A maneira como isso funciona é:
fonte
continue
de perto do fim. Tambémreturn(N,N)
não precisará do parêntese.continue
era uma relíquia de uma versão anterior.W
eT
recebe um argumento extra.Haskell, 262 bytes
Exemplo de uso:
Como funciona: a função principal
#
pega uma listal
(lista de tijolos) e um númeroh
(altura) e divide todas as permutações del
emh
sublistas em todas as posições possíveis (via função%
, por exemplo,2%[1,2,3,4]
->[ [[1],[2,3]] , [[1,2],[3]] , [[1,2,3],[]] ]
). Mantém aqueles em que dois elementos consecutivos têm a mesma soma (ou seja, o mesmo comprimento em tijolos) e as listas de subtotais não possuem elementos comuns (ou seja, fendas não se alinham, funçãov
). Pegue a primeira lista que se encaixa e construa uma série de tijolos.fonte
Python 2,
528,417,393, 381Solução de força bruta muito longa. Funciona, mas é isso, o universo pode terminar antes de obter o resultado do último caso de teste.
a é a principal função:
fonte
from itertools import*
e removendoitertools.
dapermutations
chamada. Além disso, osif
s no final podem ser alterados paraif all(x==w[0] for x in w)and~-f(o):return
... para salvar 13 bytes.f
sempre retorna na primeira iteração? Isso parece estranho. É um bug ou uma enorme oportunidade de golfe.t=0
duas vezesr()
; você pode transformar essa função emmap(sum,[x[:i] for i in range(len(x))])
uma linha (adequada para lambda-ing, se desejar). O uso de isdisjoint e sets inf()
o reduziria significativamente (tambémf()
retorna atualmente após apenas um teste, independentemente de ter encontrado um erro ou não). Pessoalmente, eu reescreveriaf()
comoreturn not all(map(isdisjoint,map(set,map(r,w[:-1])),map(set,map(r,w[1:]))))
ou algo semelhante.JavaScript (ES6) 222
232 265 279 319Ainda para ser jogado golfe.Este encontra todas as soluções, produz apenas a última encontrada, e é bastante rápido.Execute o snippet no Firefox para testar
Ungolfed And Explained
fonte
Python 2, método de grade (290 caracteres)
O método aqui é você transpor a grade e procurar um
[[
ou]]
em qualquer lugar nas colunas. Você também testa se todos os tijolos do lado esquerdo e direito da parede estão alinhados: o mais interessante aqui é testar se todos os elementos de uma string são iguais:'[[[[[['.strip('[')==''
mini versão acima:
Provavelmente isso poderia ser feito mais facilmente em uma linguagem de manipulação de matrizes.
... ou abuso de expressões regulares, o que nos permite combinar a condição "alinhar os blocos nas extremidades" com a condição "sem rachaduras":
Digamos que a largura da parede fosse w = 6. Os locais da substring "[..... [" e "] .....]" devem ser exatamente o conjunto {0, w-1, w, 2w-1,2w, 3w-1 ,. ..}. A inexistência nesses pontos significa que os tijolos são 'enrolados' da seguinte maneira:
A existência NÃO nesses pontos significa que há uma rachadura instável na parede:
Portanto, reduzimos o problema para definir equivalência, onde os conjuntos em perguntas são os índices de uma correspondência de expressão regular.
Python, método regexp (304 caracteres):
fonte
x,h=input()
.Matlab (359)
Entrada
um vetor de números inteiros, exemplo: p ([1 1 2 2 3])
Saída
o esquema do exemplo de parede:
fonte