หมายเลขโทรศัพท์ที่อ่านไม่ออก


19

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

นั่นคือความท้าทายนี้

ข่าวดีก็คือผู้โทรอ่านหมายเลขของพวกเขาสองครั้ง แต่อ่านไม่ออกทั้งสองแห่ง

โปรแกรมของคุณควรรับข้อมูลดังนี้:

5551231234 / 5551231234

โดยที่สิบหลักแรกเป็นครั้งแรกที่มีการพูดหมายเลขโทรศัพท์ในวอยซ์เมลและชุดที่สองเป็นครั้งที่สองที่มีการพูด เฉพาะ ... มันจะมีลักษณะเช่นนี้มากขึ้น:

555?ABC1_36? / 55?522_1?234
  • ตัวเลขที่ตามมาด้วยเครื่องหมายคำถามหมายความว่าเป็นสิ่งที่ดีที่สุดที่เดาได้สำหรับตัวเลขนั้น (เช่น "5?" หมายถึง "อาจเป็น 5, เปรียบเทียบกับการทำซ้ำ")
  • ขีดเส้นใต้หมายถึงตัวเลขที่หายไปซึ่งเป็นที่รู้จักบางสิ่งบางอย่างที่คลุมเครือเกินกว่าที่จะถูกถอดรหัสได้ทั้งหมด
  • ตัวอักษรเป็นแค่นั้น: ตัวอักษร ปฏิบัติต่อพวกเขาเป็นตัวเลขตามลำดับ
    • ABC -> 2, DEF -> 3, GHI -> 4, JKL -> 5, MNO -> 6, PQRS -> 7, TUV -> 8, WXYZ -> 9
    • อินพุตตัวอย่างทั้งหมดใช้ตัวพิมพ์ใหญ่ (คุณสามารถละเว้นการโทร ToUpper () ได้อย่างปลอดภัย)
    • หากภาษาของคุณใช้งานได้ดีขึ้นในกรณีเล็กคุณสามารถใช้ตัวพิมพ์เล็กสำหรับอินพุตและละเว้นการโทร ToLower () เพียงแค่ทราบว่าในคำตอบของคุณ

คุณยังสามารถรับสายการตัดสินต่อไปนี้เพิ่มเติมได้:

5? / _     -> 5  //5 is the best guess we have, use it
5? / 5?    -> 5  //uncertain, but matching
5? / 4?    -> ?  //conflict
 5 / 4     -> ?  //conflict
5? / 4     -> 4  //solid information overrides possible value
 5 / 4?    -> 5  //solid information overrides possible value
 _ / _     -> ?  //no information available

นอกจากนี้คุณสามารถสมมติว่าอินพุตทั้งหมดจะมีหมายเลขโทรศัพท์สิบหลักไม่รวมถึงเครื่องหมายคำถาม อินพุตที่ไม่ใช่ตัวเลขสิบหลัก (เช่น1234567 / 1234567) สามารถถือว่าไม่สามารถแก้ไขได้ (เอาต์พุตเท็จ) หรือเกิดข้อผิดพลาด

อินพุต

อักขระหนึ่งบรรทัด0-9A-Z _?/ตามที่อธิบายไว้ข้างต้น

เอาท์พุต

หากสามารถแยกวิเคราะห์ไปยังหมายเลขโทรศัพท์หนึ่งหลักสิบที่ถูกต้องให้ส่งออกหมายเลขโทรศัพท์ มิฉะนั้นให้ส่งข้อบ่งชี้ข้อผิดพลาดบางรูปแบบ (เช่น -1, เท็จหรือบรรทัดว่าง)

ชนะสั้นที่สุดตามปกติ

อินพุตตัวอย่าง:

1234567890 / 1234567890
1234567890? / 1234567890
123456789_ / 1234567890
1234567890? / 123456789_
1234567890 / 1234567890?
1234567890 / 123456789_
123456789_ / 1234567890?
1234567890? / 1234567890?
1234567890? / 1234567891?
123456789_ / 123456789_
555CALLUS1 / 5552255871
404_12?6039 / 4041?1560_9
_GETREVENGE / 16?36?_2838_
1?691460_50 / 16_14609?50
61?08977211 / 612?897725?1
40?0INSTA__ / 8?00_NSTI?LL
3985_534?10 / 39?8?5053_10
7__7294?737 / 7797299?_37
28?897_384?1 / _8?89763861
271168090_ / 27116800?09
6802?148343 / 67?01148343
94_11628?2?6? / 9491162_47?
17?4285_689 / 1__26?52689
6_311?95_38 / 6731194?7?38
380?7DRAGON / 3807378?5?66
4?647_93236 / 5646?6?9__36
365?268898_ / 366267?7?984
GRATEDBATE / IRATEDBATE
5307_079?93 / ____8_____
535_3_0255 / 52?5_3_024?5
55_____088 / 54?2397207?7?
6_48398_95 / _946?398?6_5?
_0_312_3_1 / 81?53123?1?71
____1_____ / 64?255?508?61
8427820607 / 6?424?8?__6?07
50_3707__6 / 52?8375?74?56
615___8255 / 62?526?983?2?1?
__652618__ / 8365261__0
149___933_ / 1_9677?92?31
___7?281562 / 3438?28154?2
5?7?7?___8?3?7?4 / 57_855837_
605_272481 / 605427__81
86?569__731 / 88560?0?7721
1__91654?15 / 17?9?9165715
800NWABODE / 80069ABI?DE
8___9017_0 / 8_2494?12?9_
_024?5?91?470 / 304?17908?7_
42510704_2 / 4_51070492
9338737_89 / 93_873PLUS
327762_401 / 327_MASH01
33093_2058 / 3309_12058
4061_33578 / 40619_3578
559_383197 / 559938_197
94_9746084 / 9459746_84
1_37655238 / 163POLKA_T
_672FRIZZY / 767237499_
8_76318872 / TIP63188_2
51_8404321 / 5178404_21
358_030314 / 358603_314
2597_85802 / 25979_5802
77141_1408 / 7714_91408
330858_457 / 330_586457
4686079_39 / 46_6079239
86457508_6 / 8_45750826
523226626_ / _23BANNANA
_ISSY_ISSY / 44__9548?79?
6?00B_YJILT / 800289KILL?
2?52803___0 / 1526?0390?61?
FI?ND___T?HE / EAS?T?EREGGS?
0_231?95_38 / 0723194?7?38
0?647_39236 / 0646?6?3__36
025?267798_ / 06?6265?9?984
0061_33578 / _0619_3578

ฉันแค่รับประกันว่าทุกกรณีขอบที่เป็นไปได้ครอบคลุม (11 รายการแรก) แต่นอกเหนือจากนั้นมันสุ่มค่อนข้างมาก

ปรับปรุง

สี่รายการที่ด้านล่างเพิ่มด้วยศูนย์นำหน้า (ตามคำแนะนำของ Jonathan Allan)

เอาต์พุตที่ถูกต้องสำหรับอินพุตตัวอย่าง:

https://pastebin.com/gbCnRdLV

ขึ้นอยู่กับเอาต์พุตจากรายการของJonathan Allan (เอาต์พุตที่จัดรูปแบบเหมาะสมที่สุด)


เราจำเป็นต้องรับอินพุตเป็นสตริงเดี่ยวแยกจากกัน" / "หรือเราสามารถใช้เป็นอินพุตมาตรฐานสองรายการได้หรือไม่
L3viathan

@ L3viathan ตอนแรกฉันเข้าใจความคิดว่าต้องใช้สายเดี่ยว
Draco18s

7
สตริงเดียวของ @ Draco18s ไม่ได้นำสิ่งใดมาสู่ความท้าทาย
fəˈnɛtɪk

1
@ fəˈnɛtɪk ไม่มีใครพูดอะไรในกล่องทราย แต่ฉันไม่มีอะไรจะใช้คู่กับอินพุต มันเป็นเพียงวิธีที่ฉันคิดว่ามันสร้างสรรค์
Draco18s

1
ใครฝากข้อความเสียงโดยใช้ตัวอักษรสำหรับหมายเลขโทรศัพท์ของพวกเขา!
Jonathan Allan

คำตอบ:


3

เยลลี่ , 84 ไบต์

4 ไบต์ - +49Ọฉันคิดว่ามันอาจจะมีพฤติกรรมเหมือนกันในทุกกรณีดังนั้นผมจึงได้แปลงจำนวนเต็มค้นหาปุ่มกดกลับไปที่ตัวละครหลักโดยใช้

”?e‘ḣ@µ”_eḤ‘ẋ@
;Ṃµ68DṬ+3RØAṁẇ@€FT+49Ọȯµ€Fṡ2i”?Ḃ$ÐḟÇ€
ḟ⁶ṣ”/Ç€ZLÐṂ€Q€LỊ$ÐfF€Ḣ€ḟ”_µL⁼⁵ȧ

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

วิธีการทำงานที่พวกเขาสามารถทำซ้ำจำนวนครั้งมากขึ้น
(เช่น"123456789_ / 123456789_ / 1234567890")
... หรือแม้กระทั่งพูดเพียงครั้งเดียวและตรรกะที่กำหนดจะใช้

ลองออนไลน์! หรือดูอินพุตตัวอย่างทั้งหมด

อย่างไร?

”?e‘ḣ@µ”_eḤ‘ẋ@ - Link 1, helper to vary the length of a 2-slice: list s
”?             - literal '?'
  e            - exists in s                   (1 or 0)
   ‘           - increment                     (2 or 1)
    ḣ@         - head with reversed @rguments  (s or s[:1] - removes 2nd value if not '?')
      µ        - monadic chain separation, call that t
       ”_      - literal '_'
         e     - exists in t                   (1 or 0)
          Ḥ    - double                        (2 or 0)
           ‘   - increment                     (3 or 1)
            ẋ@ - repeat t that many times      (t*3 or t - [`_`]->['_','_','_'])

;Ṃµ68DṬ+3RØAṁẇ@€FT+49Ọȯµ€Fṡ2i”?Ḃ$ÐḟÇ€ - Link 2, reformat a phone number: char list of [0-9][A-Z], p
;                                     - concatenate p with
 Ṃ                                    - minimum of p - (?<_<0<1<...<9<A<...<Z - never "?" however, since it only follows a digit.)
                                      -   - this is simply to make a 2-slice with the last character on the left, as used at the very end of this link.
  µ                                   - monadic chain separation call that q
                       µ€             - monadic chain separation, for €ach v in q do:
   68                                 -   literal 68
     D                                -   cast to a decimal list -  [6,8]
      Ṭ                               -   untruth                -  [0,0,0,0,0,1,0,1]
       +3                             -   add 3                  -  [3,3,3,3,3,4,3,4]
         R                            -   range                  -  [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3,4],[1,2,3],[1,2,34]]
          ØA                          -   uppercase alphabet     -  ABCDEFGHIJKLMNOPQRSTUVWXYZ
            ṁ                         -   mould like the range ^ -  [ABC,DEF,GHI,JKL,MNO,PQRS,TUV,WXYZ]
             ẇ@€                      -   sublist v exists in that? for €ach, with reversed @rguments
                F                     -   flatten        (e.g. 'E' -> [0,1,0,0,0,0,0,0]; '4' -> [0,0,0,0,0,0,0,0]
                 T                    -   truthy indexes (e.g. 'E' -> [2]; '4' -> [])
                  +49                 - add 49
                     Ọ                - cast to character
                      ȯ               -   or             (e.g. 'E' -> [3]; '4' -> '4')
                         F           - flatten
                          ṡ2          - all slices of length 2
                                 Ðḟ   - filter discard if:
                                $     -   last two links as a monad:
                            i         -     first index of
                             ”?       -     literal '?'   (first index returns 0 if none exists)
                               Ḃ      -   mod 2 (so this filter discards pairs starting with '?')
                                   Ç€ - call the last link (1) as a monad for €ach slice

ḟ⁶ṣ”/Ç€ZLÐṂ€Q€LỊ$ÐfF€Ḣ€ḟ”_µL⁼⁵ȧ - Main link: string (or char list) s
ḟ                               - filter discard any:
 ⁶                              - literal ' '
  ṣ                             - split on:
   ”/                           - literal '/'
     Ç€                         - call the last link (2) as a monad for €ach
       Z                        - transpose
         ÐṂ€                    - filter, for €ach, keep items with minimal:
        L                       -   length
            Q€                  - de-duplicate €ach
                 Ðf             - filter keep items with:
                $               - last two links as a monad:
              L                 -   length
               Ị                -   insignificant? (=1 effectively here)
                   F€           - flatten €ach
                     Ḣ€         - head €ach
                       ḟ        - filter discard any of:
                        ”_      -   literal '_'
                          µ     - monadic chain separation, call that r
                           L    - length(r)
                             ⁵  - literal 10
                            ⁼   - equal?
                              ȧ - and r (0 if r did not result in a 10-digit list, else r)

ดูเหมือนว่าอาจมีข้อผิดพลาด55_____088 / 54?2397207?7?ควรแก้ไขเป็น5523972088: ตัวเลขที่หายไปทั้งหมดมีอยู่และตัวเลขที่ไม่แน่นอนทางด้านขวามีให้ทางด้านซ้าย กรณีแบบง่าย ๆ ทั้งหมดทำงานแม้ว่า
Draco18s

อาฉันลบสิ่งที่ฉันคิดว่าเป็นตัวกรองซ้ำซ้อนมันไม่ใช่ กำลังแก้ไข ...
Jonathan Allan

เคยไปที่นั่นมาก่อน - และมันก็ไม่ใช่กอล์ฟ! ;)
Draco18s

Ooof ที่ใช้ฉันสักครู่ (ฉันพบข้อผิดพลาดที่แตกต่างกันในขณะที่ฉันกำลังทดสอบ) ได้รับมันกลับไปนับไบต์เดียวกันเป็นเพียงการเพิ่มตัวกรองกลับเมื่อแก้ไขที่แม้ว่าดังนั้น (ต๊าย)
Jonathan Allan

@ Draco18s - ทุกอย่างดูดีสำหรับคุณหรือไม่ มันอาจจะดีที่จะให้ผลลัพธ์ที่คาดหวังสำหรับกรณีทดสอบในคำถามหรืออาจแยกออกจากสิ่งที่ไม่ถูกต้อง
Jonathan Allan

7

Python 2 , 314 307 274 ไบต์

lambda s:g(*''.join(q<n<"["and`(int(n,36)-4-(n>"R")-(n>"Y"))//3`or n for n in s).split(" / "))
def g(a,b,s=str.startswith):
 if b:c,d,e,f=a[0],a[1:],b[0],b[1:];b=(c==e and[c,q][c=="_"]or"_"in c+e and min(c,e)or[q,c,e][s(f,q)-s(d,q)])+g(d[s(d,q):],f[s(f,q):])
 return b
q="?"

ลองออนไลน์!


5

Python 3, 549 530 509 453 449 410 406 394 393 391 ไบต์

ฉันแน่ใจว่านี่สามารถปรับปรุงได้ แต่มันเป็นการเริ่มต้น:

def f(e,z,q="?",u=str.isnumeric):
 if e+z in(e,z):return""
 o,O,t,T,*x=e[0],e[1:2],z[0],z[1:2],e[1:],z[1:]
 if"?"in o+t:return f([e,x[0]][o==q],z)
 if u(o):
  if u(t):return t+f(*x)if O==q!=T else o+f(*x)if o==t or T==q!=O else 1
  return o+f(*x)
 if u(t):return t+f(*x)
def g(s):
 for a,b in zip(map(chr,range(65,91)),"2223334445556667777888999"):s=s.replace(a,b)
 return f(*s.split(" / "))

ฉันกำลังใช้ str.translateตัวอักษรและฟังก์ชั่น wrapper gเพื่อสร้างอินพุตในรูปแบบที่ฉันต้องการ ฟังก์ชั่นที่เกิดขึ้นจริงfซ้ำและจะล้มเหลวในการป้อนข้อมูลที่ไม่ชัดเจน ฉันยังคงมี repititions มากมายอยู่ในนั้นดังนั้นฉันแน่ใจว่ามีพื้นที่มากมายสำหรับการปรับปรุง

การปรับปรุง:

  • บันทึก 19 ไบต์โดยการรวมเงื่อนไข
  • บันทึก 21 ไบต์ด้วย ternaries
  • บันทึก 56 ไบต์โดยใช้ความเข้าใจในพจนานุกรมแทนพจนานุกรมคู่มือด้วย @TuukkaX
  • บันทึก 4 ไบต์โดยเปลี่ยนเป็นวิธีที่แนะนำโดย @ovs โดยการปรับปรุงของ @ TuukkaX
  • บันทึก 38 ไบต์ด้วยการปรับปรุงจาก @ovs (และลบช่องว่างที่ถอดออกล่าสุดได้)
  • บันทึก 4 ไบต์โดยใส่การกำหนดstr.isnumericในอาร์กิวเมนต์คำหลัก
  • บันทึก 12 ไบต์ด้วยตัวดำเนินการเปรียบเทียบแบบรวม (เช่นT==q!=O)
  • บันทึก 1 ไบต์โดยการเปิดเข้าไปnot(e or z)e+z in(e,z)
  • บันทึก 2 ไบต์โดยการบันทึกที่ใช้บ่อย (E,Z)

สิ่งนี้มีความเข้าใจในพจนานุกรมที่ไม่มีค่าเริ่มต้นแถวบนสุด ฉันเกลียดลำดับของ 3 แต่สิ่งเหล่านั้นอาจถูกแทนที่ด้วยคณิตศาสตร์
Yytsi


@ovs นีซ ตัวอักษรสามารถเปลี่ยนเป็นmap(chr,range(65,91))แม้ว่า
Yytsi

2
RE: การทำให้วิกินี้เป็นชุมชนเพื่อสละชื่อเสียงฉันทามติจะไม่เพียงแค่ยอมรับความช่วยเหลือและให้เครดิตเหมือนที่คุณมี
Jonathan Allan

1
ฉันสาบานทุกครั้งที่ฉันกลับมาที่นี่คำตอบนี้จะสั้นลง: D
Draco18s

3

JavaScript (ES6), 180 190 188 ไบต์

แก้ไข: +10 +9 ไบต์เพื่อให้สอดคล้องกับกฎเอาต์พุตที่ผิดพลาด


(a)(b)ใช้เวลาสตริงใส่สองในไวยากรณ์ currying ส่งคืนfalseหรือสตริงที่แสดงถึงหมายเลขโทรศัพท์ที่เดา

a=>b=>!(s=(F=a=>a.match(/(.\??)|_/g).map(([x,y])=>(x<=9?++x:parseInt(x,36)*.32-(x>'Y'))|(x!='_'&!y)*16))(a).map((x,i)=>(x=(d=x^(y=F(b)[i]),x>y)?x:y)&&(d&16|!(d%x))?--x&15:a).join``)[10]&&s

มันทำงานอย่างไร

ขั้นตอนที่ # 1 - การแยกสตริงการป้อนข้อมูล

ก่อนอื่นเรากำหนดF()ฟังก์ชั่นที่แปลสตริงเป็นอาร์เรย์จำนวนเต็มโดยใช้กฎต่อไปนี้:

  • ขีดล่างจะถูกแปลงเป็น0
  • ตัวเลขNหรือตัวอักษรเทียบเท่าถูกแปลงเป็น(N + 1) หรือ 16 (เช่น "2" → 19, "R" → 24)
  • ตัวเลขNหรือตัวอักษรเทียบเท่าตามด้วยเครื่องหมายคำถามถูกแปลงเป็นN + 1 (เช่น "2?" → 3, "R?" → 8)

ซึ่งสามารถตีความได้อีกทางหนึ่งดังนี้

  • 0ไม่ทราบ
  • [ 1 .. 10 ]ไม่น่าเชื่อถือ
  • [ 17 .. 26 ]เชื่อถือได้

เราใช้F()ทั้งสองและa bสิ่งนี้ทำให้เรามีจำนวนเต็ม(x, y)สำหรับแต่ละหลักในหมายเลขโทรศัพท์ซึ่งสอดคล้องกับการตีความที่เป็นไปได้สองแบบ

ขั้นตอนที่ # 2 - เดาตัวเลข

สำหรับแต่ละคู่(x, y)เราคำนวณ:

  • d = x XOR y
  • x = MAX (x, y)ค่าที่เชื่อถือได้มักเป็นสิ่งที่ไม่น่าเชื่อถือ

ถ้าx == 0หมายความว่าอินพุตทั้งสองเป็นอักขระขีดล่าง ดังนั้นตัวเลขไม่เป็นที่รู้จักในกรณีนี้

ถ้าx! = 0เราสามารถสรุปตัวเลขได้อย่างปลอดภัยหากเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้เป็นจริง:

condition       | interpretation
----------------+------------------------------------------------------
(d AND 16) != 0 | one input is unreliable and the other one is reliable
d == 0          | both inputs are identical
d == x          | one input is an underscore

สามารถรวมสองเงื่อนไขสุดท้ายเข้าด้วย!(d % x)กัน ดังนั้นสูตรสุดท้าย:

x && (d & 16 || !(d % x))

หากเป็นจริงเราจะแปลงxกลับไปเป็นตัวเลขที่เดาได้ด้วยการคำนวณ(x - 1) และ 1515

กรณีทดสอบ

(มีเพียง 50 อันดับแรกเท่านั้นเนื่องจากข้อมูลโค้ดคอนโซลไม่สามารถรองรับประวัติเอาต์พุตได้มากขึ้น)


1234567890? / 1234567890?1234567890ควรแก้ไขเพื่อ ตอนนี้โค้ดของคุณมีเอาต์พุต123456789?ซึ่งน้อยกว่าข้อมูลที่ป้อนเข้า Assume: 5? / 5? -> 5 //uncertain, but matching
Draco18s

@ Draco18s ตรงกันข้ามกับสิ่งที่ฉันพูดฉันได้รวม51กรณีทดสอบ ดังนั้นอันแรกก็ถูกทิ้งไว้และทุกอย่างก็เลื่อนไปทีละแถว (ตอนนี้ได้รับการแก้ไขแล้วขออภัยเกี่ยวกับสิ่งนั้น)
Arnauld

Aaah แต่ถึงกระนั้นมันก็ควรจะออกผลลัพธ์ที่ผิดพลาดหรือค่าความผิดพลาดบางอย่างสำหรับกรณีทดสอบเหล่านั้น แต่อย่างอื่นดูดี
Draco18s

2

Perl 5 , 211 ไบต์

... โดยไม่มีการเยื้องและ \ n บรรทัดใหม่

@i=map{y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/22233344455566677778889999/;$_}split' / ',shift;
print map{
  $_=join'',map{s,(\d\??|_),,;$1}@i;
  /((\d)\??\2\??|(\d)\??_|_(\d)\??|(\d)\d\?|\d\?(\d))$/;$2//$3//$4//$5//$6//'?'
}1..10

ลองออนไลน์!


ดูเหมือนว่าการส่งคืน "ดีที่สุดที่จะทำได้" ( 83652618?0) แทนที่จะเป็นเท็จหรือค่าความผิดพลาดบางประเภท
Draco18s

นี่คือสิ่งที่ตัวต่อต้องการหากฉันไม่ผิด ดูกรณีต่างๆภายใต้หัวข้อ "คุณยังสามารถรับการพิจารณาตัดสินเพิ่มเติมได้ดังต่อไปนี้" หรือไม่?
Kjetil S.

ขออภัยไม่มีการแจ้งเตือนการตอบกลับของคุณ (ไม่ต้องพูดถึง) ส่วนที่ฉันทำสำหรับการเรียกใช้การตัดสินใช้?เพื่อระบุว่าไม่มีวิธีแก้ไขข้อมูลที่หายไปซึ่งควรจะผ่านไปยังส่วนผลลัพธ์:...Otherwise output some form of error indication (e.g. -1, false, or an empty line).
Draco18s

2

เรตินา, 150 140 136 ไบต์

บันทึกไม่กี่ไบต์ด้วย Kritixi Lithos

T`?L`#22233344455566677778889
./.

(?<=(\d)(\w#?){9}).#|.#(?=(\w#?){9}(\d)(?!#))
$1$4
#

_(?=.{9}(.))|(?<=(.).{9})_
$1$2
^(\d*)\1$|.*
$1

ลองออนไลน์!

คำอธิบาย:

บรรทัดแรกจะแปลงทั้งหมด?ในอินพุต#และตัวอักษรทั้งหมดให้เป็นตัวเลขเทียบเท่า จากนั้นเราจะลบช่องว่างและ/ออกจากอินพุต อีกสองบรรทัดถัดไปจะดูแลกรณี "เดากับความแน่นอน" (เช่น5? \ 4จะถูกแทนที่ด้วย4 \ 4) หลังจากลบ#s ทั้งหมดแล้วบรรทัดที่ 8 และ 9 จะจัดการกับ_กรณี"number vs. " ( _ \ 3กลายเป็น3 \ 3 ) จากนั้นหากทั้งสองส่วนของสตริงตรงกันครึ่งหนึ่งเราจะเก็บ 10 หลักแรก มิฉะนั้นหมายเลขโทรศัพท์ไม่ถูกต้องดังนั้นเราจึงลบทุกอย่าง

โซลูชัน 160 ไบต์ทางเลือกที่ใช้งานได้กับหมายเลขโทรศัพท์ที่มีความยาวตามอำเภอใจ (และขนาดเท่ากัน): TIO


คุณสามารถเปลี่ยน(/|_)ไป[/_]เป็นบันทึก 1 ไบต์ นอกจากนี้ฉันคิดว่าคุณสามารถใช้;แทนxเพื่อที่[^x]จะกลายเป็น\w
Kritixi Lithos

1

PHP, 251 236 ไบต์

for(;a&$c=preg_replace(["#[^_?](?!\?)#","#_#"],["$0k","?<"],join("-",$argv))[++$i];)${$k+="-"==$c}.=$c<_&$c>=A?0|(ord($c)-($c>W)-($c>P)-59)/3:$c;for(;$c=${1}[$k+1];)echo($n=${1}[$k])==($m=${2}[$k++])|($b=${2}[$k++])!=$c?$c>$b?$n:$m:"?";

รับอินพุตจากบรรทัดรับคำสั่ง ทำงานด้วย-nrหรือลองออนไลน์

ชำรุด

# A: transform input
                                    # 2. replace single chars with two-character chunk and make sortable:
                                    #   replace "_" with "?<", append "k" to everything else not followed by "?"
for(;a&$c=preg_replace(["#[^_?](?!\?)#","#_#"],["$0k","?<"],join("-",$argv))[++$i];)    # (unknown "<" < unsure "?" < certain "k")
${$k+="-"==$c}.=                # if "-", next argument
        $c<_&$c>=A              # if letter
            ?0|(ord($c)-($c>W)-($c>P)-59)/3 # then translate to digit
            :$c                             # else don´t
    ;
# B: evaluate
for(;$c=${1}[$k+1];)            # loop through arguments: $c=command 2
    echo
        ($n=${1}[$k])                   # $n=digit 2
        ==                          # if digits are equal
        ($m=${2}[$k++])                 # $m=digit 3
        |
        ($b=${2}[$k++])             # $b=command 3
        !=$c                        # or "commands" are not
            ?$c>$b?$n:$m            # then get the one with the more definitive "command"
            :"?"                    # else conflict/unknown
    ;

golfings

  • preg_replace แรก: -8 ไบต์
  • join: -2
  • $$kแทน$t[$k]: -5

1

PHP, 200 + 8 ไบต์

แรงบันดาลใจจากการแก้ปัญหา Arnaulds

for($s=join($argv);$c=ord($s[$i++]);$i+=$x)$t[]=$c>90?63:15&($c<65?$c:($c-($c>80)-($c>87)-59)/3)|16*$x="?"==$s[$i];for(;$p++<10;)echo chr(($e=$t[$p]^$d=$t[$p+10])&48|!(15&$e)?min($t[$p],$d)&15|48:63);

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง ทำงานด้วย-nrหรือลองออนไลน์

การแก้ไขเพื่อให้สอดคล้องกับข้อ จำกัด การส่งออกข้อผิดพลาด: (พิมพ์Xสำหรับหมายเลขที่ไม่สมบูรณ์):

  • ลบ|48(-3 ไบต์)
  • แทนที่echo chr(...);ด้วย$r.=...;echo$r>1e10?X:$r;(+11 ไบต์)

ชำรุด

for($s=join($argv);$c=ord($s[$i++]);    # loop through characters of arguments
    $i+=$x)                             # skip "?"
$t[]=
    $c>90                               # if "_"
        ?63                             # then 32+16+15
        :                               # else
            15&(                            # lower 4 bits of
            $c<65                               # if digit
            ?$c                                 # then digit
            :($c-($c>80)-($c>87)-59)/3          # else letter mapped to digit
        )
        |16*$x="?"==$s[$i]                  # if next char is "?", add 16
;
for(;$p++<10;)echo chr( # loop through translated arguments
    (
        $e=$t[$p]^      # 2. $e=difference
        $d=$t[$p+10]    # 1. $d=char from 2nd argument
    )&48                # if certainties differ
    |!(15&$e)           #    or digits do not
    ?min($t[$p],$d)&15|48   # then pick the more definite digit (15|48 -> "?")
    :63             # else "?"
);

golfings

  • หลีกpreg_replace_callbackเลี่ยง (-10 ไบต์)
  • พึ่งพาอินพุต 10 หลัก (-9)
  • และการเล่นกอล์ฟเพิ่มเติม (-8)
  • ลบjoinตัวคั่น (-7)
  • ย้ายการ$xมอบหมายไปยังจุดสิ้นสุด (-2)

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