확장 화살표 그리기


25

이 과제는 성장하는 ASCII 아트 화살표를 인쇄하는 것입니다. 패턴을 단어로 설명하지만이 시리즈의 시작 부분이 어떤지보다 쉽게 ​​볼 수 있습니다.

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

길이가 n 인 화살표는 화살촉 ( <또는 >)과 n-1대시 ( -)를 포함합니다. 오른쪽을 향한 화살표에는 먼저 대시가 있고 그 다음에 a가 >있습니다. 왼쪽 방향 화살표는로 시작하고 <그 뒤에 대시가옵니다. 이 시리즈는 길이 n오른쪽 오른쪽 화살표와 길이 n 왼쪽 화살표로 구성되며 n은 1부터 무한대까지입니다.

과제를 완료하려면 하나의 입력 인 integer i >= 1를 사용하고 첫 번째 i화살표를 출력 하는 프로그램이나 함수를 작성하십시오 . 화살표는 오른쪽 왼쪽 쌍이 아닌 개별적이므로 i=3출력해야합니다.

>
<
->

문자열 목록을 반환하거나 하나씩 인쇄 할 수 있습니다. 인쇄하는 경우 화살표는 일관된 구분 기호로 구분되어야하며, 예와 같이 줄 바꿈 일 필요는 없습니다.

이것은 이므로 가장 적은 바이트가 이깁니다.



각 줄 전후에 공백이있을 수 있습니까?
Olivier Grégoire

@ OlivierGrégoire 네, 후행 공백은 괜찮습니다.
Pavel

그리고 공백?
Olivier Grégoire

@ OlivierGrégoire 그래, 괜찮아.
Pavel

답변:



8

R , 69 바이트

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

온라인으로 사용해보십시오!

  • @Giuseppe 덕분에 -5 바이트
  • @Robert S 덕분에 -3 바이트

strrepinteger/%/%
Giuseppe

대신 a인덱싱하여 완전히 제거 할 수도 있습니다. 온라인으로 사용해보십시오! 0...(n-1)
주세페

난 바보 야 ... 고마워! : D
digEmAll

@Giuseppe : 또한 방금 Robert S의 삭제 된 질문을 발견했습니다. strrep 대신 rep를 사용하고 3 바이트를 저장할 수 있습니다 ... (facepalm)
digEmAll

8

자바 (JDK) , 81 바이트

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

온라인으로 사용해보십시오!

설명

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 독립형이 아닙니다.
Olivier Grégoire

어떻게 수행에 대해 다음과 같이 ?
candied_orange

@candied_orange 동일하다 : 수입은 계산에 필요하다.
Olivier Grégoire

import java.util.function.*;계산 하지 않습니까?
candied_orange

8

하스켈, 41 40 바이트

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

온라인으로 사용해보십시오!

일반 오래된 재귀 : 문자열로 시작 p= ">", 수집 p하는 <모든 앞에하지만 마지막 문자에서 p와 하나 개의 재귀 호출 -앞에 넣어 p. n이 목록 의 첫 번째 항목을 가져 가십시오 .

편집 : @xnor 덕분에 -1 바이트.


1
바이트를 저장하기 위한 이상한 변화 .
xnor

6

코모도어 베이직 V2 (C64), 94 바이트

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

바이트 수에 대해 완전히 확신 할 수없는 것은 유효한 프로그램을 입력하기위한 텍스트 표현을 기반으로합니다. BASIC V2는 "토큰 화 된"프로그램 표현을 사용하기 때문에 디스크에서 약간 짧습니다 (91 바이트).

온라인 데모

약간 "ungolfed":

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

자체 수정 Brainfuck , 55 바이트

문자 코드로 입력하십시오.
최대 255 개의 입력 만 지원
합니다. 줄을 구분하려면 null 문자를 사용하십시오.

우연히도 모든 화살표 그리기 문자는 BF 명령으로 사용됩니다. 불행히도 (현재) 바이트를 저장하지 않습니다.

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

온라인으로 사용해보십시오!

설명

 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 바이트

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

출력은 문자열 목록입니다. 온라인으로 사용해보십시오여기에서 .

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 바이트

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

온라인으로 사용해보십시오!

0최대 입력 에서 루프$n , 각 반복은 두 화살표 문자열을 생성. 그런 다음 0..--$n올바른 수의 요소를 꺼내기 위해 색인을 생성 합니다.

KGlasier 덕분에 6 바이트를 절약했습니다.


내 자신의 솔루션으로 혼란스러워서 몇 바이트를 줄일 수있는 방법을 찾았습니다. 루프를 대괄호로 묶고 직접 인덱싱하여 4 바이트를 절약 할 수 있습니다. 즉 param($n)(0..$n|%{($j='-'*$_++)+'>';"<$j"})[0..--$n]. 따라서 이제 $x두 번 쓸 필요가 없습니다 .
KGlasier

또한 다른 곳에서는 사용하지 않으므로 ++in ($j='-'*$_++)을 사용하지 않으면 2 바이트를 더 절약 할 수 있습니다 $_.
KGlasier

1
@ KGlasier Awesome-명백한 골프에 감사드립니다! :)
AdmBorkBork

5

파이썬 3, 53 바이트

내 첫 번째 골프 골프 답변.

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

Jo King 덕분에 -10 바이트


5

하스켈 , 51 44 바이트

xnor 덕분에 -7 바이트 ( iterate목록 이해 를 통해)!

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

온라인으로 사용해보십시오!

설명 / 언 골프

do-notation을 사용하면 a가 절약 concat되고 infix-notation을 사용하면을 사용하여 pointfree 함수를 사용할 수 있습니다 take.

f n = take n $ concat [ [b++">", '<':b] | b <- iterate ('-':) "" ]

5

Japt -m, 16 15 13 12 바이트

Shaggy 덕분에 1 바이트 절약

g<i>)iUUz ç-

온라인 테스트

설명:

-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! 매우 영리합니다. 감사합니다!
올리버


4

MathGolf , 17 15 바이트

Jo King과 Kevin Cruijssen 덕분에 2 바이트 절약

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

온라인으로 사용해보십시오!

설명

15 바이트 접근법은 원래 솔루션과 다르므로 구현에 대한 크레딧을 얻을 수 없습니다.

{                 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

if/elseMathGolf 는 어떻게 작동합니까? if-without-else 및 else-with-if-if 문이 어떻게 작동하는지 알고 있지만 MathGolf에서 ¿? (아마 나는 이것을 대신 채팅에 게시해야한다. 그러나 만약 if-else를 고칠 수 있다면 아마도 1 바이트를 절약 할 수있을 것이다.)
Kevin Cruijssen

1
@KevinCruijssen 다음 두 명령 / 블록에서 작동한다고 생각합니다. 예를 들어 ¿12, 참이면 1을, 그렇지 않으면 2 ¿Å3*Å1+는 참이면 1 을 추가하고 그렇지 않으면 다음 요소를 3 배 증가시킵니다.
Jo King

@KevinCruijssen if / else는 코드에서 두 개의 연산자 또는 블록을 팝합니다. Jo King은 그의 예에서 정확하지만 ¿{"foo"}{"bar"}또는 할 수도 있습니다 ¿1{2}.
maxb

@JoKing 슬라이싱 연산자를위한 문서를 수정하기 위해 TODO를 추가하겠습니다.
maxb

1
@KevinCruijssen의 솔루션을 사용하는 15 바이트
Jo King

4

apt -m , 14 바이트

"<>"¬hUUz ç-)q

온라인으로 사용해보십시오!

완전히 새로운 방법으로 업데이트되었습니다.

설명:

                  #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
ç첫 번째 매개 변수를 문자열로 자동 전송하므로을 삭제할 수 있습니다 '.
Oliver

1
u인덱스 래핑 덕분에 메소드 가 필요하지 않으므로 14 바이트가 될 수 있습니다.
Shaggy

4

C (gcc) , 80 77 76 74 71 바이트

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

온라인으로 사용해보십시오!

ASCII 전용 아이디어로 -3 바이트 .

\0대신 -1\n

-5 정리 부품


출력에는 후행이 포함됩니다 \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
}

명확? idk
ASCII 전용


@ASCII 전용 예, 바이트 수에 차이가 없더라도 더 명확해야합니다. 그 두 번째 요점은 .. 아이디어 주셔서 감사합니다! 그걸로 78로 줄였습니다.
attinat


!n--첫 번째 코드 블록에있는 XD
ASCII 전용




3

, 16 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 결국이 문제를 해결하기 전에 세 개의 17 바이트 솔루션이있었습니다. 설명:

Nθ

입력 n.

Fθ«

n0- 인덱스 반복 횟수.

⊘ι

-길이가 절반 인 s의 선을 그립니다 (잘라 짐).

↓>

화살촉을 그리고 다음 줄로 이동하십시오.

‖T»

화살촉을 뒤집어 모든 것을 반영하십시오.

Fθ‖T

The above loop has n reflections, but we need an even number of reflections, so perform another n reflections.


3

Clean, 76 73 bytes

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

Try it online!

Uses the neat fact that ['-','-'..] is the same as ['--'..] to save a bit.


3

JavaScript, 49 bytes

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

Try it online!


Wow, pretty cool
Limbo

...but it throws on 10000, meanwhile my ES6 solution is still works :D Anyway, your solution is very cool)
Limbo

2

Powershell, 51 bytes

param($n)0..$n|%{'-'*$_+'>';'<'+'-'*$_}|?{$n---gt0}

2

6502 machine code (C64), 49 bytes

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

Still quite a bit shorter than BASIC ;) This one has a number range only up to 255 because the natural integer size of the machine has only 8 bits.

Online demo

Usage: SYS49152,[n] (e.g. SYS49152,3 for the example from the challenge)

Commented disassembly:

         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 bytes

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

Try it online!

first we generate lists with 0 instead of "<", 1 instead of "-", and 2 instead of ">":

{ } function with argument x

x{...}\0 apply the inner function x times, starting with an initial value of 0 and preserving intermediate results

|x reverse

2- replace 0 with 2 and vice versa, keep the 1s as they are

1, prepend a 1

(1=*x)_ is the first of x equal to 1? if yes, drop one element, otherwise drop 0 elements (do nothing)

2, prepend a 2 for the initial ">" arrow

x# we have a little too many lists, so take only the first x of them

"<->" use the lists' elements (0/1/2) as indices in this string


I would like to ask for an explanation (I haven't started learning K yet, I don't know which version to start with...)
Galen Ivanov

1
@GalenIvanov i tried to write an explanation, i hope it makes sense. thanks for your interest in my favourite language :) there are multiple implementations with different advantages and disadvantages (kx's original, kona, oK and i'm working on my own). would you like to join the apl chat room so i can give you more details?
ngn

Thank you, I'm already there
Galen Ivanov

2

05AB1E, 23 20 bytes

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

Try it online!

First time using 05AB1E or any other golfing language for that matter. Any ideas welcome.

-3 from Kevin Cruijssen


1
Welcome to the world of 05AB1E, and nice first answer. +1 from me. :) "><" can be „>< to save a byte. There are builtins for 1, 2, and 3 char strings, being ', , and respectively. Here is a 18 bytes alternative I came up with, but perhaps it could be golfed a bit more. If you haven't seen it yet, we have a tips for golfing in 05AB1E page, and also feel free to ask anything in the chat.
Kevin Cruijssen

1
@KevinCruijssen Thanks so much for your ideas. I don't feel right just using your code, as it feels fairly different from mine, but I did use the idea of modulo 2 as checking for if a number is odd. I also use the two char string idea. I would not mind at all if you posted the 18 byte version on your own.
nedla2004

I've posted my answer in that case. :)
Kevin Cruijssen

2

C# (.NET Core), 90 bytes

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

Try it online!

Uses an Action delegate to pull in the input and not require a return.

Ungolfed:

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 Doesn't work, missing the first ">" output string.
Meerkat


2

ES6, 96 82 79 70 bytes

Try it online! (Thanks to @Oliver)

n=>[...Array(n)].map((_,i)=>(i%2?"<":"")+"-".repeat(i/2)+(i%2?"":">"))

1
Welcome to PPCG! By default, taking input as a variable is disallowed; you have to either make it a function (just stick a i=> in front of your code!) or from a command-line argument or STDIN or something.
HyperNeutrino

@HyperNeutrino okay, edited answer. However, the most voted answer contains only the body of the function, but ok. Anyway I'm outsider)
Limbo

Can you link it? I don't think any of them are invalid, at least not the top few.
HyperNeutrino

1
A few more bytes: Try it online
Oliver

1
A few more bytes if you re-arrange that last ternary operator and remove the center parenthesis: Try it online
Oliver

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.