Rzuć alfabet w spiralę

22

Napisz program lub funkcję, która, jeśli nzostanie podana , wydrukuje spiralne nznaki złożone z alfabetu łacińskiego, ABCDEFGHIJKLMNOPQRSTUVWXYZpowtarzane w razie potrzeby. Ta spirala powinna przebiegać przez alfabet tylko do przodu.

Powiązane ze spiralą alfabetu , chociaż spirala biegnie przez alfabet do przodu i do tyłu, a spirala jest stała.

Przypadki testowe

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

Zasady

  • Dane wejściowe będą liczbami całkowitymi nieujemnymi 0 <= n <= 1000, ale teoretycznie kod powinien obsługiwać każdą liczbę całkowitą nieujemną.
  • Twój format wyjściowy może być w dowolnym rozsądnym formacie, w razie potrzeby z ogranicznikami.
  • Obroty i odbicia są równoważne.
  • Twój alfabet może być pisany wielkimi lub małymi literami.
  • Puste miejsca w twojej spirali mogą być wypełnione dowolnymi niealfabetycznymi zerami, które uznasz za stosowne.
  • Sama spirala może mieć dowolny kształt, który uznasz za odpowiedni. Spirale prostokątne najlepiej działają z rozwiązaniami ASCII, ale rozwiązania graficzne mogą być krótsze z spiralami okrągłymi.
  • Dozwolone są wiodące i końcowe spacje oraz znaki nowej linii.
  • To jest kod golfowy. Najkrótsza odpowiedź w bajtach (lub równoważnych) wygrywa.

Jak zawsze, jeśli coś jest niejasne lub nieprawidłowe, daj mi znać w komentarzach. Powodzenia i dobrej gry w golfa!

Sherlock9
źródło
większość redaktorów nie zezwala na wydrukowanie tak długiego ciągu
t-clausen.dk
@ t-clausen.dk Poszedłem ze standardową maksymalną 32-bitową liczbą całkowitą. Jeśli masz lepszą propozycję górnej granicy, chętnie ją
Sherlock9,
Ładne i trudne :-)
Joffan

Odpowiedzi:

12

Logo, 129 87 bajtów

Rozwiązanie graficzne, zaimplementowane jako funkcja

Zostało to zbudowane na interpretatorze Logo Calormen.com . SFunkcja przyjmuje liczbę znaków jako parametr i zwraca je w spiralę. Na Tlitery Blok funkcyjny w pozycji pionowej, aby zapobiec ich obracaniu się spirali. . Uznałem, że ładniej (i grał w golfa 42 bajty ) pominięcie poprawiania orientacji liter. Zaostrzyłem również odstępy, które nie zmieniły liczby bajtów. Jeśli miałbyś rzucić alfabet, i tak wyglądałoby to bardziej.

Zaktualizowana wersja (rolki listów)

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

Wezwanie

Wywołaj w następujący sposób: S iteracje

Próbka wyjściowa

S 1000

Sample output for 1000 iterations

Stara wersja (litery zawsze pionowo)

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

Usunięto stare dane wyjściowe, aby zaoszczędzić miejsce. Zobacz tutaj .

GuitarPicker
źródło
Nie pytaj, jak wymyśliłem matematykę. Próbowałem szukać formuł online, ale większość rozwiązałem problem, utrzymując stały kąt skrętu i zwiększając długość segmentu, podczas gdy chciałem utrzymać stałą długość segmentu i zmienić kąt. Wydaje się, że próba i błąd doprowadziły do ​​stabilnej formuły. Dostosowanie 95spowoduje zmianę szczelności spirali, a zmiana 15spowoduje dostosowanie liniowego odstępu między literami.
GuitarPicker,
9

JavaScript (ES6), 203 201 bajtów

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

Próbny

Poniższą wersję demonstracyjną najlepiej uruchomić na całej stronie.

Arnauld
źródło
7

R, 46 lub 51 bajtów, w zależności od odstępów

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

wprowadź opis zdjęcia tutaj

(zaktualizowana wersja fabuły: szara spirala nie jest domyślnie drukowana, ale dodałem ją później, aby pokazać, że litery rzeczywiście leżą na spirali).

Spirala nie ma stałych odstępów, więc mam nadzieję, że jest w porządku. Jeśli wymagane są stałe odstępy, zacznij od s=(1:scan())^.5i dodaj 5 bajtów do całości. Następnie wynik jest jak poniżej (n = 150):

wprowadź opis zdjęcia tutaj

JDL
źródło
3
Sposób rozmieszczenia spirali zależy wyłącznie od Ciebie. Mam jednak dwie sugestie: 1) Zachowaj drugą spiralę. Dodaje się do twojej odpowiedzi, nawet jeśli jest mniej golfowa; 2) Czy potrafisz narysować linię spiralną przechodzącą przez litery na obrazie pierwszej spirali? Żeby spirala alfabetu była wyraźniejsza.
Sherlock9,
6

Python 3.5, 180 157 152 147 141 bajtów

-6 z powodu 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 z powodu 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')

Poprawione rozwiązanie, 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')

Poprzednie rozwiązanie:

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

Wyjaśnienie

rjest listą zawierającą spiralę. Podstawową ideą jest dodawanie nowych liter do dolnego rzędu spirali ( r[-1].append(chr(x%26+65))). Gdy dolny rząd jest wypełniony, spirala jest obracana o 90 zgodnie z ruchem wskazówek zegara, a nowy pusty rząd jest dodawany do dolnej ( r = list(zip(*r[::-1]))+[[]]).

Sztuką jest dowiedzieć się, kiedy obrócić spiralę. W pierwszym rozwiązaniu generator (j<1for i in R(n)for j in R(i//2+1))generuje sekwencję wartości True / False, które mówią, kiedy obrócić spiralę. W zmienionym rozwiązaniu zmieniłem sposób rinicjowania. Teraz, gdy długość dolnego rzędu jest równa długości górnego rzędu, spirala musi zostać obrócona.

RootTwo
źródło
Można wymienić if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]ze if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]aby zaoszczędzić 5 bajtów.
R. Kap.
Ponieważ używasz tylko rangeraz, możesz usunąć, Raby zapisać bajty. Możesz także zapisać bajty, konwertując swoją odpowiedź do pełnego programu, jednak aby zachować użycie [*zip(*r[::-1]),[]], musisz użyć range(int(input())).
Sherlock9,
Ponadto, 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)]ponieważ sprawdzasz, kiedy ostatni wiersz jest równy lub większy od pierwszego wiersza.
Sherlock9,
Dwie rzeczy: 1) Możesz utworzyć pętlę for o długości jednej linii, oddzielając instrukcje średnikami; i 2) nie zdefiniowałeś nw tej wersji. Musisz użyć int(input())lub zawrzeć kopię zapasową w funkcji.
Sherlock9
2 bajty z kondensacji forpętli: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 bajtów

X^Xk1YL1Y2y)wG>~*c

Wejście 0kończy się z błędem (który jest domyślnie dozwolony ).

Wypróbuj online!

Wyjaśnienie

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
źródło
5

Python 2, 84 82 bajtów

Znowu używam Turtle. To takie zabawne! :RE

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

Wypróbuj online

Niestety, Trinket.io ma strasznie małe płótno. Zmieniłem 9+isię 9+i/9i doprowadza punkt wyjścia żółwia w celu przechwytywania ekranu obraz, tak że bardziej pasowałby na wyjściu:

wydajność

mbomb007
źródło
Jeden bajt z, jeśli usuniesz spację z importu: from turtle import*a drugi ze zmiany z whilenafor i in range(input())
Sherlock9
4

Pyth, 32 bajty

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

Program drukujący prostokątną spiralę ASCII z małymi literami. W zależności od danych wejściowych może występować jeden wiersz lub kolumna początkowych lub końcowych białych znaków.

Wypróbuj online

Jak to działa

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
źródło
3

TSQL, 386 362 358 306 bajtów

Pamiętaj, że TSQL nie ma możliwości obracania tekstu. Ten skrypt zaczyna się od A i oblicza kierunek, w którym powinna zostać umieszczona następna litera. (prawo, dół, lewo, lewo, lewo, góra, góra, prawo ...)

Skrypt może obsłużyć maksymalnie 7744 litery.

Gra w golfa:

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

Nie golfowany:

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

Skrzypce

t-clausen.dk
źródło
2

Python 2, 243 bajty

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 to!

Leaky Nun
źródło
0

PHP , 219 bajtów

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

Wypróbuj online!

PHP, 260 bajtów

Stara wersja

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
źródło