Ouvi dizer que seu código pode ser executado mais rapidamente se você o recuar de forma inversa, para que o compilador possa processá-lo como um padrão de design de árvore do topo dos "ramos" para baixo. Isso ajuda porque a gravidade acelerará o tempo necessário para a compilação do seu código e a eficiência da estrutura de dados será aprimorada. Aqui está um exemplo, em scripts Java:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Mas, por alguma razão, o Bloco de Notas não tem uma configuração para fazer isso automaticamente, então preciso de um programa para fazer isso por mim.
Descrição
Os envios devem usar um trecho de código como entrada, reverter o recuo e gerar o código resultante.
Isso é feito pelo seguinte procedimento:
Divida o código em linhas. Cada linha começará com zero ou mais espaços (não haverá tabulações).
Encontre todos os níveis de indentação exclusivos no código. Por exemplo, para o exemplo acima, isso seria
0 4 8 12
Inverta a ordem desta lista de níveis de indentação e mapeie a lista invertida para a lista original. Isso é difícil de explicar em palavras, mas, por exemplo, pareceria
0 — 12 4 — 8 8 — 4 12 — 0
Aplique esse mapeamento ao código original. No exemplo, uma linha com recuo de espaço 0 seria recuada por 12 espaços, 4 espaços se tornariam 8 espaços etc.
Entrada / Saída
A entrada e saída podem ser fornecidas como você desejar (STDIN / STDOUT, parâmetro de função / valor de retorno, etc.); se o seu idioma não suportar entrada |
de várias linhas (ou você simplesmente não quiser), você poderá usar o caractere para separar as linhas.
A entrada consistirá apenas em novas linhas imprimíveis ASCII + e não conterá linhas vazias.
Casos de teste
Entrada:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Saída: o código de exemplo acima.
Entrada:
a
b
c
d
e
f
g
h
Resultado:
a
b
c
d
e
f
g
h
Entrada:
1
2
3
2
1
Resultado:
1
2
3
2
1
Entrada:
foo
Resultado:
foo
fonte
Respostas:
CJam,
43 39 3635 bytesIsso parece muito longo. Tenho certeza de que não estou otimizando o suficiente!Como funciona:
A idéia básica é dividir a entrada na nova linha, calcular o número de espaços iniciais em cada linha, classificar e obter números únicos, copiar essa matriz e reverter a cópia, transliterar os números originais em ordem com essas duas matrizes e, finalmente, formar o string final usando essas informações.
A parte mais longa é descobrir quantos espaços iniciais existem em cada linha, pois o CJam não tem uma maneira fácil de fazê-lo.
Expansão do código:
E no espírito da pergunta. Uma expansão real do código:
7 bytes salvos graças a Martin e 1 byte graças a Dennis
Experimente online aqui
fonte
{}#
possui um erro: retorna um número inteiro, mas deve retornar um número longo. Ironicamente,i
(convertido para inteiro) corrige isso. 2. Como""#
não possui o mesmo bug,_Sm0=#
é um byte menor.Python 2 -
137131 bytesRecebe entrada com em
|
vez de\n
.Explicação
As três primeiras linhas são bastante diretas. Faça uma lista de todas as linhas da entrada, defina uma função que informe quanto espaço em branco inicial uma sequência possui e faça uma lista classificada de valores que a função é distribuída para cada linha de entrada.
A última linha é muito mais divertida.
fonte
()
salvar 4raw_
)f(s)for s in i
deveria sermap(f,i)
.d=[];d+=set(L)
é uma versão mais curta dod=sorted(set(L))
.JavaScript, ES6,
113 103101 bytesTenho certeza de que isso pode ser jogado pelo menos um pouco mais, mas aqui vai.Nunca teria pensado que haverá uma solução JS de 101 bytes, superando o Python!
Isso cria um método chamado
f
que pode ser chamado com a sequência de entrada. Se você está em um Firefox mais recente, possui seqüências de modelos e pode chamar o método comoCaso contrário, você também pode chamá-lo como
ou tente o snippet abaixo:
fonte
\s
por um caractere de espaço) e removendo os parêntesesx
na função de substituição.(x)
: /b
e precisac
? Eles apenas se referem à mesma matriz de qualquer maneira.Ruby, 63 bytes
Isso define uma função sem nome que pega e retorna uma string. Você pode chamá-lo anexando
["string here"]
ou atribuindo-o a uma variável e, em seguida, chamando essa variável.Como funciona:
s.scan(r=/^ */)
fornece uma lista de todos os principais espaços e lojas que se regexamr
para uso posterior.uniq
elimina duplicatas.sort
... tipos.Agora pule para o final,
l.zip(l.reverse)
dê uma matriz de pares que queremos substituir.to_h
transforma isso em um hash, interpretando os pares como pares de valores-chave.Agora
s.gsub
substituiu todas as correspondências da regex (todos os espaços à esquerda) usando esse hash como uma tabela de consulta para encontrar a substituição.fonte
Pitão 39
Experimente online.
Usa a
|
opção delimitadora.fonte
Japonês
-R
, 27 bytesExperimente online!
Descompactado e como funciona
Como realmente funciona
fonte
Scala,
176171Ele adicionará uma nova linha extra no final. Se eu não tiver que preservar espaços no final da linha, posso obtê-lo para 167:
Ungolfed:
fonte
PowerShell , 112 bytes
Experimente online!
Menos golfe:
fonte
Haskell, 116
fonte
PHP - 173 bytes
O código não otimizado deve ser armazenado na
$v
variável:Aqui está a versão não-gasta e comentada:
Provavelmente nunca escrevi algo tão sujo. Estou envergonhado.
fonte
JavaScript, 351
Versão não destruída:
Testando
Mostrar snippet de código
Mostrar snippet de código
Mostrar snippet de código
Mostrar snippet de código
fonte
Perl 5, 112
111 + 1 para
-n
(-E
é grátis)Tenho certeza de que isso pode ser feito com menos pinceladas, mas não vejo como no momento.
fonte