Alfabeyi Spiralin İçinde Yuvarlayın


22

Gerektiğinde, tekrar tekrar Latin alfabesinden oluşan nbir spiral nkarakter yazdıracak bir program veya işlev yazın ABCDEFGHIJKLMNOPQRSTUVWXYZ. Bu spiral sadece ileri doğru alfabeden geçmelidir.

Spiral , Spiral ile ilgili olarak , spiral alfabe içinde ileri ve geri doğru ilerler ve spiral sabittir.

Test durumları

4   AB
    DC

40   UVWXYZ
     TGHIJA
    NSFABKB
    MREDCLC
    LQPONMD
    KJIHGFE

0

10  GHIJ
    FAB
    EDC

1000    UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
        TGHIJKLMNOPQRSTUVWXYZABCDEFGHIJA
        SFABCDEFGHIJKLMNOPQRSTUVWXYZABKB
        REZCDEFGHIJKLMNOPQRSTUVWXYZABCLC
        QDYBMNOPQRSTUVWXYZABCDEFGHIJCDMD
        PCXALEFGHIJKLMNOPQRSTUVWXYZKDENE
        OBWZKDEFGHIJKLMNOPQRSTUVWXALEFOF
        NAVYJCDMNOPQRSTUVWXYZABCDYBMFGPG
        MZUXIBCLCDEFGHIJKLMNOPQREZCNGHQH
        LYTWHABKBABCDEFGHIJKLMNSFADOHIRI
        KXSVGZAJAZGHIJKLMNOPQROTGBEPIJSJ
        JWRUFYZIZYFUVWXYZABCDSPUHCFQJKTK
        IVQTEXYHYXETQRSTUVWXETQVIDGRKLUL
        HUPSDWXGXWDSPUVWXYZYFURWJEHSLMVM
        GTORCVWFWVCROTGHIJAZGVSXKFITMNWN
        FSNQBUVEVUBQNSFABKBAHWTYLGJUNOXO
        ERMPATUDUTAPMREDCLCBIXUZMHKVOPYP
        DQLOZSTCTSZOLQPONMDCJYVANILWPQZQ
        CPKNYRSBSRYNKJIHGFEDKZWBOJMXQRAR
        BOJMXQRARQXMLKJIHGFELAXCPKNYRSBS
        ANILWPQZQPWVUTSRQPONMBYDQLOZSTCT
        ZMHKVOPYPONMLKJIHGFEDCZERMPATUDU
        YLGJUNOXONMLKJIHGFEDCBAFSNQBUVEV
        XKFITMNWVUTSRQPONMLKJIHGTORCVWFW
        WJEHSLMLKJIHGFEDCBAZYXWVUPSDWXGX
        VIDGRKJIHGFEDCBAZYXWVUTSRQTEXYHY
        UHCFQPONMLKJIHGFEDCBAZYXWVUFYZIZ
        TGBEDCBAZYXWVUTSRQPONMLKJIHGZAJA
        SFAZYXWVUTSRQPONMLKJIHGFEDCBABKB
        REDCBAZYXWVUTSRQPONMLKJIHGFEDCLC
        QPONMLKJIHGFEDCBAZYXWVUTSRQPONMD
                                LKJIHGFE

kurallar

  • Girişiniz negatif olmayan bir tamsayı olacak 0 <= n <= 1000, ancak kodunuz negatif olmayan bir tamsayıyı teorik olarak ele almalıdır.
  • Çıktı biçiminiz, gerekirse sınırlayıcılarla birlikte herhangi bir mantıklı biçimde olabilir.
  • Rotasyonlar ve yansımalar eşdeğerdir.
  • Alfabeniz büyük veya küçük harf olabilir.
  • Spiralinizdeki boş alanlar, uygun gördüğünüz alfabetik olmayan null değerlerle doldurulabilir.
  • Spiralin kendisi uygun gördüğünüz herhangi bir şekilde olabilir. Dikdörtgen spiraller en iyi ASCII çözümleriyle çalışır, ancak grafiksel çözümler dairesel spirallerle daha kısa olabilir.
  • Önde gelen ve takip eden boşluklara ve yeni hatlara izin verilir.
  • Bu kod golfü. Bayt (veya eşdeğeri) içindeki en kısa cevap kazanır.

Her zaman olduğu gibi, herhangi bir şey net değilse veya yanlışsa, lütfen yorumlarda bana bildirin. İyi şanslar ve iyi golf!


çoğu editör o kadar uzun dize basmaya izin vermez
t-clausen.dk

@ t-clausen.dk Standart maksimum 32-bit tamsayı imzalı olarak gittim. Bir üst sınır için daha iyi bir öneriniz varsa, düzenlemek için memnuniyet duyarım.
Sherlock9

Güzel ve zor :-)
Joffan

Yanıtlar:


12

Logo, 129 87 bayt

Fonksiyonel olarak uygulanan grafiksel çözüm

Bu Calormen.com Logo tercüman üzerine inşa edilmiştir . SFonksiyon parametre olarak karakter sayısını alır ve bir sarmal içinde onları çeker. Spiral ile dönen engellemek için işlevin çıkışları mektuplar dik. . Mektup oryantasyonunu düzeltmeyi ihmal etmenin daha hoş göründüğüne (ve 42 baytlık golf oynadığına ) karar verdim . Ayrıca bayt sayısını değiştirmeyen boşluğu da sıktım. Aslında bir alfabe toplayacak olsaydın, yine de böyle görünürdü.T

Güncelleme Sürümü (harfler rulo)

TO S:r
PU IF:r[REPEAT:r[LABEL CHAR((REPCOUNT-1)%26)+65
RT 99/SQRT(REPCOUNT)FD 12]]END

yakarma

Aşağıdaki gibi çağır: S yinelemeler

Örnek çıktı

S 1000

1000 yineleme için örnek çıktı

Eski Sürüm (harfler her zaman dik)

TO T:l:h
RT:h
LABEL CHAR(:l%26)+65
LT:h
END
TO S:r
PU IF:r[REPEAT:r[T REPCOUNT-1 90-HEADING
RT 95/SQRT(REPCOUNT)FD 15]]END

Yerden kazanmak için eski çıktı kaldırıldı. Burada görün .


Matematiğe nasıl geldiğimi sorma. Çevrimiçi formülleri aramayı denedim, ancak çoğu dönüş açısını sabit tutarak ve segment uzunluğunu artırarak sorunu çözdüm, oysa segment uzunluğunu sabit tutmak ve açısını değiştirmek istedim. Deneme ve yanılma, kararlı bir formüle neden olmuş gibi görünüyor. İpi ayarlamak, 95sarmalın sıkılığını değiştirecek ve 15irade değiştirmek, harflerin doğrusal aralığını ayarlayacaktır.
GuitarPicker 19.13 te

9

Javascript (ES6), 203 201 bayt

n=>{for(a=[],i=d=k=z=0,p=526,j=1;i<n;){p+=[1,32,-1,-32][d&3];j--||(((z^=1)||k++),j=k,d++);(a[y=p>>5]=(a[y]||Array(32).fill` `))[p&31]=String.fromCharCode(65+(i++%26))}return a.map(r=>r.join``).join`
`}

gösteri

Aşağıdaki demo, tercihen tam sayfa olarak çalıştırılmalıdır.


7

Boşluğa bağlı olarak R, 46 veya 51 bayt

s=1:scan();plot(s*sin(s),s*cos(s),pch=letters)

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

(arsanın güncellenmiş sürümü: gri spiral varsayılan olarak çizilmez, ancak harflerin gerçekte bir spiral üzerinde bulunduğunu göstermek için ekledim.)

Spiral sürekli aralıklı değil, bu yüzden umarım bu iyidir. Sabit aralık gerekiyorsa bununla başlayın s=(1:scan())^.5ve toplamı 5 bayt ekleyin. O zaman çıktı aşağıdaki gibidir (n = 150):

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


3
Spirali nasıl boşalttığınız tamamen size bağlıdır. Yine de iki önerim var: 1) İkinci spirali koru. Daha az golf sahası olsa bile cevabınızı ekler; 2) İlk spirali görüntündeki harflerden geçen bir spiral çizgi çizebilir misiniz? Sadece alfabe sarmalını daha net yapmak için.
Sherlock9

6

Python 3.5, 180 157 152 147 141 bayt

-6 Sherlock9 nedeniyle

r=[[]]
for x in range(int(input())):
 r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]
print(*map(''.join,r),sep='\n')

-5 Kap yüzünden.

R=range
def g(n):
 r=[[]]
 for x in R(n):
  if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]
  r[-1]+=[chr(x%26+65)]
 print(*map(''.join,r),sep='\n')

Gözden Geçirilmiş Çözüm, python 3.x:

R=range
def g(n):
 r=[[]]
 for x in R(n):
  if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]
  r[-1]+=[chr(x%26+65)]
 print(*map(''.join,r),sep='\n')

Önceki çözüm:

R=range
def g(n):
 r=[]
 for x,f in zip(R(n),(j<1for i in R(n)for j in R(i//2+1))):
  if f:r=list(zip(*r[::-1]))+[[]]
  r[-1].append(chr(x%26+65))
 print(*map(''.join,r),sep='\n')

açıklama

rSpirali tutan listelerin listesidir. Temel fikir, yeni harflerin spiralin alt satırına eklenmesidir (r[-1].append(chr(x%26+65)) ) . Alt sıra doldurulduğunda, spiral saat yönünde 90 döndürülür ve alt tarafa ( r = list(zip(*r[::-1]))+[[]]) yeni bir boş sıra eklenir .

Hile sarmalın ne zaman döndürüleceğini bulmaktır. İlk çözümde, jeneratör (j<1for i in R(n)for j in R(i//2+1)), spirali ne zaman döndüreceğinizi söyleyen bir Doğru / Yanlış değerleri dizisi üretir. Gözden geçirilmiş çözümde rbaşlangıç şeklini değiştirdim . Şimdi, alt sıranın uzunluğu üst sıranın uzunluğuna eşit olduğunda, sarmalın döndürülmesi gerekir.


5 bayt kaydetmek için if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]ile değiştirebilirsiniz if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]].
R. Kap

Yalnızca bir rangekez kullandığınızdan , Rbaytları kaydetmek için kaldırabilirsiniz . Cevabınızı tam bir programa dönüştürerek de baytları kaydedebilirsiniz, ancak kullanımını korumak için kullanmanız [*zip(*r[::-1]),[]]gerekir range(int(input())).
Sherlock9

Ayrıca, for x in range(int(input())):r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]son satırın ilk satıra eşit veya daha büyük olduğunu kontrol ettiğiniz için.
Sherlock9

İki şey: 1) İfadeleri noktalı virgüllerle ayırarak for döngüsünü bir satır uzun yapabilirsiniz; ve 2) nbu sürümde tanımlamamışsınız . int(input())Bir işlevde kullanmanız veya geri sarmanız gerekir .
Sherlock9

forDöngünün yoğunlaşmasından 2 bayt :for x in range(int(input())):r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]
Sherlock9

5

MATL , 21 18 bayt

X^Xk1YL1Y2y)wG>~*c

Giriş 0hatayla çıkar ( varsayılan olarak izin verilir ).

Çevrimiçi deneyin!

açıklama

X^Xk   % Input n implicitly. Take square root and round up
1YL    % Square matrix of that size containing a spiral of numbers
1Y2    % Predefined literal: string "AB···YZ"
y      % Duplicate the spiral matrix onto the top
)      % Apply as an index inth the string. Gives 2D array of chars
w      % Swap: move copy of the spiral matrix to top
G>~    % Set entries that exceed the input to 0, and the rest to 1 
*      % Multiply. This makes unwanted entries equal to 0
c      % Convert to char. 0 is shown as a space. Display implicitly

5

Python 2, 84 82 bayt

Tekrar Turtle kullanıyorum. Bu çok eğlenceli! : D

from turtle import*
up()
for i in range(input()):write(chr(i%26+65));rt(9);fd(9+i)

Çevrimiçi deneyin

Ne yazık ki, Trinket.io korkunç küçük bir tuval var. Değiştim 9+ietmek 9+i/9ve ekran-yakalama bu resim, bu nedenle çıktı daha uygun olacağını amacıyla kaplumbağa başlama noktası ayarlanabilir:

çıktı


: Bir ithalattan boşluk kaldırırsanız itibaren bir bayt from turtle import*gelen değiştirmesini ve başka whilehiçfor i in range(input())
Sherlock9

4

Pyth, 32 bayt

JS@Q2ju+.t_G)Hc<*GQQ.u+NY.iJJZ]Y

Dikdörtgen küçük harf ASCII spiral yazdıran bir program. Girdiye bağlı olarak, bir satır veya satır satır veya sondaki boşluk mevcut olabilir.

Çevrimiçi deneyin

Nasıl çalışır

JS@Q2ju+.t_G)Hc<*GQQ.u+NY.iJJZ]Y  Program. Input: Q
  @Q2                             Yield sqrt(Q)
JS                                Unary range, J=[1, 2, 3, ..., floor(sqrt(q))]
                         .iJJ     Interleave J with itself, yielding [1, 1, 2, 2, 3, 3, ...
                                  floor(sqrt(Q)), floor(sqrt(Q))]
                    .u+NY    Z    Cumulatively reduce by addition with base case 0,
                                  yielding [0, 1, 2, 4, 6, 9, 12, 16, 20...]
                *GQ               Repeat the lower-case alphabet Q times
               <   Q              Truncate to legth Q
              c                   Split the above at the indices in the above list
      u                       ]Y  Reduce the above, with base case [[]]:
          _G                       Reverse
        .t  )                      Transpose
       +     H                     Add the next arm of the spiral
     j                            Join on newlines and implicitly print

3

TSQL, 386 362 358 306 bayt

Lütfen TSQL'in metni döndürmenin bir yolu olmadığını unutmayın. Bu script A'dan başlıyor ve bir sonraki harfin hangi yöne yerleştirilmesi gerektiğini hesaplıyor. (sağ, aşağı, sol, sol, sol, yukarı, yukarı, sağ ...)

Komut dosyası en fazla 7744 harfe dayanabilir.

golfed:

DECLARE @z INT = 7744

DECLARE @ INT=2+SQRT(@z-1)DECLARE @o varchar(max)=REPLICATE(SPACE(@-1)+char(10),@-1);WITH C as(SELECT 0i,@/2a,@/2b UNION ALL SELECT i+1,a+z/2,b+z%2FROM(SELECT*,IIF(a>@/2*2-b,IIF(a<b,2,-1),IIF(a>b,-2,1))z FROM C)t WHERE i<@z-1)SELECT @o=STUFF(@o,@*a-@+b,1,char(i%26+65))FROM c OPTION(maxrecursion 0)PRINT @o

Ungolfed:

DECLARE @z INT = 7744

DECLARE @ INT=2+SQRT(@z-1)
DECLARE @o varchar(max)=REPLICATE(SPACE(@-1)+char(10),@-1)

;WITH C as
(
  SELECT
    0i,@/2a,@/2b
  UNION ALL
  SELECT
    i+1,a+z/2,b+z%2
    FROM 
      (SELECT*,
         IIF(a>@/2*2-b,
           IIF(a<b,2,-1),
             IIF(a>b,-2,1))z FROM C)t
  WHERE
    i<@z-1
)
SELECT 
  @o=STUFF(@o,@*a-@+b,1,char(i%26+65))
FROM c  
OPTION(maxrecursion 0)

PRINT @o

Keman


2

Python 2,243 bayt

r=range(input())
a=[1j**int((4*i+1)**.5)for i in r]
b=[map(int,(-sum(a[:i]).real,sum(a[:i]).imag))for i in r]
c,d=zip(*b)
for i in range(min(c),max(c)+1):print''.join([i,j]in b and chr(b.index([i,j])%26+65)or' 'for j in range(min(d),max(d)+1))

Ideone!


0

PHP , 219 bayt

for($q=ceil(sqrt($a=$argn))**2,$d=1,$x=$y=$w=0;$i<$q;$i++,${yx[$w%2]}+=[-1,1][$d&1],$i%$d?:$d+=$w++&1)$e[$c[]=$x-!($a&1)][$l[]=$y]=$i<$a?chr(65+$i%26):" ";for($k=min($c);$e[$k];print join($e[+$k++])."\n")ksort($e[+$k]);

Çevrimiçi deneyin!

PHP, 260 Bayt

Eski versiyon

for($y=$x=$d=$i=0;$i<$m=ceil(sqrt($n=$argv[1]))**2;$i++){$a[$y][$x]=$i<$n?chr($i%26+65):" ";$d=$y==$x&$y<1?0:(1-$y==$x&$x>0?1:($y==$x&$y>0?2:($y==-$x&$x<0?3:$d)));$d>2?$y--:($d>1?$x--:($d>0?$y++:$x++));}ksort($a);foreach($a as$r){ksort($r);echo join($r)."\n";}
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.