(Inspirado aleatoriamente em https://codegolf.meta.stackexchange.com/a/17272/42963 )
Dada uma matriz retangular de dígitos (isto é, 0 - 9
), imprima as "partes" da matriz como se os dígitos estivessem conectados juntos, formando uma única peça, em ordem crescente pelos dígitos. É garantido que as peças se conectem apenas ortogonalmente - nenhuma peça se conectará na diagonal. Só haverá no máximo 10 peças (ou seja, uma 3
peça não aparecerá duas vezes na mesma matriz).
Por exemplo, dada a matriz
0 1 1 1
0 0 1 2
3 3 2 2
a seguir estão as peças e um exemplo de saída:
0
0 0
1 1 1
1
2
2 2
3 3
O espaçamento é importante para manter a forma das peças, mas as peças não precisam necessariamente de espaçamento interior. As peças em si devem, de alguma forma, ser diferenciadas de maneira consistente (por exemplo, uma nova linha entre as peças, garantindo que cada uma seja um personagem diferente etc.). Além disso, espaços em branco externos (por exemplo, novas linhas à direita ou colunas à esquerda) não são permitidos. Por exemplo, o seguinte também seria válido:
0
00
111
1
2
22
33
ou
#
##
###
#
#
##
##
Mas o seguinte não seria (observe os espaços à direita atrás dos 0
):
0
0 0
Rotações ou reflexões também não são permitidas. Por exemplo, saída
1
111
para a matriz acima também é inválida.
As peças da matriz podem ter furos ou ser apenas um elemento:
0 0 0 1
0 2 0 1
0 0 0 3
Ou, a peça pode ser toda a matriz:
0 0 0
0 0 0
Aqui está um caso de teste maior e mais complicado:
1 1 1 1 1 2 2
3 4 4 4 2 2 2
5 5 4 4 2 0 0
5 6 6 6 6 7 7
5 6 8 8 6 6 7
9 6 6 6 7 7 7
E um exemplo de saída:
00
11111
22
222
2
3
444
44
55
5
5
6666
6 66
666
77
7
777
88
9
Regras e E / S
- A entrada e a saída podem ser fornecidas por qualquer método conveniente .
- Você pode imprimi-lo em STDOUT ou retorná-lo como resultado de uma função.
- Um programa completo ou uma função são aceitáveis.
- É necessário um espaço em branco à esquerda para manter a forma (por exemplo, a forma "T"
1
do exemplo), um espaço em branco consistente para diferenciar as peças e uma única linha nova à direita no final é permitida, mas nenhum outro espaço em branco é permitido. - Você pode assumir com segurança que as peças são numeradas
0
de formaN
contígua, o que significa que (por exemplo)3
não seria ignorado em uma matriz de seis peças. - As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
-1
ou um espaço representando um espaço vazio ou a ausência de um elemento, se possível)?0
como valor de preenchimento? Portanto, cada peça seria impressa com o restante dos valores na matriz configurados para0
-1
ou algum outro valor em vez de nada / espaço em branco não seria bom, no entanto.' '
) deve ser usado nesse caso?Respostas:
05AB1E ,
2019 bytes-1 byte graças a @ Mr.Xcoder .
Produz listas 2D de peças (com
1
e caracteres de espaço" "
) por nova linha.Experimente online ou verifique todos os casos de teste ou imprima todos os casos de teste .
Explicação:
fonte
Haskell,
133132129 bytesPega a matriz como uma lista de cadeias e retorna uma lista de lista de cadeias.
Experimente online!
fonte
Gelatina , 18 bytes
Experimente online!
Retorna uma lista de peças, onde
1
representa uma parte de uma peça e' '
está preenchida. Os últimos' '
são removidos.fonte
ẎQ=€
deve fazer, embora precisemos das peças em ordem crescente, de modo que9Ż=€
(a menos que não devamos incluir "peças inexistentes" nesse casoẎQṢ=€
))9Ż=€
que não funcionará (acho que "espaço em branco estranho [...] não é permitido") se estende também às matrizes, é por isso que estou cortando).Python 3 ,
271209206183176172191 bytesExperimente online!
Edit: Alguma limpeza e -5 graças a @ Jonathan Frech .
Edit:
-3-26 mais uma vez, graças a @ Jonathan Frech .Edit: -7 novamente graças a @ Jonathan Frech .
Edit: +19: Conforme observado por @ nimi, a saída anterior tinha um formato incorreto.
A entrada é matriz como lista de listas:
Saída é uma lista de matrizes:
Ungolfed:
fonte
Python 2 ,
173172165 bytesExperimente online!
-15 bytes de uma observação por nimi .
Em forma de programa, leva como entrada uma lista de listas de caracteres únicos; saídas imprimindo as peças encontradas usando seus caracteres.
fonte
C # (.NET Core) ,
258, 238 bytesSem LINQ.
EDIT: Modalidade de ignorância apontando melhores declarações var! Ty ty.
Experimente online!
fonte
Python 2 , 291 bytes
Experimente online!
Espera uma picada delimitada por aspas como entrada. Uma porcentagem semi-ridícula do código é dedicada ao tratamento de entrada não separada por espaço / preenchida sem espaço.
Explicação sem golfe:
fonte
Retina , 75 bytes
Experimente online! Explicação:
Acrescente um dígito à entrada. Isso representa o contador de loop. A nova linha simplifica a remoção do espaço em branco à direita.
Iniba a saída padrão e repita exatamente 10 vezes.
Avance o dígito do loop.
Produza o resultado do restante do script, mas restaure o buffer.
Substitua todos os dígitos que não correspondem ao dígito do loop por espaços. (Como isso usa um lookahead e não há nada a considerar neste momento, isso também substitui o dígito do loop.)
Remova todo o espaço em branco à direita.
Remova todas as linhas em branco.
Repita, desde que nenhuma linha comece com um dígito ...
... exclua o primeiro caractere em cada linha.
Se sobrar alguma coisa, acrescente uma nova linha para separar cada forma da seguinte. (Isso é feito para evitar novas linhas perdidas devido à falta de dígitos.)
fonte
Carvão vegetal , 43 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Leia a entrada em uma matriz. (Isso poderia ser removido se eu usasse um formato de entrada feio.)
Faça um loop sobre os 10 dígitos.
Obtenha as linhas que contêm esses dígitos.
Verifique se o dígito foi realmente encontrado (para evitar a saída de novas linhas falsas).
Desative o preenchimento automático.
Passe pelas linhas encontradas.
Passar por cada coluna ...
... se o caractere de entrada atual for igual ao dígito do loop atual, imprima-o, caso contrário, mova o cursor para a direita.
Vá para o início da próxima linha. O uso de comandos de movimento como esse permite que o Carvão apare a saída nos dois lados.
Despejar e limpar a tela pronta para o próximo dígito. Isso permite que os diferentes dígitos tenham diferentes quantidades de corte.
Tentei uma abordagem programática, mas que pesava 47 bytes, embora também tivesse sido 43 bytes por um breve período de tempo quando
Equals
vetorizada:Experimente online! Link é a versão detalhada do código. Explicação:
Desative o preenchimento automático.
Leia a entrada em uma matriz.
Faça um loop sobre os 10 dígitos.
Compare cada caractere com a entrada e crie uma matriz booleana, mas depois filtre as linhas sem correspondências.
Faça um loop sobre as linhas restantes e corte da correspondência mais antiga de qualquer linha para a correspondência mais recente da linha atual e, em seguida, mapeie a matriz booleana de volta para dígitos ou espaços, que são impressos implicitamente como uma matriz de seqüências de caracteres.
fonte
Wolfram Language 101 bytes
Tem que haver uma maneira muito mais eficiente de conseguir isso.
fonte
Perl 5, 97 bytes
TIO
Explicação
fonte
APL (Dyalog Unicode) , 38 bytes SBCS
Função de prefixo tácito anônimo. Pega uma matriz numérica como argumento e retorna uma lista de sequências de listas. Cada lista de strings representa uma peça com
1
s separados por espaço . Espaços iniciais e internos (mas não finais) são espaços.Experimente online!
∪∘,
os elementos únicos da matriz ravel (achatada)⊂{
…}¨
Para cada um desses⍵
, chame a seguinte função com toda a matriz como⍺
:⍺=⍵
indicar onde o número da peça está na matriz⊢
rendimento que (separa2
de⍺
){
…}⍣2
Aplique a seguinte função duas vezes (⍵
é a matriz booleana):∨/
mascarar linhas com pelo menos um1
(lit. redução OR de linha)⍵⌿⍨
use isso para filtrar as linhas⍉
transpor (então fazemos isso nas colunas também, depois transporemos de volta)' '@~
substitua por espaços em posições onde não (ou seja, onde0
)⍕
formato como matriz de caracteres↓
dividido em lista de strings' +$'⎕R''
O PCRE substitui os espaços finais (qualquer número de espaços seguidos por um final de linha) por nadafonte
Japonês , 29 bytes
Experimente online!
Atualizado para obedecer a formatação de saída mais rígida.
Saída como uma lista de peças com cada peça representada por uma lista de linhas, usando 2 como caractere de preenchimento.
Explicação:
fonte
false
das listas internas. Aqui está um pastebin para que eu possa explicar melhor o que deveria ser a saída. Sinta-se à vontade para pedir à OP que esclareça, mas até onde eu entendo do desafio, nem todos os espaços em branco restantes devem estar presentes na saída.Python 3 , 133 bytes
Experimente online!
Pega uma cadeia separada por nova linha e retorna uma lista de cadeias separadas por nova linha. Usa
textwrap.dedent
para se livrar dos espaços principais.fonte
Geléia , 19 bytes
Experimente online!
Um link monádico que toma a matriz como entrada e retorna uma lista de uma lista irregular por peça. O rodapé mostra isso lindamente, mas acho que a saída sem isso é consistente com as regras da pergunta.
fonte