Zniekształcone numery telefonów

19

Wiesz, w jaki sposób otrzymujesz wiadomość głosową, a połączenie tej osoby nie było świetne, i próbujesz wymyślić, jak oddzwonić, ale nie jesteś pewien, czy to była „5” czy „8” powiedziany?

To jest wyzwanie.

Dobrą wiadomością jest to, że dzwoniący odczytał ich numer dwa razy, ale jest zniekształcony w obu miejscach.

Twój program powinien pobierać dane w następujący sposób:

5551231234 / 5551231234

Tam, gdzie pierwsze dziesięć cyfr jest pierwszym razem, gdy numer telefonu jest wypowiadany w poczcie głosowej, a drugi zestaw to drugi raz, gdy jest wypowiadany. Tylko ... będzie to wyglądało bardziej tak:

555?ABC1_36? / 55?522_1?234
  • Cyfra, po której następuje znak zapytania, oznacza, że ​​najlepiej zgadnąć z tą cyfrą (np. „5?” Oznacza „prawdopodobnie 5, porównaj z powtórzeniem”).
  • Podkreślenie wskazuje znaną brakującą cyfrę, coś zbyt zamglonego przez statyczne, aby w ogóle ją odczytać.
  • Litery są po prostu takie: litery. Traktuj je jak ich odpowiednie cyfry
    • ABC -> 2, DEF -> 3, GHI -> 4, JKL -> 5, MNO -> 6, PQRS -> 7, TUV -> 8, WXYZ -> 9
    • Wszystkie przykładowe dane wejściowe używają wielkich liter (możesz bezpiecznie pominąć wywołanie ToUpper ())
    • Jeśli Twój język działa lepiej małymi literami, możesz swobodnie używać małych liter do wprowadzania i pomijać wywołanie ToLower (). Po prostu zwróć uwagę na to w swojej odpowiedzi.

Możesz dodatkowo przyjąć następujące wezwania do oceny:

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

Dodatkowo możesz założyć, że wszystkie dane wejściowe będą zawierać dziesięciocyfrowe numery telefonów, nie uwzględniając znaków zapytania. Wejścia, które nie są dziesięciocyfrowe (np. 1234567 / 1234567), Mogą być traktowane jako nierozwiązywalne (wyjście falsey) lub wygenerować błąd.

Wejście

Jedna linia znaków 0-9A-Z _?/, jak opisano powyżej.

Wynik

Jeśli można go sparsować z jednym ważnym dziesięciocyfrowym numerem telefonu, wyślij numer telefonu. W przeciwnym razie wypisz jakąś formę wskazania błędu (np. -1, fałsz lub pusty wiersz).

Najkrótsze wygrane, jak zwykle.

Przykładowe dane wejściowe:

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

Zapewniłem tylko, że każdy możliwy przypadek jest objęty (pierwsze 11 wpisów), ale poza tym jest to dość losowe.

Aktualizacja

Cztery wpisy na dole dodane z zerami wiodącymi (zgodnie z sugestią Jonathana Allana).

Prawidłowe wyjście dla przykładowych danych wejściowych:

https://pastebin.com/gbCnRdLV

Na podstawie danych wyjściowych z wpisu Jonathana Allana (sformatowane dane wyjściowe były idealne).

Draco18s
źródło
Czy musimy traktować dane wejściowe jako pojedynczy ciąg, oddzielony " / ", czy możemy po prostu traktować je jako dwa standardowe dane wejściowe?
L3viathan 22.04.17
@ L3viathan Pierwotnie pomyślałem, że muszę wziąć jeden ciąg.
Draco18s,
7
@ Pojedynczy ciąg Draco18 nic nie wnosi do wyzwania
fəˈnɛtɪk
1
@ fəˈnɛtɪk Nikt nic nie powiedział w piaskownicy, ale nie mam nic przeciwko użyciu par danych wejściowych. Tak po prostu to sobie wyobrażałem.
Draco18s,
1
Kto zostawia pocztę głosową za pomocą liter numeru telefonu ?!
Jonathan Allan

Odpowiedzi:

3

Galaretka , 84 bajty

+4 bajty - myślę, że prawdopodobnie powinien zachowywać się tak samo we wszystkich przypadkach, więc przekonwertowałem liczby całkowite wyszukiwania klawiatury z powrotem na znaki cyfrowe za pomocą +49Ọ.

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

Funkcja, która przyjmuje ciąg znaków w określonym formacie i zwraca numer telefonu jako listę znaków lub zero, jeśli jest niepoprawny. Jako program jest to drukowane jak ciąg znaków.

W jaki sposób to działa, mogliby powtórzyć liczbę więcej razy
(np. "123456789_ / 123456789_ / 1234567890")
... lub nawet powiedzieć to tylko raz, a zastosowana zostanie logika.

Wypróbuj online! lub zobacz wszystkie przykładowe dane wejściowe .

W jaki sposób?

”?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)
Jonathan Allan
źródło
Wygląda na to, że może wystąpić błąd, 55_____088 / 54?2397207?7?powinien rozwiązać 5523972088: wszystkie brakujące cyfry są obecne, a niepewne cyfry po prawej stronie są dostępne po lewej stronie. Wszystkie uproszczone przypadki działają jednak.
Draco18s,
Ach, usunąłem coś, co uważałem za zbędny filtr, tak nie było. Naprawianie ...
Jonathan Allan,
Byłem tam wcześniej - i to nie był golf! ;)
Draco18s
Ooof, co zajęło mi trochę czasu (podczas testowania znalazłem inny błąd), przywróciłem go do tej samej liczby bajtów, jak po prostu dodając filtr podczas naprawy (chociaż).
Jonathan Allan
@ Draco18s - czy wszystko wygląda dobrze dla Ciebie? Dobrze byłoby podać oczekiwany wynik dla przypadków testowych w pytaniu lub może po prostu oddzielić niepoprawne.
Jonathan Allan
7

Python 2 , 314 307 274 bajtów

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

Wypróbuj online!

ovs
źródło
5

Python 3, 549 530 509 453 449 410 406 394 393 391 bajtów

Jestem pewien, że można to poprawić, ale to początek:

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

Używam str.translatedla liter i funkcji otoki, gaby wprowadzić dane w formacie, w którym chcę. Rzeczywista funkcja fjest rekurencyjna i nie powiedzie się w przypadku niejednoznacznych danych wejściowych. Nadal mam tam wiele powtórzeń, więc jestem pewien, że jest wiele miejsca na ulepszenia.

Ulepszenia:

  • zaoszczędzono 19 bajtów, łącząc warunki
  • zapisano 21 bajtów z trójskładnikami
  • dzięki @TuukkaX zapisano 56 bajtów przy użyciu słownika zamiast słownika ręcznego
  • zapisano 4 bajty, przechodząc na metodę sugerowaną przez @ovs, z ulepszeniem @ TuukkaX
  • zapisano 38 bajtów z ulepszeniami z @ovs (i usunięto ostatnią usuwalną spację)
  • zapisano 4 bajty, umieszczając definicję str.isnumericw argumencie słowa kluczowego
  • zapisano 12 bajtów z połączonymi operatorami porównania (np. T==q!=O)
  • zapisano 1 bajt, zamieniając się not(e or z)w e+z in(e,z).
  • zapisano 2 bajty, zapisując często używane (E,Z)
L3viathan
źródło
Zawiera słownik, który nie zawiera wartości domyślnych dla górnego rzędu. Nienawidzę sekwencji 3, ale można je zastąpić matematyką.
Yytsi
@ovs Nice. Alfabet można zmienić na map(chr,range(65,91))chociaż.
Yytsi
2
RE: Czyniąc to społeczną wiki, aby zrzec się reputacji, konsensus byłby nie , po prostu zaakceptuj miłą pomoc i pochwal ją tak jak ty.
Jonathan Allan
1
Przysięgam za każdym razem, gdy tu wracam, ta odpowiedź jest coraz krótsza: D
Draco18s,
3

JavaScript (ES6), 180 190 188 bajtów

Edycja: +10 +9 bajtów, aby zachować zgodność z regułą wyjścia falsy


Pobiera dwa ciągi wejściowe w składni curry (a)(b). Zwraca albo falseciąg reprezentujący odgadnięty numer telefonu.

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

Jak to działa

Krok # 1 - Analiza łańcuchów wejściowych

Najpierw definiujemy F()funkcję, która tłumaczy ciąg znaków na tablicę liczb całkowitych, stosując następujące reguły:

  • znak podkreślenia jest konwertowany na 0
  • cyfra N lub równoważna litera jest konwertowana na (N + 1) LUB 16 (np. „2” → 19, „R” → 24)
  • cyfra N lub równoważna litera, po której następuje znak zapytania, jest konwertowana na N + 1 (np. „2?” → 3, „R?” → 8)

Co można zinterpretować w następujący sposób:

  • 0 nieznany
  • [ 1 .. 10 ]zawodny
  • [ 17 .. 26 ]niezawodny

Dotyczy F()to zarówno ai b. To daje nam parę liczb całkowitych (x, y) dla każdej cyfry numeru telefonu, odpowiadającą dwóm możliwym interpretacjom.

Krok # 2 - Odgadywanie cyfr

Dla każdej pary (x, y) obliczamy:

  • d = x XOR y
  • x = MAKS (x, y) wartości wiarygodne są zawsze preferowane od wartości niewiarygodnych

Jeśli x == 0 , oznacza to, że oba wejścia są znakami podkreślenia. W związku z tym cyfra jest nieznana.

Jeśli x! = 0 , możemy bezpiecznie wydedukować cyfrę, jeśli spełniony jest jeden z następujących warunków:

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

Dwa ostatnie warunki można połączyć !(d % x). Stąd ostateczna formuła:

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

Jeśli to prawda, konwertujemy x z powrotem na odgadniętą cyfrę obliczając (x - 1) ORAZ 15 .

Przypadki testowe

(Tylko 50 pierwszych, ponieważ fragment konsoli nie obsługuje większej historii danych wyjściowych.)

Arnauld
źródło
1234567890? / 1234567890?powinien rozwiązać 1234567890. W tej chwili kod wyjściowy, 123456789?który jest jeszcze mniej pouczający niż dane wejściowe. Assume: 5? / 5? -> 5 //uncertain, but matching
Draco18s,
@ Draco18s Wbrew temu, co powiedziałem, zawarłem 51 przypadków testowych. Tak więc pierwszy został upuszczony i wszystko przesunięto o jeden rząd. (Teraz naprawione. Przepraszam za to.)
Arnauld
Aaa Mimo to powinien wyprowadzać pewnego rodzaju falsey lub wartość błędu dla tych przypadków testowych. Ale poza tym wygląda dobrze.
Draco18s,
2

Perl 5 , 211 bajtów

... bez wcięć i \ n nowych linii

@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

Wypróbuj online!

Kjetil S.
źródło
Wygląda na to, że zwraca „najlepiej jak potrafi” ( 83652618?0), a nie jakąś wartość falsey lub błędu.
Draco18s,
Tego właśnie chciała łamigłówka, jeśli się nie mylę. Spójrz na sprawy pod nagłówkiem „Możesz dodatkowo przyjąć następujące wezwania do osądu”. Albo nie?
Kjetil S.
Niestety, nigdy nie otrzymałem powiadomienia o Twojej odpowiedzi (bez wzmianki). W sekcji, którą zrobiłem dla wywołań wyroku, używa się ?...Otherwise output some form of error indication (e.g. -1, false, or an empty line).
znaku,
2

Siatkówka, 150 140 136 bajtów

Zaoszczędź kilka bajtów dzięki Kritixi Lithos

T`?L`#22233344455566677778889
./.

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

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

Wypróbuj online!

Wyjaśnienie:

Pierwszy wiersz przekształca wszystko ?na wejściu #i wszystkie litery na ich numeryczne odpowiedniki. Następnie usuwamy spacje i /dane wejściowe. Następne dwa wiersze zajmują się przypadkami „zgadnij a pewność” (np. 5? \ 4Zostaną zastąpione przez 4 \ 4). Po usunięciu wszystkich #s wiersze 8 i 9 zajmują się przypadkami „liczba kontra _” ( _ \ 3staje się 3 \ 3). Następnie, jeśli obie połówki łańcucha pasują, zachowujemy pierwsze 10 cyfr. W przeciwnym razie numer telefonu jest nieprawidłowy, więc usuwamy wszystko.

Alternatywne rozwiązanie 160-bajtowe, które działa na numery telefonów o dowolnej długości (i jednakowej wielkości): TIO

ćpun matematyki
źródło
Można zmienić (/|_), aby [/_]zapisać 1 bajt. Myślę też, że możesz użyć ;zamiast tego, xaby [^x]stać się\w
Kritixi Lithos
1

PHP, 251 236 bajtów

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

pobiera dane z wiersza poleceń; uruchom -nrlub wypróbuj online .

awaria

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

golfa

  • preg_replace pierwszy: -8 bajtów
  • join: -2
  • $$kzamiast $t[$k]: -5
Tytus
źródło
1

PHP, 200 + 8 bajtów

zainspirowany rozwiązaniem 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);

pobiera dane wejściowe z argumentów wiersza poleceń; uruchom -nrlub wypróbuj online .

modyfikacje zgodne z ograniczeniem wyjścia błędu: (wydrukuj Xdla niekompletnej liczby):

  • usuń |48(-3 bajty)
  • zastępuje echo chr(...);się $r.=...;echo$r>1e10?X:$r;(+11 bajtów)

awaria

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

golfa

  • obejść preg_replace_callback(-10 bajtów)
  • polegać na wprowadzeniu 10 cyfr (-9)
  • i dodatkowe gry w golfa (-8)
  • usunięty joinogranicznik (-7)
  • przeniesiono $xprzypisanie do końca (-2)
Tytus
źródło
1

Perl 5 -pl , 173 bajtów

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=!/_/

Wypróbuj online!

Xcali
źródło