No Python, é possível salvar bytes alterando as funções que são usadas repetidamente. Por exemplo:
r=range
a=r(100)
b=r(200)
c=r(300)
No entanto, quando as funções são funções membro juntas, não sei como aliasá-las de uma maneira que permita o encadeamento. Por exemplo:
s='Hello'
// Plain code
s=s.replace('H','J').replace('e','i').replace('l','m').replace('o','y')
// What I am trying to do
q=replace
s=s.q('H','J').q('e','i').q('l','m').q('o','y')
Obviamente, o que estou tentando fazer não é válido. E também não é isso:
q=s.replace
s=q('H','J') // Replaces the 'H' in 'Hello'
s=q('e','i') // Replaces the 'e' in 'Hello'... and the J is gone.
s=q('l','m')
s=q('o','y')
Existe outra maneira de alias funções membro e funções encadeadas que salvam caracteres?
q
significando o quereplace
significa na classe que você está usando.q
está vinculado ao método de substituição dessastr
instância específica . Além disso, lembre-se que você pode fazer substituições de char único com"Hello".replace(*"HJ")
Respostas:
Não há problema! Você pode usar um método alternativo, mas precisa saber como usá-lo:
A chave é que você precisa passar
self
explicitamente, porque o alias é um tipo de função que usa um argumento extra que usaself
:fonte
Defina sua própria classe, com um nome de método mais curto.
Por exemplo, se você estiver usando o método
replace()
pertencente àString
classe, poderá fazer com que sua própria classeS
tenha um método chamadoq
que faça a mesma coisa.Aqui está uma implementação:
Aqui está uma implementação muito melhor:
Use-o assim:
fonte
Este é alguns caracteres mais curtos de qualquer maneira
ainda mais curto para um pequeno número de substituições é
é claro que isso apenas cobre um caso particular. No entanto, o código golf consiste em encontrar os casos especiais que podem economizar bytes.
É possível escrever uma função de wrapper que lide com o caso geral, mas o código será muito grande para ter um lugar na maioria dos desafios de golfe com código.
Em vez disso, você precisa pensar "Eu posso fazer essa transformação de maneira eficiente (strokewise) com str.replace. Posso mudar a representação interna da minha solução para tirar proveito disso? (Sem desperdiçar tantos traços para negar a vantagem)"
fonte
Você pode usar a
reduce
funçãofonte
Se você estiver fazendo muitas substituições, poderá fazer o seguinte:
fonte
[a]
)[a]
precisa ser substituído por.get(a,a)
(caso contrário, obtemos alguma coisa de Erro de chave)? E por que ter emlist(s)
vez des
?Que tal definir uma função lambda?
fonte
str.replace
/ é / que lambda! Veja minha resposta.Se suas substituições não precisarem ser encadeadas, você pode usar o `str.translate '. Os números são os ordinais ASCII. Usá-lo dessa maneira requer Python 3:
Experimente online
fonte