Kann ich diese Form mit Blöcken, Platten und Treppen herstellen?

13

Stellen Sie sich ein rechteckiges zweidimensionales Gitter vor, in dem jede Zelle entweder leer ( .) oder voll ( 0) sein kann.

z.B

..00....
0000....
.00000..
000...00
..000000
000.00..

Das Gitter wird als unendlich betrachtet, alle Zellen außerhalb des abgebildeten Bereichs sind leer.

Das Ziel ist es, die gefüllten Räume zu bedecken und die leeren Räume offen zu lassen, indem Sie einen Satz von 7 verschieden geformten Steinen verwenden, die jeweils 4 Zellen (2 × 2) des Gitters einnehmen.

Dies sind die 7 Steine:

  • Blöcke - 1 Variante

    11
    11
    
  • Platten - 2 Varianten

    ..
    22
    33
    ..
  • Treppen - 4 Varianten

    .4
    44
    5.
    55
    66
    .6
    77
    7.

Diese Bausteine ​​müssen immer an einem Raster ausgerichtet sein, dessen Zellen doppelt so breit und hoch sind wie die Zellen des Eingaberasters. Jeder Baustein kann nur eine Zelle dieses größeren Rasters belegen, aber das kleinere Raster kann unterhalb des größeren Rasters verschoben (nach oben, unten, links, rechts) werden, um mehr Optionen zum Auffinden einer Abdeckung zu erhalten. Weder die Gitter noch einzelne Steine ​​dürfen gedreht werden.

Eine Möglichkeit, das obige Beispiel zu behandeln (oder zu lösen), ist wie folgt:

..11....
2211....
.47733..
447...22
..771133
227.11..

(Identische benachbarte Bausteine ​​können immer noch Unklarheiten verursachen. Durch sorgfältiges Identifizieren des größeren Rasters wird dies jedoch behoben.)

Eine ungültige Lösung für

000000
000000

ist

566774
556744

weil die Ziegel nicht alle auf das größere Gitter ausgerichtet sind und nur eine Zelle davon belegen.

Eine gültige Lösung ist hier 3 Blöcke hintereinander:

111111
111111

Eine andere gültige Lösung umfasst 6 Platten:

......
222222
333333
......

Beachten Sie also, dass einige Eingabegitter mehrere Lösungen haben .

Eine ungültige Lösung für

00.00
00...

ist

11.33
11...

weil die Ziegel nicht auf das größere Gitter ausgerichtet sind. Die Platte müsste sich um eins nach links oder rechts bewegen, aber dann wäre die Abdeckung natürlich unvollständig. Dieses Eingangsraster hat keine Lösung .

Herausforderung

Schreiben Sie ein Programm, das (über stdin / command line) einen rechteckigen Textblock von .'s und 0' s aufnimmt , der ein abzudeckendes Raster darstellt.

Wenn es eine gültige Decklösung ist, drucken (via stdout) jede eine Lösung in der gleichen Weise wie oben, ersetzt all 0‚s mit dem entsprechenden 1durch 7bricks.

Wenn es keine Lösung gibt, sollte Ihr Programm nichts ausgeben, sondern einfach ganz normal enden.

Anmerkungen

  • Der Eingang und der Ausgang müssen nicht die gleichen rechteckigen Abmessungen haben. Ihre Ausgabe kann überflüssige Zeilen und / oder Spalten von allen enthalten .(solange sie die Lösung nicht ungültig machen).

  • Es ist auch in Ordnung, Zeilen und Spalten von allen zu trimmen ., wenn dies die gefüllten Räume nicht beeinflusst. z.B

    222222
    333333
    

    ist eine gültige Lösung für

    000000
    000000
    

    Umgekehrt konnten die beiden leeren Spalten in 00..00nicht entfernt werden, da dies die gefüllten Räume durcheinander bringen würde.

  • Optional können Sie davon ausgehen, dass die Eingabe eine einzelne nachgestellte Newline enthält. Eine einzelne nachgestellte Zeile in der Ausgabe ist auch dann in Ordnung, wenn keine Lösung vorliegt.

  • Gitter, die vollständig leer sind (alle .) und das einfache 0 × 0-Gitter sind keine Eingabefälle, über die Sie sich Sorgen machen müssen. Aber das 1 × 1- 0Raster ist, wie alle anderen Raster, die mindestens eines enthalten 0. (Sie können nicht davon ausgehen, dass die Breite oder Höhe des Eingaberasters gerade ist!)

  • Anstelle eines Programms können Sie eine Funktion schreiben, die die Eingabe als Zeichenfolgenargument verwendet und die Ausgabe normal ausgibt oder als Zeichenfolge zurückgibt. Jeder falsche Wert kann zurückgegeben werden, wenn es keine Lösung gibt.

  • Sie können 9 verschiedene druckbare ASCII- Zeichen anstelle von verwenden . 0 1 2 3 4 5 6 7. Sagen Sie einfach, was Ihre Substitutionen waren! Zeilenumbrüche müssen unverändert bleiben.

Wertung

Der kürzeste Code in Bytes gewinnt. Tiebreaker ist der am höchsten gewählte Beitrag.

Diese Herausforderung wurde von Blöcken , Platten und Treppen in Minecraft inspiriert , die den hier beschriebenen Regeln folgen. Wenn Sie PPCG und Minecraft mögen, sollten Sie sich den PPCG Minecraft Server ansehen .

Calvins Hobbys
quelle
3
Es scheint, dass der Minecraft-Server nicht im Golf-Skript implementiert ist - langweilig :-)
Thomas Weller
5
@ThomasWeller Es wurde in CJam neu implementiert, um ein paar Bytes zu sparen.
Alex A.

Antworten:

6

Python - 525 491 478 430 Bytes

r=range
def t(s):
 m=s.find("\n")+1
 for q in r(4):
  try:
   for i in r(-q%2,m-1,2):
    for j in r(-q/2,len(s)/m,2):
     k,g=j*m+i,""
     b=[k,k+1,k+m,k+m+1]
     for z in b:g+=a(s,z)
     for z in b:
      if a(s,z)!="d":s=s[:z]+`dict(dddd=0,zzdd=3,ddzz=2,zzzd=7,zzdz=6,zdzz=5,dzzz=4,zzzz=1)[g]`+s[z+1:]
   return s
  except:d
def a(v,i):
 try:
  if v[i]!="\n":return v[i]
  return "d"
 except:return "d"

Erläuterung: Dies ist mein erster Code-Golf, daher ist er möglicherweise nicht optimal, aber so funktioniert er. Die Funktion t (s) gibt das Ergebnis für den übergebenen String an. Sie ermittelt zunächst die Anzahl der Spalten, geht dann die vier möglichen unterschiedlichen Übersetzungen mit 1 durch (none, left, up, up-left) und versucht, es zu lösen für jeden. Es betrachtet jeden 2x2-Block und ordnet ihn einer gültigen Blocknummer zu, die von einem Wörterbuch vorgegeben wird, und ändert die Nullen in die Nummer.

Wenn es einen findet, der nicht im Wörterbuch enthalten ist, gibt es diesen bestimmten Versatz auf und beginnt erneut mit dem nächsten. Wenn es alle 4 Offsets durchläuft, ohne eine gültige Lösung zu finden, endet es, ohne etwas auszugeben. a (v, i) lässt den Standardwert außerhalb der Zeichenfolge zu und ignoriert Zeilenumbrüche. Obwohl es während der gesamten Laufzeit zu Teillösungen kommen kann, werden diese immer durch die endgültige richtige überschrieben, falls vorhanden.

Bearbeiten: Eine andere Zuordnung von Zeichen wird verwendet:. -> d, 0 -> z, alle anderen Nummern gehen an sich. Dies gilt sowohl für die Eingabe als auch für die Ausgabe.

Frikative Melone
quelle
1
Willkommen bei PPCG! Wir haben einige Tipps zum Golfen in Python ; womit ich glaube du kannst ein paar bytes sparen.
Lirtosiast