Python, 274 285 241 235 225 200 190 183 179 174 166 161
- Dernière clause fixe (H ou W comme séparateurs de consonnes). Ashcraft a maintenant le bon résultat. - Rendu le dict plus petit - Le formatage est plus petit (ne nécessite pas python 2.6) - Recherche de dict plus simple k
- Valeur de voyelle modifiée de '*'
vers ''
et .append
vers +=[i]
- Compréhension de la liste FTW - Suppression de l'appel à upper
: D
Je ne peux plus jouer au golf. En fait, je l'ai fait. Maintenant je pense que je ne peux plus jouer au golf! Fait à nouveau...
Utilisation de la table de traduction:
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]
Ancien code de compréhension de liste:
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]
Ancien code:
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]
Tester:
[f(i) for i in ['WASHINGTON', 'LEE', 'GUTIERREZ', 'PFSTER', 'JACKSON',
'TYMCZAK', 'VANDEUSEN', 'ASHCRAFT']]
Donne:
['W252', 'L000', 'G362', 'P236', 'J250', 'T522', 'V532', 'A261']
Comme prévu.
Perl, 110
J'utilise la solution d'Howard avec ma table de traduction (
y/A-Z/table/s
au lieu de toutess/[ABC]+/N/g
)la source
J - 99
Essai:
la source
GolfScript (74 caractères)
Cette implémentation utilise une chaîne magique qui a des caractères non imprimables. Sous
xxd
forme de sortie, c'estSans utiliser les modifications de base pour compresser une liste de nombres à 3 bits, il serait
Test en ligne
C'est essentiellement un tas de boucles ennuyeuses, mais il y a une astuce intéressante:
C'est à l'intérieur d'un pli dont le but est de gérer les doubles lettres. Les lettres adjacentes avec le même code sont fusionnées en une seule unité, même si elles sont séparées par un
H
ou unW
. Mais cela ne peut pas être implémenté de manière triviale en supprimant tous lesH
s etW
s de la chaîne, car dans le cas (certes peu probable dans la vie réelle, mais non exclu par la spécification) que la première lettre estH
ouW
et la deuxième lettre est une consonne , nous ne devons pas éluder cette consonne lorsque nous supprimons la première lettre. (J'ai ajouté un cas de testWM
qui devrait donnerW500
pour vérifier cela).Donc, la façon dont je gère cela est de faire un pli et de supprimer chaque lettre autre que la première (un effet secondaire pratique de l'utilisation du pli) qui est soit égale à la précédente soit égale au
7
code interne deH
etW
.Étant donné
a
etb
sur la pile, la façon naïve de vérifier sia == b || b == 7
seraitMais il y a une économie de 2 caractères en utilisant une copie calculée à partir de la pile:
Si
b
est égal à7
alors il copiea
; sinon, il copieb
. Donc, en comparant aveca
nous, nous obtenons une valeur véridique garantie sib
c'était7
indépendamment de la valeur dea
. (Avant que les pédants ne pèsent, GolfScript n'a pas de NaN).la source
PowerShell,
150161Essayez d'abord et je suis sûr qu'il peut y avoir beaucoup plus de golf.
Fonctionne correctement avec les cas de test de la page liée et de l'article Wikipedia:
la source
Rubis 140
J'utilise Ruby 2.0, mais je pense que cela devrait également fonctionner avec les versions antérieures.
Exemple:
puts f "PFISTER"
=>P236
la source
APL (83)
la source