Số điện thoại bị xáo trộn


19

Bạn biết làm thế nào bạn nhận được một tin nhắn thư thoại và kết nối của người đó không tốt và bạn đang cố gắng tìm cách gọi lại cho họ, nhưng bạn không chắc đó là "5" hay "8" họ nói?

Đó là thử thách này.

Tin tốt là người gọi đã đọc số của họ hai lần, nhưng nó bị cắt xén ở cả hai nơi.

Chương trình của bạn sẽ nhận đầu vào như thế này:

5551231234 / 5551231234

Trong đó mười chữ số đầu tiên là lần đầu tiên số điện thoại được nói trong hộp thư thoại và bộ thứ hai là lần thứ hai được nói. Chỉ ... nó sẽ trông giống như thế này:

555?ABC1_36? / 55?522_1?234
  • Một chữ số theo sau một dấu hỏi có nghĩa là đó là dự đoán đúng nhất cho chữ số đó (ví dụ: "5?" Có nghĩa là "có thể là 5, so sánh với lặp lại").
  • Một dấu gạch dưới chỉ ra một chữ số bị thiếu đã biết, một cái gì đó quá mờ bởi tĩnh để được giải mã.
  • Chữ cái chỉ là: chữ cái. Coi chúng như những chữ số tương ứng
    • ABC -> 2, DEF -> 3, GHI -> 4, JKL -> 5, MNO -> 6, PQRS -> 7, TUV -> 8, WXYZ -> 9
    • Tất cả các đầu vào mẫu đều sử dụng chữ hoa (bạn có thể bỏ qua cuộc gọi ToUpper () một cách an toàn)
    • Nếu ngôn ngữ của bạn hoạt động tốt hơn trong chữ thường, bạn có thể tự do sử dụng chữ thường cho đầu vào và bỏ qua cuộc gọi ToLower (). Chỉ cần lưu ý rằng trong câu trả lời của bạn.

Bạn cũng có thể giả sử các cuộc gọi phán xét sau:

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

Ngoài ra, bạn có thể giả định rằng tất cả các đầu vào sẽ chứa các số điện thoại mười chữ số, không bao gồm các dấu hỏi. Các đầu vào không có mười chữ số (ví dụ 1234567 / 1234567) có thể được coi là không thể giải được (đầu ra falsey) hoặc gây ra lỗi.

Đầu vào

Một dòng ký tự 0-9A-Z _?/, như được mô tả ở trên.

Đầu ra

Nếu nó có thể được phân tích thành một số điện thoại mười chữ số hợp lệ duy nhất, hãy xuất số điện thoại. Mặt khác, xuất một số dạng dấu hiệu lỗi (ví dụ -1, false hoặc một dòng trống).

Chiến thắng ngắn nhất, như thường lệ.

Đầu vào mẫu:

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

Tôi chỉ bảo đảm rằng mọi trường hợp cạnh có thể được bảo hiểm (11 mục đầu tiên), nhưng ngoài ra, điều đó khá ngẫu nhiên.

Cập nhật

Bốn mục ở phía dưới được thêm vào các số 0 đứng đầu (theo gợi ý của Jonathan Allan).

Đầu ra chính xác cho các đầu vào mẫu:

https://pastebin.com/gbCnRdLV

Dựa trên đầu ra từ mục nhập của Jonathan Allan (đầu ra được định dạng là lý tưởng).


Chúng ta có phải lấy các đầu vào dưới dạng một chuỗi, tách biệt " / "hoặc chúng ta có thể lấy chúng làm hai đầu vào tiêu chuẩn không?
L3viathan

@ L3viathan Ban đầu tôi đã hình dung ý tưởng là phải lấy một chuỗi.
Draco18

7
Chuỗi đơn của Draco18s không mang lại bất kỳ điều gì cho thử thách
fnɛtɪk

1
@ fəˈnɛtɪk Không ai nói gì trong hộp cát, nhưng tôi không có gì chống lại việc sử dụng các cặp đầu vào. Đó chỉ là cách tôi nghĩ ban đầu.
Draco18

1
Ai để lại một thư thoại bằng cách sử dụng các chữ cái cho số điện thoại của họ?!
Jonathan Allan

Câu trả lời:


3

Thạch , 84 byte

+4 byte - Tôi nghĩ rằng nó có thể hoạt động giống nhau trong mọi trường hợp, vì vậy tôi đã chuyển đổi số nguyên tra cứu bàn phím trở lại thành ký tự chữ số bằng cách sử dụng +49Ọ.

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

Hàm lấy chuỗi ở định dạng đã chỉ định và trả về số điện thoại dưới dạng danh sách ký tự hoặc 0 nếu không hợp lệ. Như một chương trình, nó được in như thể nó là một chuỗi.

Cách thức hoạt động, họ có thể lặp lại số lần nhiều hơn
(ví dụ "123456789_ / 123456789_ / 1234567890")
... hoặc thậm chí chỉ nói một lần và logic được xác định sẽ được áp dụng.

Hãy thử trực tuyến! hoặc xem tất cả các đầu vào mẫu .

Làm sao?

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

Có vẻ như có thể có lỗi, 55_____088 / 54?2397207?7?nên giải quyết 5523972088: tất cả các chữ số còn thiếu và các chữ số không chắc chắn ở bên phải đều có sẵn ở bên trái. Tất cả các trường hợp đơn giản chạy mặc dù.
Draco18

Ah, tôi đã xóa những gì tôi nghĩ là một bộ lọc dư thừa, nó không phải là. Đang sửa chữa ...
Jonathan Allan

Đã ở đó trước đây - và đó không phải là golf! ;)
Draco18

Việc giả mạo đã khiến tôi mất một lúc (tôi đã tìm thấy một lỗi khác trong khi tôi đang kiểm tra nó), đã đưa nó trở lại cùng số byte giống như chỉ thêm lại bộ lọc khi sửa lỗi đó (whew).
Jonathan Allan

@ Draco18s - mọi thứ có tốt với bạn không? Nó có thể là tốt để cung cấp đầu ra dự kiến ​​cho các trường hợp thử nghiệm trong câu hỏi, hoặc có thể chỉ tách ra những trường hợp không hợp lệ.
Jonathan Allan

7

Python 2 , 314 307 274 byte

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="?"

Hãy thử trực tuyến!


5

Python 3, 549 530 509 453 449 410 406 394 393 391 byte

Tôi chắc chắn rằng điều này có thể được cải thiện, nhưng đó là một sự khởi đầu:

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

Tôi đang sử dụng str.translatecho các chữ cái và một hàm bao bọc gđể tạo các đầu vào theo định dạng mà tôi muốn chúng. Hàm thực tế flà đệ quy và sẽ thất bại đối với các đầu vào mơ hồ. Tôi vẫn còn rất nhiều sự sửa đổi trong đó, vì vậy tôi chắc chắn có nhiều chỗ để cải thiện.

Cải tiến:

  • đã lưu 19 byte bằng cách kết hợp các điều kiện
  • đã lưu 21 byte với ternaries
  • đã lưu 56 byte bằng cách hiểu từ điển thay vì từ điển thủ công, nhờ @TuukkaX
  • đã lưu 4 byte bằng cách chuyển sang phương thức được đề xuất bởi @ovs, với cải tiến của @ TuukkaX
  • đã lưu 38 byte với các cải tiến từ @ovs (và khoảng trắng có thể tháo rời cuối cùng bị xóa)
  • đã lưu 4 byte bằng cách đặt định nghĩa str.isnumerictrong một đối số từ khóa
  • đã lưu 12 byte với các toán tử so sánh kết hợp (ví dụ T==q!=O)
  • lưu 1 byte bằng cách chuyển not(e or z)thành e+z in(e,z).
  • lưu 2 byte bằng cách lưu thường xuyên sử dụng (E,Z)

Điều này chứa một sự hiểu biết từ điển không chứa mặc định hàng đầu. Tôi ghét các chuỗi 3, nhưng chúng có thể được thay thế bằng toán học.
Yytsi


@ovs Đẹp. Bảng chữ cái có thể được thay đổi map(chr,range(65,91))mặc dù.
Yytsi

2
RE: Biến đây thành một wiki cộng đồng để từ bỏ danh tiếng, sự đồng thuận sẽ là không , chỉ cần chấp nhận sự giúp đỡ tử tế và ghi nhận nó như bạn có.
Jonathan Allan

1
Tôi thề mỗi lần tôi quay lại đây, câu trả lời này trở nên ngắn gọn hơn: D
Draco18s

3

JavaScript (ES6), 180 190 188 byte

Chỉnh sửa: +10 +9 byte để tuân thủ quy tắc đầu ra giả


Lấy hai chuỗi đầu vào theo cú pháp currying (a)(b). Trả về một falsehoặc một chuỗi đại diện cho số điện thoại đoán.

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

Làm thế nào nó hoạt động

Bước # 1 - Phân tích chuỗi đầu vào

Trước tiên chúng ta xác định F()hàm dịch một chuỗi thành một mảng các số nguyên bằng cách áp dụng các quy tắc sau:

  • dấu gạch dưới được chuyển thành 0
  • một chữ số N hoặc một chữ cái tương đương được chuyển đổi thành (N + 1) HOẶC 16 (ví dụ: "2" → 19, "R" → 24)
  • một chữ số N hoặc một chữ cái tương đương theo sau dấu hỏi thẩm vấn được chuyển đổi thành N + 1 (ví dụ: "2?" → 3, "R?" → 8)

Điều này có thể được giải thích theo cách khác như sau:

  • 0 chưa biết
  • [ 1 .. 10 ]không đáng tin cậy
  • [ 17 .. 26 ]đáng tin cậy

Chúng tôi áp dụng F()cho cả ab. Điều này cho chúng ta một cặp số nguyên (x, y) cho mỗi chữ số trong số điện thoại, tương ứng với hai cách hiểu có thể có.

Bước # 2 - Đoán các chữ số

Đối với mỗi cặp (x, y) , chúng tôi tính toán:

  • d = x XOR y
  • x = MAX (x, y) các giá trị đáng tin cậy luôn được ưu tiên cho các giá trị không đáng tin cậy

Nếu x == 0 , điều đó có nghĩa là cả hai đầu vào đều là ký tự gạch dưới. Vì vậy, chữ số là không rõ trong trường hợp này.

Nếu x! = 0 , chúng ta có thể suy ra chữ số một cách an toàn nếu một trong các điều kiện sau là đúng:

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

Hai điều kiện cuối cùng có thể được hợp nhất với !(d % x). Do đó công thức cuối cùng:

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

Nếu đúng, chúng tôi chuyển đổi x trở lại chữ số đã đoán bằng cách tính toán (x - 1) VÀ 15 .

Các trường hợp thử nghiệm

(Chỉ 50 cái đầu tiên vì đoạn mã điều khiển không thể hỗ trợ thêm lịch sử đầu ra.)


1234567890? / 1234567890?nên giải quyết 1234567890. Ngay bây giờ mã đầu ra của bạn 123456789?thậm chí còn ít thông tin hơn đầu vào. Assume: 5? / 5? -> 5 //uncertain, but matching
Draco18

@ Draco18s Trái ngược với những gì tôi đã nêu, tôi bao gồm 51 trường hợp thử nghiệm. Vì vậy, cái đầu tiên đã bị loại bỏ và mọi thứ thay đổi bởi một hàng. (Hiện đã được sửa. Xin lỗi về điều đó.)
Arnauld

Aaah. Tuy nhiên, nó sẽ xuất ra một số loại giá trị falsey hoặc lỗi cho các trường hợp thử nghiệm đó. Nhưng nếu không thì có vẻ tốt.
Draco18

2

Perl 5 , 211 byte

... không có thụt lề và \ n dòng mới

@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

Hãy thử trực tuyến!


Có vẻ như nó trả về "tốt nhất có thể" ( 83652618?0) chứ không phải là một loại giá trị falsey hoặc lỗi.
Draco18

Đó là những gì câu đố muốn nếu tôi không nhầm. Nhìn vào các trường hợp dưới tiêu đề "Bạn cũng có thể đảm nhận các cuộc gọi phán xét sau". Hay không?
Kjetil S.

Xin lỗi, không bao giờ nhận được thông báo trả lời của bạn (không đề cập đến). Phần tôi đã thực hiện cho các cuộc gọi phán xét sử dụng a ?để chỉ ra rằng không có cách nào để giải quyết thông tin bị thiếu, sau đó sẽ chuyển sang phần Đầu ra:...Otherwise output some form of error indication (e.g. -1, false, or an empty line).
Draco18s

2

Võng mạc, 150 140 136 byte

Đã lưu một vài byte nhờ Kritixi Lithos

T`?L`#22233344455566677778889
./.

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

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

Hãy thử trực tuyến!

Giải trình:

Dòng đầu tiên biến đổi tất cả ?trong đầu vào thành #và tất cả các chữ cái thành số tương đương của chúng. Chúng tôi sau đó loại bỏ khoảng trắng và /từ đầu vào. Hai dòng tiếp theo xử lý các trường hợp "đoán so với chắc chắn" (ví dụ: 5? \ 4sẽ được thay thế bằng 4 \ 4). Sau khi xóa tất cả #s, dòng 8 và 9 xử lý _các trường hợp "số so với " ( _ \ 3trở thành 3 \ 3). Sau đó, nếu cả hai nửa của chuỗi khớp nhau, chúng tôi giữ 10 chữ số đầu tiên. Nếu không, số điện thoại không hợp lệ để chúng tôi xóa mọi thứ.

Giải pháp thay thế 160 byte hoạt động cho các số điện thoại có độ dài tùy ý (và kích thước bằng nhau): TIO


Bạn có thể thay đổi (/|_)để [/_]tiết kiệm 1 byte. Ngoài ra tôi nghĩ bạn có thể sử dụng ;thay vì xđể [^x]có thể trở thành\w
Kritixi Lithos

1

PHP, 251 236 byte

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:"?";

lấy đầu vào từ dòng lệnh; chạy với -nrhoặc thử trực tuyến .

phá vỡ

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

đánh gôn

  • preg_replace đầu tiên: -8 byte
  • join: -2
  • $$kthay vì $t[$k]: -5

1

PHP, 200 + 8 byte

lấy cảm hứng từ giải pháp 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);

lấy đầu vào từ các đối số dòng lệnh; chạy với -nrhoặc thử trực tuyến .

sửa đổi để tuân thủ các hạn chế đầu ra lỗi: (in Xcho một số chưa hoàn thành):

  • xóa |48(-3 byte)
  • thay thế echo chr(...);bằng $r.=...;echo$r>1e10?X:$r;(+11 byte)

phá vỡ

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

đánh gôn

  • làm việc xung quanh preg_replace_callback(-10 byte)
  • dựa vào đầu vào 10 chữ số (-9)
  • và chơi gôn bổ sung (-8)
  • xóa joindấu phân cách (-7)
  • chuyển $xnhiệm vụ đến cuối (-2)

1

Perl 5 -pl , 173 byte

sub t{$_=pop;y/A-Z/22233344455566677778889999/;/_|\d\??/g}@e=m|\S+|g;@a=t$e[0];$_=join"",map{$_.=shift@a;s/^(.+)\1$/$1/||s/_//||s/..../_/||s/.\?//;$_}t$e[2];s/\?//;$_ x=!/_/

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.