Vẽ một số mũi tên mở rộng


25

Thách thức này là về việc in một loạt các mũi tên nghệ thuật ASCII đang phát triển. Tôi sẽ mô tả mô hình bằng từ ngữ, nhưng có thể dễ dàng hơn để xem phần bắt đầu của loạt bài này trông như thế nào:

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

Một mũi tên có độ dài n chứa đầu mũi tên ( <hoặc >) và n-1dấu gạch ngang ( -). Một mũi tên quay phải có dấu gạch ngang trước, sau đó a >. Một mũi tên quay sang trái bắt đầu bằng <và được theo sau bởi dấu gạch ngang. Sê n-ri bao gồm một mũi tên phải dài theo sau là mũi tên dài n bên trái, với n từ 1 đến vô cùng.

Để hoàn thành thử thách, hãy viết chương trình hoặc hàm lấy một đầu vào, một số nguyên i >= 1và xuất các imũi tên đầu tiên . Mũi tên là riêng lẻ, không phải theo cặp bên trái, vì vậy i=3bạn nên xuất ra:

>
<
->

Bạn có thể trả về một danh sách các chuỗi hoặc in chúng lần lượt. Nếu in, các mũi tên phải được phân định bằng một số dấu phân cách nhất quán, không phải là một dòng mới như trong ví dụ.

Đây là , vì vậy ít byte nhất sẽ thắng.



Chúng ta có thể có khoảng trắng trước / sau mỗi dòng không?
Olivier Grégoire

@ OlivierGrégoire Có, khoảng trắng theo sau là ok.
Pavel

Và tiêu đề khoảng trắng?
Olivier Grégoire

@ OlivierGrégoire Vâng, điều đó tốt.
Pavel

Câu trả lời:


9

Canvas , 10 byte

⇵-×<n¹[↔}]

Hãy thử nó ở đây!


Tôi không biết bất kỳ Canvas nào, nhưng đó có phải là bản dựng hình mũi tên mà tôi thấy không? kinda có vẻ như nó
Pavel

2
là tích hợp "đảo ngược theo chiều ngang" (cũng hoán đổi >& <), đáng buồn là không có mũi tên tích hợp nào: p
dzaima

8

R , 69 byte

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

Hãy thử trực tuyến!

  • -5 byte nhờ @Giuseppe
  • -3 byte nhờ @Robert S.

strrepép buộc đối số thứ hai của nó để integerbạn có thể sử dụng /thay cho%/%
Giuseppe

thay vào đó, bạn cũng có thể thoát khỏi ahoàn toàn bằng cách lập chỉ mục 0...(n-1): Hãy thử trực tuyến!
Giuseppe

Tôi là một thằng ngốc ... cảm ơn! : D
digEmAll

@Giuseppe: tôi cũng nhận thấy câu hỏi đã bị xóa của Robert S. Tôi có thể sử dụng rep thay vì strrep và lưu 3 byte ... (facepalm)
digEmAll 12/12/18

8

Java (JDK) , 81 byte

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

Hãy thử trực tuyến!

Giải thích

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 Điều đó không khép kín.
Olivier Grégoire

Làm thế nào về thực hiện như thế này ?
candied_orange

@candied_orange Nó giống nhau: nhập khẩu được yêu cầu trong số đếm.
Olivier Grégoire

Tại sao không import java.util.function.*;tính?
candied_orange

8

Haskell, 41 40 byte

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

Hãy thử trực tuyến!

Đệ quy đơn giản cũ: bắt đầu bằng chuỗi p= ">", thu thập p, <ở phía trước tất cả trừ char cuối cùng pvà một cuộc gọi đệ quy với một -đặt ở phía trước p. Lấy các nmục đầu tiên của danh sách này.

Chỉnh sửa: -1 byte nhờ @xnor.


1
Một thay đổi kỳ lạ để tiết kiệm một byte.
xnor

6

Hàng hóa BASIC V2 (C64), 94 byte

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

Không hoàn toàn chắc chắn về số lượng byte, điều này dựa trên biểu diễn văn bản để nhập chương trình hợp lệ. Nó ngắn hơn một chút trên đĩa (91 byte) vì BASIC V2 sử dụng biểu diễn "tokenized" của các chương trình.

Demo trực tuyến

Hơi "vô dụng":

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 tự sửa đổi , 55 byte

Lấy đầu vào làm mã ký tự.
Chỉ hỗ trợ đầu vào tối đa 255.
Sử dụng ký tự null để phân tách các dòng.

Thật trùng hợp, tất cả các ký tự vẽ mũi tên được sử dụng làm lệnh BF. Thật không may, nó không lưu bất kỳ byte nào (hiện tại).

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

Hãy thử trực tuyến!

Giải trình

 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

Bình thường, 17 byte

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

Đầu ra là một danh sách các chuỗi. Hãy thử trực tuyến tại đây .

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 byte

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

Hãy thử trực tuyến!

Vòng lặp từ 0lên đến đầu vào $n, mỗi lần lặp tạo ra hai chuỗi mũi tên. Những cái đó sau đó được lập chỉ mục 0..--$nđể lấy ra số lượng phần tử chính xác.

Đã lưu 6 byte nhờ KGlasier.


Loay hoay với giải pháp của riêng tôi Tôi đã tìm ra cách cắt một vài byte trên của bạn: Có thể lưu 4 byte bằng cách gói vòng lặp trong ngoặc và lập chỉ mục trực tiếp. tức param($n)(0..$n|%{($j='-'*$_++)+'>';"<$j"})[0..--$n]. Vì vậy, bây giờ bạn không phải viết $xhai lần.
KGlasier

Ngoài ra bạn có thể tiết kiệm nhiều hơn hai byte bằng cách không sử dụng ++trong ($j='-'*$_++)khi bạn không sử dụng $_bất cứ nơi nào khác.
KGlasier

1
@KGlasier Tuyệt vời - cảm ơn các golf rõ ràng! :)
admBorkBork

5

Python 3, 53 byte

Câu trả lời đầu tiên của tôi.

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

-10 byte nhờ Jo King


5

Haskell , 51 44 byte

-7 byte nhờ xnor (sử dụng iteratetrên mức hiểu danh sách)!

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

Hãy thử trực tuyến!

Giải thích / Ungolfed

Sử dụng dochú thích giúp chúng ta tiết kiệm concatvà sử dụng ký hiệu không cho phép một chức năng không điểm với take, hoàn tác những điều này sẽ mang lại:

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

5

Japt -m, 16 15 13 12 byte

Đã lưu 1 byte nhờ Shaggy

g<i>)iUUz ç-

Kiểm tra trực tuyến

Giải trình:

-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 Hà! Rất thông minh, cảm ơn!
Oliver


4

MathGolf , 17 15 byte

Đã lưu 2 byte nhờ Jo King và Kevin Cruijssen

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

Hãy thử trực tuyến!

Giải trình

Cách tiếp cận 15 byte khác với giải pháp ban đầu của tôi, tôi không thể nhận bất kỳ tín dụng nào cho việc thực hiện.

{                 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

Làm thế nào để if/elselàm việc trong MathGolf? Tôi biết các câu lệnh if-without-other và other-without-if hoạt động như thế nào, nhưng làm thế nào để tạo một if ... ...} khác {...} trong MathGolf với ¿? (Có lẽ tôi nên đăng bài này trong cuộc trò chuyện thay vì ở đây .. Nhưng tôi có thể tiết kiệm được 1 byte nếu tôi có thể sửa lỗi if-
other

1
@KevinCruijssen Tôi nghĩ rằng nó hoạt động với hai lệnh / khối tiếp theo. ví dụ: ¿12sẽ đẩy 1 nếu đúng, khác 2, ¿Å3*Å1+sẽ thêm một nếu đúng khác nhân ba phần tử tiếp theo
Jo King

@KevinCruijssen if / other bật hai toán tử hoặc khối từ mã. Jo King là chính xác trong ví dụ của mình, nhưng bạn cũng có thể làm ¿{"foo"}{"bar"}hoặc ¿1{2}.
maxb

@JoKing Tôi sẽ thêm TODO để sửa tài liệu cho các toán tử cắt.
maxb

1
15 byte sử dụng giải pháp của @ KevinCruijssen
Jo King

4

Japt -m , 14 byte

"<>"¬hUUz ç-)q

Hãy thử trực tuyến!

Cập nhật với một phương pháp hoàn toàn mới.

Giải trình:

                  #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
çtự động chuyển tham số đầu tiên của nó thành một chuỗi, vì vậy bạn có thể thả '.
Oliver

1
Bạn không cần uphương thức nhờ gói chỉ mục để có thể là 14 byte.
Xù xì

4

C (gcc) , 80 77 76 74 71 byte

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

Hãy thử trực tuyến!

-3 byte với ý tưởng chỉ từ ASCII .

-1 \0thay vì\n

-5 sắp xếp lại các bộ phận


Đầu ra bao gồm một dấu \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
}

Điều này thể rõ ràng hơn? idk
ASCII-chỉ


Chỉ có ASCII Vâng, điều đó sẽ rõ ràng hơn, ngay cả khi nó không tạo ra sự khác biệt cho bytecount. Về điểm thứ hai đó .. cảm ơn vì ý tưởng! Quản lý để cắt giảm xuống 78 với điều đó.
attinat


XD bạn vẫn có !n--trong bộ mã đầu tiên
ASCII - chỉ




3

Than , 16 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Tôi đã có ba giải pháp 17 byte trước khi cuối cùng tôi vấp phải giải pháp này. Giải trình:

Nθ

Đầu vào n.

Fθ«

Lặp lại nnhiều lần, 0 chỉ mục.

⊘ι

Vẽ một dòng có -độ dài bằng một nửa chỉ số (cắt ngắn).

↓>

Vẽ đầu mũi tên và di chuyển đến dòng tiếp theo.

‖T»

Phản ánh tất cả mọi thứ, lật đầu mũi tên.

Fθ‖T

Vòng lặp trên có các nphản xạ, nhưng chúng ta cần một số phản xạ chẵn, vì vậy thực hiện các nphản xạ khác .


3

Sạch , 76 73 byte

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

Hãy thử trực tuyến!

Sử dụng thực tế gọn gàng ['-','-'..]giống như ['--'..]để tiết kiệm một chút.


3

JavaScript, 49 byte

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

Hãy thử trực tuyến!


Wow, khá tuyệt
Limbo

... nhưng nó vẫn tiếp tục 10000, trong khi đó giải pháp ES6 của tôi vẫn hoạt động: D Dù sao, giải pháp của bạn rất tuyệt)
Limbo

2

Powershell, 51 byte

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

2

Mã máy 6502 (C64), 49 byte

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

Vẫn còn khá ngắn hơn BASIC một chút ;) Cái này có phạm vi số chỉ tối đa 255vì kích thước nguyên tự nhiên của máy chỉ có 8 bit.

Bản demo trực tuyến

Cách sử dụng: SYS49152,[n](ví dụ: ví SYS49152,3dụ từ thử thách)

Nhận xét tháo gỡ :

         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 byte

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

Hãy thử trực tuyến!

đầu tiên chúng tôi tạo danh sách bằng 0 thay vì "<", 1 thay vì "-"và 2 thay vì ">":

{ } chức năng với đối số x

x{... }\0áp dụng xthời gian chức năng bên trong , bắt đầu bằng giá trị ban đầu 0và bảo toàn kết quả trung gian

|x đảo ngược

2- thay 0 bằng 2 và ngược lại, giữ nguyên số 1

1, trả trước 1

(1=*x)_đầu tiên xbằng 1? nếu có, bỏ một phần tử, nếu không thì thả 0 phần tử (không làm gì cả)

2,trả trước 2 cho ">"mũi tên ban đầu

x#chúng ta có một chút quá nhiều danh sách, vì vậy hãy chỉ là người đầu tiên xtrong số họ

"<->" sử dụng các phần tử của danh sách (0/1/2) làm chỉ mục trong chuỗi này


Tôi muốn yêu cầu một lời giải thích (Tôi chưa bắt đầu học K, tôi không biết bắt đầu phiên bản nào với ...)
Galen Ivanov

1
@GalenIvanov tôi đã cố gắng viết một lời giải thích, tôi hy vọng nó có ý nghĩa. cảm ơn bạn đã quan tâm đến ngôn ngữ yêu thích của tôi :) có nhiều triển khai với những ưu điểm và nhược điểm khác nhau ( bản gốc của kx , kona , oK và tôi đang tự làm việc). Bạn có muốn tham gia phòng chat apl để tôi có thể cung cấp cho bạn thêm chi tiết không?
ngn

Cảm ơn bạn, tôi đã ở đó
Galen Ivanov

2

05AB1E , 23 20 byte

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

Hãy thử trực tuyến!

Lần đầu tiên sử dụng 05AB1E hoặc bất kỳ ngôn ngữ chơi gôn nào khác cho vấn đề đó. Mọi ý tưởng đều được chào đón.

-3 từ Kevin Cruijssen


1
Chào mừng đến với thế giới của 05AB1E, và câu trả lời đầu tiên tốt đẹp. +1 từ tôi. :) "><"có thể „><để lưu một byte. Có builtins cho chuỗi 1, 2, và 3 char, là ', tương ứng. Đây là một giải pháp thay thế 18 byte mà tôi đã đưa ra, nhưng có lẽ nó có thể được đánh gôn nhiều hơn một chút. Nếu bạn chưa thấy nó, chúng tôi có một mẹo để chơi gôn trong trang 05AB1E và cũng có thể thoải mái hỏi bất cứ điều gì trong cuộc trò chuyện .
Kevin Cruijssen

1
@KevinCruijssen Cảm ơn rất nhiều vì ý tưởng của bạn. Tôi không cảm thấy đúng khi sử dụng mã của bạn, vì nó cảm thấy khá khác với mã của tôi, nhưng tôi đã sử dụng ý tưởng của modulo 2 khi kiểm tra xem một số có phải là số lẻ hay không. Tôi cũng sử dụng hai ý tưởng chuỗi char. Tôi sẽ không bận tâm nếu bạn tự đăng phiên bản 18 byte.
nedla2004

Tôi đã đăng câu trả lời của mình trong trường hợp đó. :)
Kevin Cruijssen 14/12/18

2

C # (.NET Core) , 90 byte

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

Hãy thử trực tuyến!

Sử dụng một đại biểu hành động để kéo đầu vào và không yêu cầu trả lại.

Ung dung:

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 Không hoạt động, thiếu chuỗi đầu ra ">" đầu tiên.
Meerkat


2

ES6, 96 82 79 70 byte

Hãy thử trực tuyến! (Cảm ơn @Oliver)

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

1
Chào mừng đến với PPCG! Theo mặc định, lấy đầu vào là một biến không được phép; bạn phải làm cho nó trở thành một hàm (chỉ cần đặt i=>trước mã của bạn!) hoặc từ một đối số dòng lệnh hoặc STDIN hoặc một cái gì đó.
HyperNeutrino

@HyperNeutrino được rồi, chỉnh sửa câu trả lời. Tuy nhiên, câu trả lời được bình chọn nhiều nhất chỉ chứa phần thân của hàm, nhưng ok. Dù sao tôi là người ngoài cuộc)
Limbo

Bạn có thể liên kết nó? Tôi không nghĩ bất kỳ ai trong số họ là không hợp lệ, ít nhất không phải là số ít.
HyperNeutrino

1
Một vài byte nữa: Hãy thử trực tuyến
Oliver

1
Một vài byte nữa nếu bạn sắp xếp lại toán tử ternary cuối cùng đó và xóa dấu ngoặc đơn trung tâm: Hãy thử trực tuyến
Oliver

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.