Einfache DTMF-Dekodierung: Finden Sie den Telefonschlüssel!

11

Dies ist eine einfache Herausforderung, die hoffentlich zu kreativen Antworten führen kann.

Zitat von Wikipedia : "Dual-Tone Multi-Frequency Signaling (DTMF) ist ein In-Band-Telekommunikationssignalisierungssystem, das das Sprachfrequenzband über Telefonleitungen zwischen Telefongeräten und anderen Kommunikationsgeräten und Vermittlungsstellen verwendet."

Aufgabe

Bei zwei Ganzzahlen, die die Spalten- und Zeilenfrequenzen in der folgenden Tabelle darstellen, müssen Sie den entsprechenden Schlüssel ausgeben:

       | 1209 Hz | 1336 Hz | 1477 Hz
-------+---------+---------+---------
697 Hz |    1    |    2    |    3
770 Hz |    4    |    5    |    6
852 Hz |    7    |    8    |    9
941 Hz |    *    |    0    |    #

Beispiele

  • Wenn der Eingang ist [ 1209, 852 ], ist der erwartete Ausgang "7".
  • Wenn die Eingabe ist [ 1477, 941 ], ist die erwartete Ausgabe "#".

Regeln

  • Sie müssen Eingaben als Ganzzahlen in einem beliebigen vernünftigen Format vornehmen, z. B. zwei separate Variablen oder ein Array mit zwei Variablen. Bitte geben Sie an, in welcher Reihenfolge Ihr Programm sie erwartet (entweder column_freq, row_freq oder row_freq, column_freq ).
  • Die Eingabe ist garantiert gültig.
  • Sie müssen ein Zeichen drucken oder ausgeben . Sie können jedoch auch eine Ganzzahl für Zifferntasten ausgeben.
  • Dies ist , also gewinnt die kürzeste Antwort in Bytes!
Arnauld
quelle

Antworten:

2

Gelee , 19 Bytes

DḢ×3++6ị9R;“*0#  ”¤

Probieren Sie es online aus!

Nimmt als Eingabe row, columnin zwei Argumente.

Dies verwendet 3*<first digit of row> + <column> + 6 % 14, um für jeden einen anderen Wert anzugeben. Dies wird indiziert [1,2,3,4,5,6,7,8,9,"*","0","#"," "," "], um die Ausgabe zu erhalten. Die Räume könnten wirklich jeder Charakter sein; Sie sind nur Puffer, um einen impliziten Mod 14 zu erstellen.

Niedriges Niveau

DḢ×3++6ị9R;“*0#  ”¤
D                     - digits (of <row>)
 Ḣ                    - head (get first element)
  ×3                  - multiply by 3
    +                 - add (<column>)
     +6               - add 6
       ị              - index into:
                  ¤   - the nilad:
        9R              - range(9)
          ;             - concatenate
           “*0#  ”      - the string "*0#  "
fireflame241
quelle
8

JavaScript (ES6), 39 35 Byte

a=>b=>"310*58# 47269"[a%b%83%16%13]

Ordnet die beiden Eingaben Zahlen im Bereich zu, [0, 13)indem berechnet wird :
col % row % 83 % 16 % 13.
Übernimmt Eingaben in der Curry-Syntax ( f(col)(row)) und gibt eine Zeichenfolge mit einem Zeichen zurück.

Testfälle

Geschichte

Begonnen mit dem Bereich der [0, 20)Berechnung col % row % 29 % 20, für den 8 verschwendete Zeichen in der Zuordnung erforderlich waren.

Justin Mariner
quelle
4

Haskell, 42 37 Bytes

x#y="_1425__#9__*70836"!!mod(2*x+y)18

Nur ein bisschen Mathe, um einen String zu indizieren. Die Eingabereihenfolge ist <column> # <row>z 1336 # 697.

Probieren Sie es online aus!

Bearbeiten: @flawr hat eine Formel gefunden, die für kürzere Zeichenfolgen funktioniert. Insgesamt -5 Bytes. Vielen Dank!

Nimi
quelle
1
Ich habe gerade ein kleines Programm geschrieben, um Ihren Ansatz zu optimieren, und es scheint, dass Sie ein paar Bytes sparen können:x#y="_1425__#9__*70836"!!mod(2*x+y)18
Fehler
3

MATL , 23 Bytes

13*+79\'186#294*3750'w)

Eingaben sind: Spaltenfrequenz, dann Zeilenfrequenz.

Probieren Sie es online aus!

Erläuterung

Das Multiplizieren der Spaltenfrequenz mit 13, das Addieren der Zeilenfrequenz und das Berechnen von Modulo 79 ergibt einen anderen Wert für jedes der 12 Eingangspaare.

13*               % First input (implicit) times 13
+                 % Add to second input (implicit)
79\               % Modulo 79
'186#294*3750'    % Push this string
w                 % Swap
)                 % Index
Luis Mendo
quelle
1

Befunge , 34 Bytes

&"~"/9-4*&"d"/6-+1g,@
147*2580369#

Probieren Sie es online aus!

Erläuterung:

&"~"/9-4*                (Get number / 126 - 9) * 4 = 0, 4, or 8
         &"d"/6-         Get number / 100 - 6 = 0, 1, 2, or 3
                +        Add the above results - this becomes the x-coordinate in the "lookup table"
                 1g,@    Get a value on row 1 column x, output it, and end

quelle