Hilf mir, meine Avocados zu entsaften

14

Bei dieser Herausforderung habe ich ein Avocadofeld, das ich so schnell und vollständig wie möglich entsaften möchte. Können Sie ein Programm oder eine Funktion schreiben, die mir dabei helfen, die Avocados perfekt zu entsaften?

Als Eingabe erhalten Sie die Avocados als mx- mQuadrat-Gitter, wobei meine ganze Zahl zwischen 3 und 6 liegt. Jedes Quadrat enthält genau eine Avocado. Avocados haben mehrere Stadien der Saftigkeit:

Stufe 1: Die Avocado wurde überhaupt nicht entsaftet.
Stufe 2: Die Avocado wurde teilweise entsaftet.
Stufe 3: Die Avocado wurde vollständig entsaftet.
Stufe 4: Die Avocado ist aufgrund von Überentsaftung explodiert.

Wenn Sie ein Entsaftungswerkzeug verwenden, gelangen die Avocados im Wirkungsbereich dieses Entsaftungswerkzeugs zur nächsten Stufe. Explodierende Avocados haben eine Menge Kraft und zerstören das gesamte Avocado-Feld. Stellen Sie also sicher, dass keine der Avocados explodiert!

Hier ist ein Beispiel für ein Gitter von Avocados. In diesen Beispielen habe ich die Koordinate 0,0für die linke untere Ecke und die Koordinate 2,2für die rechte obere Ecke verwendet, obwohl Sie das Koordinatensystem an Ihre Sprache anpassen können.

112
221
231

Das Ziel ist es, alle Avocados perfekt zu entsaften (dh Stufe 3). Um dies zu erreichen, haben Sie drei verschiedene Entsaftungswerkzeuge in Ihrem Besitz. Jedes Entsaftungswerkzeug hat einen anderen Wirkungsbereich, aber alle erhöhen die Saftigkeit der betroffenen Avocados um 1.

Hier finden Sie alle Werkzeuge, die Sie zur Verfügung haben. Sie verwenden die Entsafter, indem Sie den ersten Buchstaben des Werkzeugs und dann die Koordinaten angeben, die entsaftet werden sollen. Wenn Sie beispielsweise den Slicer auf Quadrat verwenden 5,2möchten, müssen Sie die Ausgabe ausführen S 5,2.

Slicer : Saftet die Zielkoordinate und die Avocado auf beiden Seiten.

112     112     112
221 --> XXX --> 332
231     231     231

Reibe : Saftet die Zielkoordinate und die Avocado oben und unten.

112     1X2     122
221 --> 2X1 --> 231 --> kaboom!
231     2X1     241

Raketenwerfer : Verseucht die Zielkoordinate und alle angrenzenden Avocados.

112     1X2     122
221 --> XXX --> 332
221     2X1     231

Beispieleingänge und -ausgänge

323
212
323

G 1,1
S 1,1

3312
3121
1213
2133

R 0,0
R 1,1
R 2,2
R 3,3

22322
22222
22222
33233
33333

G 0,3
G 1,3
G 2,2
G 3,3
G 4,3

222332
333221
222332
333222
222333
333222

S 1,5
S 1,3
S 1,1
S 4,5
S 4,3
S 4,1
G 5,4
Absinth
quelle
Sie scheinen dies nicht explizit zu sagen, aber muss die Lösung auf jeden Fall die wenigsten Schritte unternehmen?
FryAmTheEggman
1
Dies hat einige konstruktive Kommentare aus der Sandbox ignoriert. Hier ist eines: Ich nehme an, Sie sollten dem Benutzer flexibel erlauben, sein Koordinatensystem zu wählen (z. B. wo der Ursprung 0-indiziert oder 1-indiziert ist).
Greg Martin
3
@Pavel, vielen Dank, dass du das nicht als Antwort oder Frage gepostet hast.
NoOneIsHere
1
Ich habe diese Frage gesehen und war bereit, VTC herunter zu stimmen und als Spam zu kennzeichnen. Stattdessen +1.
NoOneIsHere
1
@Pavel Ich war so versucht , den Titel zu machen ...
Absinth

Antworten:

1

Mathematica - 350 Bytes

Keine sehr kurze Lösung, aber besser als gar keine Lösung, oder?

t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}];""<>Cases[StringReplace[(First@Solve[(Table[G[i,j]+G[i-1,j]+G[i+1,j]+S[i,j]+S[i,j-1]+S[i,j+1]+R[i,j]+R[i-1,j]+R[i+1,j]+R[i,j-1]+R[i,j+1],{i,n=Length@#},{j,n}]/.(G|S|R)[___,0|n+1,___]->0)==3-#&&And@@t[#[i,j]>=0&],t[#[i,j]&],Integers])/.{(x_->m_):>ToString[m x]},{"["->" ","]"->"\n",", "->","}],Except@"0"]&

Eine besser lesbare Version (mit zusätzlichen Leerzeichen und Einrückungen und so weiter):

t[x_] := Flatten@Table[x /@ {G, S, R}, {i, n}, {j, n}]; 
"" <> Cases[
   StringReplace[(First@
       Solve[(Table[
             G[i, j] + G[i - 1, j] + G[i + 1, j] + S[i, j] + 
              S[i, j - 1] + S[i, j + 1] + R[i, j] + R[i - 1, j] + 
              R[i + 1, j] + R[i, j - 1] + R[i, j + 1], {i, 
              n = Length@#}, {j, n}] /. (G | S | R)[___, 
              0 | n + 1, ___] -> 0) == 3 - # && 
         And @@ t[#[i, j] >= 0 &], t[#[i, j] &], 
        Integers]) /. {(x_ -> m_) :> ToString[m x]}, {"[" -> " ", 
     "]" -> "\n", ", " -> ","}], Except@"0"] &

Die Eingabe ist ein Array (z. B. {{3,2,3},{2,2,2},{3,2,3}}), die Ausgabe ist eine Zeichenfolge (mit einem nachgestellten Zeilenumbruch - wenn dies nicht akzeptabel ist, schließen Sie die Funktion StringDrop[...,-1]für zusätzliche 15 Byte ein). Ich habe das Koordinatensystem verwendet, das besagt, dass (1,1) die linke obere Ecke ist, (n, n) die rechte untere Ecke (wobei n die Dimension der Matrix ist). Wenn die Lösung den gleichen Vorgang mehrere Male ausführen muss, enthält die Ausgabe manchmal Dinge wie3 G 2,2 (für "Verwenden der Reibe um (2,2) dreimal") - da Sie in diesem Fall nicht angegeben haben, was zu tun ist, hoffe ich das ist okay.

Erläuterung:

  • Table[G[i,j]+G[i-1,j]+G[i+1,j]+S[i,j]+S[i,j-1]+S[i,j+1]+R[i,j]+R[i-1,j]+R[i+1,j]+R[i,j-1]+R[i,j+1],{i,n=Length@#},{j,n}]Erstellt ein Array mit den Variablen G [i, j] an jeder Stelle, die durch die Verwendung der Reibe bei (i, j) beeinflusst wird, und zwar in ähnlicher Weise für S [i, j] und R [i, j]. Diese Variablen geben an, wie oft das Werkzeug an dieser Position verwendet wird.
  • .../.(G|S|R)[___,0|n+1,___]->0 Entfernt die Auswirkungen der Verwendung von Werkzeugen an Positionen außerhalb des Avocado-Feldes.
  • ...==3-# vergleicht dies mit dem Unterschied zwischen dem Input und einem Feld perfekt entsafteter Avocados.
  • ...&&And@@t[#[i,j]>=0&]sagt, dass die Variablen G [i, j], S [i, j], R [i, j] mit der Kurzschrift nicht negativ sein dürfen (Sie können die Avocados nicht entsaften!) t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}].
  • First@Solve[...,t[#[i,j]&],Integers] findet die erste ganzzahlige Lösung unserer Gleichungen in Form der Variablen G [i, j], S [i, j], R [i, j].
  • /.{(x_->m_):>ToString[m x]} verbirgt die Variablen, die gleich Null sind, und legt die Lösung in einer schönen Zeichenfolgeform ab.
  • StringReplace[...,{"["->" ","]"->"\n",", "->","}]verwandelt Strings wie "2 G[1, 4]"in Strings wie "2 G 1,4"und fügt am Ende eine neue Zeile hinzu.
  • ""<>Cases[...,Except@"0"]Entfernt alle Reste "0"und fügt alle Saiten zusammen.
Kein Baum
quelle