Bauer Jack ist sehr arm. Er will seine ganze Farm beleuchten, aber mit minimalen Kosten. Eine Lampe kann sowohl ihre eigene Zelle als auch ihre acht Nachbarn beleuchten. Er hat die Lampen auf seinem Feld arrangiert, aber er braucht Ihre Hilfe, um herauszufinden, ob er zusätzliche Lampen aufbewahrt hat oder nicht.
Zusätzliche Lampen: Lampen, die beim Entfernen von der Farm keinen Einfluss auf die Anzahl der beleuchteten Zellen haben. Außerdem werden die Lampen, auf die Sie zeigen, nicht einzeln entfernt, sondern gleichzeitig.
Hinweis: Sie können nur einige Lampen entfernen. Sie können Lampen weder neu anordnen noch einsetzen. Ihr letztes Ziel ist es, die maximale Anzahl von Lampen so zu entfernen, dass jede zuvor beleuchtete Zelle noch leuchtet.
Helfen Sie Farmer Jack dabei, die maximale Anzahl nutzloser Lampen zu erkennen, damit er sie an anderer Stelle verwenden kann.
Eingang
Sie werden in den ersten Zeilenabmessungen des Feldes M und N angegeben. Es folgen die nächsten M Zeilen mit N Zeichen, die jeweils das Feld darstellen.
'1' steht für die Zelle, in der die Lampe aufbewahrt wird.
'0' steht für eine leere Zelle.
Ausgabe
Sie müssen eine Ganzzahl ausgeben, die die Anzahl der unbrauchbaren Lampen enthält.
Beispieleingabe:
3 3
100
010
001
Beispielausgabe:
2
Gewinner:
Da es sich um Codegolf handelt, ist der Gewinner derjenige, der die Aufgabe mit der geringsten Anzahl von Zeichen erfolgreich abschließt
Antworten:
Mathematica 186 (gierig) und 224 (alle Kombinationen)
Gierige Lösung
Dadurch werden überflüssige Lichter nacheinander ausgeschaltet. Wenn die Lichtabdeckung beim Erlöschen des Lichts nicht verringert wird, kann dieses Licht eliminiert werden. Der gierige Ansatz ist sehr schnell und kann problemlos Matrizen von 15x15 und viel größer verarbeiten (siehe unten). Es gibt eine einzelne Lösung zurück, aber es ist nicht bekannt, ob dies optimal ist oder nicht. Beide Ansätze geben in den Golfversionen die Anzahl der nicht verwendeten Lichter zurück. Nicht-Golf-Ansätze zeigen auch die Gitter wie unten an.
Vor:
Nach:
Optimale Lösungen mit allen Lichtkombinationen (224 Zeichen)
Mit Dank an @ Clément.
Ungolfed Version mit allen Lichtkombinationen
fDie morphologische Transformationsfunktion, die in
sameCoverageQ
behandelt wird, behandelt das 3 x 3-Quadrat, in dem sich jedes Licht befindet, als beleuchtet (Wert = 1 statt Null). Wenn sich ein Licht in der Nähe des Randes der Farm befindet, befinden sich nur die Quadrate (weniger als 9) innerhalb der Grenzen von Die Farm wird gezählt. Es gibt keine Überzählung. Ein Quadrat, das von mehr als einer Lampe beleuchtet wird, wird einfach beleuchtet. Das Programm schaltet jedes Licht aus und prüft, ob die Gesamtbeleuchtung der Farm verringert ist. Ist dies nicht der Fall, wird dieses Licht eliminiert.nOnes[matrix]
zählt die Anzahl der markierten Zellen. Es wird verwendet, um die Lichter und auch die beleuchteten Zellen zu zählensameCoverageQ[mat1, mat2]
testet, ob die beleuchteten Zellen in mat1 der Anzahl der beleuchteten Zellen in mat2 entsprechen. MorphologicalTransform [[mat] nimmt eine Lichtmatrix und gibt eine Matrix der Zellen auf, die sie beleuchten.c[m1]
Nimmt alle Lichtkombinationen von m1 und testet sie auf Abdeckung. Unter denjenigen mit der maximalen Abdeckung werden diejenigen ausgewählt, die die wenigsten Glühbirnen haben. Jedes davon ist eine optimale Lösung.Beispiel 1:
Ein 6x6 Setup
Alle optimalen Lösungen.
Golfversion mit allen Lichtkombinationen.
Diese Version berechnet die Anzahl der nicht verwendeten Lichter. Die Gitter werden nicht angezeigt.
c
Gibt die Anzahl der nicht verwendeten Lichter zurück.n[matrix]
zählt die Anzahl der markierten Zellen. Es wird verwendet, um die Lichter und auch die beleuchteten Zellen zu zählens[mat1, mat2]
testet, ob die beleuchteten Zellen in mat1 der Anzahl der beleuchteten Zellen in mat2 entsprechen. t [[mat] nimmt eine Lichtmatrix und gibt eine Matrix` der Zellen zurück, die sie beleuchten.c[j]
Nimmt alle Lichtkombinationen von j und testet sie auf Abdeckung. Unter denjenigen mit der maximalen Abdeckung werden diejenigen ausgewählt, die die wenigsten Glühbirnen haben. Jedes davon ist eine optimale Lösung.Beispiel 2
Bei gleicher Lichtabdeckung können zwei Lichter gespeichert werden. cm]
quelle
Python, 309 Zeichen
Funktioniert mit Bitmasken.
L
ist eine Liste der Lichter, wobei jedes Licht durch eine ganze Zahl mit (bis zu) 9 Bits dargestellt wird, die für sein Lichtmuster gesetzt sind. Dann suchen wir ausführlich nach Teilmengen dieser Liste, deren bitweise - oder die gleiche wie die bitweise - oder der gesamten Liste ist. Die kürzeste Teilmenge ist der Gewinner.m
ist eine Maske, die das Umlaufen der Bits beim Verschieben verhindert.quelle
Java 6 - 509 Bytes
Ich machte einige Annahmen über die Grenzen und löste das Problem, wie zu diesem Zeitpunkt angegeben.
Laufen Sie so:
java F <inputfile 2>/dev/null
quelle
java F <inputfile 2>nul
, wenn das dann fehlschlägtjava F <inputfile
und ignoriere die Ausnahme. Auch läuft es nicht mit Java 7.c ++ - 477 Bytes
quelle
Ruby, 303
[Dies wurde codiert, um eine frühere Version der Frage zu beantworten. Anmerkung unten lesen]
Konvertieren in Boolesche Arrays und anschließendes Vergleichen von Nachbarschaften auf Änderungen.
Einschränkung (?): Die maximale Feldgröße der Farm beträgt 1.000 x 1.000. Problem besagt "Farmer Jack ist sehr arm", also gehe ich davon aus, dass seine Farm nicht größer ist. ;-) Einschränkung kann durch Hinzufügen von 2 Zeichen aufgehoben werden.
HINWEIS: Seit ich mit dem Codieren begonnen habe, haben sich anscheinend die Anforderungen an die Fragen geändert. Die folgende Klarstellung wurde hinzugefügt „die Lampen Sie zeigen werden nicht einzeln entfernt werden, aber sie werden gleichzeitig entfernt werden“ . Die Mehrdeutigkeit der ursprünglichen Frage ermöglichte es mir, Code zu testen, indem ich einzelne Lampenentfernungen testete. Daher funktioniert meine Lösung unter den neuen Anforderungen für viele Testfälle nicht. Wenn ich Zeit habe, werde ich das beheben. Ich darf nicht. Bitte stimmen Sie dieser Antwort nicht zu, da andere Antworten hier möglicherweise vollständig konform sind.
quelle
APL, 97 Zeichen / Bytes *
Nimmt eine
⎕IO←1
und⎕ML←3
APL-Umgebung an.Ungolfed Version:
Ich stimme zu, dass mehr Testfälle besser wären. Hier ist eine zufällige:
Eingang:
Ausgang (nutzlose Lampen):
Layout mit min Lampen (nicht in der Golfversion enthalten):
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ *: APL kann in einem eigenen ( alten) Einzelbyte -Zeichensatz geschrieben werden, der APL-Symbole den oberen 128-Byte-Werten zuordnet
. Für die Bewertung kann daher ein Programm mit N Zeichen , das nur ASCII-Zeichen und APL-Symbole verwendet, als N Byte lang angesehen werden.
quelle
C ++ 5.806 Bytes
Dies ist noch nicht für die Größe optimiert. Aber da es nur wenige Teilnehmer gibt, werde ich es vorerst dabei belassen.
FarmersField Header:
FarmersField CPP:
Und eine Reihe von Tests, um zu zeigen, dass der Code das tut, wofür er erstellt wurde:
quelle
Perl 3420 Bytes
Keine Golflösung, aber ich fand dieses Problem interessant:
(I / O wurde herausgenommen, damit ich konkrete Tests zeigen konnte)
quelle
Python - 305 Bytes
quelle