Inspiriert von der Google Code Challenge :
Das lateinische Alphabet enthält 26 Zeichen und Telefone haben nur zehn Ziffern auf der Tastatur. Wir möchten es Ihnen leichter machen, Ihrem Freund eine Nachricht zu schreiben, indem Sie eine Reihe von Tasten drücken, um die gewünschten Zeichen anzuzeigen. Die Buchstaben werden wie unten gezeigt auf die Ziffern abgebildet. Um beispielsweise das Zeichen B einzufügen, würde das Programm 22 drücken. Um zwei Zeichen nacheinander von derselben Taste aus einzufügen, muss der Benutzer eine Pause einlegen, bevor er die Taste ein zweites Mal drückt. Das Leerzeichen '' sollte gedruckt werden, um eine Pause anzuzeigen. Zum Beispiel steht 2 2 für AA, während 22 für B steht.
Jede Nachricht besteht nur aus Kleinbuchstaben az und Leerzeichen ''. Durch Drücken von Null wird ein Leerzeichen ausgegeben.
Ihre Herausforderung besteht darin, die kleinste Funktion zu schreiben, die die Eingabezeichenfolge annimmt, und die Folge von Tastendrücken zurückzugeben, die erforderlich sind, um die Eingabe als Zeichenfolge zu erzeugen oder an stdout auszugeben. Die Funktion mit der geringsten Anzahl von Bytes gewinnt.
Beispiel Eingabe / Ausgabe
phone("hi")
44 444
phone("hello world")
4433555 555666096667775553
Andere Klarstellungen
- Pausen dürfen nur bei Bedarf hinzugefügt werden und müssen ein Leerzeichen sein.
- Jede Nachricht besteht nur aus Kleinbuchstaben az und Leerzeichen ''. Drucken
0
, um Leerzeichen zu kennzeichnen. - Keine externen Bibliotheken.
- Nur die Eingabezeichenfolge darf an Ihre Funktion übergeben werden.
- Um andere Sprachen wettbewerbsfähig zu machen, zählt die Deklaration der primären Funktion nicht und das Importieren anderer Standardbibliotheken auch nicht.
#include
s,import
s undusing
s zählen nicht. Alles andere macht. Dies beinhaltet#define
s und Hilfsfunktionen. Siehe Regel 2 in dieser Frage, wenn Sie verwirrt sind. - Mehrere Leerzeichen können als
00
oder bezeichnet werden,0 0
da Sie nicht wirklich zwischen Leerzeichen pausieren müssen
{}
als Teil der Funktionssignatur?function f(){alert('hi');}
Soll ich zum Beispiel bei meinem Code die Zeichen vonalert('hi');
oder zählen{alert('hi');}
?t9
funktioniert das anders: Sie müssen auf jede Taste einmal klicken, um ein Wort zu erhalten.Antworten:
Rubin,
129122115111108107105Fertig mit Golfen ...
Hoppla, völlig vergessen, unnötige Leerzeichen zu entfernen - behoben ...
2 Zeichen gespart dank Peter Taylor.
Online Version
Erläuterung:
Raum wird mit der Ordnungszahl 96 in das Zeichen übersetzt
Zeichen werden zuerst einer Reihe von Zahlen zugeordnet: - a bis 2 - b bis 22 - d bis 3222 - h bis 444333222
Ein regulärer Ausdruck entspricht dann der ersten Gruppe gleicher Ziffern
Das Array ist verbunden
Alle Leerzeichen in "digit space different_digit" werden entfernt
quelle
6666
6 sollte niemals 4-mal hintereinander gedrückt werden müssen.\2
in diesem letzten Regex? Sicherlich ist die zweite Gruppe eine Behauptung mit der Breite Null?REBEL -
154110103Diese 'Funktion' akzeptiert Eingaben von stdin und sendet Ergebnisse an stdout.
Testläufe (damit Sie den Interpreter nicht installieren müssen):
quelle
JavaScript (124)
Führen Sie in Firefox.
quelle
GolfScript, 46 Zeichen
Liest wie gewohnt die Eingabe von stdin und druckt auf stdout. Siehe Online-Demo (mit fester Eingabe).
Beachten Sie, dass dieser Code auf einer sehr strengen Interpretation der Eingabespezifikation basiert (nur Kleinbuchstaben und Leerzeichen): Insbesondere werden alle Zeilenumbrüche in der Eingabe zum Absturz bringen! Dieses Problem kann auf Kosten von zwei zusätzlichen Zeichen behoben werden, indem
n-
der Code vorangestellt wird, um alle Zeilenumbrüche herauszufiltern.quelle
C ++ - 365 Zeichen ohne
int main(){}
Verwendet die gleiche Argumentation wie meine Antwort hier , verwendet jedoch nur
for
Schleifen, um jeden Buchstaben in angemessener Anzahl auszugeben.quelle
s[i]==32
anstelle von verwendens[i]==' '
. Der ASCII-Wert des Leerzeichens ist 32.Perl - 107
110Hier ist meine vorherige Lösung in 120
128 130 155:Tests:
quelle
VBA
220253/258/219Function
Zeilen hier nicht mitzählen :Mit
String
, 253 :Mit einer
For
Schleife 258 :Korrekturen für die 7/9-Taste hinzugefügt (danke, Danny), die viele Zeichen hinzugefügt haben.
Verwendung von
Choose
219 :Ich wollte nicht mit diesem laufen, da es grundlegender in der Funktionalität ist, aber es ist der kürzere Code ...
quelle
yes
sollte sein999337777
. Ich werde10338
Ihre Funktion nutzen.C
165 163 153 149138 ZeichenBei meinem ersten Versuch, Code Golf zu spielen, sind alle Vorschläge willkommen.
quelle
C ++ -
170168160Golf gespielt:
Ungolfed
quelle
C: 136 Zeichen
Und leicht ungolfed (ja, so wurde geschrieben):
Ich könnte es ein wenig reduzieren, indem ich etwas Rekursion, schwarze Magie und eine angemessene Menge Chilipulver auftrage.
quelle
Java - 243
Ziemlich naive Java-Lösung. Vielen Dank an Kommentatoren für Vorschläge.
Es wurde ein Fehler behoben, durch den manchmal unnötige Leerzeichen eingefügt wurden, z. B. für die Eingabe "Hallo Welten sup".
quelle
java
. Kannst du das in deine Überschrift schreiben, so wie es die anderen Antworten tun?t.length
durch10
i
nur zum Durchlaufen des Befehls verwendet wirdString
, entfernen Sie ihn und führen Sie eine foreach-Schleife aus:for(char c:s.toCharArray())
if(c==' '){o+='0';continue;}
auchif(c==' ')o+='0';else{
und fügen Sie das entsprechende hinzu}
.CoffeeScript - 202 (210 - 8)
quelle
APL, 77 Zeichen
Erläuterung
2+⌊y←7.99,⍨.315×⍳25
oder, ungolfed,y←(0.315×⍳25),7.99 ◇ 2+⌊y
probiert eine geeignet geneigte Linie (y = 0,315 x) an den Punkten von 1 bis 25; Die Linie wird so gekippt, dass der Boden dieser y-Werte dem sich wiederholenden Muster 000111 ... 777 mit Ausnahme der sechsten Zifferngruppe 5555 folgt. Am Ende wird eine Zahl angehängt, um die vierte 7 zu erhalten, sodass das letzte Array plus 2 22233344455566677778889999 ist.⌈3.1×y-⌊y
verstärkt die Differenz zwischen diesen y-Werten und ihren Fußböden, so dass die Obergrenzen der Differenzen das Muster 123123 ... mit einer 4 auf den letzten Ziffern der beiden Gruppen von 4 Ziffern ergeben;'0',⍨( ... )/¨⍕¨ ...
oder(( ... ) /¨ ⍕¨ ...),'0'
verwendet das letztere Ergebnis, um Ziffern aus dem ersteren zu duplizieren, sodass die Ausgabe das Array der Zeichenfolgen "2" "22" "222" "3" "33" "333" ... mit den korrekten Zeichenfolgen "7777" und " 9999 "vorhanden und eine" 0 "am Ende angehängt;⍵⍳⍨⎕UCS 96+⍳26
oder(⎕UCS 96+⍳26)⍳⍵
berechnet den Index jedes eingegebenen Zeichens, wobei "a" 1 ist, "z" 26 ist und das Leerzeichen (und jedes andere Zeichen) 27 ist;{ ... }/( ... )[ ... ]
Nimmt das letztere Ergebnis, den Index für jedes Eingabezeichen, um jedes Zeichen in die jeweilige Ziffernfolge zu übersetzen, und verkettet dann die Zeichenfolgen unter Verwendung der Funktion in geschweiften Klammern.{⍵,⍨⍺,''↑⍨=/↑¨⍺⍵}
oder{(⍺,(=/↑¨⍺,⍵)↑''),⍵}
fügt jede neue Zeichenfolge an den Akkumulator an und fügt nur dann ein einzelnes Leerzeichen ein, wenn beide Argumente mit dem gleichen Zeichen beginnen.Beispiele
quelle
Python
155150Ich wünschte, ich wäre besser in diesem XD. Funktionsdefinition nicht gezählt. Die erste Einrückungsstufe ist ein Leerzeichen, die zweite eine Registerkarte und die dritte zwei Registerkarten.
quelle
JavaScript 234
for(l=-1,r="",I=0,y=(s=prompt()).length;I<y;I++){c=s[I];n="";d=c.charCodeAt(0)-96;if(0>d)n=0;else for(k=J=0;J<8;k=++J){v="33333434"[k];if(d<=v){for(x=K=0;0<=d?K<d:K>d;x=0<=d?++K:--K)n+=k+2;break}d-=v}r+=n[0]==l[0]?" "+n:n;l=n}alert(r)
quelle
R 224
Ich bin mir sicher, dass es einen besseren Weg gibt, also werde ich weiter daran arbeiten.
quelle