พวกเขาโทรมาจากที่ไหน


19

เมื่อโทรออกต่างประเทศหมายเลขโทรศัพท์จะถูกนำหน้าด้วยรหัสที่ระบุว่าประเทศนั้นตั้งอยู่ที่ใดรหัสเหล่านี้เป็นรหัสนำหน้าซึ่งหมายความว่าไม่มีรหัสใดเป็นรหัสนำหน้าของอีกประเทศหนึ่ง

ตอนนี้ก่อนหน้านี้วันนี้คุณไม่ได้รับสายและคุณอยากรู้ว่าการโทรนั้นมาจากไหน ดังนั้นคุณต้องการค้นหารหัสโทร แต่เป็นรหัสคำนำหน้าคุณไม่แน่ใจว่าจะจบที่ไหนดังนั้นคุณตัดสินใจที่จะเขียนโปรแกรมเพื่อแยกรหัสการโทรออกจากหมายเลขที่เหลือ

อินพุต

เป็น input 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 เป็นคำนำหน้าของรหัสอื่นก็จะถูกละเว้น
  • หากประเทศหรือดินแดนเดียวจะมีรหัสมากกว่าหนึ่งรหัสและหากรหัสเหล่านั้นมีรหัสนำหน้าร่วมกันรหัสเหล่านั้นจะถูกละเว้นตามความเห็นของคำนำหน้าทั่วไป

สิ่งนี้อาจส่งผลให้ประเทศที่เป็นอิสระถูกรวมเข้าด้วยกันหรือดินแดนพิพาทที่ถูกรวมเข้ากับผู้เรียกร้องเฉพาะ นี่ไม่ได้มีวัตถุประสงค์เพื่อเป็นแถลงการณ์ทางการเมืองและการตัดสินใจเกี่ยวกับการรวมหรือการละเว้นอาณาเขตและรัฐต่างๆนั้นเกิดขึ้นตามหลักปฏิบัติไม่ใช่ความเชื่อใด ๆ ที่ฉันมีเกี่ยวกับการเป็นเจ้าของหรืออำนาจอธิปไตยของกิจการที่ใช้สิ่งเหล่านั้น

หากได้รับอินพุตที่ไม่ได้เริ่มต้นด้วยรหัสเหล่านี้พฤติกรรมของโปรแกรมของคุณจะไม่ได้กำหนด

และในที่สุดก็:

กรณีทดสอบ

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

คำตอบ:


10

JavaScript (ES6),  75 73  71 ไบต์

บันทึก 1 ไบต์ขอบคุณ @Shaggy
บันทึก 2 ไบต์ขอบคุณ @Neil

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

ลองออนไลน์!


ผมคิดว่าสามารถแทนที่599?|50 599|5[09]
Neil

@ Neil แน่นอน ขอบคุณ!
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

05AB1E , 28 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 bytes

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

ลองออนไลน์!

มีบาง unprintables:

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

Bash , 328 341 410ไบต์

ไม่ค่อยมีการแข่งขันสำหรับคะแนนการเล่นกอล์ฟ แต่สิ่งเหล่านี้ช่วยทักษะการทุบตีของฉัน!

บันทึก 13 ไบต์โดยกำจัดการจัดการค่าความยาว 2 ไบต์; การจัดเก็บเพียง 3 ไบต์เพิ่ม 8 ไบต์เป็น T แต่ทำให้คำสั่ง case ง่ายขึ้นมาก

บันทึก 69 ไบต์โดยเปลี่ยนวิธีจากการขยาย bash เป็นการจัดเก็บ delta ลิงค์ 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" ตามกฎข้างต้นกลายเป็นรายการของ deltas: "1 6 D 7 3 r4 2 [... ] 4995 1 3 2"

สามารถบันทึก 2-3 ไบต์ได้มากขึ้นโดยใช้ radix ที่สูงกว่า 36 (เช่น 62-64) แต่ 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 มีปัญหากับตัวอักษรที่ไม่สามารถพิมพ์ได้ดังนั้นโปรแกรมจะแสดงพร้อมลำดับการหลีกเลี่ยง นี่คือ hexdump ของ 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 ไบต์

ฉันรู้สึกว่ามีห้องมากมายสำหรับปรับปรุง regex - golfed เท่าที่ฉันจะไปได้ แต่ฉันจะพนันได้ว่ามันจะสั้นกว่านี้ ....

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

regex JavaScriptของพอร์ตของ@Arnauldดังนั้นอย่าลืม upvote เขา!

ลองออนไลน์

คำอธิบาย:

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

คำอธิบาย Regex:

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

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.