Pitón, 274 285 241 235 225 200 190 183 179 174 166 161
- Se corrigió la última cláusula (H o W como separadores de consonantes). Ashcraft ahora tiene el resultado correcto. - Hecho el dict más pequeño - Formating es menor (no requiere Python 2.6) - Más simple búsqueda de dict k
- valor vocal cambió de '*'
a ''
y .append
a +=[i]
- Lista de comprensión FTW - llamada eliminado para upper
: D
No puedo seguir jugando al golf. En realidad lo hice. ¡Ahora creo que no puedo seguir jugando al golf! Lo hice de nuevo ...
Usando la tabla de traducción:
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 comprensión de la lista anterior:
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 antiguo
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]
Prueba:
[f(i) for i in ['WASHINGTON', 'LEE', 'GUTIERREZ', 'PFSTER', 'JACKSON',
'TYMCZAK', 'VANDEUSEN', 'ASHCRAFT']]
Da:
['W252', 'L000', 'G362', 'P236', 'J250', 'T522', 'V532', 'A261']
Como se esperaba.
Perl, 110
Estoy usando la solución de Howard con mi tabla de traducción (en
y/A-Z/table/s
lugar de cadas/[ABC]+/N/g
)fuente
J - 99
Pruebas:
fuente
GolfScript (74 caracteres)
Esta implementación utiliza una cadena mágica que tiene caracteres no imprimibles. En
xxd
forma de salida esSin usar los cambios básicos para comprimir una lista de números de 3 bits, sería
Prueba en línea
Básicamente es un montón de bucles aburridos, pero hay un truco interesante:
Esto está dentro de un pliegue cuyo propósito es manejar letras dobles. Las letras adyacentes con el mismo código se fusionan en una unidad, incluso si están separadas por una
H
o unaW
. Pero esto no se puede implementar de manera trivial eliminando todosH
losW
sys de la cadena, porque en el caso (ciertamente improbable en la vida real, pero no descartado por la especificación) que la primera letra esH
oW
y la segunda letra es una consonante , no debemos eludir esa consonante cuando eliminamos la primera letra. (Agregué un caso de pruebaWM
que debería darW500
para verificar esto).Entonces, la forma en que manejo eso es hacer un pliegue y eliminar cada letra que no sea la primera (un efecto secundario conveniente de usar el pliegue) que es igual a la anterior o igual a
7
código interno paraH
yW
.Dado
a
yb
en la pila, la forma ingenua de verificar sia == b || b == 7
seríaPero hay un ahorro de 2 caracteres al usar una copia calculada de la pila:
Si
b
es igual a,7
entonces copiaa
; de lo contrario se copiab
. Entonces, al compararloa
, obtenemos un valor de veracidad garantizado sib
fuera7
independientemente del valor dea
. (Antes de que los pedantes pesen, GolfScript no tiene NaN).fuente
PowerShell,
150161Primero prueba y estoy seguro de que se puede jugar un poco más al golf.
Funciona correctamente con los casos de prueba tanto de la página vinculada como del artículo de Wikipedia:
fuente
Rubí 140
Estoy usando Ruby 2.0, pero creo que también debería funcionar con versiones anteriores.
Ejemplo:
puts f "PFISTER"
=>P236
fuente
APL (83)
fuente