O algoritmo de escultura de costura, ou uma versão mais complexa, é usado para redimensionar imagens com reconhecimento de conteúdo em vários programas gráficos e bibliotecas. Vamos jogar golfe!
Sua entrada será uma matriz bidimensional retangular de números inteiros.
Sua saída será a mesma matriz, uma coluna mais estreita, com uma entrada removida de cada linha, aquelas entradas representando um caminho de cima para baixo com a menor soma de todos esses caminhos.
https://en.wikipedia.org/wiki/Seam_carving
Na ilustração acima, o valor de cada célula é mostrado em vermelho. Os números pretos são a soma do valor de uma célula e o menor número preto em uma das três células acima dela (apontada pelas setas verdes). Os caminhos destacados em branco são os dois caminhos de soma mais baixa, ambos com uma soma de 5 (1 + 2 + 2 e 2 + 2 + 1).
Em um caso em que há dois caminhos vinculados para a soma mais baixa, não importa qual você remove.
A entrada deve ser obtida do stdin ou como um parâmetro de função. Ele pode ser formatado de maneira conveniente para o idioma de sua escolha, incluindo colchetes e / ou delimitadores. Especifique na sua resposta como a entrada é esperada.
A saída deve ser stdout em um formato delimitado sem ambiguidade, ou como um valor de retorno de função no equivalente em seu idioma a uma matriz 2D (que pode incluir listas aninhadas, etc.).
Exemplos:
Input:
1 4 3 5 2
3 2 5 2 3
5 2 4 2 1
Output:
4 3 5 2 1 4 3 5
3 5 2 3 or 3 2 5 3
5 4 2 1 5 2 4 2
Input:
1 2 3 4 5
Output:
2 3 4 5
Input:
1
2
3
Output:
(empty, null, a sentinel non-array value, a 0x3 array, or similar)
EDIT: Os números serão todos não negativos, e cada costura possível terá uma soma que cabe em um número inteiro de 32 bits assinado.
fonte
Respostas:
CJam,
5144 bytesEssa é uma função anônima que exibe uma matriz 2D da pilha e empurra uma em troca.
Experimente os casos de teste online no interpretador CJam . 1
Idéia
Essa abordagem itera todas as combinações possíveis de elementos de linha, filtra aquelas que não correspondem às costuras, classifica pela soma correspondente, seleciona o mínimo e remove os elementos correspondentes da matriz. 2
Código
1 Observe que o CJam não pode distinguir entre matrizes vazias e cadeias vazias, pois cadeias são apenas matrizes cujos elementos são caracteres. Portanto, a representação de strings de matrizes vazias e de strings vazias é
""
.2 Embora a complexidade de tempo do algoritmo mostrado na página da Wikipedia deva ser O (nm) para uma matriz n × m , essa é pelo menos O (m n ) .
fonte
{2ew::m2f/0-!},
Haskell, 187 bytes
Exemplo de uso:
Como funciona, versão curta: crie uma lista de todos os caminhos (1), por caminho: remova os elementos correspondentes (2) e some todos os elementos restantes (3). Pegue o retângulo com a maior soma (4).
Versão mais longa:
fonte
IDL 8.3, 307 bytes
Meh, tenho certeza que isso não vai ganhar, porque é longo, mas aqui está uma solução direta:
Ungolfed:
Criamos iterativamente a matriz de energia e rastreamos em que direção a costura segue e, em seguida, construímos uma lista de remoção quando conhecemos a posição final. Remova a costura através da indexação 1D e depois volte para a matriz com as novas dimensões.
fonte
[0:n]
; se isso for verdade, é fácil substituirr+=[0:z[1]-1]*z[0]
porr+=indgen(z[1]-1)*z[0]
.JavaScript ( ES6 ) 197209
215Implementação passo a passo do algoritmo da Wikipedia.
Provavelmente pode ser reduzido mais.
Teste a execução do snippet no Firefox.
fonte
Pip, 91 bytes
Isso não vai ganhar nenhum prêmio, mas eu me diverti trabalhando nisso. O espaço em branco é apenas para fins estéticos e não está incluído na contagem de bytes.
Esse código define uma função anônima cujo argumento e valor de retorno são listas aninhadas. Ele implementa o algoritmo da página da Wikipedia:
a
(o argumento) são os números vermelhos ez
são os números pretos.Aqui está uma versão com equipamento de teste:
Resultados:
E aqui está o equivalente aproximado no Python 3. Se alguém quiser uma explicação melhor do código Pip, basta perguntar nos comentários.
fonte