fundo
Minificadores são usados, geralmente, ao veicular JavaScript no seu navegador da Web. É comumente usado para reduzir o número de bytes que precisam ser enviados. Economizar largura de banda é útil por razões óbvias. Algumas pessoas usam ofuscadores (que intencionalmente tornam o código mais difícil de ler), não estou falando sobre eles.
Minimizaremos o Python 2
Eu estava debatendo se deveria usar JavaScript ou Python para a experiência de minificação e decidi por Python por duas razões: o espaço em branco é importante e acho que isso adicionará uma dinâmica interessante ao problema. Além disso, o uso do Python 2.7 fornecerá outra dinâmica, como remover supérfluos ()
durante uma impressão (ou seja, print("Hello world")
vs. print"Hello world"
). Pessoalmente, eu preferiria abri-lo para qualquer idioma, mas para alguns idiomas esse processo não fará muito sentido. E qual idioma você decide reduzir afetará diretamente sua pontuação (e se o idioma ainda pode ser reduzido).
Especificações
Seu objetivo é modificar apenas o código de uma maneira que não altere sua funcionalidade. É claro que você pode alterar os nomes das variáveis (dentro do seu programa de minificação), desde que isso não afete a saída (mantenha o controle do escopo ). Embora eu esteja oferecendo um programa específico, não otimize para o caso de teste, pois todas as brechas padrão são proibidas.
Pontuação : duração do programa após você o ter minificado.
Entrada : qualquer programa Python 2.7 (que não contém erros)
Saída : uma versão minificada.
Embora seu código possa acomodar todas as entradas válidas do Python 2.7, é necessário testar seu script em relação a algo para provar sua eficácia.
Clique aqui para ver o programa de exemplo.
Tornando o problema mais acessível
Sinta-se livre para usar ou modificar qualquer código encontrado dentro da minha solução (listado abaixo). Eu fiz isso para você começar com o tratamento básico de cotações; no entanto, você pode expandi-lo para recuo e etc.
Exemplos de maneiras de reduzir o Python
Todo o espaço em branco pode ser substituído pela quantidade mínima possível (reconheço que no Python você pode fazer algumas coisas complicadas com guias , mas deixarei isso para você decidir se deve ou não implementá-lo).
Exemplo
Os seguintes:
def print_a_range(a):
for i in range(a):
print(i)
Poderia ser:
def print_a_range(a):
for i in range(a):
print(i)
Tecnicamente, se houver apenas uma linha dentro de um loop, você poderá compactá-lo ainda mais:
def print_a_range(a):
for i in range(a):print(i) #Note, you can also remove the `()` here.
No entanto, há outra maneira de minimizar o espaço em branco no Python:
Os seguintes:
print ([a * 2 for a in range(20) if a % 2 == 0])
Poderia ser:
print([a*2for a in range(20)if a%2==0])
Observe que não há necessidade de um espaço entre 2
e for
. Variável, funções e palavras-chave não podem começar com um número. Portanto, o intérprete Python não tem problema <num><keyword>
. Você também deve observar que não há um espaço entre )
e if
.
Note que você não deve alterar a saída do programa! Então:
print"f(x)=x*2 is a great equation!"
A declaração de impressão acima deve permanecer a mesma porque remover o espaço entre 2
e is
modificar a saída.
fonte
'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'
para'1'*100
? Exigir fazer como o comportamento é o mesmo?Respostas:
Pontuação do Python 2.7, 2013
Este programa pode ser usado como referência e você pode pegar o código a seguir e modificá-lo e publicá-lo em suas próprias soluções.
Em retrospectiva, talvez eu devesse ter usado regex também para o tratamento de cotações, mas acho que, no estado atual, pode ser suficiente para levar as pessoas ao problema.
Por que escolhi o Python 2.7: Pensei que seria mais fácil testar para ver se fiz o travamento do programa por meio da
exec
palavra - chave.Este código recebe o programa como
in.txt
.Imaginei que deveria pelo menos fazer a bola rolar para quem quiser participar escrevendo um analisador de cotações (que também manipula comentários) e um breve exemplo de como o regex, quando combinado com o analisador de cotações, pode realmente mudar o jogo em termos de complexidade deste problema.
Nota: ainda há muito espaço para melhorias neste minificador. Como se você pudesse brincar com indentação, nomes de variáveis e remover os parênteses quando eles estão sendo usados, minhas palavras-chave, como
print
ouyield
.Saída do programa:
fonte