Löse ein Matchstick-Puzzle


17

Bei Rätsel-SE gibt es sogenannte "Matchstick-Probleme", bei denen Mathe in Matchsticks geschrieben ist und Sie eine bestimmte Anzahl davon verschieben dürfen, um eine bestimmte Eigenschaft zu erhalten.

In dieser Frage werden nur Ganzzahlen betrachtet, die in einem 7-Segment-Anzeigeformat dargestellt sind. Hier sind alle 10 Ziffern in diesem Format:

 __          __   __          __    __    __    __    __
|  |     |   __|  __|  |__|  |__   |__      |  |__|  |__|
|__|     |  |__   __|     |   __|  |__|     |  |__|   __|    

Jedes Segment der Anzeige ist ein "Streichholz", das unabhängig vom Rest der Nummer verschoben werden kann. Streichhölzer sind unteilbar und unzerstörbar, sie können weder zerbrochen noch entfernt werden.

Ein häufiges Rätsel besteht darin, eine in Basis 10 angegebene Zahl zu nehmen und zu versuchen, in einer bestimmten Anzahl von Zügen die größtmögliche Zahl zu erzielen. Eine Bewegung wird als eine Bewegung eines Streichholzes von einem belegten Steckplatz zu einem anderen nicht belegten Steckplatz betrachtet. Es ist vollkommen erlaubt, auf beiden Seiten der Zahl neue Ziffern zu setzen, zum Beispiel kann aus 0 77 3 Züge gemacht werden

 __      __  __      __   __      __   __
|  |    |  |        |  |    |       |    |
|__| ,   __|     ,     |      ,     |    |

Es ist jedoch nicht zulässig, einen Platz in 2 oder neue Plätze zwischen vorhandenen zu machen, z. B. eine 4 in eine 11 in der Mitte einer Zahl umzuwandeln oder neue Ziffern zwischen vorhandenen einzufügen. Jede Bewegung muss keine richtige Zahl ergeben, aber das Endergebnis sollte eine richtige Zahl in der Siebensegmentanzeige der Basis 10 sein. Sie müssen nicht jede Bewegung ausführen, wenn Sie dies nicht möchten. Anders als beim Puzzeln ist dies eine [tag: close ended question]. Sie dürfen in Ihren Antworten keine Operatoren (Multiplikation, Potenzierung usw.) oder mathematischen Konstanten (Pi, Grahams Zahl usw.) verwenden.

Aufgabe

Schreiben Sie ein Programm oder eine Funktion, die eine Zahl und eine Anzahl von Zügen als Eingabe verwendet und die größte Zahl zurückgibt, die mit so vielen Zügen auf der ursprünglichen Zahl gemacht werden kann.

Dies ist eine Frage, daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.

Testfälle

n, moves -> max
0, 1     -> 9
0, 3     -> 77
0, 4     -> 111
8, 3     -> 74
220, 1   -> 320
220, 2   -> 520
220, 3   -> 7227
220, 4   -> 22111
220, 5   -> 32111
747, 1   -> 747
747, 2   -> 7171
747, 3   -> 7711

verbunden


5
Ich ... tatsächlich blieb spät in der Nacht , um die Levenshtein - Distanz zwischen verschiedenen Zündholz Stellen grübeln ... Was für ein seltsamer Zufall: P
ETHproductions

1
Können in der Mitte gebildete leere Slots am Ende ignoriert werden? ZB919, 2 -> 991
DanTheMan


Weizen Zauberer, welches Gitter wird verwendet?
Tuskiomi

@tuskiomi "Allerdings können Sie nicht einen Slot in 2 oder neue Slots zwischen vorhandenen machen"
Weizen-Assistent

Antworten:


7

JavaScript (ES6), 297 286 279 267 Byte

Nimmt Eingaben in Curry-Syntax vor (s)(k), wobei s ein Array aus Ziffern und k die Anzahl der Bewegungen (Ganzzahl) ist.

s=>k=>(B=(n,b=0)=>n?B(n^n&-n,b+1):b,b=[...p='u"[k,iy#}m'].map(c=>c.charCodeAt()+2),r=[],g=(n,d='')=>n?n>0&&b.map((v,i)=>g(n-B(v),d+i)):r.push(d))(s.reduce((s,c)=>s+B(b[c]),M=0))&&b.map((_,j)=>r.map(n=>M=[...n+p].reduce((t,d,i)=>t+B(b[d]^b[s[i-j]]),0)>k*2|+n<M?M:n))|M

Testfälle


Wie?

Formdaten und Hilfsfunktion

  • Das Array b beschreibt die Formen der Ziffern als 7-Bit-Ganzzahlen, wobei jedes Bit ein Segment ist:

    7-Segment

    Beispielsweise ist die Form von "7" 0b0100101 = 37.

  • Die Hilfsfunktion B () gibt die Anzahl der Einsen in der Binärdarstellung einer bestimmten Zahl zurück:

    B = (n, b = 0) => n ? B(n ^ n & -n, b + 1) : b

Schritt 1

Wir zählen zuerst die Anzahl der Streichhölzer, die in der Eingabenummer verwendet werden:

s.reduce((s, c) => s + B(b[c]), 0)

Schritt 2

Wir übergeben diesen Wert an die rekursive Funktion g () , die eine Liste r mit allen Zahlen auffüllt, die mit genau dieser Anzahl von Matchsticks erstellt werden können:

g = (n, d = '') =>
  n ?
    n > 0 &&
    b.map((v, i) => g(n - B(v), d + i))
  :
    r.push(d)

Zum Beispiel wird g (5)[ '17', '2', '3', '5', '71' ] in r geladen .

Schritt 3

Wir müssen nun die höchste Zahl M in r auswählen, die tatsächlich aus der eingegebenen Zahl innerhalb der zulässigen Anzahl von Zügen k erhalten werden kann .

Da jede Zahl n in R verwendet genau so viele Streichhölzer als die Eingabezahl s , die Anzahl der erforderlichen Schritte zur Transformation s in n ist gleich die Hälfte der Anzahl von Segmenten Unterschiede zwischen jeder ihrer Ziffern.

Die Anzahl der Segmentdifferenzen zwischen zwei Ziffern x und y ergibt sich aus der Anzahl der Einsen in der Binärdarstellung von b [x] XOR b [y] .

Schließlich ist es wichtig anzumerken, dass wir mehrere mögliche Ziffernausrichtungen versuchen müssen, da die erste Ziffer von s nicht unbedingt auf die erste Ziffer von n abgebildet wird . Die Verschiebung zwischen den Ziffern wird durch die Variable j im Code angegeben.


1

Mathematica, 188 197 200 203 170 174 Bytes

HINWEIS: Der Code ist immer noch fehlerhaft. Ich arbeite dran.

+30 Bytes für Fehler

(p=PadLeft;q=IntegerDigits;g=Join@@(#~q~2~p~7&/@ToCharacterCode["w$]m.k{% o"][[1+q@#]])&;h=(v=g@#2~#~96-g@i~#~96;Tr@v==0&&Tr@Abs@v<=2#3)&;For[i=10^Tr@g@#,!h[p,##]&&!h[PadRight,##],--i];i)&

Das Zeichen zwischen %und osollte 0x7Faber SE nicht zulassen. Sie können auf den Pastebin-Link klicken , um den Originalcode zu kopieren.

Der Code benötigt viel Zeit, wenn mehr als 6-7 Sticks vorhanden sind. (Sie können den Startwert von iauf eine kleinere Zahl ändern , um ihn zu testen.)

Erläuterung

gist eine Hilfsfunktion, die Ziffern in eine Liste der Stabdarstellung (nach hier ) umwandelt , wie zum Beispiel {1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1}für 220.

h ist eine Hilfsfunktion für das Auffüllen von links und rechts zwischen zwei Zahlen.

fiteriert von 10^Tr@g@#(obere Grenze) bis 1, um nach einer Ganzzahl zu suchen, deren Stabdarstellung dieselbe Anzahl von 1 -> 0und 0 -> 1verglichen mit der ursprünglichen Anzahl aufweist und deren Anzahl kleiner oder gleich dem zweiten Argument ist.


Ich habe dir +1 gegeben, weil ich noch nie eine gewinnende Antwort mit einer so niedrigen Punktzahl gesehen habe wie die andere Antwort. Ich nehme an, es liegt am Mangel an Online-Testmöglichkeiten. Vielleicht könnten einige Leute, die Mathematica haben, kommen und es testen und überprüfen, ob es gut funktioniert, so dass Sie noch ein paar Upvotes bekommen könnten. Oder vielleicht könnte es jemand nach Möglichkeit in Octave konvertieren.
Geokavel
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.