Dari mana mereka menelepon?

19

Saat melakukan panggilan telepon internasional, nomor telepon diawali dengan kode yang menunjukkan negara mana nomor itu berada. Kode-kode ini adalah kode awalan , artinya tidak ada kode yang merupakan awalan dari yang lain.

Sekarang, sebelumnya hari ini Anda melewatkan panggilan, dan Anda agak penasaran dari mana panggilan itu berasal. Jadi, Anda ingin mencari kode panggilan. Tetapi, sebagai kode awalan, Anda tidak yakin di mana itu berakhir, jadi Anda memutuskan untuk menulis sebuah program untuk memisahkan kode panggilan dari sisa nomor.

Memasukkan

Sebagai input, Anda akan menerima string yang terdiri dari digit 0-9. Beberapa digit pertama akan menjadi salah satu kode panggilan negara yang tercantum di bawah ini (ini berarti digit pertama tidak akan pernah ada 0). Setelah kode panggilan negara, sisa input akan berisi nol atau lebih digit dalam urutan apa pun - tidak dijamin menjadi nomor telepon yang valid. Program Anda harus dapat menangani input yang mengandung setidaknya 15 digit

Keluaran

Program Anda harus menampilkan kode panggilan negara unik yang merupakan awalan nomor tersebut. Output yang valid adalah sebagai berikut:

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

Daftar ini didasarkan pada kode-kode yang tercantum pada daftar halaman Wikipedia tentang kode panggilan negara pada revisi 915410826, dengan beberapa modifikasi

  • Semua kode yang terdaftar sebagai tidak ditugaskan atau dihentikan dan beberapa kode yang terdaftar sebagai dicadangkan untuk penggunaan di masa mendatang dihilangkan
  • Jika kode yang tercantum di Wikipedia adalah awalan dari yang lain, yang terakhir dihilangkan
  • Jika satu negara atau teritori akan memiliki lebih dari satu kode, dan jika kode-kode itu memiliki awalan yang sama, kode-kode itu dihilangkan demi awalan bersama mereka.

Hal ini dapat menyebabkan negara-negara merdeka disatukan, atau wilayah yang disengketakan disatukan dengan penggugat tertentu. Ini tidak dimaksudkan sebagai pernyataan politik, dan keputusan tentang penyertaan atau penghilangan wilayah dan negara dibuat berdasarkan kode, bukan keyakinan apa pun yang saya pegang mengenai kepemilikan atau kedaulatan entitas yang menggunakannya.

Jika diberi input yang tidak dimulai dengan kode-kode ini, perilaku program Anda tidak ditentukan.

Dan akhirnya:

  • Ini , lebih sedikit byte kode yang lebih baik
  • Kiriman Anda dapat berupa fungsi atau program lengkap
  • Salah satu metode I / O default baik-baik saja
  • Celah standar dilarang

Uji kasus

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
sumber
Mungkin Anda sebaiknya melakukannya input | outputdengan garis putus-putus di bawahnya kecuali jika Anda ingin inputditerjemahkan output.
JL2210

Jawaban:

10

JavaScript (ES6),  75 73  71 byte

Disimpan 1 byte berkat @Shaggy
Disimpan 2 byte berkat @Neil

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

Cobalah online!

Arnauld
sumber
Saya pikir 599?|50bisa menggantikan 599|5[09].
Neil
@Neil Memang. Terima kasih!
Arnauld
Apakah s=>/(2[^07]|3[578]|42|599?|50|6[789]|8[0578]|9[679]|[^17]|)./.exec(s)[0]berfungsi untuk 72 byte?
Ovs
1
@ovs Memang, tetapi versi saat ini sebenarnya 71 byte - jumlah byte sudah ketinggalan zaman.
Arnauld
9

05AB1E , 28 25 24 byte

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

Cobalah online!

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

Retina 0.8.2 , 60 byte

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

Cobalah online!

Neil
sumber
Masukan Anda di TIO sudah menyertakan jawabannya;) Saya tahu kode Anda tidak menggunakannya, tetapi ini agak membingungkan tbh.
Kevin Cruijssen
4

Python 3 , 120 78 byte

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

Cobalah online!

Berisi beberapa unsintables:

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

Versi agak tidak disatukan (sebelumnya):

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

Cobalah online!

ovs
sumber
4

Bash , 328 341 410 byte

Tidak terlalu kompetitif untuk skor golf, tetapi masing-masing membantu keterampilan bash saya!

Disimpan 13 byte dengan menghilangkan penanganan nilai run-length 2 byte; menyimpan hanya 3 byte menambahkan 8 byte ke T, tetapi membuat pernyataan kasus lebih sederhana.

Disimpan 69 byte dengan mengubah pendekatan dari ekspansi bash ke menyimpan delta. TIO tautan sebelumnya ada di bagian bawah jawaban saya.

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

Cobalah online!

  • Mengurutkan daftar awalan secara numerik
  • T adalah "semacam" string yang dikodekan run-length yang menunjukkan delta dari nilai sebelumnya. Setiap karakter adalah salah satu dari yang berikut:
    • Nilai base36 menunjukkan peningkatan dari nilai sebelumnya
    • 'r': menunjukkan bahwa karakter selanjutnya menunjukkan angka base36 yang dikodekan dari nilai-nilai delta berulang 1.
    • '-': menunjukkan bahwa 3 karakter berikutnya adalah nilai delta berikutnya

String T = "16D73r42 [...] -3UR132" mengikuti aturan di atas menjadi daftar delta: "1 6 D 7 3 r4 2 [...] 4995 1 3 2"

Bisa menghemat 2-3 byte lebih banyak dengan menggunakan radix lebih tinggi dari 36 (seperti 62-64) tetapi Excel hanya mendukung hingga 36, ​​dan itulah yang digunakan untuk melakukan daftar delta dan konversi mereka.

  • Saat berjalan, T diurai dan diperluas ke string S yang digunakan untuk perbandingan nomor telepon yang diberikan dalam argumen baris perintah 1.

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

Cobalah online!

berdesis
sumber
2

Perl 5 (-p), 44 byte

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

Cobalah online!

Baik TIO dan SO memiliki masalah dengan karakter yang tidak diinginkan, sehingga program ditampilkan dengan urutan pelarian. Berikut hexdump dari 44 byte yang sebenarnya:

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
sumber
1

PHP , 219 byte

Saya merasa seperti ada banyak ruang untuk meningkatkan regex - golf sejauh yang saya bisa tapi saya berani bertaruh bisa jauh lebih pendek ....

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

Cobalah online!

XMark
sumber
1

Java 8, 84 byte

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

Port of regex JavaScript @Arnauld , jadi pastikan untuk membesarkannya!

Cobalah online.

Penjelasan:

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

Penjelasan 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 `.*`)
Kevin Cruijssen
sumber
0

Scala , 411 402 330 byte

Ini dengan asumsi bahwa argumen hanya berisi angka.

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

Cobalah online!

jkeatley
sumber