Usuários de recuo do espaço, uni-vos ! Devemos lutar contra todos os usuários da aba humilde !
Sua missão (se você optar por aceitá-la) é escrever um programa ou função que aceite dois argumentos:
- Uma sequência: esta é a entrada.
- Um número inteiro positivo: esse é o número de espaços por guia.
Você deve percorrer todas as linhas da string e substituir todas as guias usadas para indentação pelo número de espaços especificado e todas as guias não usadas para indentação (por exemplo, no meio de uma linha) por um espaço.
Observe que linhas como \t \tabc
comportamento indefinido; eles foram inseridos pelos usuários da guia Evil para complicar seus programas.
De acordo com a sociedade Tabs Must Die, seu programa deve ser o mais curto possível para evitar a detecção pelos usuários maus da guia.
Exemplo
\t
é usado para representar guias aqui.
String de entrada:
a
\t\tb\tc
d
Número de entrada:
4
Saída:
a
b c
d
A linha do meio foi recuada por 8 espaços, 4 por guia (já que o número fornecido era 4).
String de entrada:
\ta\t\tb
Número de entrada:
4
Saída:
a b
NOTA: Essa não é uma duplicata do desafio de expansão da guia ; requer um formato de entrada muito diferente e requisitos ligeiramente diferentes.
fonte
\ta\t\tb
,4
(minha revisão anterior estava falhando aquele)Respostas:
CJam,
302423 bytesNormalmente me recuso a postar código malicioso na internet ...
Este é um programa completo que lê a seqüência de caracteres de STDIN e o número como um argumento da linha de comando.
Experimente on-line no intérprete CJam .
Como funciona
O que
NA=
faz:Para o primeiro caractere,
N
ele conterá seu valor padrão, ou seja, a string"\n"
.Para todos os caracteres subsequentes,
N
conterá o resultado da última iteração, ou seja, o último caractere da entrada, um caractere de espaço ou uma sequência de um ou mais espaços.Se
N
for uma sequência,NA=
selecione o elemento no índice 10 de N (contornando). O resultado será um espaço ou um caractere de avanço de linha. Ambos são verdadeiros.Se N for um caractere,
NA=
pressione 1 para avanço de linha e 0 caso contrário.Por causa do acima,
NA=
empurrará um valor verdadeiro para o primeiro caractere, um caractere precedido por um avanço de linha ou um caractere precedido por uma sequência de espaços (recuo que já foi substituído).Em todos os outros casos (incluindo um tabulador que foi substituído por um caractere de espaço ),
NA=
enviará um valor falso.fonte
K5,
5345 bytesEm ação:
Eu só quero que o registro mostre que esta questão é moralmente repreensível.
fonte
... this question is morally reprehensible.
`0:
e `" \ n "\`.Perl, 23 bytes
Código de 22 bytes + linha de comando de 1 bytes
Espero que não seja muito atrevido assumir que a entrada numérica pode ser fornecida através do parâmetro -i! Certifique-se de substituir \ t no código abaixo pelo caractere de tabulação real.
Exemplo de uso:
Ou por conveniência:
Explicação:
O uso do
-p
argumento executará o programa para todas as linhas da entrada e imprimirá o resultado no final.No exemplo acima, a substituição do regex substitui
\G\t
por" "x4
(um espaço repetido quatro vezes).\G
é uma construção de expressão regular pouco conhecida que corresponde à posição da primeira correspondência se a primeira iteração ou da posição da correspondência anterior se não à primeira iteração, o que significa que substituirá apenas todas as guias no início da string e faça-o um por um. Oy/\t/ /
simplesmente substitui todas as guias restantes por espaços.fonte
Julia,
6959 bytesUngolfed:
Economizou 10 bytes e corrigiu um problema graças ao Glen O!
fonte
"hello\t\t1"
?"\t \t"
situações), você pode fazer o seguintef(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")
:, que usa uma função de substituição e captura todas as guias de recuo em uma ocorrência.Haskell, 82 bytes
Então
g 3 "a\n\t\tb\tc\nd"
faz a coisa.fonte
Mathematica,
4237 bytesObrigado a @ LegionMammal978 por várias sugestões de economia de código. O primeiro parâmetro
#
é para o texto de entrada, o segundo parâmetro#2
, para o número de espaços por guia.fonte
Table[" ",{#2}]
para" "~Table~{#2}
salvar um byte. Por que você estáStringJoin
inserindo a corda vazia?Ruby 49 bytes
fonte
JavaScript (ES6), 70
Usando cadeias de modelo, a nova linha é significativa e contada
Teste a execução do snippet abaixo no Firefox.
fonte
CoffeeScript, 72 bytes
(Tentando jogar golfe pelo menos mais duas mordidas, para vencer a solução ES6 ... Ajuda apreciada: D)
Uso:
fonte
Retina, 42 bytes
Todas as ocorrências de
.
são espaços, todas\t
são guias literais (1 byte) e<empty>
representam um arquivo em branco. É apenas para facilitar a leitura. Também não tenho certeza absoluta de que estou fazendo o loop corretamente, mas acho que sim. Cada linha deve ser colocada em seu próprio arquivo. Adicionei 1 byte para cada arquivo adicional.A entrada é assumida como Unária em sua própria linha no final da entrada.
Explicação
Eu adiciono uma
_
entrada antes da Unary para delimitá-la durante a substituição, para que eu não remova nenhuma da seqüência de entrada. Em seguida, substituo todas as guias que não estão no início de uma linha por um único espaço. Em seguida, faço um loop, removendo um único1
e adicionando um único espaço após cada guia, até ficar sem entrada. Finalmente, eu limpo, removendo as guias e o sublinhado.fonte
Python,
7268 bytesGuias são guias literais (1 byte), portanto,
r'...'
não é necessário. Infelizmente, o Python requer look-behinds / look-aheads de "largura fixa", então não posso usá-lo(?<!^|\t)
. Usa praticamente o mesmo método da minha solução Retina.fonte
Stax , 20 bytes
Execute e depure
Este programa lê a primeira linha como a largura do recuo e o restante da entrada como o programa.
fonte
Japt v2.0a0, 17 bytes
Tente
fonte
Haskell , 75 bytes
Experimente online! Isso pressupõe que a entrada contenha apenas caracteres imprimíveis, além de guias e novas linhas, conforme permitido pelo OP nos comentários.
Explicação:
A
#
função externa pega uma strings
e um númerom
e chama a#
função interna definida localmente com os mesmos argumentos. Isso é feito para acompanhar om
valor original , pois a#
função interna altera o número:('\t':r)#n=(' '<$[1..n])++r#n
Se você encontrar uma guia, substitua-a porn
espaços e deixen
inalterada.(x:r)#n=x:r#(m^sum[1|x<' '])
Se alguma partex
que não for uma guia for encontrada, mantenha-a como está, mas definan
o número original,m
sex
for uma nova linha, e1
caso contrário. Isso é feito porm^sum[1|x<' ']
:m
é levado ao poder desum[1|x<' ']
avaliar1
quandox
é menor que um espaço (ou seja, uma nova linha), então obtemosm^1 = m
. Caso contrário, é0
e nós temosm^0 = 1
.fonte
Java 11, 134 bytes
Experimente online.
NOTA: O Java 11 ainda não está no TIO, portanto
" ".repeat(n)
foi emuladorepeat(" ",n)
(com a mesma contagem de bytes).Explicação:
fonte