As guerras sagradas foram travadas por espaços versus abas. (E, claro, os espaços, sendo objetivamente superiores, venceram.) - Alex A.
S OMe PEO p le ainda se recusam a uma ccept que WHI c h é Cl e arly s upreme. Você acaba de receber um arquivo usando o InCor re ct, b ad, e inf e forma rior do whi t espace, e agora t ele cont e nts do arquivo a r e contaminado e arruinado.
Você decide que também pode mostrar à pessoa que lhe enviou o arquivo o quão errado eles estão - violentamente.
Descrição
Como o título sugere, seu desafio é pegar um arquivo que contenha uma ou mais guias:
this is an evil tab onoes
e os despedaça sem piedade.
this is an evil tab
o
n
o
e
s
Observe que o software Stack Exchange transforma abas literais em quatro espaços (porque é correto); portanto, as abas nesta postagem serão exibidas como quatro espaços. A entrada para o seu programa, no entanto, conterá guias reais.
Desafio
A solução deve ter uma única string como entrada, que pode conter ASCII, novas linhas e guias imprimíveis. Sempre haverá pelo menos uma única guia na entrada.
A saída deve ser a mesma sequência, com as seguintes regras aplicadas:
Inicie o cursor nas coordenadas (0,0) e com uma direção à direita. As coordenadas são (coluna, linha), indexadas a zero e a direção é para que lado você deve mover o cursor após imprimir um caractere.
Para cada caractere na sequência:
Se for uma nova linha, vá para as coordenadas (0, n), onde n é o número de novas linhas na sequência até agora (incluindo esta) e redefina a direção para a direita.
Se for uma guia, produza dois espaços, gire a direção do cursor 90 graus no sentido horário e produza mais dois espaços, efetivamente "quebrando" a guia ao meio. Aqui está um exemplo visual, onde uma guia é representada como
--->
e espaços como·
:foo--->bar--->baz
torna-se
foo··· · b a r · · zab··
Caso contrário, basta imprimir o caractere no cursor e mover o cursor um passo na direção atual.
Como você está lendo a string do começo ao fim, é possível que você tenha que escrever "em cima" dos caracteres existentes - tudo bem. Por exemplo, a entrada
foo--->bar
spaces are superior
deve resultar em uma saída de
foo
b
spaces are superior
r
Você pode escolher se "abas quebradas" devem substituir outros caracteres - a intenção original era que não, mas a especificação era ambígua, portanto, essa é sua decisão.
Além disso, depois de aplicar essas regras, você também pode
adicione ou remova quantos espaços finais você desejar.
adicione no máximo uma única nova linha à direita.
A entrada nunca conterá espaços à direita; também nunca conterá novas linhas iniciais ou finais. Você também pode sempre assumir que nunca precisará gravar em uma coluna ou linha menor que 0 (ou seja, fora da tela).
Caso de teste
As guias neste caso de teste são representadas como --->
porque, caso contrário, o SE as devora.
Entrada:
Test case. Here's a tab--->there's a tab--->everywhere a tab--->tab--->this is some more text
blah
blah
blah blah blah blah blah blah--->blaah--->blaah--->blah--->blaaaaah--->blah--->blah--->blah--->blah--->blah
Saída:
Test case. Here's a tab
blah
blah t
blah blah blah blah blah blah
blaablah
r b
e l b
h 'h a l
a sa a a
l l h h
this is some mobe tbxt
haalhalb
b a
a b
t
bat a erehwyreve
Animação chique:
Regras
- Isso é código-golfe , então o código mais curto em bytes vencerá!
fonte
(0,0)
você quer dizer que precisamos limpar o console primeiro ou você apenas quer dizer a posição padrão do cursor?Respostas:
MATLAB, 144 bytes
A arma de escolha para lidar com strings é, obviamente, uma linguagem projetada para manipular números [citação necessário]. Brincadeiras à parte, o melhor do Matlab é que não importa se você atribui a uma matriz 'fora dos limites': ela simplesmente cria uma matriz maior. Além disso, o elemento da matriz padrão,,
0
é renderizado como um espaço em vez de umnull
caractere prescrito pela especificação ASCII.As guias são simplesmente um salto nas coordenadas, portanto, nenhum espaço é gerado para uma guia.
Comecei com 209 bytes, mas um pouco de golfe mais cuidadoso se livrou da maior parte disso; há muita repetição nesse código, então fiz algumas tentativas e erros de quais alternativas funcionavam melhor. Eu não acho que haja muito espaço para mais otimização com esse código, mas estou sempre feliz por provar que estou errado. Edit: Tom Carpenter conseguiu provar que eu estava errado; ele conseguiu salvar 9 bytes, que eu otimizei para salvar 29 bytes. Último byte salvo, assumindo que não há caracteres de controle (ASCII <9) na entrada - as strings do MATLAB não são
null
terminadas.fonte
q('hello<tab>my name<tab>is tom<tab>c')
, mas algo ao longo das linhas deAttempted to access o(11,-2); on line 7
. Embora isso possa ter mais a ver com um problema na pergunta - se o cursor estiver voltando para trás e for além da primeira coluna, o que acontece com o restante da linha.d
variável e, em vez disso, possui 4 variáveis que, para um loop, formam o padrão [1 0 -1 0] como tal:function o=q(t) u=1;v=0;w=-1;z=0;x=0;y=1;n=1;for s=t if s==9 x=x+2*u-2*v;y=y+2*v+2*u;a=z;z=w;w=v;v=u;u=a;elseif s==10 n=n+1;x=0;y=n;else x=x+u;y=y+v;o(y,x)=s;end end
(obviamente, nos comentários, removeu todas as linhas, para que você tenha reformatá-lo como a sua para ver o que eu fiz)Python 3,
272270266262255253244 bytesO
\t
deve ser um caractere real guia.O código funciona um pouco como a resposta de Zach Gates, primeiro gerando uma grade
M
porM
ondeM
é a soma dos comprimentos das linhas. (Isso é uma quantidade enorme de excesso, mas torna o código mais curto.) Em seguida, percorre os caracteres, colocando-os nos pontos corretos, mantendo o controle da linha mais visitada. Por fim, imprime todas as linhas até essa linha.A saída contém (geralmente uma quantidade enorme de) espaços à direita e 1 nova linha à direita.
fonte
Javascript (ES6),
264245bytesTentei a abordagem "criar uma grade gigante de espaços, preencher e aparar", que acabou 19 bytes mais curta que a outra.
Modificando a penúltima linha dessa maneira, você pode remover a grande quantidade de espaços à direita em cada linha:
Experimente aqui:
Mostrar snippet de código
Explicação em breve; sugestões bem-vindas!
fonte
JavaScript (ES6), 180
183Usando cadeias de modelo, existem algumas linhas novas que são significativas e contadas.
Essa é uma função que retorna a saída solicitada (preenchida com toneladas de espaços à direita)
Há pouco a explicar: as linhas são construídas conforme necessário. Não há uma variável de direção, apenas o deslocamento 2 para x e y, pois na rotação no sentido horário eles são facilmente gerenciados:
dx <= -dy, dy <= dx
Teste a execução do snippet abaixo no Firefox
fonte
Python 2,
370369368 bytesObrigado a @sanchises e @ edc65 por me salvar um byte cada.
Ele gera a maior grade possível e circula, caractere por caractere, alternando a direção em cada guia.
fonte
if !d
eif d>2
!d
não é uma sintaxe válida. @sanchises Obrigado pelad>2
dica, no entanto.d==0
->d<1