A arte ASCII é divertida. Os editores de texto modernos são muito bons em manipular o texto. As linguagens de programação modernas estão à altura da tarefa?
Uma tarefa comum na manipulação de arte ASCII é cortar o texto em um retângulo entre dois caracteres. Esta é a tarefa que você deve implementar neste desafio.
Detalhes
Seu programa terá três entradas:
- o primeiro é o caractere 'start' do bloco - marcando o canto superior esquerdo
- o segundo é o caractere 'final' do bloco - marcando o canto inferior direito
- a terceira é uma forma de texto com várias linhas, uma string ou lista de strings, ou nome do arquivo ou qualquer outra coisa
O resultado será um texto com múltiplas linhas (novamente, em qualquer um dos formatos acima) recortado no retângulo entre as entradas fornecidas. Observe que as duas primeiras entradas podem não ser exclusivas.
Casos de borda
As caixas devem sempre ter volume pelo menos 2. Assim, estas:
() (
)
são caixas, mas estas:
)( ) (
( )
não são (com início = (
e fim = )
).
A entrada conterá apenas uma caixa. Portanto, os caracteres inicial e final devem ocorrer apenas uma vez, a menos que sejam o mesmo caractere; nesse caso, devem ocorrer exatamente duas vezes.
Além disso, cada linha na entrada deve ter pelo menos a distância entre o início de uma linha e a borda direita da caixa na entrada.
Seu programa não precisa manipular entradas inválidas; eles podem resultar em comportamento indefinido.
Regras
Aplicam-se regras típicas de código-golfe. O menor código vence.
Exemplos
Dia ensolarado: start: ( end: ) input:
This is some text
. (but this text
is in a box ).
So only it is important.
Resultado:
(but this text
is in a box )
Observe a remoção do espaço horizontal também. As culturas artísticas ASCII são 2d.
Dia chuvoso: start: ( end: ) input:
This is some text (
But is that even )
really a box?
Resultado:
(
)
Mesmo começo / fim: start: / end: / input:
Oh, I get how this could be useful
/----------------------------\
| All this text is in a box! |
\----------------------------/
Resultado:
/----------------------------\
| All this text is in a box! |
\----------------------------/
Entrada inválida: start: ( end: ) input:
Boxes are rectangular ( so this has
0 volume ) which is illegal.
Entrada inválida 2: start: ( end: ) input:
(The lines must already be square
so this line that is too short
relative to this end, is illegal)
Respostas:
Vim,
16, 12 bytes / pressionamentos de teclaExperimente online! no intérprete V
Aposto que editores de texto antigos são ainda melhores! : D
Mesmo que não seja necessariamente necessário, esta resposta funciona com as duas entradas "inválidas" fornecidas, gerando
e
Explicação:
fonte
/\/<cr><c-v>nygv$o0dp
ou algo assim por muito tempo :)Gelatina , 13 bytes
Um link diádico que aceita uma lista de caracteres iniciais e finais à esquerda e uma lista de linhas (como listas de caracteres) à direita, que produz uma lista de linhas (como listas de caracteres).
Experimente online! (programa completo - se as entradas forem válidas para Python, elas exigirão citações em string de Python.)
Quão?
Como exemplo, com esquerda =
['a', 'b']
e direita (como uma lista de listas de caracteres - as linhas):=€
produz uma lista de duas listas de listas (a primeira executa'a'=
, a segunda'b'=
):somar isso gera uma única lista de listas (somar elemento a elemento):
ŒṪ
então nos fornece os índices multidimensionais (indexados 1) dos não-zeros,[[2,3],[4,6]]
- ie[[top,left],[bottom,right]]
.r/
então executa o[2,3]r[4,6]
que, desder
vetoriza, é como[2r4, 3r6]
, avaliando para[[2,3,4],[3,4,5,6]]
- ie[rows,columns]
.,þ/
em seguida, executa[2,3,4],þ[3,4,5,6]
whereþ
é uma instrução de poduto externo e,
é par. Isso gera todos os[row,column]
valores por coluna, neste caso:Queremos isso por linha, então
Z
é usado para transpor isso para:Finalmente, os
œị
índices retornam para as linhas de entrada:Vale ressaltar que, quando os dois caracteres delimitadores são os mesmos,
=€
identifica-os duas vezes, masSŒṪ
acaba fazendo a coisa certa, pois2
é verdade, por exemplo, com['a','a']
:fonte
APL (Dyalog) ,
3830 bytes4 bytes salvos graças a @EriktheOutgolfer
Experimente online!
fonte
⍸matrix∊separators
, e fazer take / queda com eles(⍸a=⎕)↓(1+⍸a=⎕)↑a←⎕
with⎕io←0
⊃{⌽⊖⍵↓⍨⊃⍸⍺=⍵}/⎕⎕⎕
(sic, com 3 quads à direita), que é ainda mais curto. Ou... ⎕⎕(↑⎕)
se uma matriz pré-misturada não for permitida.Gelatina , 14 bytes
Experimente online!
fonte
()
) vazia (Python ), não'()'
. Se for analisável, ele precisa ser citado, no entanto, o meu//
não precisa ser citado (operador de divisão inteira sem operandos? Hm ...).()
está sendo interpretado por Jelly como algum tipo de personagem especial. A maioria dos pares de caracteres que eu tento trabalhar. Eu adoraria ouvir o que as pessoas mais familiarizadas com Jelly pensam. EDIT: ninja-ed por erik the outgolferPython 2 , 130 bytes
Experimente online!
fonte
Tela , 37 bytes
Experimente aqui!
36 bytes para obter as coordenadas dos caracteres (e convertê-los em x, y, w, h porque é isso que
@
leva) e 1 byte para obter a subseção. Deve haver uma abordagem melhorfonte
JavaScript (ES6), 98 bytes
Recebe a entrada como dois números inteiros e uma matriz de seqüências de caracteres. Retorna uma matriz de strings.
Experimente online!
Comentado
fonte
filter
emap
?! Criar uma nova matrizreduce
ou uma solução recursiva não funcionaria mais curto? No meu telefone, no pub ou eu mesmo daria uma chance.X
eY
sejam conhecidos com certeza.Java 10, 204 bytes
Modifica a matriz de entrada em vez de retornar uma nova para salvar bytes. Isso significa que as linhas removidas se tornam
""
, em vez disso. Se isso não for permitido, vou alterá-lo.Experimente online.
Explicação:
Por exemplo:
Com as entradas
start = "("
,end = ")"
elines =
o primeiro loop irá cortá-lo na parte superior e esquerda, alterando-o para este:
o segundo loop irá cortá-lo na parte inferior e direita, alterando-o para este:
fonte
Retina 0.8.2 , 110 bytes
Experimente online! Explicação:
Exclua as linhas de entrada anteriores à primeira linha da caixa.
Se o caractere inicial estiver na coluna esquerda da entrada, exclua-o.
Se o caractere inicial ainda não tiver sido excluído, altere todas as colunas de entrada deixadas por uma e repita desde o início.
Exclua o caractere final e tudo na entrada após o caractere final.
Trunque todas as linhas para o comprimento da próxima linha. Isso funciona contando todos os caracteres, exceto um, em cada linha e, em seguida, tentando corresponder a tantos caracteres na linha seguinte; se for bem-sucedido, a segunda linha será mais curta; o último caractere será excluído e o loop será repetido.
fonte
C (gcc) , 237 bytes
Experimente online!
Tenho 99% de certeza de que isso pode ser reduzido usando algum tipo de função auxiliar para encontrar o índice horizontal e o ponteiro para um caractere, pois é repetido duas vezes. Infelizmente, não consegui encontrar uma maneira curta o suficiente para fazê-lo; posso tentar novamente mais tarde, se encontrar tempo.
Descrição
fonte
Stax , 15 bytes
Execute e depure
Leva o conjunto de caracteres delimitadores de caixa (1 ou 2) na primeira linha de entrada. O restante das linhas é o corpo da entrada.
Descompactado, não jogado e comentado, é assim.
Execute este
fonte