彼らはどこから呼んでいますか?


19

国際電話をかける場合、電話番号の前に番号が所在する国を示すコードが付加されます。これらのコードはプレフィックスコードであり、他のコードのプレフィックスではありません。

さて、今日、あなたは電話を逃しました。そして、あなたはその電話がどこから来たのでしょうか。したがって、呼び出し元のコードを検索する必要があります。しかし、プレフィックスコードであるため、どこで終了するのかはよくわからないので、呼び出しコードを残りの番号から分離するプログラムを作成することにします。

入力

入力として、数字で構成される文字列を受け取ります0-9。最初の数桁は、以下にリストされている国の呼び出しコードの1つになります(これは、最初の数字がにならないことを意味します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場合を除き、代わりに下に破線を使用する必要があります。inputoutput
JL2210

回答:


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]
ニール

@Neil確かに。ありがとう!
アーナウルド

DOESのs=>/(2[^07]|3[578]|42|599?|50|6[789]|8[0578]|9[679]|[^17]|)./.exec(s)[0]72バイトのために動作しますか?
ovs

1
@ovsありますが、現在のバージョンは実際には71バイトです。バイトカウントは古くなっていました。
アーナルド

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の3120の 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は解析され、コマンドライン引数1で指定された電話番号の比較に使用される文字列Sに展開されます。

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バイトの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

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

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.