Problem:
Sie erstellen ein neues Telefon, auf dem beispielsweise spezialisierte Telefonnummern eingegeben werden können, 1-800-program
die dann automatisch in eine verwendbare Telefonnummer umgewandelt werden 1-800-7764726
( wie im vorherigen Beispiel).
Ihr Programm empfängt eine beliebige Zeichenfolge mit Zahlen, Buchstaben und Bindestrichen und konvertiert alle Buchstaben in die entsprechenden Zahlen.
Hier ist eine Tastatur als Referenz:
Regeln:
- Ihr Programm erhält einen String
- Es wird es verarbeiten und eine weitere Zeichenfolge zurückgeben / drucken
- Jede Sprache wird akzeptiert
- Da es sich um Code-Golf handelt , gewinnt der kürzeste Code
Antworten:
GolfScript, 24 Zeichen
Testeingang:
Testausgang:
Erläuterung:
{ }%
Wendet den Code zwischen den geschweiften Klammern auf jedes Zeichen der Eingabe an..96>{ }*
Führt den Code zwischen den inneren Klammern genau dann aus, wenn der ASCII-Code des Zeichens größer als 96 ist (dh ein Kleinbuchstabe).Der erste
,
verwandelt das Zeichen in eine Liste aller Zeichen mit niedrigeren ASCII-Codes und91,'qx'+-
filtert alle Zeichen mit ASCII-Codes unter 91 sowie die Buchstabenq
undx
aus der Liste heraus. So wird beispielsweise das Zeichena
in die Liste mit 6 Zeichen umgewandelt[\]^_`
, während esz
in die Liste mit 29 Zeichen umgewandelt wird[\]^_`abcdefghijklmnoprstuvwy
.Die Sekunde
,
zählt die in der Liste verbleibenden Elemente und3/
teilt diese Anzahl durch drei (Abrundung). Schließlich`
wandelt das die resultierende Zahl (im Bereich von 2 bis 9) in eine Zeichenfolge um.Somit bleiben Bindestriche und Zahlen gemäß Spezifikation unverändert, während Kleinbuchstaben gemäß dem Referenztastaturdiagramm in Zahlen abgebildet werden. Der Code wird passiert tatsächlich sauber durch alle druckbaren ASCII - Zeichen mit Ausnahme von Kleinbuchstabe (die wie beschrieben abgebildet) und den Charakteren
{
,|
und}
(die das Zwei-Zeichen - String abgebildet werden10
). Nicht-ASCII-8-Bit-Eingabe erzeugt alle Arten von seltsamen numerischen Ausgaben.Nach all dem ist es ein bisschen enttäuschend, dass dies nur das übertrifft triviale Bash-Lösung nur um sechs Zeichen übertrifft.
quelle
Bash, 30
Edit: Danke Doorknob für die Beseitigung von 3 Zeichen
Beispiel:
quelle
9
s nicht entfernen ?C
837877656362http://ideone.com/qMsIFQ
quelle
~(c=getchar())
getch()
anstelle von verwendengetchar()
?getch()
ist es nicht Standard C, weshalb es meiner Meinung nach nicht mit Ideone zusammenhängt. Ich habe es trotzdem in MSVC getestet und es funktioniert nicht wirklich traurig - da es direkt Tastatureingaben verbraucht, gibt es keine Möglichkeit, das Programm zu beenden, obwohl es das übersetzt, was Sie im laufenden Betrieb eingeben, was irgendwie ordentlich ist.Javascript - 103 Zeichen
quelle
charCodeAt(0)
mitcharCodeAt()
und Sie können Pfeil Funktion fürfunction(y)...
wenige Bytes speichern und für die~~(y/3)
Sie verwenden könneny/3|0
Rubin, 75 Zeichen
Verwendet den
chars
mit Block veralteten und druckt jeden Buchstaben einzeln mit$><<
. Ich mag auch[[*?a..?z].index(c)||-1]
; es erfasst das Zeichen, das dem Buchstaben des Alphabets entspricht, wenn es ein Buchstabe ist, und das letzte Zeichen (das zufällig das unveränderte Testzeichen ist), wenn nicht.Ruby, 43 (oder 35) Zeichen
Krass von @ace stehlen;)
Shave off 8 Zeichen, wenn ich in IRB mit der Variablen
s
als Zeichenfolge ausführen kann :quelle
C ++ - 222 Zeichen
Längste bisherige Lösung:
quelle
Frink, 92
Eine ziemlich ausführliche Sprache, ich weiß. Dadurch werden 8 statt 26 Werte überprüft, ohne dass die Vergleiche eingegeben werden müssen. Kann eine der oben genannten "222333444 .." - Lösungen auf ähnliche Weise reduziert werden?
Verwenden von eingebauten Strukturen, 107
Verwenden einer benutzerdefinierten rekursiven Funktion, 92
quelle
Smalltalk,
7970Eingabe ist s:
Wahrscheinlich kein Kandidat für die kürzeste Zeit - aber möglicherweise von Interesse für einen alten Trick, um einen Test auf eine nicht gefundene Bedingung zu vermeiden (indexOf: gibt in diesem Fall 0 zurück). Es ist also kein spezieller Test für Briefe erforderlich. Einige Smalltalks haben jedoch unveränderliche Zeichenfolgen, und wir benötigen 4 weitere Zeichen ("copy").
Oh, eine bessere Version, die sich sogar mit unveränderlichen Zeichenfolgen in 70 Zeichen befasst:
quelle
Mathematica 90
Dies folgt der Logik der @ ace-Lösung:
Beispiel
quelle
1
in#1
:)1
. Immer noch 90 Zeichen, aber das Ausschneiden und Einfügen funktioniert. Sie verstehen natürlich die Motivation, den einzelnen Zeichenpfeil zu verwenden.Perl, 50
Eine weitere offensichtliche Kopie von Aces heftiger Antwort
quelle
-p
stattdessen den Schalter verwenden, mit dem Sie jede Zeile von stdin gut durchgehen können. Während wir gerade dabei sind, muss der Bereich in y /// nicht in eckige Klammern gesetzt werden. Wir können auch drei 9er loswerden und nur eine übrig lassen und das letzte Semikolon entfernen:-p y/a-z/22233344455566677778889/
Los geht's, 30 + 1 für-p
. Vielen Dank, dass Sie Enterprise Chinese Perl Golf- und Optimierungsservices nutzen, und einen schönen Tag.R, sehr lang, aber lustig
quelle
k [32 Zeichen]
Verwendung
quelle
JavaScript, 85
JavaScript wird niemals die Golfkriege gewinnen, aber es gefällt mir und ich wollte etwas anderes tun, als auf den @ace-Zug zu springen.
quelle
PHP, 141
Nicht die kürzeste, aber mehr Spaß:
Besser lesbar:
quelle
strtolower
Python 2.7, 80
Ich bin neu in Python, also bin ich mir sicher, dass es eine Möglichkeit gibt, dies noch weiter zu verbessern. Es ist ein anderer Ansatz. Ich hoffe, es gefällt euch, mein Gott, ist Python hübsch!
Beispiel ausführen:
quelle
T-SQL, 216 Bytes
In den letzten paar Nächten habe ich einige Zeit damit verbracht, eine mathematische Sequenzfunktion zu erstellen, die richtig rundet, um die richtigen ASCII-Codes für die Zahlen aus den alphabetischen ASCII-Codes zu generieren. Es hatte eine lächerliche Anzahl von Dezimalstellen in den Koeffizienten, aber es funktionierte.
Der rationale Ansatz von mattnewport funktioniert jedoch auch in SQL, und zwar zu einem viel geringeren Preis von Bytes. Daher verzichte ich schamlos auf meine eigene Mathematik zugunsten seiner. Erhöhen Sie ihn, es ist eine elegante Lösung!
Hier ist meins:
Hierbei wird ein rekursiver CTE verwendet, um einen spontanen Stapel der Zeichen in der Telefonnummer zu erstellen und die Buchstaben im Handumdrehen zu übersetzen. Anschließend müssen Sie mit ein wenig SQL-Trick (SELECT @ p = @ p + columnValue) die Zeichenfolge aus dem CTE neu zusammensetzen, ohne dies zu erfordern ein weiteres Rekursionskonstrukt.
Ausgabe:
quelle
Python 2.7,
6665Anakatas Original
Weiter golfen
Ich habe nicht genug Reputation, um die Antwort von @ anakata zu kommentieren, deshalb habe ich hier einen separaten Beitrag verfasst. Ich hatte die gleiche Idee (unter Verwendung des Ordnungsmoduls 3), konnte aber nicht herausfinden, wie die richtigen Zahlen für s - z gedruckt werden .
Wie auch immer, die Golf Verbesserungen, die ich gemacht habe:
geändert
raw_input
zuinput
entfernt die Fremdwörter
'\b'
und Klammern und einfache Anführungszeichenentfernte den
+2
Offset und platzierte diesen in der ursprünglichen Subtraktion (97 - (3 * 2) = 91)Getestet mit dem Python 2.7.6 Interpreter. Nimmt gemäß den Regeln eine Zeichenfolgeeingabe an.
quelle
PHP, 87
quelle
q [38 Zeichen]
Inspiriert von der @ ace-Lösung
Beispiel
quelle
XQuery, 71
BaseX wurde als XQuery-Prozessor verwendet.
$i
eingegeben wird.Nicht die kürzeste Antwort, aber ziemlich kurz und gut lesbar.
quelle
Python, sehr ungolfed
Da jeder Ace kopiert, habe ich beschlossen, den Code, den ich erstellt habe, zu posten, bevor ich die Frage einreichte:
quelle
EcmaScript 6 (103 Byte):
Erwartet
i
, die Zeichenfolge zu enthalten.Versuchen Sie es in einer neueren Version von Firefox. Ich habe Google Chrome nicht ausprobiert.
quelle
Python 3, 121
quelle
Haskell, 93 ° C
Verwendung
quelle
C # 140
quelle
Python
quelle
ECMASCRIPT, 101 (mit Eingabe)
Zeilenumbruch zur Verdeutlichung hinzugefügt. 85 Zeichen, wenn die Eingabe in einer Variablen erfolgt.
quelle
Perl, 54
Shoot, @RobHoare hat mich immer noch um 4 Charaktere geschlagen. :)
quelle
QBasic, 155
Ah, die Erinnerungen ...
Das hätte kürzer sein sollen, aber ich habe mit repl.it getestet , das keine einzeiligen
IF
Anweisungen zulässt und sich seltsam verhält, wenn Sie die Variable off von lassenNEXT i
. DieASC
Funktion wird auch nicht erkannt. Um den Code auszuführen, müssen Sie diese Problemumgehung zu Beginn hinzufügen:(Das zweite Mal, wenn Sie es ausführen, wird der Interpreter sich beschweren, es sei denn, Sie entfernen die
DECLARE FUNCTION
Linie, gehen Sie Abbildung.)quelle
R 110
Beispiel:
quelle