Pitão, 274 285 241 235 225 200 190 183 179 174 166 161
- Última cláusula fixa (H ou W como separadores consoantes). Ashcraft agora tem o resultado certo. - Fez o dict menor - Formatação é menor (não requer Python 2.6) - Pesquisa dict Simplificação k
- valor vogal alterado de '*'
para ''
e .append
para +=[i]
- Lista compreensão FTW - chamada removido para upper
: D
Não posso mais jogar golfe. Na verdade eu fiz. Agora acho que não posso mais jogar golfe! Fiz isso de novo ...
Usando a tabela de conversão:
def f(n):z=n.translate(65*'_'+'#123#12_#22455#12623#1_2#2'+165*'_').replace('_','');return n[0]+(''.join(('',j)[j>'#']for i,j in zip(z[0]+z,z)if i!=j)+'000')[:3]
Código de compreensão da lista antiga:
x=dict(zip('CGJKQSXZDTLMNRBFPV','2'*8+'3345561111'))
def f(n):z=[x.get(i,'')for i in n if i not in'HW'];return n[0]+(''.join(j for i,j in zip([x.get(n[0])]+z,z)if i!=j)+'000')[:3]
Código antigo:
x=dict(zip('CGJKQSXZDTLMNRBFPV','2'*8+'3345561111'))
def f(n):
e=a=[];k=n[0]in x
for i in[x.get(i,'')for i in n.upper()if i not in'HW']:
if i!=a:e+=[i]
a=i
return n[0]+(''.join(e)+'000')[k:3+k]
Teste:
[f(i) for i in ['WASHINGTON', 'LEE', 'GUTIERREZ', 'PFSTER', 'JACKSON',
'TYMCZAK', 'VANDEUSEN', 'ASHCRAFT']]
Dá:
['W252', 'L000', 'G362', 'P236', 'J250', 'T522', 'V532', 'A261']
Como esperado.
Perl, 110
Estou usando a solução de Howard com minha tabela de conversão (em
y/A-Z/table/s
vez de todass/[ABC]+/N/g
)fonte
J - 99
Teste:
fonte
GolfScript (74 caracteres)
Esta implementação usa uma string mágica que possui caracteres não imprimíveis. Na
xxd
forma de saída éSem usar as alterações básicas para compactar uma lista de números de 3 bits, seria
Teste online
É basicamente um monte de loops chatos, mas há um truque interessante:
Isso está dentro de uma dobra cujo objetivo é lidar com letras duplas. Letras adjacentes com o mesmo código são mescladas em uma unidade, mesmo se separadas por um
H
ou aW
. Mas isso não pode ser implementado trivialmente, removendo todos osH
esW
da string, porque no caso (reconhecidamente improvável na vida real, mas não descartado pela especificação), o fato de a primeira letra serH
ouW
e a segunda letra ser uma consoante , não precisamos exaltar essa consoante quando removemos a primeira letra. (Eu adicionei um caso de testeWM
que deve darW500
para verificar isso).Portanto, a maneira como lida com isso é fazer uma dobra e excluir cada letra que não seja a primeira (um efeito colateral conveniente do uso da dobra) que é igual à anterior ou igual ao
7
código interno deH
eW
.Dada
a
eb
na pilha, a maneira ingênua de verificar sea == b || b == 7
seriaMas há uma economia de dois caracteres usando uma cópia da pilha computada:
Se
b
for igual a7
, copiaa
; caso contrário, ele copiab
. Então, comparando coma
, obtemos um valor de verdade garantido, seb
foi7
independentemente do valor dea
. (Antes de qualquer pedante pesar, o GolfScript não possui NaNs).fonte
PowerShell, 150
161Primeira tentativa e tenho certeza de que pode haver um pouco mais de golfe.
Funciona corretamente com os casos de teste da página vinculada e do artigo da Wikipedia:
fonte
Ruby 140
Estou usando o Ruby 2.0, mas acho que também deve funcionar com versões anteriores.
Exemplo:
puts f "PFISTER"
=>P236
fonte
APL (83)
fonte