Algumas pessoas insistem em usar espaços para tabulação e recuo.
Para tabulação, isso é indiscutivelmente errado. Por definição, os tabuladores devem ser usados para tabulação.
Mesmo para indentação, os tabuladores são objetivamente superiores:
Existe um consenso claro na comunidade Stack Exchange.
Usar um único espaço para indentação é visualmente desagradável; usar mais de um é um desperdício.
Como todos os
golfistassabem, os programas devem ser o mais curtos possível. Além de economizar espaço no disco rígido, os tempos de compilação também são reduzidos se for necessário processar menos bytes.Ao ajustar a largura da guia 1 , o mesmo arquivo parece diferente em cada computador, para que todos possam usar sua largura de recuo favorita sem modificar o arquivo real.
Todos os bons editores de texto usam tabuladores por padrão (e definição).
Eu digo e estou sempre certa!
Infelizmente, nem todo mundo ouve a razão. Alguém enviou a você um arquivo que está fazendo algo errado na TM e você precisa corrigi-lo. Você poderia fazê-lo manualmente, mas haverá outros.
Já é ruim o suficiente que os espaçadores estejam desperdiçando seu precioso tempo, então você decide escrever o programa mais curto possível para resolver o problema.
Tarefa
Escreva um programa ou uma função que faça o seguinte:
Leia uma única sequência de caracteres de STDIN ou como um argumento de linha de comando ou função.
Identifique todos os locais em que os espaços foram usados para tabulação ou recuo.
Uma sequência de espaços é um recuo se ocorrer no início de uma linha.
Uma execução de dois ou mais espaços é tabulada se não for recuo.
Um único espaço que não é recuo pode ou não ter sido usado para tabulação. Como esperado, quando você usa o mesmo personagem para propósitos diferentes, não há uma maneira fácil de dizer. Portanto, diremos que o espaço foi usado para confusão .
Determine a maior largura possível de tabulação 1, para a qual todos os espaços usados para tabulação ou recuo podem ser substituídos por tabuladores, sem alterar a aparência do arquivo.
Se a entrada não contiver tabulação nem indentação, é impossível determinar a largura da tabulação. Nesse caso, pule a próxima etapa.
Usando a largura da guia previamente determinada, substitua todos os espaços usados para tabulação ou recuo pelos tabuladores.
Além disso, sempre que possível, sem alterar a aparência do arquivo, substitua todos os espaços usados para confusão pelos tabuladores. (Em caso de dúvida, livre-se dos espaços.)
Retorne a string modificada da sua função ou imprima-a em STDOUT.
Exemplos
Todos os espaços de
a bc def ghij
são tabulações.
Cada execução de espaços preenche a sequência anterior de caracteres não espaciais para uma largura de 5, portanto, a largura correta da guia é 5 e a saída correta 2 é
a--->bc-->def->ghij
Os dois primeiros espaços de
ab cde f ghi jk lm
são tabulações, os outros confusão.
A largura correta da guia é 4, portanto a saída correta 2 é
ab->cde>f ghi>jk lm
O último espaço permanece intocado, pois seria renderizado como dois espaços se substituído por um tabulador:
ab->cde>f ghi>jk->lm
Todos os espaços, exceto um
int main( ) { puts("TABS!"); }
são recuos, o outro é confusão.
Os níveis de indentação são 0, 4 e 8 espaços, portanto a largura correta da guia é 4 e a saída correta 2 é
int --->main( ) --->{ --->--->puts("TABS!"); --->}
O espaço em
( )
seria renderizado como três espaços se substituído por um tabulador, permanecendo intocado.Os dois primeiros espaços de
x yz w
são recuos, os outros confundem.
A largura da guia adequada é 2 e a saída correta 2 é
->x>yz w
O último espaço seria renderizado como dois espaços se substituído por um tabulador, permanecendo intocado.
Os dois primeiros espaços de
xy zw
são recuos, os outros três são tabulação.
Somente uma largura de guia de 1 permite eliminar todos os espaços; portanto, a saída correta 2 é
>>xy>>>zw
Todos os espaços de
a b c d
são confusão.
Não existe a maior largura possível da guia, portanto a saída correta 2 é
a b c d
Regras adicionais
A entrada consistirá inteiramente em caracteres ASCII imprimíveis e alimentações de linha.
Você pode supor que haja no máximo 100 linhas de texto e no máximo 100 caracteres por linha.
Se você escolher STDOUT para saída, poderá imprimir um único avanço de linha à direita.
Aplicam-se as regras padrão de código de golfe .
1 A largura da guia é definida como a distância em caracteres entre duas paradas consecutivas , usando uma fonte monoespaçada.
2 As setas de arte ASCII representam os tabuladores que o Stack Exchange se recusa a renderizar corretamente, para o qual enviei um relatório de erro. A saída real deve conter tabuladores reais.
fonte
programs should be as short as possible
Acredito ter encontrado o irmão há muito perdido de Arthur Whitney !!Respostas:
Pitão,
102103 bytesExperimente Online
Idéia interessante, mas como as guias na entrada quebram o conceito, não é muito utilizável.
Edit: Fixed bug. muito obrigado @aditsu
fonte
PowerShell,
414409 bytesFui em frente e usei novas linhas em vez de, sempre
;
que possível, para facilitar a exibição. Estou usando finais de linha unix, para que não afete a contagem de bytes.Como executar
Copie o código no
SpaceMadness.ps1
arquivo e envie a entrada para o script. Assumirei que o arquivo que precisa ser convertido é chamadotaboo.txt
:No PowerShell:
No prompt de comando:
Eu testei com o PowerShell 5, mas deve funcionar em 3 ou superior.
Teste
Aqui está um script rápido do PowerShell que é útil para testar o acima:
Coloque isso no mesmo diretório que
SpaceMadness.ps1
, eu chamo estetester.ps1
, assim:Você entendeu a ideia. Ele cospe o conteúdo de cada arquivo após a conversão, através do
[RegEx]::Escape()
qual acontece escapar dos espaços e das guias, por isso é realmente conveniente ver o que realmente foi alterado.A saída é assim (mas com cores):
Explicação
A primeira linha define a maior função comum de fator / divisor da maneira
g
mais sucinta possível, que pega uma matriz (número arbitrário de números) e calcula o GCD recursivamente usando o algoritmo euclidiano .O objetivo disso era descobrir a "maior largura possível de tabulação", obtendo o índice + o comprimento de cada recuo e tabulação conforme definido na pergunta e alimentando-o com essa função para obter o GCD que eu acho que é o melhor que podemos faça para a largura da guia. O comprimento de uma confusão sempre será 1, portanto, nada contribui para esse cálculo.
$b
define um scriptblock porque irritantemente eu preciso chamar esse trecho de código duas vezes, então eu salvo alguns bytes dessa maneira. Este bloco pega a string (ou matriz de strings)$n
e executa uma regex nela (sls
ouSelect-String
), retornando objetos correspondentes. Na verdade, estou recebendo recuos e tabulações em um aqui, o que realmente me salvou de processamento extra ao capturá-los separadamente.$n
é usado para coisas diferentes dentro e fora do loop principal (muito ruim, mas necessário aqui para que eu possa incorporá-lo no$b
scriptblock e usá-lo dentro e fora do loop sem umaparam()
declaração longa e sem argumentos).$s
recebe a largura da guia, chamando o$b
bloco na matriz de linhas no arquivo de entrada, somando o índice e o comprimento de cada correspondência, retornando a matriz das somas como argumento para a função GCD. Então$s
, o tamanho da nossa guia é interrompido agora.Então o loop começa. Nós iteramos sobre cada linha na matriz de linhas de entrada
$n
. A primeira coisa que faço no loop é atribuir$n
(escopo local) o valor da linha atual pelo motivo acima.$w
obtém o valor da chamada de scriptblock apenas para a linha atual (os recuos e tabulações da linha atual).$c
recebe um valor semelhante, mas, em vez disso, encontramos todas as confusões .Eu adiciono
$w
e$c
quais são matrizes, fornecendo uma matriz com todas as correspondências de espaço necessárias,sort
em ordem decrescente por índice, e começo a iterar sobre cada correspondência da linha atual.O tipo é importante. Desde o início, descobri da maneira mais difícil que substituir partes de uma string com base nos valores de índice é uma má idéia quando a string de substituição é menor e altera o comprimento da string! Os outros índices são invalidados. Portanto, iniciando com os índices mais altos de cada linha, certifico-me de que apenas reduza a string do final e mova para trás para que os índices funcionem sempre.
Nesse loop,
$x
está no índice da correspondência atual e$l
é o comprimento da correspondência atual.$s
de fato, pode ser0
e isso causa uma divisão traquina por erro zero, por isso estou verificando sua validade e depois fazendo as contas.A questão
!(($x+$l)%$s)
é o único ponto em que eu verifico se uma confusão deve ser substituída por uma guia ou não. Se o índice mais o comprimento dividido pela largura da guia não tiver resto, é bom substituir esta correspondência por uma guia (essa matemática sempre funcionará nas indentações e tabulações , porque seu tamanho é o que determinou a largura da guia começar com).Para a substituição, cada iteração do loop de correspondência funciona na linha atual da entrada, portanto, é um conjunto cumulativo de substituições. A regex procura apenas
$l
espaços precedidos por$x
qualquer caractere. Nós o substituímos por$l/$s
caracteres de tabulação (ou 1 se esse número estiver abaixo de zero).Esta parte
(($l/$s),1-ge1)[0]
é uma maneira complicada de dizerif (($l/$s) -lt 0) { 1 } else { $l/$s }
ou alternativamente[Math]::Max(1,($l/$s))
. Ele cria uma matriz de$l/$s
e1
, em seguida, usa-ge 1
para retornar uma matriz que contém apenas os elementos que são maiores ou iguais a um e, em seguida, pega o primeiro elemento. Ele vem em alguns bytes menor que a[Math]::Max
versão.Portanto, quando todas as substituições forem concluídas, a linha atual será retornada da iteração
ForEach-Object
(%
) e, quando todas elas forem retornadas (uma matriz de linhas fixas), serão adicionadas-join
novas linhas (já que dividimos as novas linhas no início).Eu sinto que há espaço para melhorias aqui que estou muito cansada para pegar agora, mas talvez eu veja algo mais tarde.
fonte
PHP -
278210 bytesA função funciona testando cada largura da guia, começando com um valor de 100, o comprimento máximo de uma linha e, portanto, a largura máxima da guia.
Para cada largura da guia, dividimos cada linha em "blocos" desse comprimento. Para cada um desses blocos:
Após a análise de cada bloco de uma linha, memorizamos um avanço de linha. Se todos os blocos de todas as linhas foram analisados com sucesso, retornamos a string que memorizamos. Caso contrário, se cada largura de tabulação estritamente positiva tiver sido tentada, não haverá tabulação nem recuo, e retornaremos a string original.
Aqui está a versão não destruída:
Agradecimentos especiais ao DankMemes por salvar 2 bytes.
fonte
for($t=101;--$t;)
vez defor($t=100;$t;--$t)
CJam, 112
Experimente online
Eu tive que responder a esse desafio, porque devo fazer minha parte para ajudar a livrar o mundo dessa abominação. As guias são obviamente superiores, mas, infelizmente, algumas pessoas simplesmente não podem ser justificadas.
Explicação:
fonte
PowerShell ,
165160153152142138137 bytesExperimente online!
Menos golfe:
fonte