Python, 274 285 241 235 225 200 190 183 179 174 166 161
- Memperbaiki klausa terakhir (H atau W sebagai pemisah konsonan). Ashcraft sekarang memiliki hasil yang tepat. - Membuat dict lebih kecil - Formating lebih kecil (tidak memerlukan python 2.6) - Pencarian dict sederhana untuk k
- Mengubah nilai vokal dari '*'
ke ''
dan .append
ke +=[i]
- Daftar pemahaman FTW - Panggilan dihapus ke upper
: D
Saya tidak bisa bermain golf lebih jauh. Sebenarnya saya lakukan. Sekarang saya pikir saya tidak bisa bermain golf lebih jauh! Melakukannya lagi ...
Menggunakan tabel terjemahan:
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]
Kode pemahaman daftar lama:
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]
Kode lama:
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]
Uji:
[f(i) for i in ['WASHINGTON', 'LEE', 'GUTIERREZ', 'PFSTER', 'JACKSON',
'TYMCZAK', 'VANDEUSEN', 'ASHCRAFT']]
Memberi:
['W252', 'L000', 'G362', 'P236', 'J250', 'T522', 'V532', 'A261']
Seperti yang diharapkan.
Perl, 110
Saya menggunakan solusi Howard dengan tabel terjemahan saya (
y/A-Z/table/s
bukan setiaps/[ABC]+/N/g
)sumber
J - 99
Pengujian:
sumber
GolfScript (74 karakter)
Implementasi ini menggunakan string ajaib yang memiliki karakter yang tidak dapat dicetak. Dalam
xxd
bentuk output ituTanpa menggunakan perubahan basis untuk mengompres daftar angka 3-bit, itu akan menjadi
Tes online
Ini pada dasarnya banyak loop yang membosankan, tetapi ada satu trik yang menarik:
Ini ada di dalam flip yang tujuannya adalah untuk menangani huruf ganda. Huruf yang berdekatan dengan kode yang sama digabung menjadi satu unit, meskipun dipisahkan oleh a
H
atau aW
. Tetapi ini tidak dapat diimplementasikan secara sepele dengan menghapus semuaH
danW
dari string, karena dalam (diakui tidak mungkin dalam kehidupan nyata, tetapi tidak dikesampingkan oleh spec) kasus bahwa huruf pertama adalahH
atauW
dan huruf kedua adalah konsonan , kita tidak perlu menghilangkan konsonan itu ketika kita menghapus huruf pertama. (Saya menambahkan test caseWM
yang harus diberikanW500
untuk memeriksa ini).Jadi cara saya mengatasinya adalah dengan melakukan lipatan dan menghapus setiap huruf selain yang pertama (efek samping yang nyaman menggunakan lipatan) yang bisa sama dengan yang sebelumnya atau sama dengan
7
, kode internal untukH
danW
.Diberikan
a
danb
di tumpukan, cara naif untuk memeriksa apakaha == b || b == 7
akanTapi ada penghematan 2 karakter dengan menggunakan copy-from-stack yang dikomputasi:
Jika
b
sama dengan7
maka salinana
; jika tidak, salinanb
. Jadi saat itu membandingkan dengana
kita mendapatkan nilai truthy dijamin jikab
itu7
terlepas dari nilaia
. (Sebelum penimbangan berat badan apa pun, GolfScript tidak memiliki NaN).sumber
PowerShell, 150
161Coba pertama dan saya yakin ada golf bisa lebih sedikit.
Bekerja dengan benar dengan kasus uji dari halaman tertaut dan artikel Wikipedia:
sumber
Ruby 140
Saya menggunakan Ruby 2.0, tetapi saya pikir itu harus bekerja dengan versi sebelumnya juga.
Contoh:
puts f "PFISTER"
=>P236
sumber
APL (83)
sumber