Narysuj kilka rozszerzających się strzał

25

Wyzwanie polega na wydrukowaniu serii rosnących strzałek ASCII. Opiszę wzór w słowach, ale może być łatwiej spojrzeć na to, jak wygląda początek tej serii:

>
<
->
<-
-->
<--
--->
<---
---->
<----
----->
<-----
------>
<------
...

Strzała o długości n zawiera grot strzałki ( <lub >) i n-1myślniki ( -). Strzałka skierowana w prawo ma najpierw myślniki, a następnie >. Strzałka skierowana w lewo zaczyna się od <, a po niej następuje myślnik. Seria składa się z długości nstrzałki skierowanej w prawo, a następnie długości n strzałki skierowanej w lewo, od n od 1 do nieskończoności.

Aby ukończyć wyzwanie, napisz program lub funkcję, która pobiera jedno wejście, liczbę całkowitą i >= 1i wyprowadza pierwsze istrzałki. Strzały są indywidualne, a nie w parach prawy-lewy, dlatego i=3powinieneś wypisać:

>
<
->

Możesz zwrócić listę ciągów lub wydrukować je jeden po drugim. Podczas drukowania strzałki muszą być rozdzielane pewnym spójnym separatorem, który nie musi być znakiem nowej linii, jak w przykładzie.

To jest , więc wygrywa najmniej bajtów.

Pavel
źródło
2
Związane .
AdmBorkBork,
Czy możemy mieć spacje przed / po każdej linii?
Olivier Grégoire,
@ OlivierGrégoire Tak, końcowe białe znaki są w porządku.
Pavel
I zmierzasz w miejsce białych znaków?
Olivier Grégoire,
@ OlivierGrégoire Tak, w porządku.
Pavel,

Odpowiedzi:

9

Płótno , 10 bajtów

⇵-×<n¹[↔}]

Wypróbuj tutaj!

dzaima
źródło
Nie znam żadnego płótna, ale czy to wbudowane narzędzie do rysowania strzałek? tak to wygląda!
Pavel
2
jest wbudowanym „odwróceniem w poziomie” (także zamianą >i <), niestety nie ma wbudowanych strzałek: p
dzaima
8

R , 69 bajtów

for(i in 1:scan()-1)cat('<'[i%%2],rep('-',i/2),'>'[!i%%2],'
',sep='')

Wypróbuj online!

  • -5 bajtów dzięki @Giuseppe
  • -3 bajty dzięki @Robert S.
digEmAll
źródło
strrepzmusza swój drugi argument do integer, abyś mógł użyć /zamiast%/%
Giuseppe
możesz się go acałkowicie pozbyć , indeksując 0...(n-1)zamiast tego: Wypróbuj online!
Giuseppe,
Jestem idiotką ... dzięki! : D
digEmAll
@Giuseppe: też właśnie zauważyłem usunięte pytanie Roberta S. Mogę użyć rep zamiast strrep i zapisać 3 bajty ... (facepalm)
digEmAll 12.12.18
8

Java (JDK) , 81 bajtów

n->{for(int i=0;i<n;)System.out.printf(i%2<1?"<%s%n":"%s>%n","-".repeat(i++/2));}

Wypróbuj online!

Objaśnienia

n->{                  // int-accepting consumer
 for(int i=0;i<n;)    //  for each i from 0 to n-1 included
  System.out.printf(  //   output on stdout with a pattern
   i%2<1              //    if i is even:
    ?"<%s%n"          //     use the left-arrow pattern
    :"%s>%n",         //    else: use the right-arrow pattern
   "-".repeat(i++/2)  //    fill the "%s" in the pattern with i/2 dashes, and increment i
  );                  // 
}                     //
Olivier Grégoire
źródło
@candied_orange To nie jest samodzielne.
Olivier Grégoire,
A może zrobisz tak ?
candied_orange
@candied_orange To samo: import jest wymagany w liczbie.
Olivier Grégoire,
Dlaczego się nie import java.util.function.*;liczy?
candied_orange
8

Haskell, 41 40 bajtów

(`take`g">")
g p=p:('<':init p):g('-':p)

Wypróbuj online!

Zwykła stara rekurencja: zacznij od string p= ">", zbierz p, a <przed wszystkimi znakami oprócz ostatniego char pi rekurencyjne wywołanie z jednym -wstawionym przed p. Weź pierwsze nelementy z tej listy.

Edycja: -1 bajt dzięki @xnor.

nimi
źródło
1
Dziwna zmiana, aby zapisać bajt.
xnor
6

Commodore BASIC V2 (C64), 94 bajty

0inputn:fOi=1ton:oniaN1gO1:?"<";
1on-(i<3)gO2:fOj=1.5toi/2:?"-";:nE
2on-nOiaN1gO3:?">";
3?:nE

Nie do końca pewny co do liczby bajtów, jest to oparte na reprezentacji tekstu do wpisania poprawnego programu. Na dysku jest nieco krótszy (91 bajtów), ponieważ BASIC V2 używa „tokenizowanej” reprezentacji programów.

Demo online

Nieznacznie „bez golfa”:

0 inputn:fori=1ton:oniand1goto1:print"<";    :rem read n from user, loop to n, if odd skip "<"
1 on-(i<3)goto2:forj=1.5toi/2:print"-";:next :rem skip for i<3, print (i-1)/2 times "-"
2 on-notiand1goto3:print">";                 :rem if even skip ">"
3 print:next                                 :rem newline and next loop iteration
Felix Palmen
źródło
6

Samo-modyfikujący Brainfuck , 55 bajtów

Wprowadź dane jako kod znakowy.
Obsługuje tylko dane wejściowe do 255.
Do oddzielenia wierszy użyj znaku null.

Przypadkowo wszystkie znaki rysujące strzałki są używane jako polecenia BF. Niestety nie zapisuje żadnych bajtów (obecnie).

>>,[<<[-<.>>+<]<<.>>.+>>-[<<<<<.>>>>[-<+<.>>].>-<]>]<>-

Wypróbuj online!

Wyjaśnienie

 Code  |              Memory         | Output | Comment
-------+-----------------------------+--------+--------------------------
       | '<' '>' '-' [0]  0   0   0  |        |
>>,    | '<' '>' '-'  0   0  [x]  0  |        |
[      |                             |        |
       | '<' '>' '-'  l   0  [x]  0  |        | l = arrow length
<<[-<  |                             |        | copy l to next cell
.>>+<] |                             |        | and print '-'
       | '<' '>' '-' [0]  l   x   0  | -----  | there are l '-'s
<<.    | '<' [>] '-'  0   l   x   0  | >      |
>>.+   | '<' '>' '-' [1]  l   x   0  | <null> |
>>-    | '<' '>' '-'  1   l  [y]  0  |        | y=x-1
[      |                             |        | execute if y>0
<<<<<. | [<] '>' '-'  1   l   y   0  | <      |
>>>>   | '<' '>' '-'  1  [l]  y   0  |        |
[-<+<. |                             |        |
>>]    | '<' '>' '-'  L  [0]  y   0  | -----  | L=l+1
.      | '<' '>' '-'  L  [0]  y   0  | <null> |
>-<]>] |                             |        | decrement y
<>-    |                             |        | do nothing, used as data
użytkownik202729
źródło
6

Python 2 , 54 bajty

dzięki i Jo King za naprawienie błędu.

k=0
exec"print k%2*'<'+k/2*'-'+~k%2*'>';k+=1;"*input()

Wypróbuj online!

ovs
źródło
3
Twoje strzały mają zbyt wiele myślników; tylko co drugi powinien się wydłużyć kreską.
xnor
1
54 bajty
tsh
5

Pyth, 17 bajtów

m_W%d2+*\-/d2@"><

Dane wyjściowe to lista ciągów znaków. Wypróbuj online tutaj .

m_W%d2+*\-/d2@"><"dQ   Implicit: Q=eval(input())
                       Trailing "dQ inferred
m                  Q   Map [0-Q), as d, using:
          /d2            Floored division of d by 2
       *\-               Repeat "-" the above number of times
      +                  Append to the above...
             @"><"d      Modular index d into "><" - yields ">" for even d, "<" for odd
                         - examples: d=4 gives "-->", d=7 gives "---<"
 _W                      Reverse the above if...
   %d2                   ... (d % 2) != 0
                       Implicit print result of the map
Sok
źródło
5

PowerShell , 62 56 50 bajtów

param($n)(0..$n|%{($j='-'*$_)+'>';"<$j"})[0..--$n]

Wypróbuj online!

Pętle od 0do wejścia $n, każda iteracja tworzy dwa ciągi strzałek. Są one następnie indeksowane, 0..--$naby wyciągnąć prawidłową liczbę elementów.

Zaoszczędzono 6 bajtów dzięki KGlasier.

AdmBorkBork
źródło
Bałagając się z własnym rozwiązaniem znalazłem sposób na wycięcie kilku bajtów: możesz zaoszczędzić 4 bajty, zawijając pętlę w nawiasach i bezpośrednio indeksując. tj param($n)(0..$n|%{($j='-'*$_++)+'>';"<$j"})[0..--$n]. Więc teraz nie musisz pisać $xdwa razy.
KGlasier,
Ponadto można zaoszczędzić kolejne dwa bajty nie używając ++w ($j='-'*$_++)jak nie używasz $_nigdzie indziej.
KGlasier,
1
@KGlasier Awesome - dzięki za oczywiste golfa! :)
AdmBorkBork
5

Python 3, 53 bajty

Moja pierwsza odpowiedź codegolfa.

lambda x:[i%2*"<"+i//2*"-"+~i%2*">"for i in range(x)]

-10 bajtów dzięki Jo King

Stef van der Zon
źródło
5

Haskell , 51 44 bajtów

-7 bajtów dzięki xnor (użycie iterateponad listy)!

(`take`do b<-iterate('-':)"";[b++">",'<':b])

Wypróbuj online!

Wyjaśnienie / Niegolfowany

Użycie do-notacji pozwala nam zaoszczędzić a concat, a użycie notacji infiksowej pozwala na bezfunkcyjną funkcję z take, cofnięcie ich dałoby:

f n = take n $ concat [ [b++">", '<':b] | b <- iterate ('-':) "" ]
ბიმო
źródło
5

Japt -m, 16 15 13 12 bajtów

Zaoszczędził 1 bajt dzięki Kudłatemu

g<i>)iUUz ç-

Przetestuj online

Wyjaśnienie:

-m            // Map the program through [0...Input); U becomes the iterative number
g<i>)iUUz ç-  
 <i>          // ">" prepended with "<", creating "><"
g             //   Get the char at index U, with index-wrapping
    i         // Insert:
     U        //   At index U, with index-wrapping
         ç-   //   "-" repeated:
      Uz      //     U/2 times
Oliver
źródło
1
12 bajtów
Kudłaty
@Shaggy Ha! Bardzo sprytne, dzięki!
Oliver
4

MathGolf , 17 15 bajtów

Zaoszczędzono 2 bajty dzięki Jo King i Kevin Cruijssen

{ï½'-*'>ï¥╛Å⌡\n

Wypróbuj online!

Wyjaśnienie

Podejście 15-bajtowe różni się od mojego oryginalnego rozwiązania, nie mogę przypisać sobie żadnego uznania za wdrożenie.

{                 start block or arbitrary length
 ï                index of current loop, or length of last loop
  ½               pop a : push(a//2 if int else a/2)
   '-             push single character "-"
     *            pop a, b : push(a*b)
      '>           push single character ">"
        ï         index of current loop, or length of last loop
         ¥        modulo 2
          ╛       if without else
           Å      start block of length 2
            ⌡     decrement twice
             \    swap top elements
              n   newline char, or map array with newlines
maxb
źródło
Jak if/elsedziała MathGolf? Wiem, jak działają instrukcje if-without-else i else-without-if, ale jak utworzyć if {...} else {...} w MathGolf ¿? (Może powinienem opublikować to na czacie zamiast tutaj .. Ale może mógłbym zaoszczędzić 1 bajt, jeśli mogę naprawić if-else.)
Kevin Cruijssen,
1
@KevinCruijssen Myślę, że działa z następnymi dwoma poleceniami / blokami. np. ¿12popchnie 1, jeśli prawda, w przeciwnym razie 2, ¿Å3*Å1+doda jeden, jeśli prawda, potroi kolejny element
Jo King
@KevinCruijssen If / else wyskakuje z dwóch operatorów lub blokuje kod. Jo King ma rację w swoim przykładzie, ale możesz także zrobić ¿{"foo"}{"bar"}lub ¿1{2}.
maks.
@JoKing Dodam TODO, aby naprawić dokumenty dla operatorów krojenia.
maks.
1
15 bajtów przy użyciu rozwiązania @ KevinCruijssen
Jo King
4

Japt -m , 14 bajtów

"<>"¬hUUz ç-)q

Wypróbuj online!

Zaktualizowany o całkowicie nową metodę.

Wyjaśnienie:

                  #Implicitly map over the range [0..input) as U
"<>"              #The string "<>"
    ¬             #Split into the array ["<",">"]
     hU     )     #Replace the element at index U with wrapping:
           -      # The character '-'
          ç       # Repeated a number of times equal to
       Uz         #  U integer divided by 2
             q    #Join the array to a string
Kamil Drakari
źródło
1
çautomatyczne rzutowanie pierwszego parametru na ciąg, dzięki czemu można upuścić '.
Oliver,
1
Nie potrzebujesz tej umetody dzięki zawijaniu indeksu, więc może to być 14 bajtów.
Kudłaty
4

C (gcc) , 80 77 76 74 71 bajtów

g(n,i,j){--n&&g(n);for(j=n%2,i=n/=2;putchar(~n?n---i*j?45:62-j*2:0););}

Wypróbuj online!

-3 bajty z pomysłem tylko z ASCII .

-1 z \0zamiast\n

-5 przestawianie części


Dane wyjściowe obejmują końcowe \0.

g(n,i,j){
    --n&&g(n);              //draw smaller arrows first (if n>1)
    for(j=n%2,i=n/=2;       //j:!(input parity); i:arrow len-1=ceil(input)/2-1
        putchar(~n          //if n>=0, arrow is not yet completed
                ? n---i*j   //if not first (j==1) or last (j==0) char of arrow:
                  ? 45      // output '-'
                  : 62-j*2  // otherwise, output the appropriate arrow head
                : 0););     //\0 after arrow complete. putchar returns 0; loop terminates
}
attinat
źródło
to może być jaśniejsze? idk
tylko ASCII,
tak blisko: /
tylko ASCII,
@ Tylko ASCII Tak, to powinno być jaśniejsze, nawet jeśli nie ma to znaczenia dla liczby bajtów. Co do tego drugiego punktu ... dziękuję za pomysł! Dzięki temu udało się skrócić do 78.
attinat
XD nadal masz !n--w pierwszym bloku kodu
tylko ASCII,
3

JavaScript (ES6), 58 bajtów

Zwraca ciąg rozdzielony spacjami.

n=>(g=p=>n--?k++&1?`<${p} `+g(p+'-'):p+'> '+g(p):'')(k='')

Wypróbuj online!

Arnauld
źródło
3

SNOBOL4 (CSNOBOL4) , 123 122 118 bajtów

	N =INPUT - 1
P	H =X / 2
	Y =DUPL('-',H)
	OUTPUT =EQ(H,X - H) Y '>'	:S(I)
	OUTPUT ='<' Y
I	X =LT(X,N) X + 1	:S(P)
END	

Wypróbuj online!

Giuseppe
źródło
3

V , 22 bajtów

i>
<Àñäkjjé-já-ñÀGjdG

Wypróbuj online!

DJMcMayhem
źródło
5
To wygląda jak jakiś dziwny język skandynawski
Pavel
3

Węgiel drzewny , 16 bajtów

NθFθ«⊘ι↓>‖T»Fθ‖T

Wypróbuj online! Link jest do pełnej wersji kodu. Miałem trzy 17-bajtowe rozwiązania, zanim w końcu natknąłem się na to. Wyjaśnienie:

Nθ

Wejście n.

Fθ«

nCzasy powtórzeń , indeksowane 0.

⊘ι

Narysuj linię -s o długości połowy wskaźnika (obciętą).

↓>

Narysuj grot strzałki i przejdź do następnej linii.

‖T»

Odzwierciedlaj wszystko, obracając groty strzał.

Fθ‖T

Powyższa pętla ma nodbicia, ale potrzebujemy parzystej liczby odbić, więc wykonaj kolejne nodbicia.

Neil
źródło
3

Czysty , 76 73 bajtów

import StdEnv,StdLib
$n=take n[s\\i<-inits['--'..],s<-[i++['>'],['<':i]]]

Wypróbuj online!

Korzysta ze zgrabnego faktu, który ['-','-'..]jest taki sam, jak ['--'..]trochę zaoszczędzić.

Obrzydliwe
źródło
3

JavaScript, 49 bajtów

f=n=>--n?f(n,l='')+(n%2?`
<`+l:`
${l+='-'}>`):'>'

Wypróbuj online!

tsh
źródło
Wow, całkiem spoko
Limbo
... ale włącza się 10000, tymczasem moje rozwiązanie ES6 nadal działa: D W każdym razie twoje rozwiązanie jest bardzo fajne)
Limbo
2

PowerShell, 51 bajtów

param($n)0..$n|%{'-'*$_+'>';'<'+'-'*$_}|?{$n---gt0}
mazzy
źródło
2

Kod maszynowy 6502 (C64), 49 bajtów

00 C0 20 9B B7 A2 00 8A 4A A8 90 05 A9 3C 20 D2 FF A9 2D C0 00 F0 06 20 D2 FF 
88 D0 FA 8A 4A B0 05 A9 3E 20 D2 FF A9 0D 20 D2 FF E8 E4 65 D0 D7 60

Nadal jest nieco krótszy niż BASIC ;) Ten ma zakres liczbowy tylko do tego, 255ponieważ naturalna liczba całkowita maszyny ma tylko 8 bitów.

Demo online

Zastosowanie: SYS49152,[n](np. SYS49152,3Na przykład z wyzwania)

Skomentowany demontaż :

         00 C0       .WORD $C000        ; load address
.C:c000  20 9B B7    JSR $B79B          ; get unsigned byte from commandline
.C:c003  A2 00       LDX #$00           ; main loop counter
.C:c005   .loop:
.C:c005  8A          TXA                ; loop counter to accumulator
.C:c006  4A          LSR A              ; divide by 2, shift lowest bit to C
.C:c007  A8          TAY                ; result to Y
.C:c008  90 05       BCC .toright       ; C clear -> counter even, skip '<'
.C:c00a  A9 3C       LDA #$3C           ; load character '<'
.C:c00c  20 D2 FF    JSR $FFD2          ; output character
.C:c00f   .toright:
.C:c00f  A9 2D       LDA #$2D           ; load character '-'
.C:c011  C0 00       CPY #$00           ; counter/2 == 0 ? then no dashes
.C:c013  F0 06       BEQ .skipdashes
.C:c015   .printdashes:
.C:c015  20 D2 FF    JSR $FFD2          ; output character
.C:c018  88          DEY                ; decrement Y
.C:c019  D0 FA       BNE .printdashes   ; not 0 yet -> repeat
.C:c01b   .skipdashes:
.C:c01b  8A          TXA                ; loop counter to accumulator
.C:c01c  4A          LSR A              ; shift lowest bit to C
.C:c01d  B0 05       BCS .toleft        ; C set -> counter odd, skip '>'
.C:c01f  A9 3E       LDA #$3E           ; load character '>'
.C:c021  20 D2 FF    JSR $FFD2          ; output character
.C:c024   .toleft:
.C:c024  A9 0D       LDA #$0D           ; load newline character
.C:c026  20 D2 FF    JSR $FFD2          ; output character
.C:c029  E8          INX                ; next loop iteration
.C:c02a  E4 65       CPX $65            ; compare to command line argument
.C:c02c  D0 D7       BNE .loop          ; not reached yet -> repeat main loop
.C:c02e  60          RTS                ; exit
Felix Palmen
źródło
2

K (ngn / k) , 31 29 bajtów

{"<->"x#2,x{(1=*x)_1,2-|x}\0}

Wypróbuj online!

najpierw generujemy listy z 0 zamiast "<", 1 zamiast "-"i 2 zamiast ">":

{ } funkcja z argumentem x

x{... }\0zastosuj xczasy funkcji wewnętrznych , zaczynając od wartości początkowej 0i zachowując wyniki pośrednie

|x rewers

2- zamień 0 na 2 i odwrotnie, zachowaj 1s takimi, jakie są

1, przygotuj 1

(1=*x)_jest pierwszy xrówny 1? jeśli tak, upuść jeden element, w przeciwnym razie upuść 0 elementów (nic nie rób)

2,wstaw 2 dla początkowej ">"strzałki

x#mamy trochę za dużo list, więc weź tylko pierwszą xz nich

"<->" użyj elementów list (0/1/2) jako wskaźników w tym ciągu

ngn
źródło
Chciałbym prosić o wyjaśnienie (jeszcze nie zacząłem uczyć się K, nie wiem, od której wersji zacząć ...)
Galen Iwanow
1
@GalenIvanov Próbowałem napisać wyjaśnienie, mam nadzieję, że ma to sens. dzięki za zainteresowanie moim ulubionym języku :) istnieje wiele implementacje z różnymi zaletami i wadami ( oryginału KX męska , Kona , OK, a ja pracuję na własną rękę). Czy chcesz dołączyć do czatu APL, aby uzyskać więcej informacji?
ngn
Dziękuję, już tam jestem
Galen Iwanow
2

05AB1E , 23 20 bajtów

FNÉD„><è'-N;∍«s_iR},

Wypróbuj online!

Po raz pierwszy skorzystaj z 05AB1E lub innego języka golfowego. Wszelkie pomysły są mile widziane.

-3 od Kevina Cruijssena

nedla2004
źródło
1
Witamy w świecie 05AB1E i fajna pierwsza odpowiedź. +1 ode mnie :) "><"może być„>< zapisać bajt. Istnieje builtins ciągów 1, 2 i 3 Char jest ', i odpowiednio. Oto 18-bajtowa alternatywa, którą wymyśliłem, ale być może mogłaby być nieco bardziej golfa. Jeśli jeszcze tego nie widziałeś, mamy wskazówki dotyczące gry w golfa na stronie 05AB1E , a także możesz prosić o cokolwiek na czacie .
Kevin Cruijssen,
1
@KevinCruijssen Dzięki bardzo za twoje pomysły. Nie czuję się dobrze, gdy używam twojego kodu, ponieważ wydaje się całkiem inny niż mój, ale wykorzystałem pomysł modulo 2 jako sprawdzanie, czy liczba jest nieparzysta. Używam również idei dwóch ciągów znaków. Nie miałbym nic przeciwko, gdybyś sam opublikował 18-bajtową wersję.
nedla2004
Mam pisał moją odpowiedź w tej sprawie. :)
Kevin Cruijssen
2

C # (.NET Core) , 90 bajtów

a=>{for(int i=0;i<a;i++){var s=new String('-',i/2);Console.WriteLine(i%2<1?s+">":"<"+s);}}

Wypróbuj online!

Używa delegata akcji, aby pobrać dane wejściowe i nie wymaga powrotu.

Nie golfowany:

a => {
    for(int i = 0; i < a; i++)          // from [0, a)
    {
        var s = new String('-', i / 2);     // create string of dashes of length (a / 2)
        Console.WriteLine(i % 2 < 1 ?       // write arrow
                                s + ">" :       // if i is even: dashes plus ">"
                                "<" + s);       // if i is odd: "<" plus dashes
    }
}
Surykatka
źródło
89 bajtów
Embodiment of Ignorance
@EmbodimentofIgnorance Nie działa, brakuje pierwszego ciągu wyjściowego „>”.
Meerkat,
A może zamiast tego?
Wcielenie ignorancji
2

ES6, 96 82 79 70 bajtów

Wypróbuj online!(Dzięki @Oliver)

n=>[...Array(n)].map((_,i)=>(i%2?"<":"")+"-".repeat(i/2)+(i%2?"":">"))
Otchłań
źródło
1
Witamy w PPCG! Domyślnie przyjmowanie danych wejściowych jako zmiennej jest niedozwolone; musisz albo i=>ustawić tę funkcję (po prostu przykleić przed kodem!), albo z argumentu wiersza poleceń, STDIN lub czegoś takiego.
HyperNeutrino,
@HyperNeutrino w porządku, zredagowana odpowiedź. Jednak najczęściej głosowana odpowiedź zawiera tylko treść funkcji, ale jest ok. W każdym razie jestem outsider)
Limbo
Czy możesz to połączyć? Nie sądzę, aby któryś z nich był nieważny, a przynajmniej nie kilka najlepszych.
HyperNeutrino,
1
Jeszcze kilka bajtów: Wypróbuj online
Oliver
1
Jeszcze kilka bajtów, jeśli przearanżujesz tego ostatniego operatora trójskładnikowego i usuniesz nawias środkowy: Wypróbuj online
Oliver,
2

Czerwony , 109 108 bajtów

-1 bajt dzięki NK1406

func[n][repeat i n[print reduce[pick[pad/with pad/left/with]k: i% 2 + 1
pick copy"<>"k i / 2 + k - 1 #"-"]]]

Wypróbuj online!

Galen Iwanow
źródło
1
-1 za usunięcie spacji
NK1406,
@ NK1406 Dziękujemy! Nie wiedziałem, że to jest ważne.
Galen Iwanow