Tor
Schreiben Sie ein Programm oder eine Funktion, die eine numerische Telefonnummer in einen Text übersetzt, der das Sprechen erleichtert. Wenn Ziffern wiederholt werden, sollten sie als "double n" oder "triple n" gelesen werden.
Bedarf
Eingang
Eine Folge von Ziffern.
- Angenommen, alle Zeichen sind Ziffern von 0 bis 9.
- Angenommen, die Zeichenfolge enthält mindestens ein Zeichen.
Ausgabe
Durch Leerzeichen getrennte Wörter, wie diese Ziffern laut vorgelesen werden können.
Ziffern in Wörter übersetzen:
0 "oh"
1 "eins"
2 "zwei"
3 "drei"
4 "vier"
5 "fünf"
6 "sechs"
7 "sieben"
8 "acht"
9 "neun"Wenn dieselbe Ziffer zweimal hintereinander wiederholt wird, geben Sie "double number " ein.
- Wenn die gleiche Ziffer dreimal hintereinander wiederholt wird, schreiben Sie "dreifache Zahl ".
- Wenn die gleiche Ziffer vier oder mehr Mal wiederholt wird, schreiben Sie für die ersten beiden Ziffern "double number " und werten Sie den Rest der Zeichenfolge aus.
- Zwischen jedem Wort befindet sich genau ein Leerzeichen. Ein einzelnes vorangestelltes oder nachfolgendes Leerzeichen ist zulässig.
- Bei der Ausgabe wird nicht zwischen Groß- und Kleinschreibung unterschieden.
Wertung
Quellcode mit den wenigsten Bytes.
Testfälle
input output
-------------------
0123 oh one two three
4554554 four double five four double five four
000 triple oh
00000 double oh triple oh
66667888 double six double six seven triple eight
19999999179 one double nine double nine triple nine one seven nine
code-golf
kolmogorov-complexity
Hand-E-Food
quelle
quelle
Antworten:
05AB1E ,
5352515049 BytesProbieren Sie es online!
Erläuterung:
quelle
M
sieht man auch in Listen nach, wenn man die maximale Ganzzahl auf dem Stapel ermittelt? Wusste das nicht. Klingt nach etwas, an das man sich erinnert. :)8088 Assembly, IBM PC DOS,
164159156155 BytesBinär:
Erstellen und testen Sie die ausführbare Datei
xxd -r
von oben oder laden Sie PHONE.COM herunter .Zerlegte Auflistung:
TL; DR:
Die Eingabezeichenfolge wird von rechts nach links gelesen, um das Auffinden eines Tripels zu erleichtern. Die Ausgabe wird auf den x86-Stapel geschoben , um das Umkehren der Anzeigereihenfolge und das Neuanordnen der Wörter "double" und "triple" vor dem Ziffernnamen zu vereinfachen.
Wenn sich die nächste Ziffer von der letzten unterscheidet, wird der Name in der Wortliste nachgeschlagen und auf den Stapel verschoben. Da es kein formales Konzept für ein "indiziertes Array von Zeichenfolgen variabler Länge" im Maschinencode gibt, wird die Liste der Wörter
i
(der Wortindex) so oft gescannt, bis der Zeichenfolgenbegrenzer ($
) das entsprechende Wort gefunden hat. Hilfreich ist, dass x86 ein paar kurze Anweisungen hat (REPNZ SCASB
ähnlich wiememchr()
in C), die dies vereinfachen (danke CISC !).Wenn die Ziffer mit der vorherigen identisch ist, wird der Zähler für die Länge eines "Laufs" inkrementiert und die Schleife am Eingang nach links fortgesetzt. Sobald der Lauf beendet ist, wird der Name der Ziffer vom Stapel genommen, da er für jede Gruppierung nach dem "Doppel" oder "Dreifach" gesetzt werden muss. Wenn die Lauflänge ungerade ist (und die Lauflänge ungerade ist
> 1
), wird der Name der Ziffer, gefolgt von der Zeichenfolge "Triple", in den Stapel verschoben und die Lauflänge um 3 verringert. Da die Lauflänge jetzt gerade ist, ist der Schritt wird für "double" wiederholt, bis die Lauflänge 0 ist.Wenn die Eingabezeichenfolge das Ende erreicht hat, wird der Stapel ausgegeben, wobei jede gespeicherte Zeichenfolge in umgekehrter Reihenfolge auf den Bildschirm geschrieben wird.
I / O:
Eine eigenständige ausführbare PC-DOS-Datei, die über die Befehlszeilenausgabe an die Konsole eingegeben wird.
Laden Sie PHONE.COM herunter und testen Sie es .
quelle
repne scasb
istmemchr
(oderstrchr
wenn Sie wissen, dass es einen Treffer geben wird), nichtstrstr
.mov cl, byte[si]
äquivalent zu istmovzx cx, byte [si]
. Ich frage mich, ob die Verwendung eines anderen RegistersAH
für die Zählung mitdec ah / jnz
stattloop
etwas davon abhalten würde, CX nicht zu pushen / popen. Wahrscheinlich nicht, und Sie haben keine 16-Bit-Register mehr, die 1 Byte zulassen würdendec
.CH=0
gehe ich von fysnet.net/yourhelp.htm aus , die für jede vernünftige DOS-Version immer gleich null ist, also mitBX
. Gute Gedanken über die Null-Ausdehnungmov
, obwohl ich technisch nicht denke, dassmovzx
sie auf dem 808x verfügbar ist (die Zielplattform bleibt ein IBM PC 5150 und alle). Ich habe mit allen Registern herumgespielt, so gut ich konnte, um die Bytes zu retten, aber wenn Sie etwas sehen, das ich wahrscheinlich verpasst habe, lassen Sie es mich bitte wissen!memchr
IMO zu nennen . Die Bezeichnung "Zeichenfolgenanweisung" täuscht die Leute in die Irre, dass sie an implizit langen C-Zeichenfolgen arbeiten, aber tatsächlich arbeiten sie an explizit langen Zeichenfolgen wiestd::string
oder Puffern. Wiememcpy
,memset
(MOVs / stos)memchr
/memrchr
(REPNE SCAS mit DF = 0 oder 1), undmemcmp
(repe CMPS). Das einzige C-Äquivalent fürrepe scas
ist,strspn
weil ich nicht glaube, dass es dafür einemem
Funktion gibt . Sie können sogar beschreibenstosw
oderstosd
alswmemset
zum Beispiel.movzx
kostet ein zusätzliches Opcode-Byte, und ja, es wurde erst mit 386 eingeführt. Es war nur einfacher zu tippen, um die Tatsache zu beschreiben, dass Sie eine Low-Byte-Zusammenführung durchführen und davon ausgehen, dass sie korrekt null erweitert ist. Wenn Sie CX oder mindestens CH = 0 kennen, dann gehen Sie ja zum Golfen immermov
zu CL. Aber außerhalb des Golfsports sind x86s Anweisungen zum Laden von Bytesmovzx
undmovsx
: Sie vermeiden falsche Abhängigkeiten oder andere Partial-Register-Spielereien. Auf modernen CPUs mit einem Dword-Ziel sind sie so schnell, wie Dword geladenmov
wird.05AB1E ,
6156535251 Bytes-9 Bytes dank @Grimy .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Sehen Sie sich meinen Tipp 05AB1E (Abschnitt Wie verwende ich das Wörterbuch? ) An, um zu verstehen, warum es
… ‹¶½¿
ist" double triple"
und“Šç€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“
ist"oh two three four five six seven eight nine"
.quelle
if(length>=4)
bevor ich den Rest hinzufügte, aber natürlich ist es nicht notwendig für ganze Zahlen der Größe1,2,3
, da;Å2¨3ª£
die Zeichenketten intakt bleiben (nur umhüllt von einer Liste, die wir ohnehin nach der Karte abflachen). Danke fürs bemerken! Und freue mich auf Ihre Antwort mitÅγ
. Ich hatte in der Tat das Gefühl, dass der erste Teil irgendwie viel kürzer gemacht werden könnte.Dg;LàäR
ist immer noch ein Byte kürzer alsāɨšJõK
und viel ähnlicher als das, was Sie ursprünglich hatten.á
stattõK
am Ende. :)á
! Hier ist eine 51 und eine andere . 50 fühlt sich möglich.QuadR , 137 Byte SBCS
Titeletui mit einem führenden Leerzeichen.
Probieren Sie es online!
∊
ϵ nlist (flatten)¯2↑¨
nimm die letzten zwei Zeichen (links mit einem Leerzeichen aufgefüllt ) von jedem Zeichen@
an Positionen, an denen(∊∘⎕A)
Zeichen Mitglieder des Großbuchstaben A lphabet sind,⍵
als Ergebnis der folgenden PCRE-Ersetzungsoperation…(.)
Jedes Zeichen,\1
dem*
null oder mehrmals ein Zeichen folgt , wird durch das folgende Ergebnis ersetzt:{…}⍵M
"dfn";⍵
ist der M atch des obigen Musters('OhOneTwoThreeFourFiveSixSevenEightNine'(
...)⎕A)
die folgende anonyme stillschweigende Funktion mit der langen Schnur und die Groß gelten A lphabet als linke Argumente:∊
Mitgliedschaft (von Buchstaben in der langen Zeichenkette in Großbuchstaben)⊂
Partitionen (mit einer neuen Partition, die beginnt, wenn sie Mitglied ist⊣
das linke Argument (dh die lange Zeichenkette)(
...)⎕R
PCRE R eplace folgende Muster mit diesen Worten:⎕D
die Ziffern 0 bis 9,¨
Behandle jedes als ein separates Muster⍺←
Weisen Sie diese Ersatzfunktion zu⍺
(für ein Lphabetise)⋄
dann,⊃⍵
das erste Zeichen des Spiels,
als Zeichenfolge⍺
anwenden ,⍺
um esw←
ordne dies zuw
(für Wort )' '∊
…:
Wenn Space Mitglied ist (dh wenn das Match leer war):⍬
nichts zurückgeben (wird zur leeren Zeichenkette)⋄
sonst,1=≢⍵:
Wenn man der Anzahl der Zeichen in der Übereinstimmung entspricht (dh der Länge):⍺⍵
Alphabetisieren Sie diese Ziffer⋄
sonst,3=≢⍵:
wenn drei gleich der Anzahl der Zeichen in der Übereinstimmung ist (dh ihre Länge):'Triple',w
prepend "Triple" , um die w ord⋄
sonst,2↓⍵
fallen auf Ziffern aus dem Match∇
darauf zurückgreifenw,
das Wort voranstellen'Double',
"Double" voranstellenquelle
JavaScript (ES6),
161 160 152144 ByteDie Ausgabe enthält ein einzelnes führendes Leerzeichen.
Probieren Sie es online!
oder Siehe den formatierten Quellcode
Wie?
Die Konvertierung erfolgt in drei Schritten:
"X X"
durch"double X"
"double X X"
durch"triple X"
Um Bytes zu sparen, verwenden wir für alle Schritte den gleichen regulären Ausdruck:
was wie folgt funktioniert:
In Schritt 1 verwenden wir eine Rückruffunktion, die das richtige Wort aus einer Nachschlagetabelle auswählt:
"799999"
→" seven nine nine nine nine nine"
In Schritt 2 ersetzen wir durch
"$1 double$2"
:" (seven)( nine)( nine)"
→" seven double nine"
"( nine)( nine) nine"
→" double nine nine"
In Schritt 3 ersetzen wir durch
"triple$2"
:" (double)( nine)( nine)"
→" triple nine"
quelle
Wolfram-Sprache (Mathematica) , 115 Bytes
Probieren Sie es online!
Nimmt eine Ziffernliste als Eingabe. Die Ausgabe enthält ein führendes Leerzeichen.
quelle
Stax , 56 Bytes
Führen Sie es aus und debuggen Sie es
quelle
Python 2 ,
171169168 BytesProbieren Sie es online!
-1 Byte, danke an Jitse
quelle
1312
;)['','double ','triple '][n]
bis' eellpbiurotd'[-n:0:-2]
für 168 Bytes: Probieren Sie es online!Perl 5
-p
, 111 BytesProbieren Sie es online!
Erläuterung:
quelle
Scala , 213 Bytes
Ich habs. Irgendwie war die rekursive Version, die ich zu erstellen versuchte, viel ausführlicher als diese (immer noch rekursiv, aber nur in einem Fall). Die Funktion
f
nimmt die Telefonnummer als Eingabezeichenfolge und gibt ihre Phonetik mit einem nachgestellten Leerzeichen aus.Probieren Sie es online!
Edit : -8b dank DrY Wit!
Scala , 215 Bytes
Und hier kommt die führende Whitespace-Version, die aus irgendeinem Grund zwei Bytes länger ist (auch bei massivem Refactoring).
Probieren Sie es online!
quelle
(o(0)+"").toInt
mito(0)-48
.PHP ,
174169166159 BytesProbieren Sie es online!
Für jede Ziffer bei Index
$i
ab 0:$i
gleich 3 ist, wird gedruckt'triple '
und zu 2 addiert,$i
sodass bei der nächsten Iteration 2 Stellen übersprungen werden.$i
mindestens 2, aber nicht 3 beträgt, wird 1 gedruckt'double '
und zur$i
nächsten Iteration hinzugefügt, sodass 1 Ziffer übersprungen wird.$i++
.quelle
Retina 0,8,2 , 105 Bytes
Probieren Sie es online! Gibt ein führendes Leerzeichen aus. Erklärung: Ich habe ursprünglich versucht, eine Regex zu verwenden, die automatisch mit 2 oder 3 Ziffern übereinstimmt, aber der Ansatz von @ Arnauld erwies sich als golferisch. Erläuterung:
Ordnen Sie identische Ziffernpaare zu und ersetzen Sie die erste durch a
=
. Dann wiederholen, so dass bei einer ungeraden Zahl auch die vorletzte Ziffer durch a ersetzt wird=
.Leert die Ziffern (und
=
s) aus.Behandeln Sie den Fall von drei identischen Ziffern.
Ersetzen Sie alle verbleibenden Zeichen durch Wörter.
quelle
Jelly , 59 Bytes
Probieren Sie es online!
Eine monadische Verknüpfung, die eine Zeichenfolge aus Ziffern als Argument verwendet und eine Jelly-Zeichenfolge aus durch Leerzeichen getrennten Wörtern zurückgibt. Beim Aufruf als Vollprogramm erfolgt die Ausgabe implizit.
quelle
T-SQL 2017, 238 Byte
Einige Zeilenumbrüche hinzugefügt, um die Lesbarkeit zu verbessern
Probieren Sie es online aus
quelle
C ++, 382 Bytes
Es ist kein Superclever, aber jemand musste eine C ++ - Version schreiben. Die rekursive Funktion R durchläuft die Eingabezeichenfolge und zählt die wiederholten Werte. Wenn es mehr als 3 Wiederholungen gibt, wird so getan, als ob es 2 Wiederholungen gäbe, dann wird zurückgespult und es wird erneut versucht.
Ein paar weitere Quell-Zeichen könnten wahrscheinlich mit
#define
Major herausgedrückt werden, aber ich bin sicher, dass ein besserer Algo mehr herausdrücken könnte.und Verifikation von Testfällen:
quelle
#include <sstream>
? Oder können Sie das nach dem Golfspiel für die Testfunktion nach unten verschieben? Ich denke, das Tippenstd::ostream&s
würde weniger Platz beanspruchen alsusing namespace std;
, es sei denn, es gibt andere Stellen, an denen Sie eine benötigen würdenstd::
.Perl 6 ,
9693 BytesProbieren Sie es online!
Dies ist ein anonymer Codeblock, der eine Zahl akzeptiert und eine Zeichenfolge mit den Zahlen in Großbuchstaben zurückgibt, z. B.
0123 => oh ONE TWO THREE
mit einem einzelnen nachgestellten Leerzeichen.Dies wurde für eine Weile gelöscht, bis ich herausfand, wie man Captures in einem Lookahead verwendet, aber es sollte jetzt behoben werden.
quelle
rot , 242 Bytes
Probieren Sie es online!
quelle
Scala , 253 Bytes
Probieren Sie es online!
quelle
Oracle SQL, 578 Bytes (in formatierter Form)
Die Lösung ist in keiner Weise präzise, so dass sie in formatierter Form veröffentlicht wird.
Testen Sie in SQL * Plus
Der Haupttrick besteht darin, dass Ziffern, die mithilfe von Oracle-Formatmodellen in Wörter umgewandelt wurden, anstelle von hartcodierten Literalen "eins" ... "neun".
quelle
union all
mitselect regexp_replace(s,case when length(regexp_substr(s, '(.)(\1)+')) = 3 then '^...' else '^(.)\1|^.' end) from r
.JavaScript, 142 Bytes
Probieren Sie es online!
quelle
(Roblox) Lua 5.1 , 166 Bytes
Stellen Sie sicher, dass
s
es sich um einen vordefinierten Zeichenfolgenwert handelt, der nur mit Ziffern gefüllt ist. Das ist die Variable, die geändert werden soll. Das Ergebnis enthält ein führendes Leerzeichen[\u20]
.quelle
s
, bereits Eingaben zu verlangen . Abgesehen davon hast du einen guten ersten Beitrag! Ich würde empfehlen, dass Sie einen Link zu einer Online-Test-Site hinzufügen , z. B. tio.run/#lua, damit andere Ihre Lösung testen können