Zu Ihrer Großelternzeit wurde eine Telefonnummer mit einem Drehknopf wie folgt gewählt:
Um jede Ziffer zu wählen, stecken Sie Ihren Finger in das entsprechende Loch, ziehen Sie ihn bis zum Anschlag und lassen Sie ihn los. Ein Mechanismus bewirkt, dass sich der Drehknopf wieder in seine Ruheposition dreht, und das Telefon trennt einen Stromkreis eine festgelegte Anzahl von Malen und verbindet ihn erneut, wobei hörbare Klicks zu hören sind.
Das Wählen der Ziffer N erfordert N solche "Impulse", mit Ausnahme von N = 0, was zehn Impulse sind.
Rotary-Telefone haben die Eigenschaft, dass große Ziffern (8, 9, 0) länger zum Wählen benötigen als kleine Ziffern (1, 2, 3). Dies war eine wichtige Überlegung bei der Erstellung früher Vorwahlkarten, und warum New York City mit seiner hohen Bevölkerungs- (und Telefonleitungs) dichte 212 (nur 5 Impulse) erhielt, während 907 (26 Impulse) in das dünn besiedelte Alaska gingen. Natürlich wurde dies alles irrelevant, als die Tonwahl populär wurde.
Die Herausforderung
Schreiben Sie in so wenigen Bytes wie möglich ein Programm oder eine Funktion, die eine Zeichenfolge (oder eine Folge von Zeichen) mit einer Telefonnummer als Eingabe verwendet und deren Anzahl von Wählimpulsen ausgibt. Diese sind wie folgt zu zählen:
Ziffern
- Die Ziffern 1-9 zählen als die Anzahl der Impulse.
- Ziffer 0 zählt als 10 Impulse.
Briefe
Beachten Sie, dass den Ziffern 2 bis 9 Buchstaben des lateinischen Alphabets zugeordnet sind. Diese waren ursprünglich für benannte Vermittlungsstellen vorgesehen , wurden jedoch für Telefongespräche und SMS-Eingabesysteme neu verwendet.
Sie müssen es unterstützen, Buchstaben in Ihren Telefonnummern zu haben, indem Sie die E.161- Zuordnung von Buchstaben zu Ziffern verwenden:
- A, B, C = 2
- D, E, F = 3
- G, H, I = 4
- J, K, L = 5
- M, N, O = 6
- P, Q, R, S = 7
- T, U, V = 8
- W, X, Y, Z = 9
Sie können davon ausgehen, dass die Eingabe bereits in Groß- oder Kleinschreibung geschrieben wurde.
Andere Charaktere
Sie müssen die willkürliche Verwendung der Zeichen ()+-./
und Leerzeichen als Formatierungstrennzeichen zulassen . Sie können für diesen Zweck alle nicht-alphanumerischen Zeichen zulassen , wenn dies einfacher zu implementieren ist.
Diese Zeichen tragen nicht zur Impulszahl bei.
Beispielcode
Eine nicht Golf spielende Nachschlagetabelle und Funktion in Python:
PULSES = {
'1': 1,
'2': 2, 'A': 2, 'B': 2, 'C': 2,
'3': 3, 'D': 3, 'E': 3, 'F': 3,
'4': 4, 'G': 4, 'H': 4, 'I': 4,
'5': 5, 'J': 5, 'K': 5, 'L': 5,
'6': 6, 'M': 6, 'N': 6, 'O': 6,
'7': 7, 'P': 7, 'Q': 7, 'R': 7, 'S': 7,
'8': 8, 'T': 8, 'U': 8, 'V': 8,
'9': 9, 'W': 9, 'X': 9, 'Y': 9, 'Z': 9,
'0': 10
}
def pulse_count(phone_num):
return sum(PULSES.get(digit, 0) for digit in phone_num)
Beispiel für Ein- und Ausgabe
911
→ 11867-5309
→ 48713 555 0123
→ 42+1 (212) PE6-5000
→ 571-800-FLOWERS
→ 69PUZZLES
→ 48
+- ()*#.
) verwendet werden, genau wie Buchstaben auf Großbuchstaben beschränkt sind. Korrigiere mich, wenn ich falsch liege.*
und#
, die bei Tastentelefonen besondere Bedeutungen haben und bei Drehknöpfen nicht wählbar sind.Antworten:
05AB1E ,
19181715 BytesProbieren Sie es online!
Dies ist die erste Antwort, die π verwendet. Warum sollte man π verwenden, könnte man fragen? Nun, die Buchstaben sind der Reihe nach mit 22233344455566677778889999 verknüpft. Beachten Sie, wie sich die meisten Ziffern dreimal wiederholen, 7 jedoch viermal. Man könnte sagen, dass sich jede Ziffer durchschnittlich 3 + 1/7 Mal wiederholt. Ich frage mich, ob es eine Zahl gibt, die ungefähr 3 + 1/7 ist und weniger Bytes als 22/7 benötigt.
Dies ergibt nur 4 7s, nicht 4 9s, daher müssen wir Z immer noch als Sonderfall behandeln.
quelle
"abcdefghijklmnopqrstuvwxyz"
, aber nicht für"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. Ich könnte das Alphabet in Großbuchstaben umwandeln, anstatt die Eingabe in Kleinbuchstaben umzuwandeln, aber das ist das gleiche bytecount.C # (Visual C # Interactive Compiler) , 51 Byte
1 Byte dank @recursive gespeichert
Dank der Beobachtung von @ ExpiredData, dass nur
() +-/.
die Eingabe erfolgt, wurden 10 Bytes eingespartProbieren Sie es online!
quelle
-10
ist~9
, was im Kontext funktionieren sollte.APL (Dyalog Unicode) , 27 Byte SBCS
Anonyme implizite Präfixfunktion.
Probieren Sie es online!
(
…)∘⍳
Finden Sie den Index * jedes Zeichens in der folgenden Zeichenfolge:* Elemente, die nicht gefunden werden, erhalten den Index 1 + den Maximalindex, dh 11
⎕D
die Ziffern:"0123456789"
1⌽
zyklisch einen Schritt nach links drehen;"1234567890"
11|
Divisionsrest bei Division durch 11 ** ergibt 0 für alle Nicht-Ziffern
…
+
addieren Sie das zu dem Folgenden:'@ADGJMPTW'∘⍸
der ɩ nterval ɩ ndex * für jedes Zeichen* Also [− [, "@") ergibt 0, ["@", "A") ergibt 1, ["A", "D") ergibt 2 usw.
+/
summieren dasquelle
Python 2 , 74 Bytes
Probieren Sie es online!
Berechnet den ASCII-Wert für jedes Zeichen. Die erste Option sucht nach Buchstaben und die zweite nach Zahlen. Die Klarstellung, dass alle in der Eingabe zulässigen Interpunktionszeichen ASCII-Werte kleiner als 48 haben, vereinfacht die Logik, aber eine neue Methode könnte jetzt insgesamt besser sein.
Python 2 , 84 Bytes
Probieren Sie es online!
Verwendet eine fest codierte Nachschlagezeichenfolge, wobei jeder Block mit 5 Zeichen den Zeichen entspricht, die jeden Wert ab 1 angeben. Leerzeichen werden mit gefüllt
x
, die sich nicht in der großgeschriebenen Eingabe befinden können. Zufällig erscheinende Zeichen nicht im String Produkten-1
für die ,.find
die einen Summanden von Null ergibt.quelle
JavaScript (Node.js) , ...
7669 BytesProbieren Sie es online!
-7 danke @Arnauld!
Erläuterung
Alle von
[space]().+-/
werden nicht von erfasst/\w/g
, daher wirken sie sich nicht auf die Gesamtsumme aus.quelle
Perl 5
-p
,5251 Bytes@Grimy bekommt Gutschrift für -1
Probieren Sie es online!
quelle
/\d/g
sollte/./g
für -1 sein (ja, es behandelt die Interpunktion immer noch korrekt).J , 39 Bytes
Probieren Sie es online!
Ein Port der APL-Lösung von Adám
quelle
Retina 0.8.2 , 34 Bytes
Probieren Sie es online! Link enthält Testfälle. Erläuterung:
Wandle die Buchstaben
WTPMJGDA
in die Ziffern um9..0
.Mische alle verbleibenden Buchstaben um 1 nach unten und wiederhole, bis alle Buchstaben in Ziffern umgewandelt wurden.
Ersetzen Sie
0
durch,55
da sie die gleiche Anzahl von Impulsen zum Wählen benötigen.Nimm die digitale Summe.
quelle
K4 , 44 Bytes
Lösung:
Beispiele:
Erläuterung:
Naive Herangehensweise, wahrscheinlich ziemlich golfen. Nachschlageindex des Charakters, Nachschlagepunktzahl, Summe.
quelle
Perl 6 , 53 Bytes
Probieren Sie es online!
Multipliziert den ASCII-Code mit 0,313 anstatt mit 1/3 und verwendet das bitweise ODER, das auf Null rundet, um die richtige Verzerrung zu erhalten .
quelle
C (gcc) ,
94898680 BytesDanke an ceilingcat, nwellnhof und Rogem für die Vorschläge.
Probieren Sie es online!
quelle
c<43U
stattdessen vorc-17<26U
Bash , 256 Bytes
Sie können die
(( … ))
Konstrukte durchlet
für identische Byteanzahl ersetzen . Möglicherweise gibt es einen guten Algorithmus zum Reduzieren der case-Anweisungen, der jedoch noch nicht gefunden wurde. Mit ein bisschen Überarbeitung könnten Sie es auch zu einer Funktion machen (aber nicht in den gleichen oder weniger Bytes, es sei denn, Sie können dasfunction fname { … }
obere und das hintere Ende rabattieren ).Probieren Sie es online!
Eine bessere Lösung mit der Kartenzeichentechnik nutzt das
tr
Tool:[Bash with tr], 173 Bytes
Probieren Sie es online!
quelle
while((${#p}))
funktioniert und spart drei Bytes.c=${p:0:1};case c in ([0-9]) ((d+=c?c:10));;
Speichert weitere 16.tr -dc 0-9
Wenn Sie zur tr-Pipeline hinzugefügt haben, brauchen Sie überhaupt keine case-Anweisung, und der Zusatz kann in diewhile
Bedingung mit eingeklappt werden&&
.read p;p=$(echo $p|tr A-Z 22233344455566677778889999|tr -dc [0-9]);while ((${#p}));do c=${p:0:1}&&((d+=c?c:10));p=${p#?};done;echo $d
p=$(head -1|tr A-Z 22233344455566677778889|tr -dc 0-9);while((${#p}));do((d+=(c=${p:0:1})?c:10));p=${p#?};done;echo $d
.. Die letzten drei 9en werden nicht benötigt, da tr das letzte Ersetzungszeichen wiederverwendet, wenn das zweite Argument zu kurz ist.read p;while((${#p}>0));do case ${p:0:1} in ([1-9])((d+=${p:0:1}));;([0])((d+=10));;([ABC)((d+=2));;([P-S])((d+=7));;([W-Z])((d+=9));;([DEF])((d+=3));;([GHI])((d+=4));;([JKL])((d+=5));;([MNO])((d+=6));;(?)d=$d;esac;p=${p#?};done;echo $d
Jelly ,
3324 BytesProbieren Sie es online!
Ein monadischer Link, der eine Zeichenfolge als Argument verwendet und die Anzahl der Impulse zurückgibt. Neu geschrieben , inspiriert von @ Grimy der 05AB1E Antwort so sicher sein , sie upvote!
quelle
PowerShell ,
10910287 ByteProbieren Sie es online!
BEARBEITEN: @ mazzys Idee für einen Regex-Schalter mit einer gewissen Formatierung der Zeichenfolge, um char -> int -> string umzuwandeln und nur die erste 'Ziffer' zu erfassen
Original:
Ich hatte gehofft, <100 Bytes zu bekommen, also werde ich weiter nachsehen, ob ich noch etwas anderes tun kann. Es gibt wahrscheinlich eine Möglichkeit, die Zahlenfolge zu entfernen
Entschuldigung, wenn dies verwirrend ist, da ich Arrays mit booleschen Indexanweisungen verschachtelt habe, aber -
Erläuterung:
[char[]]"$args"|%{
liest die Eingabe als String gegossen und dann in ein char Array explodiert sie und beginnt eine für-jede Schleife mit der Überprüfung ,()[$_-gt47]
um zu sehen , ob irgendeine()+-./
(alle ASCII - Zeichenwerte haben <48) eingegeben wurdeAnmerkung: Powershell übernimmt
$true
und$false
als1
und0
jeweils für Array - IndizesDann bekommen wir entweder
48
für die Symbole, oder:('22233344455566677778889999'[$_-65],(58,$_)[$_-ne48])[$_-lt64]
Die
[$_-lt64]
Überprüfungen für eine Zahl oder einen Buchstaben (alles angenommenes Kapital hier). Wenn es sich um einen Buchstaben handelt,'22233344455566677778889999'[$_-65]
ändern Sie ihn in 0-25, um das Array zu indizieren und den Impulswert (als Zeichen) auszugeben. Wenn das Zeichen eine Zahl ist, schauen wir uns stattdessen Folgendes an:(58,$_)[$_-ne48]
Überprüfen0
und Ausgeben58
oder nur das numerische Zeichen selbst.Alles
$a+= ... -=48
initialisiert eine numerische Variable $ a at0
und addiert dann die Ausgabe. Die Ausgabe ist der ASCII-Zeichenwert einer Zahl, also subtrahieren48
.Hinweis: Wenn die Eingabe ein Symbol war,
$a+=48-48
wird sie ignoriert. Wenn ja0
, bekommen wir$a+=58-48
unsere +10Zuletzt wird
;$a
nur unser endgültiger Wertbeitrag für jede Schleife ausgegebenquelle
=
darin, die von meinen vorherigen Methoden zur Lösung dieses Problems übrig geblieben sind, danke für den Haken! Kannstt*y
du erklären, warum das funktioniert, um die Zeichenfolge in ein Zeichenarray zu zerlegen?-f
und[0]
.PowerShell ,
958579 Byteinspiriert von nwellnhofs antwort .
inspiriert von der Antwort
[0]
von Sinusoid .Probieren Sie es online!
Abgerollte Version:
quelle
Stax , 21 Bytes
Führen Sie es aus und debuggen Sie es
quelle
Kotlin , 113 Bytes
Probieren Sie es online!
quelle
Python 3 ,
134123 BytesProbieren Sie es online!
-11 Bytes dank @ dan04
quelle
'ADGJMPTWBEHKNQUXCFILNRVYSZ'
können Sie die Zahlenfolge auf reduzieren'23456789'*3+'79'
.