Gömülü Altıgenler!


18

Göreviniz: bir tamsayı verildiğinde n, n. Derinliğe kadar aşağıdaki kuralları izleyerek gömülü bir altıgen deseni oluşturun.

Gömülü bir altıgen bunun temel şekline sahiptir: ( n=0)

 __      
/  \
\__/

Gömülü Altıgenler n=1ve n=2:

  ____    
 /  \ \
/\__/  \
\      /
 \____/

    ________    
   /  \ \   \
  /\__/  \   \
 /\      /    \
/  \____/      \
\              /
 \            /
  \          /
   \________/

Her bir tarafın uzunluğu, bir önceki derinlikte iki kez aynı tarafın uzunluğunun 2 katıdır. Üst ve alt taraflar 2 karakter uzunluğunda n=0, geri kalanı 1 karakter uzunluğunda başlar. Üst-alt olmayan yan uzunluklar 2^nuzun olmalıdır ( OEIS: A000079 ) ve üst ve alt taraflar kurala uymalıdır 2^(n+1)(aynı OEIS).

Geçerli altıgenler 0 dizinli, isterseniz 1 dizinli kullanmayı seçebilirsiniz.

Bu , bu yüzden en kısa cevap kazanır!


@LuisMendo Tamam, adı değiştireceğim.
SparklePony Yoldaş

Büyük girdileri işlemek zor olabilir (örn. 64). Bunun bir sınırı var mı n?
Matthew Roh

@SIGSEGV n için bir sınır yoktur.
SparklePony Yoldaş

1
:)) Hexagony bir cevap görmek için eğlendirdi olabilir misiniz
Sn Xcoder

1
Heh, Koch eğrisi gönderimimin kaplumbağa grafikleri de bunu yapabilir (sadece ilk işlev değişti). Kesinlikle bunun için çok uzun olsa da :)
Ørjan Johansen

Yanıtlar:


10

Kömür , 40 29 bayt

@Neil sayesinde while döngüsünü diğer hileler arasında for-döngüye çevirerek 11 bayt tasarruf

FN«AX²ιβ×__β↓↘β←↙β↑←×__β↖β→↗β

Çevrimiçi deneyin!

Açıklama (modası geçmiş)

Bu program, en büyük altıgeni oluşturmakla başlar ve daha sonra küçük olanları bir süre döngüsünde tek tek yapar (1 dizinli). Referans için, αgiriş numarası βiçeren değişkendir 2^(α-1)ve ιdöngüde yineleme değişkendir.

Nα                        # Take input and store in α
Wα«                       # While α do:
 ×_X²ι                    #  Write "_"*(2**ι); this forms the top edge of the hexagon
 ↓                         #  Go down
 AX²⁻ι¹β                 #  Assign 2**(ι-1) to β
 ↘β←                       #  Write \ β times in a SE direction (top right edge) and then go left
 ↙β↑                       #  Write / β times in a SW direction (bottom right edge) and then go up
 ←×_X²ι                   #  Write the bottom edge
 ↖β→↗β                    #  Just like before, write the top and bottom left edges
 A⁻α¹α                    #  Decrement α
                          # Now the pointer is at the top left corner of the hexagon,
                          # from where the other smaller hexagons will soon be generated

"Merhaba, Dünya!" Olmadığını fark ettim. Charcoal için henüz bir program. Eklemelisin.
mbomb007

@ mbomb007 Bu sadece "bu dil kaynak dosyasını komut içermiyorsa yazdırır" yanıtının tekrarı olmaz mıydı?
Neil

Bunu fark ettiğinde bazı bayt kaydedildi ×_X²ιaynıdır ×__βve bazı daha fazla dönüştürerek bayt bir içine de girdi numarasını saklamak zorunda kaçınır, hangi. Çevrimiçi deneyin! .
Neil

@Neil Teşekkürler, bu çok temiz :)
Kritixi Lithos

5

Haskell , 230 217 207 bayt

DÜZENLE:

  • -13 bayt: @xnor benim #olabileceğimi gördümax .
  • -10 bayt: Ve ayrıca bu zipWithve bir pişleçle birleştirilebilirdi ?ve (bir şekilde!) Yeniden uygulandım replicate.

malır Integerve döndürür a String.

m n=unlines.foldr1 o$((2^n)&).(2^)<$>[0..n]
l&t|a<-c[l,2*t]" _",b<-[c[l-i,1,2*t+2*i-2,1,l-i]" / \\ "|i<-[1..t]]=a:b++r(r<$>o[a]b)
c=(concat.).z replicate
o=max?' '?""
f?e=z f.(++repeat e)
r=reverse
z=zipWith

Çevrimiçi deneyin!

Nasıl çalışır

  • mana işlevdir. &Altıgenleri uygun dolgu ile üretmek için kullanır , sonra bunları katlar o.
  • l&tsatırların bir listesi olarak t, yan uzunluğun büyük bir tanesinin içine yerleştirilmiş küçük bir yan uzunluk altıgen oluşturur . lString
    • a alt çizgi ile altıgenin üst çizgisidir.
    • baltıgenin üst yarısındaki diğer çizgilerin listesidir. Çizgileri b, dikdörtgen şeklinde olan dolguda ortalanmıştır; bu, bir sonraki adımın çalışmasına izin verir.
    • Altıgen alt yarısı aüzerine Kaplanmış bile osonra ters, (çizgilerin her ikisi için ve her bir hat içinde).
  • ciki bağımsız değişken, uzunluk listesi ve dize alır ve orijinaldeki her karakterin karşılık gelen uzunluk kadar kopyasına sahip bir dize oluşturur c[1,3,2]"abc" == "abbbcc"; &Çizgileri oluşturmak için kullanılır .
  • o resimleri çizgi listesi olarak temsil eden iki argüman alır ve birincisi, ikincisinin üstüne daha küçük olanı bindirir.
    • Hem altıgenleri birleştirmek hem de her altıgene alt kısım eklemek için kullanılır.
    • Temelde ?, ilk resmi hem aşağı hem de sağa doğru sonsuz sayıda boşlukla doldurmak için iki kez kullanarak , sonra da karşılık gelen karakterleri bir araya getirerek max, varsa boşluk olmayan karakteri seçerek çalışır.
  • (f?e)l mlsonsuz sayıda 'e' öğesi ekleyerek bir listeyi doldurur , ardından sonuç listesini ve listeyi işlevle mbirlikte fermuarlar f.

1
Güzel çözüm! Bence (#)olabilir max.
xnor

1
Vızıltının ile kombine edilebilir pbayt tasarrufu için: o=max?' '?"";f?e=z f.(++repeat e). Daha kısa, noktasız olabilir.
xnor

2
(\n->(<$[1..n]))olduğunu replicate.
xnor

@xnor replicate? Şimdi bu sadece utanç verici. Çok fazla alışkınım <$[1..n]ya da [1..n]>>neredeyse her zaman kazanıyorum. Ancak, ?daha da kısaltacağımı görmüyorum . Zaten ppointfree yapmaya çalıştım ve ++şeyleri havaya uçurmak, sadece yanlış noktada flip.
Ørjan Johansen

3

JavaScript (ES6), 258 bayt

f=(n,s=` `.repeat(1<<n),p=(n?f(n-1):`


`).replace(/(.*)\n/g,s+`$1 `+s)+s,t=`_`.repeat(2<<n))=>(s+t+s+`
`+s.replace(/ /g,"$'/$'$'  $`$`$`$`\\$'\n")).replace(/ /g,(c,i)=>p[i+(1<<n>>1)])+s.replace(/ /g,"$`\\$`$`  $'$'$'$'/$`\n").replace(/ +\/( *)\n$/,t+`/$1
`)
<input type=number min=0 oninput=o.textContent=f(+this.value)><pre id=o>

Açıklama: İlkinden sonraki altıgenler için, önceki altıgen ilk önce her iki tarafta oluşturulur ve doldurulur (bu, çıktının bir dikdörtgen olmasına bağlıdır). (İlk başlık için bir miktar sahte dolgu oluşturulur.) Altıgenin üst ve üst tarafları oluşturulur ve tüm boşluklar önceki altıgenle birleştirilir. (Altıgenlerin hizalanması için bazı hileler vardır; fazladan kenar boşluklarına izin verilirse bu daha kolay olacaktır.) Altıgenin alt kenarları üst kenarlara benzer şekilde oluşturulur ve altıgenin altı doldurulur. Özyinelemenin çalışması için son satırsonu da dahil olmak üzere dikdörtgen çıktıyı döndürmek için özen gösterilmelidir.


Yani, bunun Teflon ve Deep Dish Pizza olanlarının hepsinin gerçekten benzer bir yapı olduğunu gösteriyor musunuz? Bu biraz temiz.
AdmBorkBork

1
@AdmBorkBork Bunu yapan birkaç cevap daha var; bu köşegenler /ASCII sanatında popülerdir ve replaceyöntem bunları JavaScript'te oluşturmanın nispeten ucuz bir yoludur.
Neil

1<<n>>1: Güzel simetri ;-)
Luke

@Luke Değişkeni diyelim değiştirebilirim, vama ne yazık ki 1her zamanki yazı tiplerimde simetrik değil.
Neil

2

PHP, 337 Bayt

0 Dizinleme

$h=array_fill(0,1+2*$v=2**($c=$argn),str_pad("",4*$v));for(;1+$c;$c--)for($i=0;$i<$e=2**$c*2+1;$i++){$z=$e-$i<2;$y=$i&&$i<$e/2;$x=$i>=$e/2&$i<$e-1;$h[$i]=substr_replace($h[$i],$s=str_pad(!$y?$z|$x?"\\":"":"/",$e-1+$z-$y+$y*$i*2-$x+$x*2*($e-$i),$z|!$i?"_":" ").(!$y?$z|$x?"/":"":"\\"),$v-$z-$y*$i-$x*($e-$i),strlen($s));}echo join("\n",$h);

Çevrimiçi deneyin!

Expanded

$h=array_fill(0,1+2*$v=2**($c=$argn),str_pad("",4*$v)); # fill array with maximal width
for(;1+$c;$c--)  # greatest hexagon to lowest
for($i=0;$i<$e=2**$c*2+1;$i++){ # loop through the rows
    $z=$e-$i<2;$y=$i&&$i<$e/2;$x=$i>=$e/2&$i<$e-1; # booleans last first ad second half
    $h[$i]=substr_replace($h[$i], # replace substring
    $s=str_pad(
        $z?"\\":($y?"/":($x?"\\":"")),
        $e-1+$z-$y+$y*$i*2-$x+$x*2*($e-$i),
        $z|!$i?"_":" "
        ).(!$z?!$y?$x?"/":"":"\\":"/"), # with string for smaller hexagon
    $v-$z-$y*$i-$x*($e-$i), # at offset
    strlen($s));
}
echo join("\n",$h); # Output
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.