그들은 어디에서 전화합니까?


19

국제적으로 전화를 걸 때 전화 번호 앞에는 해당 국가의 국가를 나타내는 코드가 붙습니다.이 코드는 접두사 코드 이므로 다른 코드의 접두사가 없습니다.

자, 오늘 초에 전화를받지 못했습니다. 전화가 어디에서 왔는지 궁금합니다. 따라서 호출 코드를 찾아보고 싶습니다. 그러나 접두사 코드이기 때문에 끝이 확실하지 않으므로 호출 코드를 나머지 번호와 구분하는 프로그램을 작성하기로 결정합니다.

입력

입력으로 숫자로 구성된 문자열을받습니다 0-9. 처음 몇 자리 숫자는 아래 나열된 국가 전화 코드 중 하나입니다 (첫 번째 자리는 절대로 사용되지 않음을 의미 0). 국가 전화 코드 다음에 나머지 입력은 순서에 상관없이 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에 나열된 코드가 다른 코드의 접두사 인 경우 해당 코드는 생략되었습니다.
  • 단일 국가 나 지역에 둘 이상의 코드가 있고 해당 코드에 공통 접두사가있는 경우 해당 코드는 공통 접두사를 위해 생략됩니다.

이로 인해 독립 국가가 함께 집중되거나 분쟁 지역이 특정 청구자와 함께 집중 될 수 있습니다. 이것은 정치적 진술로 의도 된 것이 아니며, 영토 및 국가의 포함 또는 생략에 관한 결정은이를 사용하는 주체의 소유권 또는 주권에 관한 어떠한 신념이 아니라도 규범에 근거하여 내려졌습니다.

이러한 코드로 시작하지 않는 입력이 제공되면 프로그램의 동작은 정의되지 않습니다.

그리고 마지막으로:

  • 이것은 이며 적은 바이트의 코드가 좋습니다.
  • 제출물은 기능 또는 전체 프로그램 일 수 있습니다.
  • 의 모든 기본 I / O 방법은 괜찮
  • 표준 허점 은 금지되어 있습니다

테스트 사례

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

자바 스크립트 (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

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

파이썬 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 바이트 만 저장하면 8 바이트가 T에 추가되지만 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을 1로 나타냅니다.
    • '-': 다음 3자가 다음 델타 값임을 나타냅니다.

위 규칙에 따른 문자열 T = "16D73r42 [...] -3UR132"는 델타 목록이됩니다. "1 6 D 7 3 r4 2 [...] 4995 1 3 2"

36보다 높은 기수 (62-64와 같은)를 사용하여 2-3 바이트를 더 절약 할 수 있지만 Excel은 기본적으로 최대 36까지만 지원하므로 델타 목록과 변환을 수행하는 데 사용됩니다.

  • 실행시 T는 구문 분석되어 명령 행 인수 1에 제공된 전화 번호의 비교에 사용되는 문자열 S로 확장됩니다.

T를 확장하면 S는 다음과 같이됩니다. "17 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 바이트의 16 진 덤프는 다음과 같습니다.

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

자바 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))

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.