Decodificación DTMF simple: ¡encuentra la clave del teléfono!

11

Este es un desafío simple que, con suerte, puede conducir a algunas respuestas creativas.

Citando Wikipedia : "La señalización de frecuencia múltiple de tono dual (DTMF) es un sistema de señalización de telecomunicaciones en banda que utiliza la banda de frecuencia de voz a través de líneas telefónicas entre equipos telefónicos y otros dispositivos de comunicación y centros de conmutación".

Tarea

Dados dos enteros que representan las frecuencias de columna y fila en la siguiente tabla, su tarea es generar la clave correspondiente:

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

Ejemplos

  • Si la entrada es [ 1209, 852 ], la salida esperada es "7".
  • Si la entrada es [ 1477, 941 ], la salida esperada es "#".

Reglas

  • Debe tomar la entrada como números enteros en cualquier formato razonable, como dos variables separadas o una matriz de dos variables. Especifique en qué orden los espera su programa ( column_freq, row_freq o row_freq, column_freq ).
  • La entrada está garantizada para ser válida.
  • Debe imprimir o generar un carácter . Sin embargo, también se le permite generar un número entero para claves de dígitos.
  • Este es el , por lo que gana la respuesta más corta en bytes.
Arnauld
fuente

Respuestas:

2

Jalea , 19 bytes

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

Pruébalo en línea!

Toma entrada como row, columnen dos argumentos.

Esto sirve 3*<first digit of row> + <column> + 6 % 14para dar un valor diferente para cada uno. Esto se indexa [1,2,3,4,5,6,7,8,9,"*","0","#"," "," "]para dar la salida. Los espacios realmente podrían ser cualquier personaje; son solo buffer para crear un mod 14 implícito.

Nivel bajo

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
fuente
8

JavaScript (ES6), 39 35 bytes

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

Mapas de las dos entradas en números en el rango [0, 13)mediante el cálculo:
col % row % 83 % 16 % 13.
Toma la entrada en la sintaxis de curry ( f(col)(row)) y devuelve una cadena de un solo carácter.

Casos de prueba

Historia

Comenzó con el rango de [0, 20)cálculo col % row % 29 % 20, que requería 8 caracteres desperdiciados en el mapeo.

Justin Mariner
fuente
4

Haskell, 42 37 bytes

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

Solo algunas matemáticas para indexar una cadena. El orden de entrada es <column> # <row>, por ejemplo 1336 # 697.

Pruébalo en línea!

Editar: @flawr encontró una fórmula que funciona en cadenas más cortas. En general -5 bytes. ¡Gracias!

nimi
fuente
1
Acabo de escribir un pequeño programa para optimizar su enfoque, y parece que puede ahorrar unos pocos bytes:x#y="_1425__#9__*70836"!!mod(2*x+y)18
flawr
3

MATL , 23 bytes

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

Las entradas son: frecuencia de columna, luego frecuencia de fila.

Pruébalo en línea!

Explicación

Multiplicando la frecuencia de la columna por 13, sumando la frecuencia de la fila y calculando el módulo 79, se obtiene un valor diferente para cada uno de los 12 pares de entradas.

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
fuente
1

Befunge , 34 bytes

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

Pruébalo en línea!

Explicación:

&"~"/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

fuente