Meta-Hintergrund
Dies wurde als Frage zu Puzzling gestellt und die sofortige Reaktion lautete "Nun, jemand wird das einfach per Computer lösen". Es gab eine Debatte darüber, wie komplex ein Programm zur Lösung dieses Problems sein müsste. Nun, "wie komplex muss dieses Programm sein" ist so ziemlich die Definition von Code-Golf , also kann PPCG das Problem vielleicht lösen?
Hintergrund
Eine Matchstick-Gleichung ist im Grunde eine normale mathematische Gleichung, bei der jedoch die Ziffern und Operatoren physikalisch konstruiert werden, indem Matchsticks auf einen Tisch gelegt werden. (Das wichtigste relevante Merkmal von Streichhölzern ist, dass sie ziemlich steif sind und eine konstante Länge haben. Manchmal verwenden die Leute stattdessen andere Gegenstände, wie Wattestäbchen.)
Für diese Herausforderung müssen wir keine spezifischen Regeln für die Anordnung der Streichhölzer definieren (wie bei der verknüpften Herausforderung). Es geht uns nur darum, wie viele Streichhölzer wir benötigen, um einen Ausdruck darzustellen, der eine bestimmte Zahl ergibt.
Die Aufgabe
Hier ist ein Alphabet mit Ziffern und mathematischen Operatoren, die Sie verwenden können und die jeweils Kosten in Streichhölzern haben:
0
, kostet 6 Streichhölzer1
, kostet 2 Streichhölzer2
, kostet 5 Streichhölzer3
, kostet 5 Streichhölzer4
, kostet 4 Streichhölzer5
, kostet 5 Streichhölzer6
, kostet 6 Streichhölzer7
, kostet 3 Streichhölzer8
, kostet 7 Streichhölzer9
, kostet 6 Streichhölzer+
, kostet 2 Streichhölzer-
, kostet 1 Streichholz×
, kostet 2 Streichhölzer
(Sie können ×
wie *
in der Ausgabe Ihres Programms darstellen, wenn Sie möchten, um die Verwendung von Nicht-ASCII-Zeichen zu vermeiden. In den meisten Codierungen ×
werden mehr Bytes als benötigt *
, und daher kann ich mir vorstellen, dass die meisten Programme diesen Spielraum nutzen möchten .)
Sie müssen ein Programm schreiben, das eine nichtnegative Ganzzahl als Eingabe verwendet (mit vernünftigen Mitteln ) und einen Ausdruck erzeugt, der diese Ganzzahl als Ausgabe auswertet (wiederum mit vernünftigen Mitteln). Darüber hinaus muss der Ausdruck nicht trivial sein: es mindestens einen Operator enthalten muss +
, -
oder×
. Schließlich muss der von Ihnen ausgegebene Ausdruck unter allen Ausgaben, die ansonsten der Spezifikation entsprechen, der billigste (oder der billigste) in Bezug auf die Gesamtkosten des Streichholzes sein.
Klarstellungen
- Sie können mehrstellige Zahlen bilden, indem Sie mehrere Ziffern hintereinander ausgeben (z. B.
11-1
ist eine gültige zu erzeugende Ausgabe10
). Um ganz genau zu sein, wird die resultierende Zahl dezimal interpretiert. Diese Art der Verkettung ist keine Operation, die mit Zwischenergebnissen arbeitet. Nur für Literalziffern, die im ursprünglichen Ausdruck enthalten sind. - Zum Zweck dieser Herausforderung.
+
,-
Und×
sind Infixoperatoren; Sie brauchen einen Streit zu ihrer Linken und zu ihrer Rechten. Sie dürfen sie nicht in Präfixpositionen wie+5
oder verwenden-8
. - Sie haben keine Klammern (oder eine andere Möglichkeit, die Priorität zu steuern) zur Verfügung. Der Ausdruck wird gemäß den typischen Standardprioritätsregeln ausgewertet (Multiplikationen werden zuerst durchgeführt, und dann werden die Additionen und Subtraktionen von links nach rechts ausgewertet).
- Sie haben keinen Zugriff auf andere mathematische Operatoren oder Konstanten als die oben aufgeführten. "Querdenken" -Lösungen werden bei Puzzling oft akzeptiert, aber es ist nicht sinnvoll, einen Computer zu fordern, der sie selbst entwickelt, und hier bei PPCG möchten wir, dass es objektiv ist, ob eine Lösung richtig ist oder nicht.
- Es gelten die üblichen Überlaufregeln für Ganzzahlen: Ihre Lösung muss in der Lage sein, für beliebig große Ganzzahlen in einer hypothetischen (oder möglicherweise realen) Version Ihrer Sprache zu arbeiten, in der standardmäßig alle Ganzzahlen unbegrenzt sind, Ihr Programm jedoch aufgrund der Implementierung in der Praxis fehlschlägt Ganzzahlen, die so groß sind, werden nicht unterstützt, was die Lösung nicht ungültig macht.
- Wenn Sie dieselbe Ziffer oder denselben Operator mehrmals verwenden, müssen Sie die Matchstick-Kosten bei jeder Verwendung bezahlen (da Sie natürlich nicht dieselben physischen Matchsticks an zwei verschiedenen Stellen auf dem Tisch wiederverwenden können).
- Es gibt keine zeitliche Begrenzung. Brute-Force-Lösungen sind akzeptabel. (Auch wenn Sie eine Lösung haben, die schneller als Brute Force ist, können Sie sie gerne veröffentlichen, auch wenn sie länger ist. Es ist immer interessant zu sehen, wie sich alternative Ansätze vergleichen lassen.)
- Obwohl es niemals erforderlich ist , eine Erklärung für Ihren Code zu schreiben , ist dies wahrscheinlich eine gute Idee. Code-Golf- Lösungen sind oft sehr schwer zu lesen (insbesondere für Leute, die mit der Sprache, in der sie geschrieben sind, nicht vertraut sind), und es kann schwierig sein, eine Lösung zu bewerten (und somit darüber abzustimmen), es sei denn, Sie verstehen, wie sie funktioniert.
Siegbedingung
Als Code-Golf- Herausforderung werden Antworten mit weniger Bytes als besser angesehen. Sie können jedoch wie gewohnt Antworten mit unterschiedlichen Ansätzen oder in bestimmten Sprachen veröffentlichen, auch wenn diese ausführlicher sind als bestimmte andere Sprachen. Das Ziel des Golfsports ist es wirklich zu sehen, inwieweit Sie ein bestimmtes Programm optimieren können, und diese Vorgehensweise bietet uns viele potenzielle Optimierungsprogramme. Lassen Sie sich also nicht entmutigen, wenn jemand eine Lösung mit einem völlig anderen Ansatz oder einer völlig anderen Sprache vorlegt und eine viel kürzere Antwort erhält. Es ist gut möglich, dass Ihre Antwort besser optimiert ist und mehr Fähigkeiten zeigt, und die Wähler von PPCG wissen das oft zu schätzen.
quelle
Antworten:
Python2, 1̶9̶8̶ ̶b̶y̶t̶e̶s̶ 182 Bytes dank math_junkie
Dieser Algorithmus schließt Präfixversionen von
+
und nicht aus-
, aber sie sind entweder schlechter als ihre infix-Gegenstücke oder gleich und erscheinen später in der Suche. Da das Schlüsselwortargumente
veränderlich verwendet wird, gibt es ungültige Ergebnisse, wenn es mehrmals pro Sitzung aufgerufen wird. Um dies zu beheben, verwenden Sief(n, e=[(0,'')])
statt nurf(n)
. Beachten Sie, dass die vier Einrückungen Registerkarten darstellen, sodass dies nur mit Python 2 funktioniert.Ich habe auch eine ungolfed und optimierte Version, die auch bei größeren Stückzahlen schnell läuft:
quelle
PHP, 241 Bytes
Online Version
Nervenzusammenbruch
Weg mit etwas besserer Leistung
Unterstützung negativer Ganzzahlen
Version mit negativen ganzen Zahlen
quelle
$e+="6255456376"[$i[$s++]];
.