Gulung Alfabet menjadi Spiral

22

Tulis sebuah program atau fungsi yang, ketika diberikan n, akan mencetak nkarakter spiral yang terdiri dari alfabet Latin yang ABCDEFGHIJKLMNOPQRSTUVWXYZdiulang sesuai kebutuhan. Spiral ini harus dijalankan melalui alfabet hanya ke depan.

Terkait dengan Alfabet Spiral , meskipun spiral berjalan melalui alfabet maju dan mundur, dan spiral itu konstan.

Uji kasus

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

Aturan

  • Input Anda akan berupa bilangan bulat non-negatif 0 <= n <= 1000, tetapi kode Anda secara teoritis harus menangani bilangan bulat non-negatif.
  • Format output Anda mungkin dalam format waras, dengan pembatas jika perlu.
  • Rotasi dan refleksi setara.
  • Alfabet Anda mungkin huruf besar atau kecil.
  • Ruang kosong di spiral Anda dapat diisi dengan nol non-alfabet apa pun yang Anda inginkan.
  • Spiral itu sendiri mungkin dalam bentuk apa pun yang Anda inginkan. Spiral persegi panjang paling sesuai dengan solusi ASCII, tetapi solusi grafis mungkin lebih pendek dengan spiral melingkar.
  • Ruang memimpin dan mengikuti dan baris baru diizinkan.
  • Ini kode golf. Jawaban terpendek dalam byte (atau setara) menang.

Seperti biasa, jika ada yang tidak jelas atau salah, harap beri tahu saya di komentar. Semoga berhasil dan bermain golf dengan baik!

Sherlock9
sumber
kebanyakan editor tidak akan mengizinkan mencetak string yang panjang
t-clausen.dk
@ t-clausen.dk Aku pergi dengan standar integer maksimum 32-bit yang ditandatangani. Jika Anda memiliki saran yang lebih baik untuk batas atas, saya akan dengan senang hati mengeditnya.
Sherlock9
Bagus dan rumit :-)
Joffan

Jawaban:

12

Logo, 129 87 byte

Solusi grafis, diimplementasikan sebagai fungsi

Ini dibangun di atas penerjemah Logo Calormen.com . The Sfungsi mengambil sejumlah karakter sebagai parameter dan menarik mereka dalam spiral. The Thuruf fungsi output tegak untuk mencegah mereka dari berputar dengan spiral. . Saya memutuskan bahwa itu tampak lebih baik (dan golf 42 byte ) untuk menghilangkan mengoreksi orientasi huruf. Saya juga memperketat jarak yang tidak mengubah jumlah byte. Jika Anda benar-benar menggulung alfabet, toh akan terlihat lebih seperti ini.

Versi Diperbarui (roll huruf)

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

Doa

Panggil sebagai berikut: S iterasi

Output sampel

S 1000

Contoh output untuk 1000 iterasi

Versi Lama (huruf selalu tegak)

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

Keluaran lama dihapus untuk menghemat ruang. Lihat di sini .

GuitarPicker
sumber
Jangan tanya bagaimana saya membuat matematika. Saya mencoba mencari rumus online, tetapi sebagian besar menyelesaikan masalah dengan menjaga sudut putaran konstan dan meningkatkan panjang segmen, sedangkan saya ingin menjaga panjang segmen konstan dan mengubah sudut. Trial and error tampaknya telah menghasilkan formula yang stabil. Menyesuaikan 95akan mengubah ketatnya spiral, dan mengubah 15akan menyesuaikan spasi linear dari huruf-huruf.
GuitarPicker
9

Javascript (ES6), 203 201 byte

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`
`}

Demo

Demo di bawah ini sebaiknya dijalankan di halaman penuh.

Arnauld
sumber
7

R, 46 atau 51 byte, tergantung pada jarak

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

masukkan deskripsi gambar di sini

(versi plot yang diperbarui: spiral abu-abu tidak diplot secara default, tetapi saya menambahkannya setelah itu untuk menunjukkan bahwa huruf-huruf tersebut memang terletak pada spiral.)

Spiral tidak memiliki spasi konstan, jadi saya harap ini baik-baik saja. Jika diperlukan spasi konstan, mulailah dengan s=(1:scan())^.5, dan tambahkan 5 byte ke total. Maka hasilnya adalah seperti di bawah ini (n = 150):

masukkan deskripsi gambar di sini

JDL
sumber
3
Cara Anda mengatur jarak spiral Anda sepenuhnya terserah Anda. Saya punya dua saran, namun: 1) Pertahankan spiral kedua. Itu menambah jawaban Anda bahkan jika itu kurang golf; 2) Dapatkah Anda menggambar garis spiral melalui huruf-huruf dalam gambar spiral pertama Anda? Hanya untuk membuat spiral alfabet lebih jelas.
Sherlock9
6

Python 3.5, 180 157 152 147 141 byte

-6 karena Sherlock9

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 karena Kap.

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')

Solusi yang Direvisi, 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')

Solusi Sebelumnya:

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')

Penjelasan

radalah daftar daftar yang memuat spiral. Ide dasarnya adalah bahwa huruf-huruf baru ditambahkan ke baris bawah spiral (r[-1].append(chr(x%26+65)) ). Ketika baris bawah terisi, spiral diputar 90 searah jarum jam dan baris kosong baru ditambahkan ke bawah ( r = list(zip(*r[::-1]))+[[]]).

Kuncinya adalah mencari tahu kapan harus memutar spiral. Dalam solusi pertama, generator (j<1for i in R(n)for j in R(i//2+1))menghasilkan urutan nilai Benar / Salah yang memberi tahu kapan harus memutar spiral. Dalam solusi yang direvisi, saya mengubah cara rdiinisialisasi. Sekarang ketika panjang baris bawah sama dengan panjang baris atas, spiral harus diputar.

RootTwo
sumber
Anda dapat mengganti if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]dengan if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]untuk menyimpan 5 byte.
R. Kap
Karena Anda hanya menggunakan rangesekali, Anda dapat menghapus Runtuk menyimpan byte. Anda juga dapat menyimpan byte dengan mengonversi jawaban Anda ke program lengkap, meskipun untuk mempertahankan penggunaannya [*zip(*r[::-1]),[]], Anda harus menggunakannya range(int(input())).
Sherlock9
Juga, 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)]karena Anda memeriksa kapan baris terakhir sama atau lebih besar dari baris pertama.
Sherlock9
Dua hal: 1) Anda dapat membuat for loop satu baris panjang dengan memisahkan pernyataan dengan titik koma; dan 2) Anda belum menentukan ndalam versi ini. Entah Anda harus menggunakan int(input())atau membungkus kembali dalam suatu fungsi.
Sherlock9
2 byte dari kondensasi forloop: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 byte

X^Xk1YL1Y2y)wG>~*c

Input 0keluar dengan kesalahan (yang diizinkan secara default ).

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
5

Python 2, 84 82 byte

Saya menggunakan Turtle lagi. Sangat menyenangkan! : D

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

Cobalah online

Sayangnya, Trinket.io memiliki kanvas kecil yang mengerikan. Saya mengubah 9+ike 9+i/9dan disesuaikan titik awal penyu untuk tujuan screen-menangkap gambar ini, sehingga lebih dari output akan cocok:

keluaran

mbomb007
sumber
Satu byte dari jika Anda menghapus spasi dari impor: from turtle import*dan satu lagi dari mengubah dari whilekefor i in range(input())
Sherlock9
4

Pyth, 32 byte

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

Sebuah program yang mencetak spiral ASCII huruf kecil persegi panjang. Bergantung pada input, satu baris atau kolom spasi putih terkemuka atau tambahan mungkin ada.

Cobalah online

Bagaimana itu bekerja

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
TheBikingViking
sumber
3

TSQL, 386 362 358 306 byte

Harap dicatat bahwa TSQL tidak memiliki cara untuk memutar teks. Script ini dimulai dari A dan menghitung ke arah mana huruf berikutnya harus ditempatkan. (kanan, bawah, kiri, kiri, kiri, atas, atas, kanan ...)

Script dapat menangani maksimal 7744 huruf.

Golf:

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

Tidak Disatukan:

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

Biola

t-clausen.dk
sumber
2

Python 2, 243 byte

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))

Ide itu!

Biarawati Bocor
sumber
0

PHP , 219 byte

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]);

Cobalah online!

PHP, 260 Bytes

Versi lama

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";}
Jörg Hülsermann
sumber