Python, 274 285 241 235 225 200 190 183 179 174 166 161
- Die letzte Klausel (H oder W als Konsonantentrennzeichen) wurde korrigiert. Ashcraft hat jetzt das richtige Ergebnis. - Dikt verkleinern - Formatieren ist kleiner (benötigt kein Python 2.6) - Einfachere Diktsuche nach k
- Geänderter Vokalwert von '*'
nach ''
und .append
nach +=[i]
- Listenverständnis FTW - Entfernter Aufruf an upper
: D
Ich kann nicht weiter Golf spielen. Eigentlich habe ich getan. Jetzt glaube ich, dass ich nicht weiter Golf spielen kann! Schon wieder getan...
Verwenden der Übersetzungstabelle:
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]
Alter Listenverständniscode:
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]
Alter 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]
Prüfung:
[f(i) for i in ['WASHINGTON', 'LEE', 'GUTIERREZ', 'PFSTER', 'JACKSON',
'TYMCZAK', 'VANDEUSEN', 'ASHCRAFT']]
Gibt:
['W252', 'L000', 'G362', 'P236', 'J250', 'T522', 'V532', 'A261']
Wie erwartet.
Perl, 110
Ich verwende Howards Lösung mit meiner Übersetzungstabelle (
y/A-Z/table/s
anstelle von jeders/[ABC]+/N/g
)quelle
J - 99
Testen:
quelle
GolfScript (74 Zeichen)
Diese Implementierung verwendet eine magische Zeichenfolge mit nicht druckbaren Zeichen. In
xxd
Ausgabeform ist esOhne die Basisänderungen zum Komprimieren einer Liste von 3-Bit-Zahlen wäre dies der Fall
Online-Test
Es ist im Grunde ein Haufen langweiliger Loops, aber es gibt einen interessanten Trick:
Dies ist innerhalb einer Falte, deren Zweck es ist, Doppelbuchstaben zu behandeln. Benachbarte Buchstaben mit demselben Code werden zu einer Einheit zusammengefasst, auch wenn sie durch ein
H
oder ein getrennt sindW
. Dies kann jedoch nicht einfach durch Entfernen allerH
s undW
s aus der Zeichenfolge implementiert werden , da in dem (im wirklichen Leben zwar unwahrscheinlichen, aber nicht von der Spezifikation ausgeschlossenen) Fall, dass der erste Buchstabe ein Konsonant ist,H
oderW
der zweite Buchstabe ein Konsonant ist Wir müssen uns diesem Konsonanten nicht entziehen, wenn wir den ersten Buchstaben entfernen. (Ich habe einen Testfall hinzugefügt,WM
der es geben sollte,W500
um dies zu überprüfen).Die Art und Weise, wie ich damit umgehe, besteht darin, einen Falz auszuführen und jeden Buchstaben außer dem ersten zu löschen (ein praktischer Nebeneffekt bei der Verwendung von Falz), der entweder gleich dem vorherigen oder gleich
7
dem internen Code fürH
und istW
.Gegeben
a
undb
auf dem Stapel, der naive Weg, um zu überprüfen, oba == b || b == 7
wäreEs werden jedoch 2 Zeichen gespeichert, wenn eine berechnete Kopie des Stapels verwendet wird:
Wenn
b
ist gleich7
dann kopiert esa
; sonst kopiert esb
. Beim Vergleich mit erhaltena
wir also einen garantierten Wahrheitswert, wennb
dieser7
unabhängig vom Wert von wara
. (Bevor Pedanten einwiegen, hat GolfScript keine NaNs).quelle
PowerShell, 150
161Versuchen Sie es zuerst und ich bin mir sicher, dass es noch viel mehr Möglichkeiten zum Golfen gibt.
Funktioniert korrekt mit den Testfällen von der verlinkten Seite und dem Wikipedia-Artikel:
quelle
Rubin 140
Ich benutze Ruby 2.0, aber ich denke, es sollte auch mit früheren Versionen funktionieren.
Beispiel:
puts f "PFISTER"
=>P236
quelle
APL (83)
quelle