Minotaur için ev geliştirme


42

Minotaur için ev geliştirme

Girit labirentinin çizilmesi oldukça kolaydır. Sadece simetrik bir şekille başlayın (burada kırmızı). Bu satırların 'düğümlerinin' tüm bitiş noktalarını çağıralım. Ardından kemerleri çizmeye başlarsınız (siyah): İlki en üstteki orta düğümde başlar ve sağdaki yandaki düğüme bağlanır, ardından önceki başlığa en yakın iki düğüm bağlanır. Bu, tüm düğümler kaplanana kadar tekrar edilir.

gif

Şimdi bu kavramı genelleştirebiliriz: Daha fazla Lşekil ekleyerek kolayca yeni başlangıç ​​kalıpları oluşturabiliriz . İlk şekilleri şu şekilde sıraladım:

derece, aşama

En soldaki desen, 0 derece derece bir cretan labirenti üretecektir . Bir sonraki derece 1 derece (bir orijinal) vb bir cretan labirent yaratacaktır .

Görev

Negatif olmayan bir tamsayı verildiğinde n, programınız naşağıdaki örneklerde gösterilen derece dereceli bir cretan labirentinin ascii gösterimini vermelidir . Sondaki boşluklar / yeni satırlar önemli değil. Kodunuzun nasıl çalıştığı hakkında kısa bir açıklama yapmanız gerekir.

Örnekler

Orijinal cretan labyrith (derece 1) çıkışı aşağıdaki gibidir:

+-----------------------------+
| +-------------------------+ |
| | +---------------------+ | |
| | | +-----------------+ | | |
| | | | +-------------+ | | | |
| | | | | +---------+ | | | | |
| | | | | | +-----+ | | | | | |
| | | | | | | +-+ | | | | | | |
| | | | | + | | | + | | | | | |
| | | | +---+ | +---+ | | | | |
| | | +-------+-------+ | | | |
| | +-------+ | +-------+ | | |
| +-------+ | | | +-------+ | |
+-----------+ | +-----------+ |
              +---------------+

İlk desen:

+ | | | +
--+ | +--
----+----
--+ | +--
+ | | | +

0 derecelik cretian labirenti şöyle görünmelidir:

+-------------+ 
| +---------+ | 
| | +-----+ | | 
| | | +-+ | | | 
| | + | + | | | 
| +---+---+ | | 
+---+ | +---+ | 
      +-------+ 

İlk desen:

+ | +
--+--
+ | +

Yanıtlar:


10

Perl 5, 349 bayt

say$p="| "x$_,"+","-"x(16*$n-4*$_+13),"+ $p"for 0..4*($n=pop)+3;say$p="| "x(3*$n+2),"+ | ","| "x2x$n,"+ $p|";$p=~s/..//,$q="-"x(4*$_-1),say"$p+$q+ ","| "x(2*$n-2*$_+1),"+$q+ $p|"for 1..$n;$p=~s/..//;say$p,("+---"."-"x4x$n)x2,"+ $p|";$p=~s/..//,$q="-"x(4*$n+3)."-"x4x$_,say"$p+$q+ | ","| "x2x($n-abs$_),"+$q+ $p|"for-$n..$n;say" "x(8*$n+6),"+----$q+"

(Geçmek n bir komut satırı bağımsız değişken olarak).

Labirenti altı bölümde satır satır hesaplar:

  • ilk 4n + 4 satır,
  • sonraki satır (no olan tek satır -),
  • sonraki n satırları,
  • sonraki satır (ilk desenin ortasındaki satır),
  • sonraki 2n + 1 satır,
  • son satır (satır aralığı olan satır).

6

Python 3.5, 703 695 676 648 587 581 542 535 500 486 462 431 423 411 bayt:

( 55 bayt kaydetme önerisi için @flawr'a teşekkür ederiz (486 -> 431)! )

def j(r):R=range;Z=zip;B=r+r+2;P,M='+-';X='| ';q=[*Z(R(0,B-1,2),R(B-1,0,-2))];L=r+1;A=2+r;print('\n'.join([X*w+P+M*v+P+' |'*w for v,w in Z(R(4*L*4-3,0,-4),R(4*L))]+[X*g+P*o+M*k+u+M*k+P*o+' |'*-~g for g,o,k,u in Z([*R(4*L-A,0,-1),*R(4*L-A)],[0]+[1]*(3*r+2),[0,*R(1,4*L,2),*R(4*L+1,11*r,2)],[M*y+'+ '+X*b+P+M*y for y,b in q]+[M*B+P+M*B]+[M*y+'+ '+X*b+P+M*y for y,b in q[::-1]+q[1:]])]+[' '*(8*r+6)+P+M*(8*r+7)+P]))

Başlık için pek bir rakip yok, ama yine de bir şans verdim ve mükemmel çalışıyor. Yapabileceğim zamanla daha fazla kısaltmaya çalışacağım, ama şimdilik onu seviyorum ve daha mutlu olamadım.

Çevrimiçi deneyin! (İdeone) (Görünür çevrimiçi derleyici kısıtlamaları nedeniyle burada biraz daha farklı görünebilir. Ancak, yine de aynıdır.)

Açıklama:

Bu açıklamanın amaçları için, yukarıdaki işlevin girişe reşit olarak eşitlendiğini varsayalım 1. Olduğu söyleniyor, temelde olan, adım adım ...

  1. q=[*Z(R(0,B-1,2),R(B-1,0,-2))]

    Bir zip nesnesi, qbiri aralıktaki her bir ikinci tam sayıdan 0=>r+r+1ve diğeri aralıktaki her ikinci tam sayıdan oluşan 2 aralık nesnesi ile oluşturulur r+r+1=>0. Bunun nedeni, belirli bir derecede bir Girit labirentinin her başlangıç ​​paterninin her zaman -her satırda eşit bir sayıya sahip olmasıdır . Örneğin, derece bir cretan labirent için 1, r+r+1eşittir 3ve böylece, desen her zaman 0kısa çizgilerle başlar , ardından 4(2 + 2) kısa çizgilerle başlar. Bu zip nesnesi r+1, labirentin düzeninin ilk satırları için kullanılacaktır .

    Not: Bunun tek nedeni qbir listedir ve diğerlerinden ayrılmasının nedeni qbirkaç kez başvurulan ve abone olunmasıdır ve çok fazla tekrardan tasarruf etmek ve aboneliğe izin vermek için basitçe qliste şeklinde bir zip nesnesi oluşturdum .

  2. print('\n'.join([X*w+P+M*v+P+' |'*w for v,w in Z(R(4*L*4-3,0,-4),R(4*L))]+[X*g+P*o+M*k+u+M*k+P*o+' |'*-~g for g,o,k,u in Z([*R(4*L-A,0,-1),*R(4*L-A)],[0]+[1]*(3*r+2),[0,*R(1,4*L,2),*R(4*L+1,11*r,2)],[M*y+'+ '+X*b+P+M*y for y,b in q]+[M*B+P+M*B]+[M*y+'+ '+X*b+P+M*y for y,b in q[::-1]+q[1:]])]+[' '*(8*r+6)+P+M*(8*r+7)+P]))

    Bu, labirentin inşa edildiği ve bir araya getirildiği son adımdır. Burada, ilk 4*r+1olarak labirentin üst satırlarından, ikincisi labirentin orta 3*r+3çizgilerinden oluşan üç liste ve en son labirentin son satırından oluşan son liste satır sonları ( \n) ile birleştirilir. bir uzun dize. Son olarak, tüm labirentten oluşan bu büyük dize basılmıştır. Bu 2 listenin ve 1 dizginin gerçekte içerdiği şeye daha fazla girelim:

    • Bir başka sıkıştırılmış nesnenin liste halinde her satırın birer birer yaratılması için kullanılan birinci liste, satırlar |veya +sembollerle, aralıktaki tuhaf çizgi 0=>4*(r+1), iz |ya da +sembollerle ve ardından bir yeni satırla ( \n). Derece bir 1labirent durumunda , bu liste şöyle döner:

      +-----------------------------+
      | +-------------------------+ |
      | | +---------------------+ | |
      | | | +-----------------+ | | |
      | | | | +-------------+ | | | |
      | | | | | +---------+ | | | | |
      | | | | | | +-----+ | | | | | |
      | | | | | | | +-+ | | | | | | |
      
    • 4 liste içeren bir zip nesnesinden oluşan 2. liste ve her liste öncü / iz |sembollerinin sayısına, +sembollerin sayısına, tire sayısına ve son olarak da ilk r+1satırlarını içeren son listeye karşılık gelir . zip nesnesine göre oluşturulan desen, desenin qortasındaki çizgi (olmayan |) ve r+2simetrik desenin son çizgileri. Bu özel durumda, bu listenin zip nesnesinde kullanılan son liste geri dönecektir:

      + | | | +
      --+ | +--
      ----+----
      --+ | +-- 
      + | | | + 
      --+ | +--  <- Last line created especially for use in the middle of the labyrinth itself.
      

      Bu nedenle, 1 derecelik bir labirent durumunda, bu listenin tamamı geri dönecektir:

      | | | | | + | | | + | | | | | |
      | | | | +---+ | +---+ | | | | |
      | | | +-------+-------+ | | | |
      | | +-------+ | +-------+ | | |
      | +-------+ | | | +-------+ | |
      +-----------+ | +-----------+ | <- Here is where the extra line of the pattern is used.
      
    • Son satırın oluşturulduğu bu son liste. Burada, ilk parça Psayısının son satırının ilk bölümü (ilk boşluktan önceki) uzunluğu oluşturulur. Daha sonra, aynı satırın son bölümünün (bitiş bölümü) + 4 çizgi sayısı eklenir, bunların tümü önce gelir ve ardından tek bir +sembol izlenir . Derece 1 labirent durumunda, bu son liste döner:

                    +---------------+
      

    Bunların hepsini bir araya getirdikten sonra, bu adım sonunda tamamlanan labirenti verir. 1 derecelik bir labirent durumunda, nihayetinde buna geri dönecekti:

    +-----------------------------+
    | +-------------------------+ |
    | | +---------------------+ | |
    | | | +-----------------+ | | |
    | | | | +-------------+ | | | |
    | | | | | +---------+ | | | | |
    | | | | | | +-----+ | | | | | |
    | | | | | | | +-+ | | | | | | |
    | | | | | + | | | + | | | | | |
    | | | | +---+ | +---+ | | | | |
    | | | +-------+-------+ | | | |
    | | +-------+ | +-------+ | | |
    | +-------+ | | | +-------+ | |
    +-----------+ | +-----------+ |
                  +---------------+
    

1
Belki önce bunu tanımlayabilir R=rangemisin? Aynı şey için P='+'mi?
flawr

1
Bence altın fırsatı söyleme fırsatını for g,o,k,u in Z
Sherlock9

@ Sherlock9 Haha! İyi bir fikir! Eklendi. :)
R. Kap
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.