Alfabeyi Spiral!


13

Aşağıdaki dizeye bakın. Bir desen fark ettiniz mi?

ABEFNOPEFGH
DC GQI
MHRJ
LKJI SK
DTL
cum
BAZYXWV N
EO
DP
CQ
BAZYXWVUTSR

Bazılarının fark etmiş olabileceği gibi, temelde satırların / sütunların arasındaki mesafelerin 1 boşluk / satırsonu giderek arttığı alfabenin bir spirali.

Titiz tanım

  • Başlangıçta 0 olan bir c sayacına sahip olalım .
  • Biz ilk yazmak c + 1 soldan sağa alfabenin harfleri: A.
  • Daha sonra, yukarıdan aşağıya doğru bir sonraki (c + 1) (c + 2) / 2 harfler (eklenti B) AB.

  • Soldan sağa, sonraki (c + 1) (c + 2) / 2 (ekle C):

    AB
     C
    
  • Ve aşağıdan yukarıya, sonraki c + 1 harfleri (ekle D):

    AB
    DC
    
  • Döngünün sonuna ulaştı. Bu nedenle, c'yi artıralım (bu 1 olur). Daha sonra, ilk adımdan başlar, tek fark , alfabenin ilk c + 1 harflerini kullanmak yerine , bu döngünün son öğesinden başlayarak sonraki c + 1 harflerini kullanmamızdır ( Dbu durumda, böylece devam ediyoruz EFG...). Ne zaman Zulaşıldığında, bu döngüleri gelen geri A.

Görev

N (1-indeksleme için pozitif veya 0-indeksleme için negatif olmayan) bir tamsayı verildiğinde , spiralin ilk N döngüsünü çıktılar .

kurallar

  • Küçük harf veya büyük harf alfabe kullanabilirsiniz, ancak seçiminizin tutarlı olması gerekir (bunlardan yalnızca birini kullanın, karıştırmaya izin verilmez).

  • Bu boşlukların varsayılan olarak yasak olduğunu belirterek, herhangi bir programlama dilinde standart yöntemlerden herhangi birini kullanarak girdi alabilir ve çıktı sağlayabilirsiniz .

  • Kabul edilebilir çıktı biçimleri: çok satırlı dize, satırları temsil eden dize listesi, her biri bir satırı temsil eden birden fazla karakter listesi içeren bir liste veya uygun bulduğunuz başka bir şey. İlk biçimi seçmemeniz durumunda, kodunuzun güzel basılı bir sürümünü eklemek iyi olur.

  • Bu , bu yüzden gereksinimleri karşılayan bayt (her dilde) en kısa kod kazanır!


Test senaryoları

Giriş tamsayısı bir satırsonu üzerinden karşılık gelen çıktısı ile ayrılacak ve testler tire işareti ile ayrılacaktır. Bunların 1 dizinli olduğunu unutmayın.

1

AB
DC

--------

2

ABEF
DC G
MH
LKJI 

--------

3

ABEFNOP
DC GQ
MHR
LKJI S
DT
CU
BAZYXWV

-------

4

ABEFNOPEFGH
DC GQI
MHRJ
LKJI SK
DTL
cum
BAZYXWV N
EO
DP
CQ
BAZYXWVUTSR

-------
5

ABEFNOPEFGHFGHIJ
DC GQIK
MHRJL
LKJI SKM
DTLN
CUMO
BAZYXWV NP
EOQ
DPR
CQS
BAZYXWVUTSR T
RU
QV
PW
ÖKÜZ
NMLKJIHGFEDCBAZY

------

6

ABEFNOPEFGHFGHIJSTUVWX
DC GQIKY
MHRJLZ
LKJI SKMA
DTLNB
CUMOC
BAZYXWV NPD
EOQE
DPRF
CQSG
BAZYXWVUTSR TH
RUI
QVJ
PWK
OXL
NMLKJIHGFEDCBAZY M
SN
RO
QP
PQ
VEYA 
NMLKJIHGFEDCBAZYXWVUTS

Testisler n = 1,2,3,5,6 olmalı bence.
TFeld

Yanıtlar:


9

Odun kömürü , 31 bayt

F⮌…⁰NB⁺²⊘×ι⁺³ι⭆α§α⁺λ÷×ι⊕×ι⁺⁹⊗ι⁶

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Not: Deverbosifier bazı nedenlerden dolayı bir arka ayırıcı çıkarır. Açıklama:

F⮌…⁰NB

Kutuları ters boyutta (en büyükten en küçüğe) çizin.

⁺²⊘×ι⁺³ι

Kutunun boyutunu hesaplayın.

⭆α§α⁺λ

Döndürülmüş bir alfabe kullanarak kutunun kenarlığını çizin.

÷×ι⊕×ι⁺⁹⊗ι⁶

Kutunun sol üst köşesinde görünecek harfi hesaplayın (0 dizinli).


6

Python 2 , 176 bayt

n=input()
k=n*-~n/2+1
a=eval(`[[' ']*k]*k`)
x=y=z=0
for s in range(4*n+4):exec s/4*(s/4+1)/2*"if'!'>a[y][x]:a[y][x]=chr(z%26+65);z+=1\nx+=abs(2-s%4)-1;y+=s%2-s%4/3*2\n"
print a

Çevrimiçi deneyin!

açıklama

Doğru boyutta boş bir dizi boşluk oluşturuyoruz, ardından sol üst köşeden başlayarak bunun üzerinde hareket ediyoruz:

  • 1 adım →, 1 adım ↓, 1 adım ←, 1 adım ↑

  • 3 adım →, 3 adım ↓, 3 adım ←, 3 adım ↑

  • 6 adım →, 6 adım ↓, 6 adım ←, 6 adım ↑

  • 10 adım →, 10 adım ↓, 10 adım ←, 10 adım ↑

  • ...

Boş bir hücre bulduğumuzda, buraya bir harf koyarız ve alfabedeki bir sonraki harfe geçeriz.

Kodda s%4yön (→ ↓ ← ↑) ve bunu birçok kez basarız:

TriangularNumber(s/4) = s/4*(s/4+1)/2.

Golf fırsatları

  • Haritaya s%4göre 1,0,-1,0daha kısa bir yol var mı abs(2-s%4)-1?

  • Haritaya s%4göre 0,1,0,-1daha kısa bir yol var mı s%2-s%4/3*2?

Kredi

  • Bay Xcoder bir bayt kurtardı.

2
+1 Vay be, bu sadece harika. Nasıl çalıştığını anlamak için biraz zamanımı aldı. Bir kısayol buldum 21/(s%4+3)%3-1: s%2-2*(s%4>2)( 179 bayt ). Yine de golf oynayabilir
Bay

4

Cı,  305  281 bayt

@Mr. Dört bayt tasarrufu için Xcoder!

#define L(x,y)l[x][y]=a++%26+65;
#define F for(
c,i,j,a,p;f(n){char**l=calloc(8,i=a=n*n*4);F;i--;memset(l[i],32,a))l[i]=malloc(a);F c=a=p=i=0;c<n;++c){F i=p;i<c+p+!c;)L(j=0,c+i++)F p=i;j<=-~c*(c+2)/2;)L(j++,c+i)F;c+i-1;)L(j-1,c+--i)F i=0;i<=c;)L(j+~i++,0)}F i=0;i<j;)puts(l[i++]);}

Çevrimiçi deneyin!


1
İlk kez bir #definefor görüyorum for((bu aslında bayt kazandırır). Benden +1. :)
Kevin Cruijssen

2

Piton 2 , 262 260 254 245 bayt

lambda n:[[[' ',chr(65+(4*(i<j)+sum((i<j)*8+2+I*[5,9][i<j]+sum(2*R(I))for I in R(S(i,j)-1))+[i+j,-i-j][i<j])%26)][max(i,j)==S(i,j)*-~S(i,j)/2or i*j<1]for i in R(1+n*-~n/2)]for j in R(1+n*-~n/2)]
R=range
S=lambda x,y:int((8*max(x,y)+1)**.5+.99)/2

Çevrimiçi deneyin!

Daha fazla matematik ile yeni bir yöntem!

Karakter listelerinin listesini döndürür.


Eski versiyon:

Python 2 , 322 321 308 298 bayt

R=range
n=input()
w=1+n*-~n/2;r=[w*[' ']for _ in R(w)];r[0][0]='A';l=R(1,w*w*9);c=lambda:chr(65+l.pop(0)%26)
for i in R(n+1):
 w=1+i*-~i/2;W=w-i
 for x in R(W,w):r[0][x]=c()
 for y in R(1,w):r[y][w-1]=c()
 for x in R(1,w):r[w-1][w+~x]=c()
 for x in R(1,w-W):r[w+~x][0]=c()
for l in r:print`l`[2::5]

Çevrimiçi deneyin!


@ Mr.Xcoder Bu durumda sadece .49yeterli değil ya da çok büyük girdiler için başarısız mı?
Kevin Cruijssen

1
@KevinCruijssen Emin değilim, ama bu kesin olarak çalışır, 260 bytes .
Bay Xcoder

Python'u o kadar iyi bilmiyorum, ama i<jdört kez kullandığınız için bir inline değişkeni yapmak mümkün mü?
Kevin Cruijssen

1
+1==1+Önceki yöntemimden golf ile 245 bayt
Bay Xcoder

1

Perl 5, 177 +2 (-nl) = 179 bayt

Xcali sayesinde 2 bayt kaydedildi

sub n{chr 65+$c++%26}@O=(n);while($,++<$_){$_.=$"x$,for@O;push@O,($"x length$O[0])x$,;$O[0]=~s/ /n/eg;s/ $/n/e for@O;1while$O[-1]=~s/.*\K /n/e;s/^ /n/e for reverse@O}print for@O

Çevrimiçi deneyin


Sen kullanarak bir bayt kaydedebilirsiniz -1yerine $#O. Ayrıca kullanarak $,yerine $ndaha önce boşluk kaldırmak izin verir forde$_.=$"x$n for@O
Xcali

teşekkür ederim, başka iyileştirmeler arıyordum ama şu an bulamadım
Nahuel Fouilleul

regex değişen 2 daha bayt kaydedildi s/ (?=\S)/n/eiçins/.*\K /n/e
Nahuel FOUILLEUL

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.