D'où appellent-ils?

19

Lorsque vous effectuez des appels internationaux, les numéros de téléphone sont précédés d'un code indiquant le pays dans lequel se trouve le numéro. Ces codes sont des codes préfixes , ce qui signifie qu'aucun code n'est le préfixe d'un autre.

Plus tôt dans la journée, vous avez manqué un appel et vous êtes curieux de savoir d'où cet appel pourrait provenir. Vous souhaitez donc rechercher le code d'appel. Mais, étant un code préfixe, vous ne savez pas trop où il se termine, vous décidez donc d'écrire un programme pour séparer le code appelant du reste du numéro.

Contribution

En entrée, vous recevrez une chaîne composée des chiffres 0-9. Les premiers chiffres seront l'un des indicatifs de pays indiqués ci-dessous (cela signifie que le premier chiffre ne le sera jamais 0). Après l'indicatif téléphonique du pays, le reste de l'entrée contiendra zéro ou plusieurs chiffres dans n'importe quel ordre - il n'est pas garanti qu'il s'agisse d'un numéro de téléphone valide. Votre programme doit être capable de gérer des entrées contenant au moins 15 chiffres

Production

Votre programme doit sortir le code d'appel de pays unique qui est un préfixe du numéro. Les sorties valides sont les suivantes:

1
20
211
212
213
216
218
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
260
261
262
263
264
265
266
267
268
269
27
290
291
297
298
299
30
31
32
33
34
350
351
352
353
354
355
356
357
358
359
36
370
371
372
373
374
375
376
377
378
379
380
381
382
383
385
386
387
389
39
40
41
420
421
423
43
44
45
46
47
48
49
500
501
502
503
504
505
506
507
508
509
51
52
53
54
55
56
57
58
590
591
592
593
594
595
596
597
598
5993
5994
5997
5999
60
61
62
63
64
65
66
670
672
673
674
675
676
677
678
679
680
681
682
683
685
686
687
688
689
690
691
692
7
800
808
81
82
84
850
852
853
855
856
86
870
875
876
877
878
879
880
881
882
883
886
888
90
91
92
93
94
95
960
961
962
963
964
965
966
967
968
970
971
972
973
974
975
976
977
979
98
991
992
993
994
995
996
998

Cette liste est basée sur les codes listés sur la page Liste des codes d'appel de Wikipédia de la révision 915410826, avec quelques modifications

  • Tous les codes répertoriés comme non attribués ou abandonnés et certains codes répertoriés comme réservés pour une utilisation future ont été omis
  • Si un code répertorié sur Wikipedia est le préfixe d'un autre, ce dernier a été omis
  • Si un seul pays ou territoire avait plusieurs codes et si ces codes avaient un préfixe commun, ces codes sont omis au profit de leur préfixe commun.

Cela peut entraîner le regroupement de pays indépendants ou le regroupement de territoires contestés avec un demandeur en particulier. Il ne s'agit pas d'une déclaration politique, et les décisions concernant l'inclusion ou l'omission de territoires et d'États ont été prises sur la base des codes, et non des convictions que j'ai en ce qui concerne la propriété ou la souveraineté des entités qui les utilisent.

Si une entrée ne commence par aucun de ces codes, le comportement de votre programme n'est pas défini.

Et enfin:

Cas de test

input -> output
5292649259 -> 52
3264296721 -> 32
1550 -> 1
33121394 -> 33
7 -> 7
2542112543 -> 254
2005992972 -> 20
350 -> 350
360 -> 36
8505234469 -> 850
9795586334 -> 979
148985513598795 -> 1
222222 -> 222
5999995 -> 5999
Sara J
la source
Vous devriez peut-être input | outputplutôt faire avec une ligne de tiret en dessous à moins que vous ne vouliez inputêtre traduit en output.
JL2210

Réponses:

10

JavaScript (ES6),  75 73  71 octets

1 octet enregistré grâce à @Shaggy
2 octets enregistrés grâce à @Neil

s=>/1|7|(2[^07]|3[578]|42|599?|50|6[789]|8[0578]|9[679]|.)./.exec(s)[0]

Essayez-le en ligne!

Arnauld
la source
Je pense que 599?|50peut remplacer 599|5[09].
Neil
@Neil En effet. Merci!
Arnauld
Fonctionne s=>/(2[^07]|3[578]|42|599?|50|6[789]|8[0578]|9[679]|[^17]|)./.exec(s)[0]pour 72 octets?
ovs
1
@ovs Oui, mais la version actuelle est en fait de 71 octets - le nombre d'octets était dépassé.
Arnauld
9

05AB1E , 28 25 24 octets

η•A󾫸tEΓ∞ζ∊u½d•.¥¤ØªKн

Essayez-le en ligne!

η                            # prefixes of the input
 •A󾫸tEΓ∞ζ∊u½d•            # compressed integer 211112166111113621489811655218129
                 .¥          # undelta: [0, 2, 3, 4, 5, 6, 8, 9, 15, 21, 22, 23, 24, 25, 26, 29, 35, 37, 38, 42, 50, 59, 67, 68, 69, 75, 80, 85, 87, 88, 96, 97, 99, 108]
                   ¤         # last element of that list: 108
                    Ø        # nth prime: 599
                     ª       # append it to the list
                      K      # remove all those values from the list of prefixes
                       н     # get the first prefix left
Grimmy
la source
6

Retina 0.8.2 , 60 octets

!`^(2[1-69]?|3[578]?|42?|599?|50?|6[789]?|8[578]?|9[679]?)?.

Essayez-le en ligne!

Neil
la source
Votre entrée dans le TIO inclut déjà la réponse;) Je sais que votre code ne les utilise pas, mais cela semble un peu déroutant.
Kevin Cruijssen
4

Python 3 , 120 78 octets

f=lambda n:{n//10+3}-{*b'	 &()-5>FGHSXZ[cdf',602}and f(n//10)or n

Essayez-le en ligne!

Contient certains non imprimables:

00000000: 663d 6c61 6d62 6461 206e 3a7b 6e2f 2f31  f=lambda n:{n//1
00000010: 302b 337d 2d7b 2a62 2705 0306 0708 090b  0+3}-{*b'.......
00000020: 0c18 191a 1b1c 1d20 2628 292d 353e 4647  ....... &()-5>FG
00000030: 4853 585a 5b63 6466 272c 3630 327d 616e  HSXZ[cdf',602}an
00000040: 6420 6628 6e2f 2f31 3029 6f72 206e       d f(n//10)or n

Version peu antérieure (antérieure):

f=lambda n:{n/10}-{0,2,3,4,5,6,8,9,21,22,23,24,25,26,29,35,37,38,42,50,59,599,67,68,69,80,85,87,88,96,97,99}and f(n/10)or n

Essayez-le en ligne!

ovs
la source
4

Bash , 328 341 410 octets

Pas très compétitif pour un score de golf, mais chacun d'eux aide mes compétences bash!

13 octets enregistrés en éliminant la gestion des valeurs de longueur d'exécution de 2 octets; le stockage de seulement 3 octets ajoute 8 octets à T, mais rend l'instruction de cas beaucoup plus simple.

Économie de 69 octets en changeant l'approche de l'expansion bash au stockage des deltas. Le lien TIO précédent se trouve au bas de ma réponse.

T='16D73r423112r62r72r6F1224r53-03511322rZr32r9L1611-01Fr9BrD2112V12-025r9-029r8-0202rB2r7-0308-162121E5r832-02082r72Cr52-3UR132'
A(){
V=$[V+36#$1]
S="$S $V"
}
R(){
read -n$1 d
}
while read -n1 c;do
case $c in -)R 3;A $d;;r)R 1;for((i=1;$i<=36#$d;i++)){ A 1;};;*)A $c;;esac;done<<<$T
for s in $S;do [[ $1 =~ ^$s ]]&&echo $s;done

Essayez-le en ligne!

  • Tri numérique de la liste des préfixes
  • T est une "sorte de" chaîne codée de longueur indiquant le delta de la valeur précédente. Chaque personnage est l'un des suivants:
    • Une valeur base36 montrant l'augmentation par rapport à la valeur précédente
    • 'r': indique que le caractère suivant indique le nombre codé en base36 de valeurs delta répétées de 1.
    • '-': indique que les 3 caractères suivants sont la prochaine valeur delta

La chaîne T = "16D73r42 [...] -3UR132" suivant les règles ci-dessus devient une liste de deltas: "1 6 D 7 3 r4 2 [...] 4995 1 3 2"

Pourrait économiser 2-3 octets de plus en utilisant un radix supérieur à 36 (comme 62-64), mais Excel ne prend en charge nativement que jusqu'à 36, et c'est ce qui faisait la liste des deltas et leurs conversions.

  • Lors de l'exécution, T est analysé et développé dans la chaîne S utilisée pour la comparaison du numéro de téléphone donné dans l'argument de ligne de commande 1.

T, S en expansion devient: "1 7 20 27 30 31 32 33 34 36 [...] 5993 5994 5997 5999"

Essayez-le en ligne!

frapper
la source
2

Perl 5 (-p), 44 octets

$\=chop until/^599$/+vec"\x7D\x03\xE0\x27\x68\x04\x04\x08\x38\x00\xA1\x01\x0B",$_,1

Essayez-le en ligne!

TIO et SO ont tous deux des problèmes avec les caractères non imprimables, donc le programme est affiché avec des séquences d'échappement. Voici un hexdump des 44 octets réels:

0000000: 245c 3d63 686f 7020 756e 7469 6c2f 5e35  $\=chop until/^5
0000010: 3939 242f 2b76 6563 227d 03e0 2768 0404  99$/+vec"}..'h..
0000020: 0838 00a1 010b 222c 245f 2c31            .8....",$_,1
Grimmy
la source
1

PHP , 219 octets

J'ai l'impression qu'il y a beaucoup de place pour améliorer l'expression régulière - je l'ai joué au golf aussi loin que possible, mais je parie que cela peut être beaucoup plus court ...

preg_match('/(1|7|2(0|1[12368]|[2346].|5[^9]|7|9[01789])|3[578]?.|42?[013]|5([1-8]|0.|99?[3479])|6([0-6]|7[^1]|8[^4]|9[012])|8(0[08]|[1246]|5[02356]|7[05-9]|8[0-368])|9([0-58]|6[^9]|7[^8]|9[1-8]))/',$argn,$r);echo$r[0];

Essayez-le en ligne!

XMark
la source
1

Java 8, 84 octets

s->s.replaceAll("(1|7|(2[^07]|3[578]|42|599?|50|6[789]|8[0578]|9[679]|.).).*","$1");

Port de l' expression rationnelle JavaScript de @Arnauld , alors assurez-vous de voter pour lui!

Essayez-le en ligne.

Explication:

s->                    // Method with String as both parameter and return-type
  s.replaceAll("(1|7|(2[^07]|3[578]|42|599?|50|6[789]|8[0578]|9[679]|.).).*",
                       //  Replace this regex-match
               "$1");  //  With this replacement

Explication de l'expression régulière:

(1|7|(2[^07]|3[578]|42|599?|50|6[789]|8[0578]|9[679]|.).).*  // MATCH:
 1                                                           //  a 1
  |7                                                         //  or a 7
    |(                                                )      //  or:
      2[^07]                                                 //   a 2 not followed 0 nor 7
            |3[578]                                          //   or a 3 followed by 5, 7, or 8
                   |42                                       //   or a 42
                      |599?                                  //   or a 59 or a 599
                           |50                               //   or a 50
                              |6[789]                        //   or a 6 followed by 7, 8, or 9
                                     |8[0578]                //   or an 8 followed by 0, 5, 7, or 8
                                             |9[679]         //   or a 9 followed by 6, 7, or 9
                                                    |.       //   or any single digit
                                                       .     //  followed by any single digit
(                                                       )    //  All captured in capture group 1
                                                         .*  //  With 0 or more digits following

$1                                                           // REPLACEMENT:
$1                                                           //  The match of capture group 1,
                                                             //  (effectively removing the
                                                             //   remaining digits of `.*`)
Kevin Cruijssen
la source
0

Scala , 411 402 330 octets

Cela suppose que l'argument ne contient que des chiffres.

"(1|(2(0|(1[12368])|([2346]\\d)|(5[^9])|7|(9[^2-6])))|(3(([0-4])|([57]\\d)|6|(8[^48])|9))|(4([^2]|(2[013])))|(5((0\\d)|[^09]|(9([^9]|(9[3479])))))|(6([0-6]|(7[^1])|(8[^4])|(9[0-2])))|7|(8((0[08])|[1246]|(5[02356])|(7[05-9])|(8[^4579])))|(9([0-58]|(6[^9])|(7[^8])|(9[^079]))))(.*)".r.unapplySeq(args(0)).foreach(l=>println(l.head))

Essayez-le en ligne!

jkeatley
la source