Löse Grid-Tangram


22

Das Tangram ist ein Dissektionspuzzle aus sieben Formen: Fünf unterschiedlich große Dreiecke, ein Parallelogramm und ein Quadrat. Bei einer gegebenen Form besteht das Ziel darin, die Form unter Verwendung aller Teile und ohne Überlappung wiederherzustellen. Es gibt offensichtlich unendlich viele Möglichkeiten, diese Gruppe von Stücken in der Ebene anzuordnen. Eine interessante Untergruppe sind die

Gitter Tangrams

Wir können das "normale" Tangram-Quadrat in ein größeres Quadrat zeichnen, das durch ein Gitter in 16 kleinere Quadrate unterteilt ist. Gitter-Tangrams sind nur Formen, die aus den Tangram-Teilen bestehen, sodass sich alle Eckpunkte der Teile auf den Gitterpunkten befinden.

Dies sind die Arten von Tangram-Rätseln, die wir bei dieser Herausforderung berücksichtigen möchten, da sie wahrscheinlich einfacher zu handhaben sind als die allgemeineren.

Als Randnotiz: Die chinesischen Mathematiker Chuan-Chin Hsiung und Fu Traing Wang bewiesen 1942, dass es nur 13 konvexe Tangrams gibt. Sie zeigten zunächst, dass das Problem auf Gittertangrams reduziert werden kann, und verwendeten dann einige kombinatorische und geometrische Argumente. Dies sind alles diese 13:

Herausforderung

Geben Sie bei einem lösbaren Gittertangram eine Zerlegung des Gittertangrams in die sieben Tangramteile aus.

IO

Ein Tangram wird als Schwarz-Weiß-Bild (die Form ist schwarz, der Hintergrund weiß) mit beidseitigen Vielfachen von 50 Pixel angegeben. Das Raster hat eine Breite von genau 50px. Die Gitterlinien verlaufen parallel zu den Bildseiten.

BEARBEITEN: Das Bild kann als Eingabe akzeptiert und als Ausgabe in jedem geeigneten Rasterbildformat wie PNG, TIFF, PBM usw. zurückgegeben werden. Eine Darstellung als binäres 2D-Array oder String oder Matrix ist jedoch zulässig.

Die Ausgabe sollte wieder die gleiche Größe und Form haben, aber bei jedem Stück eine andere Farbe haben oder alternativ mit weißen Linien, die alle Stücke trennen. Es ist erwähnenswert, dass das nicht rechteckige Viereck umgedreht werden kann.

Die Pixel am Rand der Teile müssen nicht genau mit denen der Form übereinstimmen, auch wenn es Aliasing-Effekte oder andere Unschärfen gibt, ist dies immer noch in Ordnung.

Beispiel für Ein- und Ausgabe:

Beispiele:

Mögliche Lösungen:


Die Bildverarbeitung ist bei dieser Herausforderung eine völlig unnötige Hürde. Ich würde es viel attraktiver finden, wenn Sie die Eingabe als kleines binäres Array spezifizieren würden.
Sparr

1
Wie gesagt, das wurde schon im Sandkasten besprochen. Aber ich bezweifle, dass es viele Bytes hinzufügt, da die Aufgabe selbst viel schwieriger ist.
Fehler

3
Ich war einer der Leute, die empfohlen haben, dass Input und Output so sind, wie sie sind, und ich habe diese Empfehlung ausgesprochen, weil dies meiner Meinung nach die natürlichste und passendste Art ist, eine Tangram-Herausforderung zu präsentieren. Jede Form von Eingabe / Ausgabe würde eine erhebliche Anzahl von Bytes benötigen, daher denke ich nicht, dass dies hier wirklich ein Problem ist.
El'endia Starman

1
Ich stimme Elendia zu. Das einzige Problem mit grafischer E / A besteht darin, dass Sprachen ohne Grafikfunktionen eingeschränkt werden können. Das heißt, PBM und PGM sind der ASCII-Kunst so nahe, dass es kein wirkliches Problem gibt, WENN es der Fall ist, dass die Leute solche Formate kennen. en.wikipedia.org/wiki/Netpbm_format
Level River St

1
@LevelRiverSt Das ist ein guter Punkt, ich denke, es wäre völlig akzeptabel, diese Formate oder sogar z. B. ein 2D-Array / eine Folge von Nullen und Einsen zu verwenden.
Fehler

Antworten:


31

BBC BASIC, 570 514 490 Bytes ASCII

Laden Sie den Interpreter unter http://www.bbcbasic.co.uk/bbcwin/download.html herunter

435 Bytes tokenisiert

Das vollständige Programm zeigt eine Eingabe von L.bmpauf dem Bildschirm an und ändert sie dann, um eine Lösung zu finden.

*DISPLAY L
t=PI/8q=FNa(1)
DEFFNa(n)IFn=7END
LOCALz,j,p,i,c,s,x,y,m,u,v
F.z=0TO99u=z MOD10*100v=z DIV10*100ORIGINu,v
F.j=0TO12S.4p=0F.i=j+3TOj+9S.2c=9*COS(i*t)s=9*SIN(i*t)p=p*4-(POINT(c,s)<>0)*2-(POINT(9*c,9*s)<>0)N.
m=n:IFn=5A.(43A.p)=0p=0m=7
IF(ASCM."??O|(C",n)-64A.p)=0THEN
F.i=-1TO0GCOL0,-i*n:c=99*COS(j*t)s=99*SIN(j*t)y=402/3^m MOD3-1MOVE-c-s*y,c*y-s:x=n<3MOVEc*x-s*x,s*x+c*x:x=2778/3^m MOD3-1y=5775/3^m MOD3-1PLOT85-32*(n MOD6>3),c*x-s*y,s*x+c*y:IFi q=FNa(n+1)ORIGINu,v
N.
ENDIF
N.N.=0

Erläuterung

Beachten Sie, dass in BBC basic ein Abstand von 1 Pixel = 2 Einheiten gilt, sodass das 50x50-Pixel-Raster zu einem 100x100-Raster wird.

Wir verwenden eine rekursive Funktion, um die beiden großen Dreiecke, das mittlere Dreieck, das Quadrat und das Parallelogramm in die Form zu bringen. Die frühere Form in der Liste wird gezeichnet, bevor der nächste rekursive Aufruf erfolgt. Wenn ein rekursiver Aufruf zurückkehrt, ohne eine Lösung zu finden, wird die frühere Form schwarz überzeichnet und eine neue Position der früheren Form versucht.

Sobald diese fünf Formen gezeichnet sind, ist das Platzieren der beiden kleinen Dreiecke nur eine Formalität. Es ist jedoch notwendig, eine davon zu zeichnen, um sie zu unterscheiden, wenn sie eine gemeinsame Kante haben. Wir färben nur eines der beiden kleinen Dreiecke. Der andere ist in natürlichem Schwarz gehalten.

Es wird versucht, jede Form an verschiedenen x-, y-Koordinaten und in vier verschiedenen Rotationen zu platzieren. Um zu testen, ob Platz zum Zeichnen einer Form frei ist, verwenden wir die folgende Vorlage mit einem Winkel von 45 Grad. Die Rotationen werden um die *und die getesteten 8 Pixel in 2 Halbkreisen mit Radius 9 und 81 Einheiten durchgeführt und fallen auf Strahlungslinien mit ungeraden Vielfachen von 22,5 Grad zur x- und y-Achse.

Für ein großes Dreieck müssen alle 8 Felder frei sein. Bei anderen Formen müssen nur einige der Zellen frei sein, damit eine Maske angewendet wird.

+----+----   Shape             Mask HGFEDCBA Mask decimal 
|\ E/|\G /  
| \/F|H\/    1,2. Large triangle    11111111    -1
|C/\ | /     3. Med triangle        00001111    15
|/ D\|/      4. Square              00111100    60
+----*       5. Parallelogram       11101000   -24
|\ B/        6. Small triangle      00000011     3
|A\/         7. Parallogr reversed  00101011    43
| /          Note: reversed parallelogram is checked/drawn at recursion depth n=5
|/           with a special check, but the coordinates are encoded as m=7.  

Sobald festgestellt wurde, dass eine Form passt, muss sie gezeichnet werden. Wenn es sich um ein Dreieck handelt, mit dem es gezeichnet ist PLOT 85, und wenn es sich um ein Parallelogramm handelt, ist die Zahl 32 höher (beachten Sie, dass PLOTwir ein Quadrat für Zwecke als spezielles Parallelogramm betrachten). In beiden Fällen müssen 3 aufeinanderfolgende Eckpunkte angegeben werden. Der zweite Scheitelpunkt ist der Ursprung der Form ( *in der obigen Tabelle markiert ), mit Ausnahme des großen Dreiecks, bei dem es sich (vor der Drehung) um den Ursprung handelt. -1,-1.Die anderen beiden Scheitelpunkte können x- und y-Koordinaten haben, -1,0 or 1die aus der Basis 3 extrahiert werden codierte Zahlen, dann um 99 skaliert und bei Bedarf durch Transformation mit cund gedreht s.

Ungolfed Code

  *DISPLAY L
  t=PI/8                                          :REM Constant 22.5 degrees.
  q=FNa(1)                                        :REM Call function, return dummy value to q
  END                                             :REM End the program gracefully if no solution. Absent in golfed version.

  DEFFNa(n)                                       :REM Recursive function to place shapes.
  IFn=7END                                        :REM If n=7 solution found, end program.
  LOCALk,z,j,p,i,c,s,x,y,m,u,v                    :REM declare local variables for function.
  k=ASCMID$("??O|(C",n)-64                        :REM Bitmasks for big tri, big tri, med tri, sq, normal paralellogram, small tri.
  FORz=0TO99                                      :REM For each point on the grid
    u=z MOD10*100:v=z DIV10*100                   :REM calculate its x and y coordinates relative to bottom left of screen
    ORIGINu,v                                     :REM and set the origin to this point.
    FORj=0TO12STEP4                               :REM For each rotation 0,90,180,270deg
      p=0                                         :REM assume no non-black pixels found
      FORi=j+3TOj+9STEP2                          :REM test angles of 3,5,7,9 times 22.5 deg anticlockwise from right x axis.
        c=9*COS(i*t)                             :REM Coords of test points at radius ll
        s=9*SIN(i*t)
        p*=4                                      :REM Leftshift any existing data in p
        p-=(POINT(c,s)<>0)*2+(POINT(9*c,9*s)<>0)  :REM and check pixels at radius 11 and 99.
      NEXT
      m=n                                         :REM The index of the shape to plot normally corresponds with recursion depth n.
      IF n=5 AND (43ANDp)=0 p=0:m=7               :REM If n=5 check if a reverse parallelogram is possible (mask 43). If so, clear p and change m to 7.
      REM                                         :REM Check p against mask k, if the shape fits then...
      IF (k ANDp)=0 THEN
        FOR i=-1 TO 0                               :REM draw the shape in colour, and if deeper recursions prove unsuccesful, redraw it in black.
          GCOL0,-i*n                                :REM Colour is equal to n.
          c=99*COS(j*t)                             :REM Set parameters c and s for scaling by 99
          s=99*SIN(j*t)                             :REM and rotation by 0,90,180 or 270 as appropriate.
          x=-1                                      :REM For vertex 1, x=-1 always.
          y=402/3^m MOD3-1                          :REM Lookup y value for vertex 1.
          MOVEc*x-s*y,s*x+c*y                       :REM Use c and s to transform the vertex and move to it.
          x=n<3                                     :REM For vertex 2, coords are 0,0 except for large triangle where they are -1,-1
          y=x                                       :REM in BBC BASIC, TRUE=-1
          MOVEc*x-s*y,s*x+c*y                       :REM Use c and s to transform the vertex and move to it.
          x=2778/3^m MOD3-1                         :REM Lookup x and y value for vertex 3.
          y=5775/3^m MOD3-1                         :REM PLOT85 uses last 2 points + specified point to make triangle, PLOT85+32 makes paralelogram (or square.)
          PLOT85-32*(n MOD6>3),c*x-s*y,s*x+c*y      :REM Use c and s to transform the vertex and draw shape.
          IFi q=FNa(n+1):ORIGINu,v                  :REM If i=-1 recurse to next level. If it fails, reset the origin before replotting this level's shape in black.
        NEXT
      ENDIF
    NEXT
  NEXT
  =0                                                :REM Dummy value to return from function

Ausgabe

Dies ist eine Montage der vom Programm gefundenen Lösungen für die Testfälle. Die Verwendung von 99 statt 100 aus Golfgründen hinterlässt einige kleine schwarze Lücken. Da die Formen während der Suche neu gezeichnet werden, kann es in einigen Fällen einige Sekunden dauern, bis sie ausgeführt werden. Das Anschauen ist sehr faszinierend.

Bildbeschreibung hier eingeben


4
Wow, ich bin beeindruckt. Jetzt würde ich gerne ein Video davon in Aktion sehen! =)
flawr
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.