他们从哪里打来的?


19

在国际范围内拨打电话时,电话号码前会带有一个代码,以指示该号码所在的国家/地区。这些代码是前缀代码,这意味着任何代码都不是另一个前缀。

现在,今天早些时候,您错过了一个呼叫,并且您很好奇该呼叫可能来自何处。因此,您想查找调用代码。但是,作为前缀代码,您不太确定它的结尾,因此您决定编写一个程序以将调用代码与号码的其余部分分开。

输入值

作为输入,您将收到一个由digits组成的字符串0-9。前几位数字将是下面列出的国家/地区电话代码之一(这意味着前几位永远不会是0)。输入国家/地区电话代码后,其余输入将以任意顺序包含零个或多个数字- 保证该数字是有效的电话号码。您的程序必须能够处理至少包含15位数字的输入

输出量

您的程序应输出唯一的国家/地区电话代码,该代码是该号码的前缀。有效输出如下:

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

此列表基于915410826修订版的Wikipedia的“国家/地区代码列表”页面上列出的代码,并做了一些修改。

  • 列出了所有未分配或已停产的代码,以及一些保留为将来使用的代码
  • 如果Wikipedia上列出的代码是另一个的前缀,则省略后者
  • 如果单个国家或地区将具有多个代码,并且这些代码具有公共前缀,则将省略这些代码,而使用其公共前缀。

这可能导致将独立国家混为一谈,或将有争议的领土与特定索赔人混为一谈。这并非旨在作为政治声明,关于是否包含领土和国家的决定是基于法规做出的,而不是我对使用它们的实体的所有权或主权所持的任何信念。

如果给定的输入不以任何这些代码开头,则程序的行为是不确定的。

最后:

测试用例

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

input | output除非您想input翻译成,否则可能应该在其下方使用虚线来代替output
JL2210

Answers:


10

JavaScript(ES6), 75 73  71字节

@Shaggy 节省了1个字节@Neil
节省了2个字节

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

在线尝试!


我认为599?|50可以代替599|5[09]
尼尔

@尼尔确实。谢谢!
Arnauld

可以s=>/(2[^07]|3[578]|42|599?|50|6[789]|8[0578]|9[679]|[^17]|)./.exec(s)[0]工作72个字节吗?
ovs

1
@ovs可以,但是当前版本实际上是71个字节-字节数已过时。
Arnauld

9

05AB1E28 25 24字节

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

在线尝试!

η                            # 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


4

Python 3中120个 78字节

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

在线尝试!

包含一些不可打印的内容:

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

有点不符合实际的版本(较早):

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

在线尝试!


4

,328个341 410字节

高尔夫得分并不十分有竞争力,但是每一个都有助于我的击球技巧!

通过消除处理2个字节的游程长度值,节省了13个字节;仅存储3个字节会使T增加8个字节,但使case语句简单得多。

通过将方法从bash扩展更改为存储增量,节省了69个字节。上一个TIO链接位于我的答案的底部。

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

在线尝试!

  • 对前缀列表进行数字排序
  • T是“某种”游程长度编码的字符串,显示了前一个值的增量。每个字符都是以下之一:
    • 一个base36值,显示从前一个值开始的增加
    • 'r':表示下一个字符表示重复增量值的base36编码数目,为1。
    • '-':表示接下来的3个字符是下一个增量值

遵循上述规则的字符串T =“ 16D73r42 [...]-3UR132”成为增量列表:“ 1 6 D 7 3 r4 2 [...] 4995 1 3 2”

通过使用比36高的基数(例如62-64)可以节省2-3个字节,但是Excel仅本地支持多达36个字节,这就是用来做增量及其转换列表的方式。

  • 运行时,将T解析并扩展为字符串S,用于比较命令行参数1中给出的电话号码。

扩展的T,S变为:“ 1 7 20 27 30 31 32 33 34 36 [5993 5994 5997 5999”

在线尝试!


2

Perl 5(-p),44个字节

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

在线尝试!

TIO和SO都遇到无法打印的字符的麻烦,因此该程序以转义序列显示。这是实际44个字节的十六进制转储:

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

1

的PHP,219字节

我觉得正则表达式还有很多改进的地方-尽我所能打高尔夫球,但我敢打赌它可能会更短。

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];

在线尝试!


1

Java 8,84字节

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

@Arnauld的JavaScript正则表达式的端口,确保对其进行投票!

在线尝试。

说明:

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

正则表达式说明:

(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 `.*`)


0

411个 402 330字节

这是假设参数仅包含数字。

"(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))

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.