Izgara-Tangram'ı çözün


22

Tangram Beş farklı büyüklükte üçgenler, bir paralelkenar ve bir kare: Yedi şekillerden oluşan bir diseksiyon bulmaca. Bir şekil verildiğinde amaç, tüm parçaları kullanarak ve üst üste binmeden şekli yeniden oluşturmaktır. Düzlemde bu parça setini düzenlemek için sonsuz sayıda yol vardır. İlginç bir alt küme

Izgara Tangramları

"Standart" Tangram karesini, bir ızgara tarafından alttan küçük karelere bölünmüş daha büyük bir kareye çizebiliriz . Izgara tangramları, tangram parçalarından oluşan, parçaların tüm köşeleri ızgara noktalarında olacak şekildedir.

Bunlar, bu mücadelede ele almak istediğimiz Tangram bulmacası çeşitleri, çünkü muhtemelen daha genel olanlardan daha kolay ele alınıyorlar.

Yan not olarak: Çinli matematikçiler Chuan-Chin Hsiung ve Fu Traing Wang, 1942'de sadece 13 dışbükey tangram olduğunu kanıtladı. İlk önce problemin grid tangramlarına indirgenebileceğini gösterdiler ve daha sonra bazı birleştirici ve geometrik argümanlar kullandılar. Bunların hepsi bu 13:

Meydan okuma

Çözülebilir bir ızgara tangramı verildiğinde, ızgara tangramının yedi tangram parçasına ayrılmasıyla çıktı.

IO

Bir tangram siyah-beyaz bir görüntü olarak verilir (şekil siyah, arka planda beyaz), her iki tarafı da 50 piksele sahip. Izgara tam olarak 50 piksel genişliğe sahiptir. Izgara çizgileri görüntünün yanlarına paraleldir.

EDIT: Görüntü, giriş olarak kabul edilebilir ve PNG, TIFF, PBM vb.

Çıktı tekrar aynı boyuta sahip olmalı ve yine aynı şekle sahip olmalıdır, ancak her parça farklı bir renkte veya alternatif olarak tüm parçaları ayıran beyaz çizgilerle olmalıdır. Dikdörtgen olmayan dörtgenlerin döndürülebildiğine dikkat etmek önemlidir.

Parçaların kenarındaki piksellerin, tam olarak diğer efektler veya başka tüyler oluşması durumunda bile, şekil üzerindeki ile aynı olması gerekmez.

Örnek Giriş ve Çıkış:

Örnekler:

Olası çözümler:


görüntü işleme, bu zorlukta tamamen gereksiz bir engeldir. Girdiyi küçük bir ikili dizi olarak belirlediyseniz çok daha çekici bulabilirim.
Sparr

1
Dediğim gibi, o kumdayken tartışıldı. Ancak görevin kendisi çok daha zor olduğu için çok fazla bayt eklediğinden şüpheliyim.
kusur

3
Girdi ve çıktının eskisi gibi olmasını öneren insanlardan biriydim ve bu tavsiyeyi yaptım çünkü bu bana göre bir Tangram yarışması sunmanın en doğal ve en uygun yolu. Herhangi bir girdi / çıktı biçimi çok sayıda bayt alır, bu yüzden bunun gerçekten bir sorun olduğunu sanmıyorum.
El'endia Starman,

1
Elendia ile aynı fikirdeyim. Grafik I / O ile ilgili tek sorun, grafik olanakları olmayan dilleri sınırlayabilmesidir. Bununla birlikte, PBM ve PGM, ASCII sanatına o kadar yakındır ki, gerçek bir problem yoktur, eğer insanlar böyle formatların farkındaysa. en.wikipedia.org/wiki/Netpbm_format
Level River St

1
@LevelRiverSt Bu iyi bir nokta, bu formatları veya hatta bir 2d dizisi / sıfırlar ve birler dizisi kullanmanın tamamen kabul edilebilir olacağını düşünüyorum.
kusur

Yanıtlar:


31

BBC BASIC, 570 514 490 bayt ASCII

Tercümanı http://www.bbcbasic.co.uk/bbcwin/download.html adresinden indirin.

Tokenlenmiş 435 bayt

Tam program L.bmpekrandan bir girdi görüntüler , ardından bir çözüm bulmak için onu değiştirir.

*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

açıklama

BBC basic'de 1 piksel = 2 birim mesafenin, 50x50 piksel ızgarasının 100x100 ızgara haline geldiğine dikkat edin.

2 büyük üçgen, orta üçgen, kare ve paralelkenarın şeklini yerleştirmek için özyinelemeli bir işlev kullanıyoruz. Listedeki önceki şekil bir sonraki özyinelemeli çağrı yapılmadan önce çizilir. özyinelemeli bir çağrı bir çözüm bulunmadan geri dönerse, önceki şekil siyah renkte yeniden çizilir ve önceki şeklin yeni bir konumu denenir.

Bu beş şekil çizildiğinde, iki küçük üçgenin yerleştirilmesi sadece bir formalitedir. Ancak, ortak bir kenarı paylaşıyorlarsa onları ayırt etmek için bunlardan birini çizmek gerekir. İki küçük üçgenden sadece birini renklendiriyoruz. Diğer doğal siyah kalır.

Her şeklin yerleştirilmesi farklı x, y koordinatlarında ve 4 farklı dönüşte denenir. Bir şekil çizmek için boş alan olup olmadığını test etmek için aşağıdaki şablonu 45 derece açı ile kullanırız. Rotasyonlar hakkında yapılır* ve test edilen 8 piksel, yarıçap 9 ve 81 birimlerinin 2 yarım dairesindedir ve x ve y eksenlerine 22.5 derecelik tek katlarda yayılan çizgiler üzerine düşer.

Büyük bir üçgen için 8 boşluğun hepsinin temiz olması gerekir. Diğer şekiller için, hücrelerin yalnızca bazılarının temiz olması gerekir, böylece bir maske uygulanır.

+----+----   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.  

Bir şeklin sığacağı tespit edildikten sonra, çizilmesi gerekir. Çizilen bir üçgen PLOT 85ise, bir paralelkenar ise, sayı 32 daha yüksektir ( PLOTbir kare için özel bir paralelkenar olduğunu düşünüyoruz). Her iki durumda da ardışık 3 köşe verilmelidir. İkinci köşe ( *yukarıdaki tabloda işaretli olan) büyük üçgenin haricinde, (dönmeden önce) olduğu yerde (örneğin dönmeden önce) tabanın 3'ten çıkarılmış -1,-1.x ve y koordinatlarına sahip olabilir. -1,0 or 1kodlanmış sayılar, daha sonra 99 ile ölçülmüş ve ile dönüştürme ile gerektiğinde döndürülür cves .

Ungolfed kod

  *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

Çıktı

Bu, program tarafından test durumları için bulunan çözümlerin bir montajıdır. Golf nedeniyle 100 yerine 99 yerine bazı küçük siyah boşluklar bırakıyor. Şekiller aramalar sırasında yeniden çizildiğinden, bazı durumlarda kaçmak biraz zaman alabilir ve izlenmesi oldukça etkileyicidir.

görüntü tanımını buraya girin


4
Vay, etkilendim. Şimdi bir videosunu çalışırken görmek isterim! =)
kusur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.