Termine as abas contra a guerra espacial
Portanto, houve um grande debate sobre o uso de guias ou espaços para recuar / formatar o código. Você pode ajudar a universidade a resolver a disputa, adotando um método único e incrivelmente louco de formatação.
Seu trabalho é escrever um programa ou função completo que expanda todas as guias em quatro espaços. E então substitui uma série de n espaços à esquerda por "/ (n - duas estrelas aqui) /". Você receberá entrada em várias linhas em qualquer formato razoável (matriz de cadeias de caracteres única para cada nova linha. Matriz colunar etc.)
Entrada de amostra roubada descaradamente . Observe que, como as guias são expandidas automaticamente para quatro espaços no SE, eu o represento como o caractere "^", mas você também deve manipular as guias (codepoint 0x09). Todos os caracteres "^" representam uma tabulação.
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
Not zero so multiply by 256 again to get 65536
[>++++<-]>[<++++++++>-]<[>++++++++<-]
+>[>
# Print "32"
++++++++++[>+++++<-]>+.-.[-]<
<[-]<->] <[>>
# Print "16"
+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
# Print "8"
++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
^this is preceded by a tab
^^two tabs
^^^three tabs etcetera!
Saída de amostra
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
/**/Not zero so multiply by 256 again to get 65536
/**/[>++++<-]>[<++++++++>-]<[>++++++++<-]
/**/+>[>
/******/# Print "32"
/******/++++++++++[>+++++<-]>+.-.[-]<
/**/<[-]<->] <[>>
/******/# Print "16"
/******/+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
/**/# Print "8"
/**/++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
/**/this is preceded by a tab
/******/two tabs
/**********/three tabs etcetera!
Como a universidade precisa de espaço para baixar o Vim e o Emacs, você tem muito pouco espaço de armazenamento para o seu código. Portanto, este é o código-golfe e o código mais curto vence. Você pode assumir que a entrada é bem formada e as linhas com menos de quatro espaços (após a substituição das guias) podem resultar em um comportamento indefinido.
aviso Legal
Essa estratégia de formatação "excelente" veio como cortesia do Geobits e é reproduzida com sua permissão. Nenhum programador foi prejudicado durante a produção deste desafio.
fonte
/*
, ou isso pode ser assumido como não uma "entrada bem formada"? Um arquivo de origem C ++ teria sido um teste melhor, porque seu comentário de várias linhas/* */
possivelmente quebraria algumas respostas que substituem o primeiro e o último dos espaços iniciais por um/
e, em seguida, prossiga para preencher espaços com*
./* */
código C ++, mas desta vez no início da linha. De acordo com suas especificações, ele deve ser deixado como está. Aqui a armadilha é, e já encontrou respostas erradas, que um regex como o dizer/\** /
usado para preencher esses espaços entre // com asteriscos transformaria a linha/***/
. Eu já vi essa conversão também/*//*/
. Presumo que ambos estejam incorretos.Respostas:
V ,
21, 20 bytesExperimente online!
Esta é literalmente apenas uma porta direta da minha resposta vim. As diferenças notáveis:
O
Í
comando (substituto global) preenche automaticamente o/g
sinalizador, que salva dois bytesô
é idêntico a\t
Î
É um mnemônico para:%norm
, e também preenche o espaço necessário entre:%norm
e o conjunto de teclas.O retorno de carro à direita no final é adicionado implicitamente.
fonte
Vim,
37, 34, 33,32 bytesExperimente online!
Observe que isso requer um retorno de carro à direita (enter) no vim, embora não no intérprete online.
Isso usa o intérprete V porque é compatível com versões anteriores. Uma solução muito simples.
Aqui está um gif que permite ver a solução acontecer em tempo real. Isso usa uma versão um pouco mais antiga, e eu adicionei algumas teclas extras para torná-la mais lenta, para que você possa ver o que acontece:
E aqui está a explicação de como funciona:
fonte
g
, mas então você editado para não usar g: / +1 de qualquer maneira: D:g
porque ela abusa de um recurso menos conhecido: onorm
comando é cancelado se^F<space>
falhar. Então,:%norm ^F<space>foo
é essencialmente a mesma coisa que:g/^ /norm foo
divertidos hacks do Vim. : Dnorm
?^F
, não<C-f>
notação chave parva Vim. Nesse caso^
, pule para o primeiro caractere que não é um espaço em branco eF<space>
Qual é o primeiro espaço atrás do cursor.Perl, 41 bytes
Corra com a
-p
bandeira, assim:Substitua
␉
por uma guia (no Bash, tente digitar Control-V Tab.)fonte
perl
substituímos essa referência no local, eu gostariased
que tivesse isso também.Queijo Cheddar ,
605756 bytesGuardado 3 bytes graças a @Conor O'Brien
Eu gostaria que o Cheddar tivesse melhor formatação de string.
Experimente online!
Explicação
Esta é uma função.
@
é uma propriedade funcionalizada representa (por exemplo, ruby's&:
), permitindo que você faça coisas como: `ar.map (@. head (-1))Se você não está familiarizado com o regex, o:
isso basicamente corresponde a um ou mais (
+
) espaços () no início (
^
) de cada (g
) linha (m
).fonte
/^ +/
é suficiente como uma expressão regular, pois podemos assumir que os espaços iniciais terão pelo menos 4 de comprimento.Mathematica, 97 bytes
Função anônima. Pega uma string como entrada e retorna uma string como saída.
fonte
Python 3, 124 bytes
Usa boa e velha regex.
Ideone it!
fonte
Java
210207 bytesEsta é a solução de referência que a implementa ingenuamente.
fonte
for(int j=0;++j<i-1;)
. Além disso, você pode remover oint
antesj
, e colocá-lo após a já presente int:int i=s.length()-(x=s.replaceAll("^\\s+", "")).length(),j;
JavaScript ES6, 75 bytes
Substitua
\t
por uma guia literal no seu código.fonte
Java,
185184167152 bytesDada a definição muito vaga de array de strings dada no post inicial, usei
Stream<String>
que permite algumas economias de bytes consequentes.Usei técnicas diferentes das do RI para alcançar o mesmo objetivo. O algoritmo em si é bastante o mesmo.
Testando e não destruído :
fonte
Retina , 25 bytes
o
\t
deve ser substituído por um caractere de tabulação real (0x09).Experimente online!
Explicação
Substitua cada guia por quatro espaços.
Transforme cada linha separadamente (
%
) combinando2+N
espaços no início da linha e substituindo-a por/.../
onde...
estão asN
cópias de*
.fonte
Python,
125111 byteshttps://repl.it/DGyh/2
fonte
SED (56 + 1 para -r) 57
Onde
⇥
está uma guia1. substitui as guias por espaços.
2. substitui o primeiro e o último espaço à esquerda por
/
.3. substitui o primeiro espaço depois
/
e 0+*
s por um*
até que não haja correspondência.fonte
-f
. Quaisquer sinalizadores extras usados como n ou r devem ser contados como um byte cada. Assim, aqui, você salva 2 bytes.;
comando após o t também não é necessário. Quanto ao código em si, você precisa de um ^ no início do terceiros
comando, caso contrário, uma entrada como esta "3/5" é transformada em "3 / * 5". No primeiros
comando, você realmente tem uma guia lá, mas ela não é mostrada e enganosa corretamente; portanto, use \ t ou especifique depois, que char era uma guia.A universidade deve considerar permitir um pouco mais de espaço para programas no Emacs Lisp (ou usar como padrão
tabify
euntabify
sozinho), pois eles ficam ainda mais detalhados que o Java. Também deve prestar muita atenção aos alunos (ou professores) cujo tamanho de identificação é menor que quatro ou que codificam em algum idioma não-C.A solução a seguir possui 206 bytes
Supondo que
tab-width
não precise ser definido explicitamente, podemos salvar 20 deles.E a versão não-gasta ficaria assim
Nós primeiro
untabify
a região antes de pular para o seu início. Então, enquanto vemos o espaço em branco no início de uma linha, substituí-lo por um comentário que contenha o espaço em branco. Para ser exato, o comentário a ser inserido é construído porque ocupa 97 bytes. Uma solução mais curta para copiar algumas strings n vezes é muito apreciada.
fonte
Ruby,
5247 + 1 (sinalizador p) = 48 bytesEditar : salvou 5 bytes inteiros, graças ao Value Ink
fonte
p
sinalizador para aproveitar o fato de que (g) submodifica$_
e, portanto, altera o valor impresso?ruby -pe 'gsub ?\t," "*4;sub(/^ +/){?/+?**($&.size-2)+?/}'
(g)sub
sem bang pode modificar$_
aqui.GNU sed,
6664 + 1 (sinalizador r) = 65 bytesEdit: 1 byte a menos, graças à sugestão de Riley .
Corre: sed -rf formatter.sed input_file
A razão para separar com
\n
os espaços iniciais do restante do texto nessa linha é porque, caso contrário, uma linha C ++ iniciada com um comentário como esse/* */
seria transformada em/*****/
uma linha 4 mais simples,s,^(/\**) ,\1*,
igual ou até mesmos,^(/\**) ( */),\1*\2,
. Como o sed executa o script para cada linha de entrada, nenhum\n
é introduzido no espaço do padrão na leitura.fonte
/
até substituir o\n
. Isso evita que você ter que fazê-lo em linha 4.\t
por um caractere de tabulação.