Güzel aralıklı ASCII spirali


13

Bu spirali düşünün

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

Merkezden başlayarak:

  • İlk satırın (yukarı) 3 karakteri vardır.
  • İkinci satırda aynı sayıda karakter var (3)
  • Ardından, sonraki iki taraf için iki karakter (5) ekliyoruz.
  • Bu desen devam eder, iki taraf aynı uzunlukta daha sonra uzunluğu 2 arttırır.

Bu spirali N çizgileri için üretmek istiyorum.

  • Herhangi bir dilde yazın.
  • Girdi / bağımsız değişken, vb. Sarmalınızdaki satır sayısıdır.
  • Her satır, önceki satırın bitiş karakteri bir önceki satırın saat yönünde 90 derece yönünde başlar.
  • Spiralin çizgileri olduğu sürece, her satırdan önce veya sonra ne kadar boşluk olduğu umurumda değil.
  • Seçtiğiniz boşluk olmayan herhangi bir karakterle spiral çizmek için metin çıktısı alın.
  • Bunu en az sayıda baytla yapmaya çalışın.

Test senaryoları (çıktı olarak karma kullanarak):

N = 1

#
#
#

N = 2

###
#
#

N = 3

###
# #
# #
  #
  #

N = 10

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

@Shaggy "Çıktı metnini seçtiğiniz boşluk olmayan herhangi bir karakterle spiral çizmek için." Evet, ne istersen.
AJFaraday


3
İlk görüntünün *yerine bir #. Beklenen?
Wernisch

@Wernisch Yararlı bir başlangıç ​​noktası olması amaçlanmıştır, ancak sanırım yanıltıcıdır. İstediğiniz karakteri kullanabilirsiniz.
AJFaraday

Yanıtlar:


11

05AB1E , 13 11 bayt

Kod:

İki bayt kaydettiği için Emigna'ya teşekkürler !

LDÈ-Ì'#3Ý·Λ

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!

açıklama

Spiraldeki her bir kenarın uzunlukları 3 uzunluğu ile başlar ve her iki adımda iki adım yavaş yavaş artar:

3,3,5,5,7,7,9,

kenarlı bir spiral için , bu listeyi boyutuna kırpmamız yeterlidir . Bu, aşağıdaki kod parçasıyla yapılır:nnn

L                # Create a list from [1 .. input]
 DÈ              # Duplicate and check for each number if even
   -             # Subtract that from the first list
    Ì            # Add 2

Bu bize istenen uzunlukların listesini verir.

     '#          # Push the '#' character
       0246S     # Push the array [0, 2, 4, 6]
            Λ    # Write to canvas

Kanvas, üç parametreyi (ilk önce en sağdaki parametrenin atıldığı yer) açan bir işlev olarak çalışır: <uzunluk (lar)> , <karakter (ler)> , <yön (ler)> . Direction parametresi bu durumda bir sayı listesidir. Talimatlara karşılık gelen sayılar:

[70162543]

Bu durumda, [0, 2, 4, 6] yol tarifleri listesine karşılık gelir [↑, →, ↓, ←]. Tuval, uzunluk listesinden alınan her uzunluk boyunca yinelenir, '#' karakterini kullanır ve yönler listesi üzerinde döngüsel olarak yinelenir.


0246S=3Ý·
Emigna

@Emigna Ah Bunu düşünmedim, teşekkürler!
Adnan

6

Python 2 , 176 170 165 161 157 bayt

g=lambda a,r:r and g(map(''.join,zip(*a))[::-1],r-1)or a
R=['#']
n=1
exec"R=g(['  '+l for l in g(R,n)][:-1]+[(n+2)*'#'],3*n);n+=1;"*input()
print'\n'.join(R)

Çevrimiçi deneyin!

Tekrar tekrar: Spiralin yinelemesini 'kanonik' bir konuma gdöndürmek için kullanır n(N = 3 veya N = 7'ye benzer), mevcut her satırın soluna 2 boşluk ekleyip son satırı değiştirerek yeni bir segment ekler tüm '#'s (N = 4 veya N = 8 ile karşılaştırılabilir bir konumla sonuçlanır) ve son olarak gtekrar doğru konuma döndürmek için kullanın. Köpürtün, durulayın, tekrarlayın.


4

Kömür , 16 15 14 bayt

↶FN«¶×#⁺³⊗÷ι²↷

@Neil sayesinde -2 bayt .

Çevrimiçi deneyin (ayrıntılı) veya Çevrimiçi deneyin (saf) .

Açıklama:

Yazdırma yönü varsayılan olarak sağdadır ve yukarı doğru başlamak istiyoruz, bu yüzden saat yönünün tersine 45 derece döndürerek başlıyoruz:

PivotLeft();
↶

Ardından iaralıkta döngü yapın [0, input):

For(InputNumber()){ ... }
FN« ...

Bir konum geri gitme etkisini taklit etmek için yeni bir satır yazdırın:

Print("\n");
¶

xGeçerli yönde "#" miktarını yazdırın :

Print(Times("#", ... ));
×# ...

Nerede xgeçerli: 3 + i // 2 * 2:

Add(3,Doubled(IntegerDivide(i,2))
⁺³⊗÷ι²

Ardından, döngünün bir sonraki yinelemesi için saat yönünde 45 derece döndürün:

PivotRight();
↷

Charcoal'da geriye doğru hareket etme emri olmadığını varsayıyorum?
Emigna

@Emigna Emin değilim, ama ben de bulamadım. Bu cevabı yazarken gerçekten kendimi arıyordum. Belirli bir yöne sahip bir Hareketin yanı sıra belirli koordinatlara sahip bir Atlama var, ancak maalesef bir MoveBack yok.
Kevin Cruijssen

1
⊗÷ι²bir bayt daha kısadır ⁻ι﹪ι². Ayrıca, s'den \nönce a yazdırarak geri hareket etmenin etkisini elde edebilirsiniz #, bu da »#ek bir genel bayt tasarrufu için kaldırmanıza izin verir .
Neil

@ Neil için teşekkürler ⊗÷ι², ama s \nönce bir baskı için değişiklikler ne olurdu #? Öğesini eklersem spiral yanlıştırPrint("\n") .
Kevin Cruijssen

Artık kollar üst üste geldiği için onları #daha uzun yapmalısınız .
Neil

3

Python 2 , 179178 bayt

-1 byte için Kevin Cruijssen'e teşekkürler .

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec k/2*2*"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

Çevrimiçi deneyin!


Python 2 , 179 bayt

Bu yaklaşımda, arama listesi yerine formüller xve ydeltalar için kullanılır .

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
exec'exec k/2*2*"x+=k%-2+k%4/3*2;y-=(k%2or k%4)-1;m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

Çevrimiçi deneyin!


n+1+n%2için n%2-~niçin -1 bayt. Ve 0--n/4*21'den daha kısa olduğunu hatırlamak zorundayım -(-n/4*2). Güzel cevap, benden +1.
Kevin Cruijssen

1

JavaScript (ES6), 185 bayt

Tabii bu daha çok golf olabilir, belki de körelme ile, ama işte benim alçakgönüllü girişimim. Sondan bir önceki karakter hariç okunabilirlik için satır sonları eklendi

r=(a,n=1)=>n?r(a.reduce((_,c)=>c).map((_,i)=>a.map(e=>e[i])).reverse(),n-1):a,
s=n=>n?r(s(n-1)).map((r,i)=>[...r,w,w].map(x=>i?x:'#')):[[w=' ']],
d=n=>r(s(n),1-i).map(r=>r.join``).join`
`

Kullanım: d(10)N = 10 deneme örneğine göre bir dize döndürür.

Bir işlevi tanımlar r(a,n)bir dizi dönmesine agöre ndöner; aralık ve çizgiler (tekrar başlangıç ​​konumuna döndürülmez) döndürerek ve ekleyerek bir s(n)boyut spirali temsil eden 2 boyutlu bir dizi oluşturmak için bir işlev n; ve meydan okumaya göre sürekli olarak döndürülen ve döndürülen bir dize olarak işlenen bir d(n)boyut spirali çizmek için bir fonksiyon n.

Bu gerçekten eğlenceli bir mücadeleydi: ¬)

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.