Entrada
Sua entrada neste desafio é uma lista de pares inteiros. Eles representam os cantos a sudoeste de quadrados de unidade no avião e a lista representa sua união como um subconjunto do avião. Por exemplo, a lista
[(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)]
representa o conjunto de cor vermelha nesta imagem:
Saída
Yor output é uma lista de quádruplos inteiros, representando subconjuntos retangulares do plano. Mais explicitamente, um quádruplo (x,y,w,h)
repercute um retângulo de largura w > 0
e altura h > 0
cujo canto sudoeste está (x,y)
. Os retângulos devem formar uma cobertura exata da região de entrada, no sentido de que cada quadrado da unidade é um subconjunto de algum retângulo, cada retângulo é um subconjunto da região e dois retângulos podem se sobrepor apenas em suas bordas. Para proibir soluções triviais, a cobertura não deve conter dois retângulos que possam ser mesclados em um retângulo maior.
Por exemplo, a lista
[(0,0,2,1),(0,1,3,1),(1,2,2,1)]
representa a cobertura legal
da região acima, enquanto a cobertura dada pelo
[(0,0,2,2),(2,1,1,1),(1,2,1,1),(2,2,1,1)]
é ilegal, pois os quadrados 1 por 1 vizinhos podem ser mesclados:
Regras
Você pode dar um programa completo ou uma função. A formatação precisa da entrada e saída não é importante, dentro do razoável. A menor contagem de bytes vence e as brechas padrão não são permitidas. Você é incentivado a fornecer uma explicação do seu algoritmo e alguns exemplos de resultados.
Casos de teste
Uma região em forma de U:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(2,0),(2,1),(3,0),(3,1),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5)]
Um triângulo grande:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(3,0),(3,1),(3,2),(3,3),(3,4),(3,5),(3,6),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(6,0),(6,1),(6,2),(6,3),(7,0),(7,1),(7,2),(8,0),(8,1),(9,0)]
Um quadrado com furos:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(3,0),(3,1),(3,2),(3,4),(3,5),(3,6),(3,7),(3,8),(3,9),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,7),(5,8),(5,9),(6,1),(6,2),(6,3),(6,5),(6,6),(6,7),(6,8),(6,9),(7,0),(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),(7,7),(7,8),(7,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,4),(9,5),(9,6),(9,7),(9,8),(9,9)]
Regiões desconectadas:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,6),(1,7),(1,8),(1,9),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(4,0),(4,1),(4,2),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,6),(5,7),(5,8),(5,9),(6,0),(6,1),(6,2),(6,4),(6,5),(6,6),(6,7),(6,8),(6,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,7),(9,8),(9,9),(10,0),(10,1),(10,2),(10,3),(10,4),(10,5),(10,6),(10,7),(10,8),(10,9)]
Verificador
Use este programa Python 2 para verificar sua solução. Ele retira do STDIN uma lista de tuplas (a entrada) e uma lista de quádruplas (sua saída), separadas por vírgula.
Também escrevi este programa Python 2 para gerar as imagens e você também pode usá-lo. Ele retira do STDIN uma lista de tuplas ou quádruplas e produz um arquivo chamado out.png
. Requer a biblioteca PIL. Você também pode alterar o tamanho das células da grade e a largura das linhas de cintura.
3-h
para~h
?Python -
272261258251224Eu acho que posso jogar mais isso.
Tenho certeza de que isso funciona, mas ainda não terminei de testá-lo em todos os casos de teste.Eu terminei de testá-lo. Funciona para todos os casos de teste.Estou trabalhando para adicionar imagens dos resultados.Editar: Aqui estão os resultados do exemplo e dos casos de teste:Estou tentando escrever isso em Perl, mas não consigo descobrir como obter matrizes multidimensionais do stdin sem um grande número de caracteres. Alguém tem alguma sugestão?
fonte
(i[0]+w,i[1]+j)not in c
a{(i[0]+w,i[1]+j)}-c
e você pode moverw=h=1
para ac=set(a)-set(b)
linhab+=[(j+i[0],k+i[1])]
parab+=(j+i[0],k+i[1]),
e você usarrange
três vezes por isso é mais curto para atribuirr=range
x,y=i
isso usandox
e emy
vez dei[0]
ei[1]
? Isso economizaria muitos bytes.while not[j for j in r(h)if(x+w,y+j)not in c]:w+=1
usarwhile all((x+w,y+j)in c for j in r(h)):w+=1
.Python 2, 139
O programa aceita listas de pares ordenados cercados por chaves na entrada padrão. Por exemplo,
{(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)}
Muitas vezes é irritante (não apenas no golfe) que o Python não permita uma atribuição dentro de um teste de loop. Para contornar isso, usei operações de formatação de string.
fonte
Mathematica -
315 285267 bytesCom alguma ajuda de @ MartinBüttner.
Ungolfed:
Uso:
Casos de teste
Uma região em forma de U
Um triângulo grande
Um quadrado com buracos
Regiões desconectadas
fonte
Haskell, 158
casos de teste e imagens estarão aqui em breve.
Algoritmo: Pegue o primeiro quadrado. Chegue o mais à direita sem encontrar um quadrado que não esteja na entrada. Em seguida, alcance o mais alto possível sem ter um quadrado que não esteja na entrada. Agora temos um retângulo sem um quadrado ausente. Adicione-o à saída, remova todos os quadrados da entrada e chame recursivamente.
fonte
not$all(\x->elem(x,i)s)
porany(\x->notElem(x,i)s)
.JavaScript (ES6) 148155
199Edit2 Um pouco mais de ajuste
Edit Some golfing + reescreva usando a recursão. Não esperava tal redução. Agora é um pouco difícil de seguir, mas o algoritmo é o mesmo.
O algoritmo é semelhante à resposta @jakube.
Sim? O primeiro elemento cresce, o segundo elemento é apagado, inicia novamente na etapa 2
Senão, prossegue para o próximo elemento
Teste no snippet
fonte
Mathematica,
153 151 144 136 136133Exemplo:
Entrada:
Saída:
Entrada:
Saída:
Algoritmo:
Cubra a região com quadrados de unidades e mescle-os.
fonte