Usted sabe cómo recibe un mensaje de correo de voz y la conexión de la persona no fue excelente, y está tratando de encontrar la manera de devolverle la llamada, pero no está seguro de si fue un "5" o un "8". ¿dijo?
Ese es este desafío.
La buena noticia es que la persona que llama leyó su número dos veces, pero está confuso en ambos lugares.
Su programa debería recibir información como esta:
5551231234 / 5551231234
Donde los primeros diez dígitos son la primera vez que se dice el número de teléfono en el correo de voz y el segundo conjunto es la segunda vez que se dice. Solo que ... se verá más así:
555?ABC1_36? / 55?522_1?234
- Un dígito seguido de un signo de interrogación significa que esa es la mejor suposición para ese dígito (por ejemplo, "5?" Significa "probablemente un 5, comparar con repetir").
- Un guión bajo indica un dígito faltante conocido, algo demasiado borroso por la estática para ser descifrado.
- Las letras son solo eso: letras. Trátelos como sus respectivos dígitos
- ABC -> 2, DEF -> 3, GHI -> 4, JKL -> 5, MNO -> 6, PQRS -> 7, TUV -> 8, WXYZ -> 9
- Todas las entradas de muestra usan mayúsculas (puede omitir de manera segura una llamada ToUpper ())
- Si su idioma funciona mejor en minúsculas, puede usar libremente minúsculas para la entrada y omitir una llamada a ToLower (). Solo tenga en cuenta eso en su respuesta.
También puede asumir las siguientes llamadas de juicio:
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
Además, puede suponer que todas las entradas contendrán números de teléfono de diez dígitos, sin incluir los signos de interrogación. Las entradas que no tienen diez dígitos (p 1234567 / 1234567
. Ej. ) Pueden tratarse como insolubles (salida falsey) o generar un error.
Entrada
Una línea de caracteres 0-9A-Z _?/
, como se describió anteriormente.
Salida
Si se puede analizar a un único número de teléfono válido de diez dígitos, envíe el número de teléfono. De lo contrario, muestra alguna forma de indicación de error (por ejemplo, -1, falso o una línea vacía).
Las victorias más cortas, como de costumbre.
Entradas de muestra:
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
Solo me aseguré de que todos los casos límite posibles están cubiertos (las primeras 11 entradas), pero aparte de eso, es bastante aleatorio.
Actualizar
Cuatro entradas en la parte inferior agregadas con ceros a la izquierda (a sugerencia de Jonathan Allan).
Salida correcta para las entradas de muestra:
Basado en la salida de la entrada de Jonathan Allan (la salida formateada era ideal).
" / "
, o podemos simplemente tomarlas como dos entradas estándar?Respuestas:
Jalea , 84 bytes
+4 bytes: creo que probablemente debería comportarse igual en todos los casos, por lo que he convertido los enteros de búsqueda del teclado a caracteres de dígitos usando
+49Ọ
.Una función que toma la cadena en el formato especificado y devuelve el número de teléfono como una lista de caracteres o cero si no es válido. Como programa, esto se imprime como si fuera una cadena.
La forma en que funciona podrían repetir el número más veces
(por ejemplo
"123456789_ / 123456789_ / 1234567890"
)... o incluso solo decirlo una vez, y se aplicará la lógica definida.
Pruébalo en línea! , o ver todas las entradas de muestra .
¿Cómo?
fuente
55_____088 / 54?2397207?7?
debe resolverse a5523972088
: todos los dígitos faltantes están presentes y los dígitos inciertos a la derecha están disponibles a la izquierda. Sin embargo, todos los casos simplistas se ejecutan.Python 2 ,
314307274 bytesPruébalo en línea!
fuente
Python 3,
549530509453449410406394393391 bytesEstoy seguro de que esto se puede mejorar, pero es un comienzo:
Estoy usando
str.translate
las letras y una función de contenedorg
para hacer las entradas en el formato en el que las quiero. La función realf
es recursiva y fallará para entradas ambiguas. Sin embargo, todavía tengo muchas repeticiones allí, así que estoy seguro de que hay mucho margen de mejora.Mejoras:
str.isnumeric
en un argumento de palabra claveT==q!=O
)not(e or z)
ene+z in(e,z)
.(E,Z)
fuente
map(chr,range(65,91))
embargo, el alfabeto se puede cambiar a .JavaScript (ES6),
180190188 bytesEditar:
+10+9 bytes para cumplir con la regla de salida falsaToma las dos cadenas de entrada en sintaxis de curry
(a)(b)
. Devuelvefalse
o una cadena que representa el número de teléfono adivinado.Cómo funciona
Paso # 1 - Analizando las cadenas de entrada
Primero definimos la
F()
función que traduce una cadena en una matriz de enteros aplicando las siguientes reglas:Que puede interpretarse al revés de la siguiente manera:
Aplicamos
F()
a ambosa
yb
. Esto nos da un par de enteros (x, y) para cada dígito en el número de teléfono, correspondientes a las dos posibles interpretaciones.Paso # 2 - Adivinando los dígitos
Para cada par (x, y) , calculamos:
Si x == 0 , significa que ambas entradas son caracteres de subrayado. Entonces, el dígito es desconocido en este caso.
Si x! = 0 , podemos deducir con seguridad el dígito si se cumple una de las siguientes condiciones:
Las dos últimas condiciones se pueden combinar
!(d % x)
. De ahí la fórmula final:Si es verdadero, convertimos x nuevamente al dígito adivinado calculando (x - 1) Y 15 .
Casos de prueba
(Solo los 50 primeros porque el fragmento de consola no puede admitir más historial de salida).
Mostrar fragmento de código
fuente
1234567890? / 1234567890?
debe resolver a1234567890
. En este momento, su código sale, lo123456789?
que es aún menos informativo que la entrada.Assume: 5? / 5? -> 5 //uncertain, but matching
Perl 5 , 211 bytes
... sin sangría y \ n líneas nuevas
Pruébalo en línea!
fuente
83652618?0
) en lugar de algún tipo de valor falso o de error.?
para indicar que no hay forma de resolver la información faltante, que luego debe pasar a la sección Salida:...Otherwise output some form of error indication (e.g. -1, false, or an empty line).
Retina,
150140136 bytesGuardado algunos bytes gracias a Kritixi Lithos
Pruébalo en línea!
Explicación:
La primera línea transforma todo
?
en la entrada#
y todas las letras en sus equivalentes numéricos. Luego eliminamos los espacios y/
de la entrada. Las siguientes dos líneas se ocupan de los casos de "conjetura versus certeza" (por ejemplo5? \ 4
, serían reemplazados por4 \ 4
). Después de eliminar todos los#
s, las líneas 8 y 9 tratan con los_
casos "número vs. " (se_ \ 3
convierte3 \ 3
). Luego, si ambas mitades de la cadena coinciden, conservamos los primeros 10 dígitos. De lo contrario, el número de teléfono no es válido, por lo que eliminamos todo.Solución alternativa de 160 bytes que funciona para números de teléfono de longitud arbitraria (e igual tamaño): TIO
fuente
(/|_)
a[/_]
para guardar 1 byte. También creo que se puede utilizar;
en lugar dex
por lo que[^x]
puede llegar a ser\w
PHP,
251236 bytestoma entrada de la línea de comando; ejecutar
-nr
o probarlo en línea .Descompostura
campos de golf
preg_replace
primero: -8 bytesjoin
: -2$$k
en lugar de$t[$k]
: -5fuente
PHP, 200 + 8 bytes
inspirado en la solución Arnaulds .
toma datos de los argumentos de la línea de comandos; ejecutar
-nr
o probarlo en línea .modificaciones para cumplir con la restricción de salida de error: (imprimir
X
para un número incompleto):|48
(-3 bytes)echo chr(...);
con$r.=...;echo$r>1e10?X:$r;
(+11 bytes)Descompostura
campos de golf
preg_replace_callback
(-10 bytes)join
delimitador (-7)$x
Asignación movida al final (-2)fuente
Perl 5
-pl
, 173 bytesPruébalo en línea!
fuente