Décodage DTMF simple: trouvez la clé du téléphone!


11

Il s'agit d'un défi simple qui, espérons-le, peut conduire à des réponses créatives.

Citant Wikipedia : "La signalisation multifréquence à deux tons (DTMF) est un système de signalisation de télécommunications intrabande utilisant la bande de fréquences vocales sur les lignes téléphoniques entre l'équipement téléphonique et d'autres appareils de communication et centres de commutation."

Tâche

Étant donné deux nombres entiers représentant les fréquences de colonne et de ligne dans le tableau suivant, votre tâche consiste à générer la clé correspondante:

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

Exemples

  • Si l'entrée est [ 1209, 852 ], la sortie attendue est "7".
  • Si l'entrée est [ 1477, 941 ], la sortie attendue est "#".

Règles

  • Vous devez prendre les entrées sous forme d' entiers dans n'importe quel format raisonnable, comme deux variables distinctes ou un tableau de deux variables. Veuillez spécifier dans quel ordre votre programme les attend (soit column_freq, row_freq ou row_freq, column_freq ).
  • L'entrée est garantie pour être valide.
  • Vous devez imprimer ou imprimer un caractère . Cependant, vous êtes également autorisé à générer un entier pour les clés numériques.
  • C'est le , donc la réponse la plus courte en octets gagne!

Réponses:


2

Gelée , 19 octets

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

Essayez-le en ligne!

Prend l'entrée comme row, columndans deux arguments.

Cela permet 3*<first digit of row> + <column> + 6 % 14de donner une valeur différente pour chacun. Ceci est indexé dans [1,2,3,4,5,6,7,8,9,"*","0","#"," "," "]pour donner la sortie. Les espaces pourraient vraiment être n'importe quel caractère; ils sont juste un tampon pour créer un mod 14 implicite.

Niveau faible

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#  "

8

JavaScript (ES6), 39 35 octets

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

Cartes les deux entrées en nombre dans la plage [0, 13)en calculant:
col % row % 83 % 16 % 13.
Prend des entrées dans currying syntax ( f(col)(row)) et retourne une chaîne de caractère unique.

Cas de test

Histoire

Commencé par la plage de [0, 20)calcul col % row % 29 % 20, qui nécessitait 8 caractères perdus dans le mappage.


4

Haskell, 42 37 octets

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

Juste quelques calculs pour indexer une chaîne. L'ordre d'entrée est <column> # <row>, par exemple 1336 # 697.

Essayez-le en ligne!

Edit: @flawr a trouvé une formule qui fonctionne sur une chaîne plus courte. Globalement -5 octets. Merci!


1
Je viens d'écrire un petit programme pour optimiser votre approche, et il semble que vous puissiez économiser quelques octets:x#y="_1425__#9__*70836"!!mod(2*x+y)18
flawr

3

MATL , 23 octets

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

Les entrées sont: fréquence de colonne, puis fréquence de ligne.

Essayez-le en ligne!

Explication

La multiplication de la fréquence de la colonne par 13, l'ajout de la fréquence de la ligne et le calcul du modulo 79 donne une valeur différente pour chacune des 12 paires d'entrées.

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



1

Befunge , 34 octets

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

Essayez-le en ligne!

Explication:

&"~"/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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.