Verstümmelte Telefonnummern


19

Sie wissen, wie Sie eine Voicemail-Nachricht erhalten und die Verbindung der Person war nicht gut, und Sie versuchen herauszufinden, wie Sie sie zurückrufen können, sind sich aber nicht sicher, ob dies eine "5" oder eine "8" war sagte?

Das ist diese Herausforderung.

Die gute Nachricht ist, dass der Anrufer seine Nummer zweimal vorliest, sie aber an beiden Stellen verstümmelt ist.

Ihr Programm sollte Eingaben wie diese annehmen:

5551231234 / 5551231234

Wo die ersten zehn Stellen das erste Mal sind, wird die Telefonnummer in der Voicemail gesagt, und der zweite Satz ist das zweite Mal, dass sie gesagt wird. Nur ... es wird ungefähr so ​​aussehen:

555?ABC1_36? / 55?522_1?234
  • Eine Ziffer gefolgt von einem Fragezeichen bedeutet, dass dies die beste Vermutung für diese Ziffer ist (z. B. "5?" Bedeutet "wahrscheinlich eine 5, vergleiche mit Wiederholung").
  • Ein Unterstrich zeigt eine bekannte fehlende Ziffer an, die durch statische Aufladung zu unscharf ist, als dass sie überhaupt entschlüsselt werden könnte.
  • Buchstaben sind genau das: Buchstaben. Behandle sie als ihre jeweiligen Ziffern
    • ABC -> 2, DEF -> 3, WHI -> 4, JKL -> 5, MNO -> 6, PQRS -> 7, TÜV -> 8, WXYZ -> 9
    • Alle Beispieleingaben verwenden Großbuchstaben (Sie können einen ToUpper () - Aufruf sicher auslassen).
    • Wenn Ihre Sprache in Kleinbuchstaben besser funktioniert, können Sie Kleinbuchstaben für die Eingabe verwenden und einen ToLower () -Aufruf auslassen. Beachten Sie dies einfach in Ihrer Antwort.

Sie können zusätzlich folgende Urteilsforderungen annehmen:

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

Außerdem können Sie davon ausgehen, dass alle Eingaben zehnstellige Telefonnummern enthalten, ohne die Fragezeichen. Eingaben, die nicht aus zehn Ziffern bestehen (z. B. 1234567 / 1234567), können entweder als unlösbar (falsche Ausgabe) behandelt werden oder einen Fehler auslösen.

Eingang

Eine Zeichenzeile 0-9A-Z _?/, wie oben beschrieben.

Ausgabe

Wenn eine einzige gültige zehnstellige Telefonnummer angegeben werden kann, geben Sie die Telefonnummer aus. Andernfalls wird eine Fehleranzeige ausgegeben (z. B. -1, false oder eine leere Zeile).

Kürzeste Siege wie gewohnt.

Beispieleingaben:

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

Ich habe nur versichert, dass jeder mögliche Randfall abgedeckt ist (die ersten 11 Einträge), aber abgesehen davon ist es ziemlich zufällig.

Aktualisieren

Vier Einträge am unteren Rand mit führenden Nullen hinzugefügt (auf Vorschlag von Jonathan Allan).

Richtige Ausgabe für die Sample-Eingänge:

https://pastebin.com/gbCnRdLV

Basierend auf der Ausgabe von Jonathan Allans Eintrag (die formatierte Ausgabe war ideal).


Müssen wir die Eingaben als eine einzelne Zeichenfolge, getrennt durch " / ", annehmen oder können wir sie einfach als zwei Standardeingaben annehmen?
L3viathan

@ L3viathan Ich hatte ursprünglich die Idee gehabt, eine einzige Saite nehmen zu müssen.
Draco18s

7
@ Draco18s Einzelsaite bringt nichts zur Herausforderung
f --n17tɛk

1
@ fəˈnəˈtɪk Niemand hat etwas in der Sandbox gesagt, aber ich habe nichts dagegen , Eingabepaare zu verwenden. Es war genau so, wie ich es ursprünglich gedacht hatte.
Draco18s

1
Wer hinterlässt eine Voicemail mit Buchstaben als Telefonnummer ?!
Jonathan Allan

Antworten:


3

Gelee , 84 Bytes

+4 Bytes - Ich denke, es sollte sich wahrscheinlich in allen Fällen gleich verhalten, also habe ich die Ganzzahlen der Tastatursuche wieder in Ziffern umgewandelt, indem ich verwendet habe +49Ọ.

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

Eine Funktion, die die Zeichenfolge im angegebenen Format verwendet und die Telefonnummer als Liste von Zeichen oder Null zurückgibt, wenn sie ungültig ist. Als Programm wird dies so gedruckt, als wäre es eine Zeichenkette.

So wie es funktioniert, könnten sie die Zahl mehrmals wiederholen
(zB "123456789_ / 123456789_ / 1234567890")
... oder sogar nur einmal sagen, und die definierte Logik wird angewendet.

Probieren Sie es online! , oder sehen Sie sich alle Beispieleingaben an .

Wie?

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

Möglicherweise liegt ein Fehler vor, der behoben werden 55_____088 / 54?2397207?7?sollte 5523972088: Alle fehlenden Ziffern sind vorhanden, und die unsicheren Ziffern auf der rechten Seite sind auf der linken Seite verfügbar. Alle vereinfachenden Fälle laufen jedoch.
Draco18s

Ah, ich habe das entfernt, was ich für einen redundanten Filter hielt, das war es nicht. Fixing ...
Jonathan Allan

Ich war schon einmal dort - und es war kein Golf! ;)
Draco18s

Ooof das hat eine Weile gedauert (ich habe einen anderen Fehler gefunden, als ich es getestet habe), habe es wieder auf die gleiche Byteanzahl gebracht, als ich nur den Filter wieder hinzugefügt habe, als ich das behoben habe (puh).
Jonathan Allan

@Draco18s - Sieht für dich alles gut aus? Es kann sinnvoll sein, die erwartete Ausgabe für die Testfälle in der Frage anzugeben oder die ungültigen Fälle einfach herauszusuchen.
Jonathan Allan

7

Python 2 , 314 307 274 Bytes

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

Probieren Sie es online!


5

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

Ich bin mir sicher, dass dies verbessert werden kann, aber es ist ein Anfang:

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

Ich benutze str.translatefür die Buchstaben eine Wrapper-Funktion g, um die Eingaben in dem Format zu machen, in dem ich sie haben möchte. Die eigentliche Funktion fist rekursiv und schlägt bei mehrdeutigen Eingaben fehl. Ich habe immer noch viele Wiederholungen, daher bin ich mir sicher, dass es viel Raum für Verbesserungen gibt.

Verbesserungen:

  • Durch Kombinieren von Bedingungen wurden 19 Byte eingespart
  • 21 Bytes mit Ternaries gespeichert
  • Dank @TuukkaX konnten 56 Byte mithilfe eines Wörterbuchverständnisses anstelle des manuellen Wörterbuchs eingespart werden
  • 4 Bytes gespart, indem auf die von @ovs vorgeschlagene Methode umgeschaltet wurde, mit der Verbesserung von @ TuukkaX
  • 38 Bytes mit Verbesserungen von @ovs gespeichert (und das letzte entfernbare Leerzeichen entfernt)
  • 4 Bytes gespart, indem die Definition str.isnumericin ein Schlüsselwortargument eingegeben wurde
  • 12 Bytes mit kombinierten Vergleichsoperatoren gespart (zB T==q!=O)
  • 1 Byte durch Drehen not(e or z)in gespeichert e+z in(e,z).
  • 2 Bytes gespart durch Speichern der häufig verwendeten (E,Z)



@ovs Schön. Das Alphabet kann jedoch geändert werden map(chr,range(65,91)).
Yytsi

2
RE: Wenn man dies zu einem Community-Wiki macht, um auf den Ruf zu verzichten, wäre der Konsens nein .
Jonathan Allan

1
Ich schwöre jedes Mal, wenn ich hierher zurückkomme, wird diese Antwort kürzer: D
Draco18s

3

JavaScript (ES6), 180 - 190 - 188 Byte

Bearbeiten: +10 +9 Bytes, um der Regel für die fehlerhafte Ausgabe zu entsprechen


Übernimmt die beiden Eingabezeichenfolgen in Currying-Syntax (a)(b). Gibt entweder eine falseoder eine Zeichenfolge zurück, die die erratene Telefonnummer darstellt.

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

Wie es funktioniert

Schritt 1 - Analysieren der Eingabezeichenfolgen

Wir definieren zunächst die F()Funktion, die einen String in ein Array von Ganzzahlen übersetzt, indem wir die folgenden Regeln anwenden:

  • Der Unterstrich wird in 0 umgewandelt
  • eine Ziffer N oder ein äquivalenter Buchstabe wird in (N + 1) ODER 16 umgewandelt (z. B. "2" → 19, "R" → 24)
  • Eine Ziffer N oder ein äquivalenter Buchstabe, gefolgt von einem Abfragezeichen, wird in N + 1 umgewandelt (z. B. "2?" → 3, "R?" → 8).

Was umgekehrt wie folgt interpretiert werden kann:

  • 0 unbekannt
  • [ 1 .. 10 ]unzuverlässig
  • [ 17 .. 26 ]zuverlässig

Wir bewerben uns F()bei beiden aund b. Dies gibt uns ein Paar von Ganzzahlen (x, y) für jede Ziffer in der Telefonnummer, entsprechend den zwei möglichen Interpretationen.

Schritt 2 - Erraten der Ziffern

Für jedes Paar (x, y) berechnen wir:

  • d = x XOR y
  • x = MAX (x, y) zuverlässige Werte werden immer unzuverlässigen vorgezogen

Wenn x == 0 , bedeutet dies, dass beide Eingaben Unterstriche sind. Die Ziffer ist in diesem Fall also unbekannt.

Wenn x! = 0 ist , können wir die Ziffer sicher ableiten, wenn eine der folgenden Bedingungen erfüllt ist:

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

Die letzten beiden Bedingungen können zusammengeführt werden !(d % x). Daher die endgültige Formel:

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

Wenn dies zutrifft, konvertieren wir x zurück in die erratene Ziffer, indem wir (x - 1) UND 15 berechnen .

Testfälle

(Nur die 50 ersten, da das Konsolen-Snippet keinen weiteren Ausgabeverlauf unterstützen kann.)


1234567890? / 1234567890?sollte auflösen 1234567890. Im Moment gibt Ihr Code etwas aus, 123456789?das noch weniger aussagekräftig ist als die Eingabe. Assume: 5? / 5? -> 5 //uncertain, but matching
Draco18s

@ Draco18s Entgegen meiner Aussage habe ich 51 Testfälle eingeschlossen. Also wurde der erste fallen gelassen und alles um eine Reihe verschoben. (Jetzt behoben. Entschuldigung.)
Arnauld

Aaah. Trotzdem sollte es eine Art Falsch- oder Fehlerwert für diese Testfälle ausgeben. Sieht aber sonst gut aus.
Draco18s

2

Perl 5 , 211 Bytes

... ohne Einrückung und \ n Zeilenumbrüche

@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

Probieren Sie es online!


Sieht so aus, als würde es "das Beste geben, was es kann" ( 83652618?0) und nicht irgendeine Art von Falschmeldung oder Fehlerwert.
Draco18s

Welches ist, was das Puzzle wollte, wenn ich mich nicht irre. Schauen Sie sich die Fälle unter der Überschrift "Sie können zusätzlich folgende Urteilsaufforderungen annehmen" an. Oder nicht?
Kjetil S.

Entschuldigung, ich habe nie eine Benachrichtigung über Ihre Antwort erhalten (keine Erwähnung). In dem Abschnitt, den ich für die Urteilsaufforderungen erstellt habe, wird ein verwendet, ?um anzuzeigen, dass es keine Möglichkeit gibt, die fehlenden Informationen zu beheben, die dann in den ...Otherwise output some form of error indication (e.g. -1, false, or an empty line).
Ausgabeabschnitt gelangen

2

Retina, 150 140 136 Bytes

Dank Kritixi Lithos konnten ein paar Bytes eingespart werden

T`?L`#22233344455566677778889
./.

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

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

Probieren Sie es online!

Erläuterung:

Die erste Zeile wandelt alle ?Eingaben in #und alle Buchstaben in ihre numerischen Äquivalente um. Wir entfernen dann die Leerzeichen und /aus der Eingabe. Die nächsten beiden Zeilen kümmern sich um Fälle "Vermutung vs. Gewissheit" (zB 5? \ 4würden ersetzt durch 4 \ 4). Nachdem Sie alle #s entfernt haben, behandeln die Zeilen 8 und 9 die _Fälle "Anzahl vs. " ( _ \ 3wird 3 \ 3). Wenn dann beide Hälften der Zeichenfolge übereinstimmen, behalten wir die ersten 10 Ziffern bei. Andernfalls ist die Telefonnummer ungültig, sodass wir alles entfernen.

Alternative 160-Byte-Lösung, die für Telefonnummern beliebiger Länge (und gleicher Größe) funktioniert: TIO


Sie können das (/|_)to ändern [/_], um 1 Byte zu speichern. Auch ich denke, Sie können ;anstelle von verwenden, xso dass werden [^x]kann\w
Kritixi Lithos

1

PHP, 251 236 Bytes

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

Nimmt Eingaben von der Kommandozeile entgegen; Laufen Sie mit -nroder versuchen Sie es online .

Nervenzusammenbruch

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

Golfen

  • preg_replace zuerst: -8 Bytes
  • join: -2
  • $$kstatt $t[$k]: -5

1

PHP, 200 + 8 Bytes

inspiriert von Arnaulds Lösung .

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

Nimmt Eingaben von Befehlszeilenargumenten entgegen. Laufen Sie mit -nroder versuchen Sie es online .

Änderungen zur Einhaltung der Fehlerausgabe-Einschränkung: (Ausdruck Xfür eine unvollständige Nummer):

  • entfernen |48(-3 Bytes)
  • ersetzen echo chr(...);durch $r.=...;echo$r>1e10?X:$r;(+11 Bytes)

Nervenzusammenbruch

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

Golfen

  • umgehen preg_replace_callback(-10 Bytes)
  • Verlassen Sie sich auf 10-stellige Eingabe (-9)
  • und zusätzliches Golfen (-8)
  • joinTrennzeichen entfernt (-7)
  • Verschobene $xZuordnung zum Ende (-2)

1

Perl 5 -pl , 173 Bytes

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

Probieren Sie es online!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.