Wenn Sie das Buch Contact von Carl Sagan gelesen haben , kommt Ihnen diese Herausforderung vielleicht bekannt vor.
Wenn Sie einen Satz mathematischer Gleichungen eingeben, der aus einer Zahl, einem unbekannten Operator, einer anderen Zahl und einem Ergebnis besteht, können Sie ableiten, welche Operatoren Addition, Subtraktion, Multiplikation oder Division darstellen.
Jede Eingabegleichung besteht immer aus
- eine nicht negative ganze Zahl
- einen der Buchstaben
A
,B
,C
, oderD
- eine andere nicht negative ganze Zahl
- der Charakter
=
- eine letzte nicht negative ganze Zahl
zusammen verkettet. Eine mögliche Eingabe ist beispielsweise 1A2=3
, aus der Sie ableiten können, dass dies A
eine Addition darstellt. Jede der ganzen Zahlen wird befriedigen 0 ≤ x ≤ 1,000
.
Es ist jedoch nicht immer so einfach. Es kann zu Unklarheiten kommen zwischen:
5A0=5
: Addition Subtraktion1A1=1
: Multiplikation / Division0A5=0
: Multiplikation / Division2A2=4
: Addition / Multiplikation4A2=2
: Subtraktion / Division0A0=0
: Addition / Subtraktion / Multiplikation
und so weiter. Die Herausforderung besteht darin, diese Fähigkeit zu nutzen, um in Kombination mit dem Eliminierungsprozess die Auswahl einzugrenzen und herauszufinden, welchen Operator jeder Buchstabe darstellt. (Es wird immer mindestens eine Eingabegleichung geben, und es wird immer möglich sein, jeden in der Eingabe verwendeten Buchstaben eindeutig einem einzelnen Operator zuzuordnen.)
Angenommen, die Eingabe besteht aus den folgenden Gleichungen:
0A0=0
: Hiermit wird A auf Addition, Subtraktion oder Multiplikation eingegrenzt (kann nicht durch 0 dividiert werden).10B0=10
: B muss entweder Addition oder Subtraktion sein.5C5=10
: C ist offensichtlich Addition, die B-Subtraktion macht, die A-Multiplikation macht.
Daher sollte die Ausgabe für diese Eingangsgleichungen A
mit *
, B
mit -
und C
mit übereinstimmen +
.
Die Eingabe kann entweder als einzelne, durch Leerzeichen / Kommas getrennte Zeichenfolge oder als Array von Zeichenfolgen erfolgen, die jeweils eine Gleichung darstellen. Die Ausgabe kann entweder eine einzelne Zeichenfolge ( "A*B-C+"
), ein Array ( ["A*", "B-", "C+"]
) oder ein wörterbuch- / diktähnliches 2D-Array ( {"A": "*", ...}
oder [["A", "*"], ...]
) sein.
Sie können davon ausgehen, dass eine Zahl niemals durch eine andere Zahl geteilt wird, durch die sie nicht teilbar ist.
Da es sich um Code-Golf , der kürzeste Code in Bytes gewinnt.
Testfälle:
In Out
-------------------------------
0A0=0 10B0=10 5C5=10 A*B-C+
100D100=10000 D*
4A2=2 4B2=2 0A0=0 A-B/
15A0=15 4B2=2 2C2=0 A+B/C-
1A1=1 0A0=0 A*
0A0=0 2A2=4 5B0=5 2B2=4 A*B+
2A2=4 0C0=0 5B0=5 5A0=5 A+B-C*
0A1000=0 4A2=2 A/
quelle
Antworten:
MATL , 53 Bytes
Verwendet die aktuelle Version (10.1.0)
EDIT (12. Juni 2016): Anpassung an Sprachänderungen,
Y}
nachg
und1L3$)
nach ersetzenY)
. Der unten stehende Link enthält diese ÄnderungenProbieren Sie es online!
Erläuterung
Dies testet alle möglichen Permutationen der vier Operatoren in einer Schleife, bis eine Permutation alle Gleichungen wahr macht.
Um zu testen, ob Gleichungen wahr sind, wird ein regulärer Ausdruck angewendet, um die vier Buchstaben durch die Operatoren zu ersetzen (in der Reihenfolge, die von der aktuellen Permutation vorgegeben wird), und die Zeichenfolge wird in Zahlen umgewandelt (ausgewertet). Dies ergibt ein Array mit so vielen Zahlen wie Gleichungen, in denen Gleichungen, die wahr sind,
1
und Gleichungen, die falsch sind, werden0
. Wenn dieser Vektor nur1
Werte enthält , sind wir fertig.Die gefundene Lösung weist den vier Buchstaben Operatoren zu, aber nicht alle müssen in der Eingabe enthalten sein. Daher wird ein letzter Test durchgeführt, um nicht verwendete Buchstaben (und deren übereinstimmende Operatoren) zu verwerfen.
quelle
Python, 278 Zeichen
Meine erste Antwort auf Code Golf ...
Es ist nur eine Funktion, die einen Brute-Force-Algorithmus implementiert. Sie bezeichnen ihn als Übergabe der Gleichungszeichenfolge.
quelle
["A","B","C","D"]
durchlist("ABCD")
?=
in der Definition von entfernenl
.4A2=2 4B3=1
).JavaScript (ES6),
213208 ByteErläuterung
Eingabe und Ausgabe sind Zeichenfolgen.
Definiert eine Funktion
f
die gleichzeitig als rekursive Funktion zum Generieren aller Permutationen der Operatoren und zum Testen vollständiger Permutationen mit den Eingabegleichungen verwendet wirdeval
.Prüfung
Test verwendet keine Standardargumente für die Browserkompatibilität.
Code-Snippet anzeigen
quelle