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:
Basierend auf der Ausgabe von Jonathan Allans Eintrag (die formatierte Ausgabe war ideal).
" / "
, annehmen oder können wir sie einfach als zwei Standardeingaben annehmen?Antworten:
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Ọ
.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?
quelle
55_____088 / 54?2397207?7?
sollte5523972088
: 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.Python 2 ,
314307274 BytesProbieren Sie es online!
quelle
Python 3,
549530509453449410406394393391 BytesIch bin mir sicher, dass dies verbessert werden kann, aber es ist ein Anfang:
Ich benutze
str.translate
für die Buchstaben eine Wrapper-Funktiong
, um die Eingaben in dem Format zu machen, in dem ich sie haben möchte. Die eigentliche Funktionf
ist 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:
str.isnumeric
in ein Schlüsselwortargument eingegeben wurdeT==q!=O
)not(e or z)
in gespeicherte+z in(e,z)
.(E,Z)
quelle
map(chr,range(65,91))
.JavaScript (ES6),
180 -190 -188 ByteBearbeiten:
+10+9 Bytes, um der Regel für die fehlerhafte Ausgabe zu entsprechenÜbernimmt die beiden Eingabezeichenfolgen in Currying-Syntax
(a)(b)
. Gibt entweder einefalse
oder eine Zeichenfolge zurück, die die erratene Telefonnummer darstellt.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:Was umgekehrt wie folgt interpretiert werden kann:
Wir bewerben uns
F()
bei beidena
undb
. 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:
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:
Die letzten beiden Bedingungen können zusammengeführt werden
!(d % x)
. Daher die endgültige Formel: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.)
Code-Snippet anzeigen
quelle
1234567890? / 1234567890?
sollte auflösen1234567890
. Im Moment gibt Ihr Code etwas aus,123456789?
das noch weniger aussagekräftig ist als die Eingabe.Assume: 5? / 5? -> 5 //uncertain, but matching
Perl 5 , 211 Bytes
... ohne Einrückung und \ n Zeilenumbrüche
Probieren Sie es online!
quelle
83652618?0
) und nicht irgendeine Art von Falschmeldung oder Fehlerwert.?
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).
Retina,
150140136 BytesDank Kritixi Lithos konnten ein paar Bytes eingespart werden
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" (zB5? \ 4
würden ersetzt durch4 \ 4
). Nachdem Sie alle#
s entfernt haben, behandeln die Zeilen 8 und 9 die_
Fälle "Anzahl vs. " (_ \ 3
wird3 \ 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
quelle
(/|_)
to ändern[/_]
, um 1 Byte zu speichern. Auch ich denke, Sie können;
anstelle von verwenden,x
so dass werden[^x]
kann\w
PHP,
251236 BytesNimmt Eingaben von der Kommandozeile entgegen; Laufen Sie mit
-nr
oder versuchen Sie es online .Nervenzusammenbruch
Golfen
preg_replace
zuerst: -8 Bytesjoin
: -2$$k
statt$t[$k]
: -5quelle
PHP, 200 + 8 Bytes
inspiriert von Arnaulds Lösung .
Nimmt Eingaben von Befehlszeilenargumenten entgegen. Laufen Sie mit
-nr
oder versuchen Sie es online .Änderungen zur Einhaltung der Fehlerausgabe-Einschränkung: (Ausdruck
X
für eine unvollständige Nummer):|48
(-3 Bytes)echo chr(...);
durch$r.=...;echo$r>1e10?X:$r;
(+11 Bytes)Nervenzusammenbruch
Golfen
preg_replace_callback
(-10 Bytes)join
Trennzeichen entfernt (-7)$x
Zuordnung zum Ende (-2)quelle
Perl 5
-pl
, 173 BytesProbieren Sie es online!
quelle