Python, 274 285 241 235 225 200 190 183 179 174 166 161
- Naprawiono ostatnią klauzulę (H lub W jako separatory spółgłosek). Ashcraft ma teraz właściwy wynik. - Zmniejszono dykt - Formatowanie jest mniejsze (nie wymaga Pythona 2.6) - Prostsze wyszukiwanie dykta k
- Zmieniono wartość samogłoski z '*'
na ''
i .append
na +=[i]
- Zrozumienie listy FTW - Usunięto wywołanie do upper
: D
Nie mogę już grać w golfa. Właściwie to zrobiłem. Teraz myślę, że nie mogę już grać w golfa! Zrobiłem to jeszcze raz ...
Za pomocą tabeli translacji:
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]
Stary kod zrozumienia listy:
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]
Stary kod:
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]
Test:
[f(i) for i in ['WASHINGTON', 'LEE', 'GUTIERREZ', 'PFSTER', 'JACKSON',
'TYMCZAK', 'VANDEUSEN', 'ASHCRAFT']]
Daje:
['W252', 'L000', 'G362', 'P236', 'J250', 'T522', 'V532', 'A261']
Zgodnie z oczekiwaniami.
Perl, 110
Korzystam z rozwiązania Howarda z tabelą tłumaczeń (
y/A-Z/table/s
zamiast wszystkichs/[ABC]+/N/g
)źródło
J - 99
Testowanie:
źródło
GolfScript (74 znaki)
Ta implementacja korzysta z magicznego ciągu znaków, który ma znaki niedrukowalne. W
xxd
postaci wyjściowej jestByłoby to bez użycia podstawowych zmian do skompresowania listy liczb 3-bitowych
Test online
To w zasadzie kilka nudnych pętli, ale jest jedna interesująca sztuczka:
To jest wewnątrz zakładki, której celem jest obsługa podwójnych liter. Sąsiadujące litery o tym samym kodzie są scalane w jedną jednostkę, nawet jeśli są oddzielone przez a
H
lub aW
. Ale to nie może być realizowane trywialnie przez wyprowadzenie wszystkichH
s iW
s od napisu, ponieważ w (wprawdzie mało prawdopodobne, w prawdziwym życiu, ale nie wykluczone przez spec) tak, że pierwsza litera jestH
alboW
a druga litera jest spółgłoską , nie musimy unikać tej spółgłoski, gdy usuwamy pierwszą literę. (Dodałem przypadek testowy,WM
który powinien daćW500
to sprawdzić).Tak więc radzę sobie z tym, aby zrobić fałd i usunąć każdą literę inną niż pierwsza (wygodny efekt uboczny użycia fold), który jest albo równy poprzedniej, albo jest równy
7
wewnętrznemu kodowi dlaH
iW
.Biorąc pod uwagę
a
ib
na stosie, naiwny sposób sprawdzenia, czya == b || b == 7
będzieAle można zaoszczędzić 2 znaki, używając obliczonej kopii ze stosu:
Jeśli
b
jest równe,7
to kopiujea
; w przeciwnym razie kopiujeb
. Porównując z tyma
, otrzymujemy gwarantowaną prawdziwą wartość, jeślib
była ona7
niezależna od wartościa
. (Przed ważeniem jakichkolwiek pedantów, GolfScript nie ma NaN).źródło
PowerShell, 150
161Pierwsza próba i jestem pewien, że można grać w golfa o wiele więcej.
Działa poprawnie z przypadkami testowymi zarówno z połączonej strony, jak i artykułu z Wikipedii:
źródło
Ruby 140
Używam Ruby 2.0, ale myślę, że powinien on również działać z wcześniejszymi wersjami.
Przykład:
puts f "PFISTER"
=>P236
źródło
APL (83)
źródło