Decodifica DTMF semplice: trova la chiave del telefono!


11

Questa è una semplice sfida che si spera possa portare ad alcune risposte creative.

Citando Wikipedia : "La segnalazione multi-frequenza a doppio tono (DTMF) è un sistema di segnalazione in-band di telecomunicazione che utilizza la banda di frequenza vocale su linee telefoniche tra apparecchiature telefoniche e altri dispositivi di comunicazione e centri di commutazione".

Compito

Dati due numeri interi che rappresentano le frequenze di colonna e di riga nella tabella seguente, il tuo compito è quello di produrre la chiave corrispondente:

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

Esempi

  • Se l'ingresso è [ 1209, 852 ], l'uscita prevista è "7".
  • Se l'input è [ 1477, 941 ], l'output previsto è "#".

Regole

  • È necessario accettare input come numeri interi in qualsiasi formato ragionevole, ad esempio due variabili separate o una matrice di due variabili. Specificare in quale ordine sono previsti dal programma ( column_freq, row_freq o row_freq, column_freq ).
  • L'input è garantito per essere valido.
  • È necessario stampare o stampare un carattere . Tuttavia, puoi anche generare un numero intero per i tasti numerici.
  • Questo è , quindi vince la risposta più breve in byte!

Risposte:


2

Gelatina , 19 byte

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

Provalo online!

Accetta input come row, columnin due argomenti.

Questo utilizza 3*<first digit of row> + <column> + 6 % 14per dare un valore diverso per ciascuno. Questo è indicizzato in [1,2,3,4,5,6,7,8,9,"*","0","#"," "," "]per dare l'output. Gli spazi potrebbero davvero essere di qualsiasi carattere; sono solo buffer per creare una mod implicita 14.

Basso livello

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 byte

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

Atlanti i due ingressi in numeri nell'intervallo [0, 13)calcolando:
col % row % 83 % 16 % 13.
Accetta l'input nella sintassi del curry ( f(col)(row)) e restituisce una stringa a carattere singolo.

Casi test

Storia

Iniziato con l'intervallo di [0, 20)con il calcolo col % row % 29 % 20, che ha richiesto 8 caratteri sprecati nella mappatura.


4

Haskell, 42 37 byte

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

Solo un po 'di matematica per indicizzare una stringa. L'ordine di input è <column> # <row>, ad es 1336 # 697.

Provalo online!

Modifica: @flawr ha trovato una formula che funziona su una stringa più corta. Complessivamente -5 byte. Grazie!


1
Ho appena scritto un piccolo programma per ottimizzare il tuo approccio e sembra che tu possa risparmiare qualche byte:x#y="_1425__#9__*70836"!!mod(2*x+y)18
flawr

3

MATL , 23 byte

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

Gli input sono: frequenza di colonna, quindi frequenza di riga.

Provalo online!

Spiegazione

Moltiplicando la frequenza della colonna per 13, aggiungendo la frequenza di riga e calcolando il modulo 79 si ottiene un valore diverso per ciascuna delle 12 coppie di ingressi.

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 byte

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

Provalo online!

Spiegazione:

&"~"/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.