Decodificação DTMF simples: encontre a chave do telefone!

11

Este é um desafio simples que, esperançosamente, pode levar a algumas respostas criativas.

Citando a Wikipedia : "A sinalização multifreqüencial de tom duplo (DTMF) é um sistema de sinalização de telecomunicações em banda que usa a banda de frequência de voz em linhas telefônicas entre equipamentos telefônicos e outros dispositivos de comunicação e centros de comutação".

Tarefa

Dados dois números inteiros que representam as frequências de coluna e linha na tabela a seguir, sua tarefa é gerar a chave correspondente:

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

Exemplos

  • Se a entrada for [ 1209, 852 ], a saída esperada é "7".
  • Se a entrada for [ 1477, 941 ], a saída esperada é "#".

Regras

  • Você deve receber a entrada como números inteiros em qualquer formato razoável, como duas variáveis ​​separadas ou uma matriz de duas variáveis. Especifique em qual ordem seu programa está esperando ( coluna_freq, row_freq ou row_freq, column_freq ).
  • A entrada é garantida como válida.
  • Você deve imprimir ou imprimir um caractere . No entanto, você também pode gerar um número inteiro para as teclas de dígitos.
  • Isso é , então a resposta mais curta em bytes vence!
Arnauld
fonte

Respostas:

2

Geléia , 19 bytes

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

Experimente online!

Recebe entrada como row, columnem dois argumentos.

Isso usa 3*<first digit of row> + <column> + 6 % 14para fornecer um valor diferente para cada um. Isso é indexado [1,2,3,4,5,6,7,8,9,"*","0","#"," "," "]para fornecer a saída. Os espaços podem realmente ter qualquer personagem; eles são apenas buffer para criar um mod implícito 14.

Nível baixo

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

JavaScript (ES6), 39 35 bytes

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

Mapeia as duas entradas em números no intervalo [0, 13)pelo cálculo:
col % row % 83 % 16 % 13.
Recebe entrada na sintaxe de curry ( f(col)(row)) e retorna uma string de caractere único.

Casos de teste

História

Começou com o intervalo de [0, 20)com cálculo col % row % 29 % 20, que exigia 8 caracteres desperdiçados no mapeamento.

Justin Mariner
fonte
4

Haskell, 42 37 bytes

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

Apenas um pouco de matemática para indexar uma string. A ordem de entrada é <column> # <row>, por exemplo 1336 # 697.

Experimente online!

Edit: @flawr encontrou uma fórmula que funciona em uma string mais curta. Geral -5 bytes. Obrigado!

nimi
fonte
1
Acabei de escrever um pequeno programa para otimizar sua abordagem, e parece que você pode salvar alguns bytes:x#y="_1425__#9__*70836"!!mod(2*x+y)18
flawr 19/08/17
3

MATL , 23 bytes

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

As entradas são: frequência da coluna e frequência da linha.

Experimente online!

Explicação

Multiplicar a frequência da coluna por 13, adicionar a frequência da linha e calcular o módulo 79 fornece um valor diferente para cada um dos 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
fonte
1

Befunge , 34 bytes

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

Experimente online!

Explicação:

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

fonte