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.



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!


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.

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
  );                  // 
}                     //


@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.


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

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


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

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.


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


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 ('-':) "" ]

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


@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

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

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
}

to może być jaśniejsze? idk
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

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.


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ć.


3

JavaScript, 49 bajtów

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

Wypróbuj online!


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}

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


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


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


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


@EmbodimentofIgnorance Nie działa, brakuje pierwszego ciągu wyjściowego „>”.
Meerkat,


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?"":">"))

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,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.