Питон, 274 285 241 235 225 200 190 183 179 174 166 161
- Исправлено последнее предложение (H или W в качестве разделителей согласных). Ашкрафт теперь имеет правильный результат. - Сделал ДИКТ меньше - форматирование меньше (не требуется Python 2.6) - Simpler поиск ДИКТ для k
- измененного значения гласного от '*'
к ''
и .append
к +=[i]
- Список пониманию FTW - Удален вызоваupper
: D
Я не могу дальше играть в гольф. На самом деле я сделал. Теперь я думаю, что больше не могу играть в гольф! Сделал это снова ...
Используя таблицу перевода:
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]
Старый код понимания списка:
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]
Старый код:
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]
Тестовое задание:
[f(i) for i in ['WASHINGTON', 'LEE', 'GUTIERREZ', 'PFSTER', 'JACKSON',
'TYMCZAK', 'VANDEUSEN', 'ASHCRAFT']]
дает:
['W252', 'L000', 'G362', 'P236', 'J250', 'T522', 'V532', 'A261']
Как и ожидалось.
Perl, 110
Я использую решение Говарда с моей таблицей перевода (
y/A-Z/table/s
вместо каждогоs/[ABC]+/N/g
)источник
J - 99
Тестирование:
источник
GolfScript (74 символа)
Эта реализация использует волшебную строку, которая имеет непечатаемые символы. В
xxd
форме вывода этоБез использования базовых изменений для сжатия списка 3-битных чисел, было бы
Онлайн тест
Это в основном куча скучных петель, но есть один интересный трюк:
Это внутри сгиба, целью которого является обработка двойных букв. Смежные буквы с одинаковым кодом объединяются в одну единицу, даже если они разделены
H
илиW
. Но это не может быть реализовано тривиально, удаляя всеH
s иW
s из строки, потому что в (по общему признанию, маловероятно в реальной жизни, но не исключено спецификацией) случае, что первая буква являетсяH
или,W
а вторая буква является согласной нам не нужно исключать эту согласную при удалении первой буквы. (Я добавил тестовый примерWM
который должен дать,W500
чтобы проверить это).Таким образом, я справляюсь с тем, чтобы сделать сгиб и удалить каждую букву, отличную от первой (удобный побочный эффект использования сгиба), которая либо равна предыдущей, либо равна
7
внутреннему коду дляH
иW
.Учитывая
a
иb
в стеке, наивный способ проверить,a == b || b == 7
будет лиНо есть двухсимвольное сохранение с использованием вычисленной копии из стека:
Если
b
равно,7
то копируетa
; в противном случае он копируетb
. Таким образом, к тому времени, сравнивая с,a
мы получаем гарантированное истинное значение, если оноb
было7
независимо от значенияa
. (До того, как весят педанты, у GolfScript нет NaN).источник
PowerShell, 150
161Сначала попробуйте, и я уверен, что в гольфе может быть немного больше.
Корректно работает с контрольными примерами из связанной страницы и статьи в Википедии:
источник
Рубин 140
Я использую Ruby 2.0, но я думаю, что он должен работать и с более ранними версиями.
Пример:
puts f "PFISTER"
=>P236
источник
APL (83)
источник