Скрутіть алфавіт у спіраль


22

Напишіть програму або функцію, яка при наданні nбуде друкувати спіральні nсимволи, довгі, складені з латинського алфавіту, ABCDEFGHIJKLMNOPQRSTUVWXYZповторені за потребою. Ця спіраль повинна проходити через алфавіт лише вперед.

Пов’язана з алфавітною спіраллю, хоча спіраль проходить через алфавіт вперед і назад, а спіраль є постійною.

Тестові кейси

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

Правила

  • Вашим входом буде невід'ємне ціле число 0 <= n <= 1000, але теоретично ваш код повинен обробляти будь-яке невід'ємне ціле число.
  • Ваш вихідний формат може бути в будь-якому розумному форматі, при необхідності з роздільниками.
  • Обертання та відбиття рівноцінні.
  • Ваш алфавіт може бути великим або малим.
  • Порожні пробіли у вашій спіралі можуть бути заповнені будь-якими не алфавітними нулями, які ви вважаєте за потрібне.
  • Сама спіраль може бути в будь-якій формі, яку Ви вважаєте за потрібну. Прямокутні спіралі найкраще працюють з рішеннями ASCII, але графічні розв’язки можуть бути коротшими з круговими спіралями.
  • Доступні провідні та кінцеві місця та нові рядки.
  • Це код гольфу. Виграє найкоротша відповідь у байтах (або еквіваленті).

Як завжди, якщо щось незрозуміле чи неправильне, будь ласка, повідомте мене про це у коментарях. Успіхів і хорошого гольфу!


більшість редакторів не дозволять довго друкувати рядок
t-clausen.dk

@ t-clausen.dk Я пішов зі стандартним підписаним 32-бітовим цілим максимумом. Якщо у вас є найкраща пропозиція щодо верхньої межі, я би радий відредагувати її.
Sherlock9

Приємно і хитро :-)
Джофан

Відповіді:


12

Логотип, 129 87 байт

Графічне рішення, реалізоване як функція

Це було засновано на перекладачі логотипів Calormen.com . SФункція приймає число символів в якості параметра і малює їх у вигляді спіралі. В Tфункція виводить літери в вертикальному положенні , щоб запобігти їх від повороту спіралі. . Я вирішив, що виглядає приємніше (і виграв 42 байти ), опустивши коригування орієнтації літер. Я також посилив інтервал, який не змінив кількість байтів. Якби ви насправді згорнули алфавіт, це все одно виглядало б так.

Оновлена ​​версія (рулон листів)

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

Заклик

Викликати так: S ітерації

Вибірка зразка

S 1000

Вибірка зразка для 1000 ітерацій

Стара версія (листи завжди вертикально)

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

Старий вихід видалено для економії місця. Подивіться тут .


Не питай, як я придумав математику. Я спробував шукати формули в Інтернеті, але більшість вирішив проблему, підтримуючи постійний кут повороту і збільшуючи довжину відрізка, тоді як я хотів утримувати постійну довжину сегмента і змінювати кут. Намагання та помилки, схоже, призвели до стабільної формули. Регулювання 95волі змінить герметичність спіралі, а зміна 15волі регулюватиме лінійний інтервал літер.
GuitarPicker

9

Javascript (ES6), 203 201 байт

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

Демо

Демонстраційний демонстраційний приклад бажано виконувати на повній сторінці.


7

R, 46 або 51 байт, залежно від відстані

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

введіть тут опис зображення

(оновлена ​​версія сюжету: сіра спіраль за замовчуванням не нанесена, але я додав її після того, щоб показати, що літери дійсно лежать на спіралі.)

Спіраль не є постійним інтервалом, тому я сподіваюся, що це нормально. Якщо потрібен постійний інтервал, починайте s=(1:scan())^.5замість цього і додайте 5 байт до загальної кількості. Тоді вихід такий, як нижче (n = 150):

введіть тут опис зображення


3
Як ви розмістите спіраль, повністю залежить від вас. Однак у мене є дві пропозиції: 1) Тримайте другу спіраль. Це додає вашій відповіді, навіть якщо вона менш гофрована; 2) Чи можете ви намалювати спіральну лінію, що проходить через букви на зображенні першої спіралі? Просто, щоб зробити спіраль алфавіту чіткішою.
Шерлок9,

6

Python 3.5, 180 157 152 147 141 байт

-6 завдяки Шерлоку9

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 завдяки Кап.

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

Переглянуте рішення, 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')

Попереднє рішення:

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

Пояснення

r- це список списків, що містить спіраль. Основна ідея полягає в тому, що нові букви додаються в нижній ряд спіралі ( r[-1].append(chr(x%26+65))). Після заповнення нижнього ряду спіраль повертається на 90 за годинниковою стрілкою, а до нижнього ( r = list(zip(*r[::-1]))+[[]]) додається новий порожній рядок .

Хитрість полягає в тому, щоб з’ясувати, коли повертати спіраль. У першому рішенні генератор (j<1for i in R(n)for j in R(i//2+1))виробляє послідовність значень True / False, які вказують, коли потрібно обертати спіраль. У доопрацьованому рішенні я змінив спосіб rініціалізації. Тепер, коли довжина нижнього ряду дорівнює довжині верхнього ряду, спіраль потрібно обертати.


Ви можете замінити if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]з , if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]щоб зберегти 5 байт.
Р. Кап

Оскільки ви використовуєте лише rangeодин раз, ви можете видалити, Rщоб зберегти байти. Ви також можете зберегти байти, перетворивши свою відповідь у повну програму, хоча для збереження використання [*zip(*r[::-1]),[]]вам потрібно буде використовувати range(int(input())).
Шерлок9,

Крім того, 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)]оскільки ви перевіряєте, коли останній рядок дорівнює першому рядку чи більше.
Шерлок9,

Дві речі: 1) Ви можете зробити цикл for для одного рядка довгим, розділивши висловлювання крапками з комою; і 2) ви не визначилися nв цій версії. Або вам потрібно скористатися int(input())функцією або загорнути її в резервну копію функції.
Шерлок9,

2 байти від конденсації forпетлі: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)]
Шерлок9,

5

MATL , 21 18 байт

X^Xk1YL1Y2y)wG>~*c

Вхід 0виходить із помилкою (яка дозволена за замовчуванням ).

Спробуйте в Інтернеті!

Пояснення

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 байт

Я знову використовую Черепаху. Це так весело! : D

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

Спробуйте в Інтернеті

На жаль, у Trinket.io є жахливо маленьке полотно. Я змінив 9+iдо 9+i/9і відрегулювати початкову точку черепахи з метою екрану захоплення зображення, так що більше продукції буде відповідати:

вихід


Один байт, якщо ви видалите пробіл з імпорту: from turtle import*а інший - перехід відwhilefor i in range(input())
Sherlock9,

4

Pyth, 32 байти

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

Програма, яка друкує прямокутну нижню регістр ASCII. Залежно від вводу, може бути присутнім один рядок або стовпчик провідної чи кінцевої пробілів.

Спробуйте в Інтернеті

Як це працює

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 байт

Зауважте, що у TSQL немає способу обертання тексту. Цей сценарій починається з A і обчислює, в якому напрямку слід розмістити наступну букву. (праворуч, вниз, вліво, вліво, вліво, вгору, вгору, вправо ...)

Сценарій може обробляти максимум 7744 букви.

Гольф:

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

Безголівки:

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

Скрипка


2

Python 2, 243 байти

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

Ідей це!


0

PHP , 219 байт

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

Спробуйте в Інтернеті!

PHP, 260 байт

Стара версія

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";}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.