Expansor de caixa automático
Às vezes, minhas caixas são pequenas demais para caber em qualquer coisa. Eu preciso que você faça um expansor de caixa! Então, o que faz de uma caixa uma caixa nesse desafio.
Os cantos da caixa são sempre espaços. A própria caixa pode ser feita com o mesmo caractere. Esse caractere pode ser qualquer caractere ASCII imprimível , exceto um espaço. Então, esses são os caracteres:
Os comprimentos laterais da caixa acima são 4, 3 . Você pode assumir que o comprimento do lado é sempre positivo . Isso significa que esta é a menor caixa que você precisa manusear:
Para expandir uma caixa, você precisa incrementar o comprimento de cada lado. Vamos passar por isso, passo a passo, com o exemplo acima. Primeiro, pegamos o lado superior da caixa, que é:
Expandimos isso em um, obtendo:
Esta é a parte superior e inferior da caixa agora. Depois disso, fazemos o mesmo com os lados à esquerda e à direita:
Agora montamos novamente a caixa, que resulta em:
Dada uma caixa, expanda-a por 1. A caixa pode ser fornecida em várias linhas ou em uma matriz.
a caixa pode ter uma nova linha antes?
@Riley Sim, isso é permitido :).
— 21416 Adnan
A caixa pode ser preenchida com espaços?
@LeakyNun Sim, você pode fazer isso.
V , 6 5 bytes
Na verdade, é um byte mais longo do que deveria. Deveria ter sido:
Mas isso tem um erro desconhecido. :(
O que o outro faz?
@ ConorO'Brien äé o operador duplicado (essencialmente "y" e "p" em conjunto em um byte) de modo äêé "coluna duplicado"
onde ♥ é Control-V.
Por que não usar os YPdois momentos para obter consistência?
Eu bati acidentalmente pdurante a gravação da animação, então fiquei com ela ao transcrever a resposta. Isso importa? > _>;
Achei a inconsistência estranha, mas gosto da sua explicação.
Isso é exatamente a mesma coisa que a minha resposta em V, só que por acaso criei mapeamentos de um byte para <C-v> Ge YP. Isso faz meu idioma parecer barato. : /
Hm, control-V aparece como um coração no meu telefone ... ❤
Explicação: O primeiro regexp duplica a segunda coluna e o segundo regexp duplica a segunda linha, ampliando a caixa conforme desejado. Editar: salvou 4 bytes graças ao MartinEnder ♦.
Lambda anônima:
-7 de xnor
D é uma função que duplica o segundo item de uma sequência.
A idéia de re-utilizando a função é inteligente, mas parece ser mais curto para apenas repetir o código: lambda L:[s[:2]+s[1:]for s in L[:2]+L[1:]].
Nota lateral para a versão anterior: Eu acho que map(D,D(s))daria 43 vez
Experimente online! (Existem várias linhas adicionais que permitem um conjunto de testes em que os casos de teste são separados por dois feeds de linha.)
1é um limite que restringe a Retina a aplicar a substituição apenas na primeira correspondência encontrada. ¶corresponde a um único avanço de linha, portanto, precisamos considerar apenas a substituição do avanço de linha no final da primeira linha. É substituído por ¶$%'¶, onde $%'insere toda a linha após a correspondência (um elemento de substituição específico da Retina). Portanto, isso duplica a segunda linha.
Aqui, %é o modo por linha, para que cada linha seja processada individualmente e as linhas sejam unidas novamente depois. 2=também é um limite. Este significa "aplicar a substituição apenas ao segundo jogo". A partida em si é simples, um único caractere e a substituição a duplica. Portanto, esse estágio duplica a segunda coluna.
Usa a idéia do RootTwo de duplicar a segunda linha e coluna. O map ffaz isso para cada linha e o f.faz para as linhas.
PowerShell v2 +, 57 53 52 bytes
Um pouco semelhante à resposta JavaScript de Neil . A primeira substituição corresponde ao início da linha e aos próximos dois caracteres e os substitui pelo primeiro caractere e pelo segundo caractere duas vezes. Em vez de uma segunda substituição, ela foi trocada pela indexação de matriz para duplicar a segunda linha. Recebe entrada como uma matriz de seqüências de caracteres. As fatias da matriz resultantes são deixadas no pipeline e a impressão é implícita.
Economizou 4 bytes graças a Martin.
@MartinEnder Sim, obrigado, ó sábio Regex-Sensei.
— AdmBorkBork 12/08
Braquilog , 28 26 bytes
2 bytes graças a Fatalize.
Isso é dois bytes menor
— Fatalize 13/08/16
@Fatalize Eu nunca soube que você pode fazê-lo dessa maneira ...
A entrada é uma matriz de caracteres 2D, com ponto e vírgula como separador de linhas. Por exemplo, o primeiro caso de teste tem entrada
Experimente online! Casos de teste 1 , 2 , 3 .
O código faz o seguinte duas vezes: repita a segunda linha da matriz e transponha.
Para repetir a segunda linha de uma matriz m× n, o vetor [1 2 2 3 ... m]é usado como índice de linha. Esse vetor é gerado da seguinte maneira: range [1 2 3 ... m], anexar outro 2, classificar.
SED 69 19 (14 + 1 para -r) 15
Você não pode simplesmente fazer /.\(.\)/\0\1;2p?
@ Neil Eu procurei por tudo isso 2p, achei que havia uma maneira de fazer isso, mas não consegui encontrá-lo. Obrigado!
A parte -r '' não é necessária, desde que você adicione 1 byte ao sinalizador r, economizando 3 bytes. Além disso, desde que você editou sua primeira versão do código, a explicação no final agora não é válida.
— seshoumara 3/09/16
@ Neil Não podia acreditar nos meus olhos quando vi a referência anterior \0, pois eles começam em 1. O manual on-line do GNU sed não fala nada disso. No entanto, o uso &é equivalente e mais curto.
@seshoumara Ah, essas sutilezas da versão regexp ... qual delas usa \0então?
CJam , 14 bytes
Semelhante à minha resposta MATL , mas repete a segunda e última linha em vez da segunda.
Recebe entrada como uma matriz de caracteres:
Aplique uma função duas vezes ( 2{…}/) que forneça a transposição ( +) do argumento correto indexado ( x@) pela decodificação incremental do comprimento de execução ( &) de um mais ( 1+) uma lista dos locais iguais a 1 ( 1=) no intervalo de 0 a ( !) o tamanho da dimensão externa do argumento correto ( #x).
Experimente aqui com oK.
O símbolo APL monádico ⍉ é a transposição da matriz, que não é a mesma coisa que girar 90 graus.
@ JohnE: é claro. Eu devo estar mais cansado do que pensei. Na verdade, girar 90 graus seria ⌽⍉ou ⊖⍉, mas, neste caso, não importa.
ListSharp , 326 bytes
Eu definitivamente preciso adicionar o aninhamento de funções, mas isso funciona muito bem
comente se você quiser uma explicação
1 2, {1, 2} anexado a
1↓ um elemento caiu de
⍳ os índices
)¨ De cada
∘ do
⍴ o {número de linhas, número de colunas}
⌷ índices em
⊢ o argumento
nós encontramos os índices; {1, 2, 3} para as linhas e {1, 2, 3, 4} para as colunas. Agora, eliminamos os elementos iniciais para obter {2, 3} e {2, 3, 4} e, em seguida, acrescentamos com {1, 2}, fornecendo {1, 2, 2, 3} e {1, 2, 2, 3, 4}. Por fim, usamos isso para selecionar linhas e colunas, duplicando simultaneamente as linhas 2 e 2.
Solução muito simples, tendo como entrada uma matriz de linhas. Eu não gosto de inserts duplicados , então vou tentar jogar golfe.