Você sabe como recebe uma mensagem de correio de voz e a conexão da pessoa não é ótima, e está tentando descobrir como chamá-la de volta, mas não sabe ao certo se era um "5" ou um "8". disse?
Esse é esse desafio.
A boa notícia é que o interlocutor leu o número duas vezes, mas está truncado nos dois lugares.
Seu programa deve receber informações como estas:
5551231234 / 5551231234
Onde os dez primeiros dígitos são a primeira vez que o número de telefone é dito no correio de voz e o segundo conjunto é a segunda vez que é dito. Apenas ... ficará mais ou menos assim:
555?ABC1_36? / 55?522_1?234
- Um dígito seguido de um ponto de interrogação significa que essa é a melhor estimativa para esse dígito (por exemplo, "5?" Significa "provavelmente um 5, compare com repetir").
- Um sublinhado indica um dígito ausente conhecido, algo muito distorcido pela estática para ser decifrado.
- Cartas são exatamente isso: cartas. Trate-os como seus respectivos dígitos
- ABC -> 2, DEF -> 3, GHI -> 4, JKL -> 5, MNO -> 6, PQRS -> 7, TUV -> 8, WXYZ -> 9
- Todas as entradas de amostra usam maiúsculas (você pode omitir com segurança uma chamada de ToUpper ())
- Se seu idioma funcionar melhor em letras minúsculas, você poderá usar livremente letras minúsculas para a entrada e omitir uma chamada ToLower (). Apenas observe isso em sua resposta.
Além disso, você pode assumir as seguintes chamadas de julgamento:
5? / _ -> 5 //5 is the best guess we have, use it
5? / 5? -> 5 //uncertain, but matching
5? / 4? -> ? //conflict
5 / 4 -> ? //conflict
5? / 4 -> 4 //solid information overrides possible value
5 / 4? -> 5 //solid information overrides possible value
_ / _ -> ? //no information available
Além disso, você pode assumir que todas as entradas conterão números de telefone de dez dígitos, sem incluir os pontos de interrogação. As entradas que não têm dez dígitos (por exemplo 1234567 / 1234567
) podem ser tratadas como insolúveis (saída falsey) ou gerar um erro.
Entrada
Uma linha de caracteres 0-9A-Z _?/
, conforme descrito acima.
Resultado
Se puder ser analisado para um único número de telefone válido de dez dígitos, produza o número de telefone. Caso contrário, imprima alguma forma de indicação de erro (por exemplo, -1, falso ou uma linha vazia).
Vitórias mais curtas, como de costume.
Entradas de amostra:
1234567890 / 1234567890
1234567890? / 1234567890
123456789_ / 1234567890
1234567890? / 123456789_
1234567890 / 1234567890?
1234567890 / 123456789_
123456789_ / 1234567890?
1234567890? / 1234567890?
1234567890? / 1234567891?
123456789_ / 123456789_
555CALLUS1 / 5552255871
404_12?6039 / 4041?1560_9
_GETREVENGE / 16?36?_2838_
1?691460_50 / 16_14609?50
61?08977211 / 612?897725?1
40?0INSTA__ / 8?00_NSTI?LL
3985_534?10 / 39?8?5053_10
7__7294?737 / 7797299?_37
28?897_384?1 / _8?89763861
271168090_ / 27116800?09
6802?148343 / 67?01148343
94_11628?2?6? / 9491162_47?
17?4285_689 / 1__26?52689
6_311?95_38 / 6731194?7?38
380?7DRAGON / 3807378?5?66
4?647_93236 / 5646?6?9__36
365?268898_ / 366267?7?984
GRATEDBATE / IRATEDBATE
5307_079?93 / ____8_____
535_3_0255 / 52?5_3_024?5
55_____088 / 54?2397207?7?
6_48398_95 / _946?398?6_5?
_0_312_3_1 / 81?53123?1?71
____1_____ / 64?255?508?61
8427820607 / 6?424?8?__6?07
50_3707__6 / 52?8375?74?56
615___8255 / 62?526?983?2?1?
__652618__ / 8365261__0
149___933_ / 1_9677?92?31
___7?281562 / 3438?28154?2
5?7?7?___8?3?7?4 / 57_855837_
605_272481 / 605427__81
86?569__731 / 88560?0?7721
1__91654?15 / 17?9?9165715
800NWABODE / 80069ABI?DE
8___9017_0 / 8_2494?12?9_
_024?5?91?470 / 304?17908?7_
42510704_2 / 4_51070492
9338737_89 / 93_873PLUS
327762_401 / 327_MASH01
33093_2058 / 3309_12058
4061_33578 / 40619_3578
559_383197 / 559938_197
94_9746084 / 9459746_84
1_37655238 / 163POLKA_T
_672FRIZZY / 767237499_
8_76318872 / TIP63188_2
51_8404321 / 5178404_21
358_030314 / 358603_314
2597_85802 / 25979_5802
77141_1408 / 7714_91408
330858_457 / 330_586457
4686079_39 / 46_6079239
86457508_6 / 8_45750826
523226626_ / _23BANNANA
_ISSY_ISSY / 44__9548?79?
6?00B_YJILT / 800289KILL?
2?52803___0 / 1526?0390?61?
FI?ND___T?HE / EAS?T?EREGGS?
0_231?95_38 / 0723194?7?38
0?647_39236 / 0646?6?3__36
025?267798_ / 06?6265?9?984
0061_33578 / _0619_3578
Eu só garanti que todos os casos extremos possíveis sejam cobertos (as 11 primeiras entradas), mas fora isso, é praticamente aleatório.
Atualizar
Quatro entradas na parte inferior foram adicionadas com zeros à esquerda (por sugestão de Jonathan Allan).
Saída correta para as entradas de amostra:
Com base na saída da entrada de Jonathan Allan (a saída formatada era ideal).
" / "
, ou podemos apenas tomá-las como duas entradas padrão?Respostas:
Geléia , 84 bytes
+4 bytes - acho que provavelmente deve se comportar da mesma forma em todos os casos, então converti os números inteiros de pesquisa do teclado de volta para dígitos digitados usando
+49Ọ
.Uma função que pega a sequência no formato especificado e retorna o número de telefone como uma lista de caracteres ou zero, se inválido. Como um programa, isso é impresso como se fosse uma string.
Da maneira que funciona, eles podem repetir o número mais vezes
(por exemplo
"123456789_ / 123456789_ / 1234567890"
)... ou até mesmo dizê-lo apenas uma vez, e a lógica definida será aplicada.
Experimente online! ou veja todas as entradas de amostra .
Quão?
fonte
55_____088 / 54?2397207?7?
deve resolver5523972088
: todos os dígitos ausentes estão presentes e os dígitos incertos à direita estão disponíveis à esquerda. Todos os casos simplistas são executados.Python 2 ,
314307274 bytesExperimente online!
fonte
Python 3,
549530509453449410406394393391 bytesTenho certeza que isso pode ser melhorado, mas é um começo:
Estou usando
str.translate
as letras e uma função de invólucrog
para fazer as entradas no formato em que as quero. A função realf
é recursiva e falhará para entradas ambíguas. Ainda tenho muitas repetições por lá, então tenho certeza de que há muito espaço para melhorias.Melhorias:
str.isnumeric
em um argumento de palavra-chaveT==q!=O
)not(e or z)
eme+z in(e,z)
.(E,Z)
fonte
map(chr,range(65,91))
embora.JavaScript (ES6),
180190188 bytesEditar:
+10+9 bytes para obedecer à regra de saída falsaPega as duas seqüências de entrada na sintaxe de currying
(a)(b)
. Retorna umafalse
ou uma sequência que representa o número de telefone adivinhado.Como funciona
Etapa 1 - Analisando as seqüências de entrada
Primeiro, definimos o
F()
função que traduz uma string em uma matriz de números inteiros aplicando as seguintes regras:O que pode ser interpretado ao contrário da seguinte maneira:
Nós aplicamos
F()
a ambosa
eb
. Isso nos fornece um par de números inteiros (x, y) para cada dígito no número de telefone, correspondendo às duas interpretações possíveis.Etapa 2 - Adivinhando os dígitos
Para cada par (x, y) , calculamos:
Se x == 0 , significa que ambas as entradas são caracteres sublinhados. Portanto, o dígito é desconhecido neste caso.
Se x! = 0 , podemos deduzir com segurança o dígito se uma das seguintes condições for verdadeira:
As duas últimas condições podem ser mescladas
!(d % x)
. Daí a fórmula final:Se verdadeiro, convertemos x de volta ao dígito calculado calculando (x - 1) E 15 .
Casos de teste
(Somente os 50 primeiros, porque o snippet do console não suporta mais histórico de saída.)
Mostrar snippet de código
fonte
1234567890? / 1234567890?
deve resolver a1234567890
. No momento, o seu código gera123456789?
menos informações do que a entrada.Assume: 5? / 5? -> 5 //uncertain, but matching
Perl 5 , 211 bytes
... sem recuo e \ n novas linhas
Experimente online!
fonte
83652618?0
), em vez de algum tipo de valor falsa ou de erro.?
para indicar que não há nenhuma maneira de resolver a informação em falta, que deve, então, cair para a seção de saída:...Otherwise output some form of error indication (e.g. -1, false, or an empty line).
Retina,
150140136 bytesEconomizou alguns bytes graças a Kritixi Lithos
Experimente Online!
Explicação:
A primeira linha transforma tudo
?
na entrada em#
e todas as letras em seus equivalentes numéricos. Em seguida, removemos os espaços e/
da entrada. As próximas duas linhas tratam dos casos de "palpite versus certeza" (por exemplo,5? \ 4
seriam substituídos por4 \ 4
). Depois de remover todos os#
s, as linhas 8 e 9 tratam dos_
casos "número vs. " (_ \ 3
torna-se3 \ 3
). Então, se as duas metades da string corresponderem, mantemos os 10 primeiros dígitos. Caso contrário, o número de telefone é inválido, portanto, removemos tudo.Solução alternativa de 160 bytes que funciona para números de telefone de tamanho arbitrário (e tamanho igual): TIO
fonte
(/|_)
para[/_]
para salvar 1 byte. Também acho que você pode usar;
em vez dex
modo que[^x]
pode se tornar\w
PHP,
251236 bytesrecebe entrada da linha de comando; correr com
-nr
ou experimente online .demolir
golfe
preg_replace
primeiro: -8 bytesjoin
: -2$$k
em vez de$t[$k]
: -5fonte
PHP, 200 + 8 bytes
inspirado na solução Arnaulds .
recebe entrada de argumentos de linha de comando; correr com
-nr
ou experimentar online .modificações para cumprir a restrição de saída de erro: (impressão
X
para um número incompleto):|48
(-3 bytes)echo chr(...);
por$r.=...;echo$r>1e10?X:$r;
(+11 bytes)demolir
golfe
preg_replace_callback
(-10 bytes)join
delimitador (-7)$x
tarefa movida para o final (-2)fonte
Perl 5
-pl
, 173 bytesExperimente online!
fonte