Свернуть алфавит в спираль


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) Можете ли вы нарисовать спиральную линию, проходящую через буквы на изображении вашей первой спирали? Просто чтобы сделать алфавит более понятным.
Sherlock9

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())).
Sherlock9

Кроме того, 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

Две вещи: 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)]
Sherlock9

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*а другой от изменения от whileдоfor 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 букв.

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

скрипка


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.