Vous savez comment vous obtenez un message vocal et la connexion de la personne n'était pas excellente, et vous essayez de comprendre comment la rappeler, mais vous ne savez pas si c'était un "5" ou un "8". m'a dit?
Voilà ce défi.
La bonne nouvelle est que l'appelant a lu son numéro deux fois, mais qu'il est tronqué aux deux endroits.
Votre programme devrait recevoir des commentaires comme celui-ci:
5551231234 / 5551231234
Lorsque les dix premiers chiffres sont la première fois que le numéro de téléphone est dit dans la messagerie vocale et le deuxième ensemble est la deuxième fois qu'il est dit. Seulement ... ça ressemblera plus à ceci:
555?ABC1_36? / 55?522_1?234
- Un chiffre suivi d'un point d'interrogation signifie que c'est la meilleure estimation pour ce chiffre (par exemple "5?" Signifie "probablement un 5, comparer avec répéter").
- Un trait de soulignement indique un chiffre manquant connu, quelque chose de trop flou par statique pour être déchiffré du tout.
- Les lettres ne sont que cela: des lettres. Traitez-les comme leurs chiffres respectifs
- ABC -> 2, DEF -> 3, GHI -> 4, JKL -> 5, MNO -> 6, PQRS -> 7, TUV -> 8, WXYZ -> 9
- Tous les exemples d'entrées utilisent des majuscules (vous pouvez omettre en toute sécurité un appel ToUpper ())
- Si votre langue fonctionne mieux en minuscules, vous pouvez librement utiliser des minuscules pour l'entrée et omettre un appel ToLower (). Notez cela dans votre réponse.
Vous pouvez en outre assumer les appels de jugement suivants:
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
De plus, vous pouvez supposer que toutes les entrées contiendront des numéros de téléphone à dix chiffres, sans les points d'interrogation. Les entrées qui ne sont pas à dix chiffres (par exemple 1234567 / 1234567
) peuvent être traitées comme insolubles (sortie falsey) ou renvoyer une erreur.
Contribution
Une ligne de caractères 0-9A-Z _?/
, comme décrit ci-dessus.
Production
S'il peut être analysé en un seul numéro de téléphone à dix chiffres valide, entrez le numéro de téléphone. Sinon, affichez une forme quelconque d'indication d'erreur (par exemple -1, false ou une ligne vide).
Victoires les plus courtes, comme d'habitude.
Exemples d'entrées:
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
J'ai seulement assuré que tous les cas de bord possibles sont couverts (les 11 premières entrées), mais à part cela, c'est à peu près aléatoire.
Mise à jour
Quatre entrées en bas ajoutées avec des zéros de tête (à la suggestion de Jonathan Allan).
Sortie correcte pour les entrées d'échantillon:
Basé sur la sortie de l'entrée de Jonathan Allan (la sortie formatée était idéale).
" / "
, ou pouvons-nous simplement les prendre comme deux entrées standard?Réponses:
Gelée , 84 octets
+4 octets - Je pense que cela devrait probablement se comporter de la même manière dans tous les cas, j'ai donc reconverti les entiers de recherche du clavier en caractères numériques en utilisant
+49Ọ
.Une fonction qui prend la chaîne au format spécifié et renvoie le numéro de téléphone sous forme de liste de caractères ou zéro si non valide. En tant que programme, cela est imprimé comme s'il s'agissait d'une chaîne.
La façon dont cela fonctionne, ils pourraient répéter le nombre de fois
(par exemple
"123456789_ / 123456789_ / 1234567890"
)... ou même le dire une seule fois, et la logique définie s'appliquera.
Essayez-le en ligne! ou consultez tous les exemples d'entrées .
Comment?
la source
55_____088 / 54?2397207?7?
devrait se résoudre à5523972088
: tous les chiffres manquants sont présents et les chiffres incertains à droite sont disponibles à gauche. Tous les cas simplistes fonctionnent cependant.Python 2 ,
314307274 octetsEssayez-le en ligne!
la source
Python 3,
549530509453449410406394393391 octetsJe suis sûr que cela peut être amélioré, mais c'est un début:
J'utilise
str.translate
pour les lettres et une fonction wrapperg
pour faire les entrées dans le format dans lequel je les veux. La fonction réellef
est récursive et échouera pour les entrées ambiguës. Cependant, j'ai encore beaucoup de répétitions, donc je suis sûr qu'il y a beaucoup de place pour l'amélioration.Améliorations:
str.isnumeric
dans un argument de mot cléT==q!=O
)not(e or z)
danse+z in(e,z)
.(E,Z)
la source
map(chr,range(65,91))
cependant.JavaScript (ES6),
180190188 octetsModifier:
+10+9 octets pour se conformer à la règle de sortie falsifiéePrend les deux chaînes d'entrée dans la syntaxe de curry
(a)(b)
. Renvoie soitfalse
une chaîne représentant le numéro de téléphone supposé.Comment ça fonctionne
Étape # 1 - Analyser les chaînes d'entrée
Nous définissons d'abord la
F()
fonction qui traduit une chaîne en un tableau d'entiers en appliquant les règles suivantes:Ce qui peut être interprété dans l'autre sens comme suit:
Nous appliquons
F()
à la foisa
etb
. Cela nous donne une paire d'entiers (x, y) pour chaque chiffre du numéro de téléphone, correspondant aux deux interprétations possibles.Étape # 2 - Deviner les chiffres
Pour chaque paire (x, y) , nous calculons:
Si x == 0 , cela signifie que les deux entrées sont des caractères de soulignement. Donc, le chiffre est inconnu dans ce cas.
Si x! = 0 , nous pouvons déduire le chiffre en toute sécurité si l'une des conditions suivantes est remplie:
Les deux dernières conditions peuvent être fusionnées avec
!(d % x)
. D'où la formule finale:Si vrai, nous convertissons x en chiffre deviné en calculant (x - 1) ET 15 .
Cas de test
(Seuls les 50 premiers parce que l'extrait de console ne peut pas prendre en charge plus d'historique de sortie.)
Afficher l'extrait de code
la source
1234567890? / 1234567890?
devrait se résoudre à1234567890
. À l'heure actuelle, votre code sort,123456789?
ce qui est encore moins informatif que l'entrée.Assume: 5? / 5? -> 5 //uncertain, but matching
Perl 5 , 211 octets
... sans retrait et \ n nouvelles lignes
Essayez-le en ligne!
la source
83652618?0
) plutôt qu'une sorte de valeur de falsey ou d'erreur.?
pour indiquer qu'il n'y a aucun moyen de résoudre les informations manquantes, qui devraient ensuite passer à la section Sortie:...Otherwise output some form of error indication (e.g. -1, false, or an empty line).
Rétine,
150140136 octetsEnregistré quelques octets grâce à Kritixi Lithos
Essayez-le en ligne!
Explication:
La première ligne transforme tout
?
dans l'entrée en#
et toutes les lettres en leurs équivalents numériques. Nous supprimons ensuite les espaces et/
de l'entrée. Les deux lignes suivantes prennent en charge les cas de «supposition contre certitude» (par exemple,5? \ 4
seraient remplacés par4 \ 4
). Après avoir supprimé tous les#
s, les lignes 8 et 9 traitent des cas «nombre vs_
» (_ \ 3
devient3 \ 3
). Ensuite, si les deux moitiés de la chaîne correspondent, nous conservons les 10 premiers chiffres. Sinon, le numéro de téléphone n'est pas valide, nous supprimons tout.Solution alternative de 160 octets qui fonctionne pour les numéros de téléphone de longueur arbitraire (et de taille égale): TIO
la source
(/|_)
pour[/_]
sauver 1 octet. Je pense aussi que vous pouvez utiliser;
au lieu dex
sorte que[^x]
peut devenir\w
PHP,
251236 octetsprend l'entrée de la ligne de commande; courir avec
-nr
ou essayer en ligne .panne
golf
preg_replace
premier: -8 octetsjoin
: -2$$k
au lieu de$t[$k]
: -5la source
PHP, 200 + 8 octets
inspiré par la solution Arnaulds .
prend l'entrée des arguments de ligne de commande; courir avec
-nr
ou essayer en ligne .modifications pour se conformer à la restriction de sortie d'erreur: (imprimer
X
pour un numéro incomplet):|48
(-3 octets)echo chr(...);
par$r.=...;echo$r>1e10?X:$r;
(+11 octets)panne
golf
preg_replace_callback
(-10 octets)join
délimiteur (-7)$x
affectation déplacée à la fin (-2)la source
Perl 5
-pl
, 173 octetsEssayez-le en ligne!
la source