拡大する矢印を描く


25

この課題は、成長する一連のASCIIアート矢印を印刷することです。パターンを言葉で説明しますが、このシリーズの始まりがどのように見えるかを見る方が簡単かもしれません。

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

長さnの矢印には、矢印(<または>)とn-1ダッシュ(-)が含まれます。右向きの矢印には最初にダッシュがあり、次にがあり>ます。左向きの矢印はで始まり、<その後にダッシュが続きます。シリーズは、n右向きの長さの矢印とそれに続く左向きの長さnの長さで構成され、nは1から無限大です。

チャレンジを完了するには、1つの入力(整数i >= 1)を受け取り、最初のi矢印を出力するプログラムまたは関数を作成します。矢印は、左右のペアではなく個別のものi=3です。したがって、出力する必要があります。

>
<
->

文字列のリストを返すか、次々にそれらを印刷できます。印刷する場合、矢印は一貫した区切り記号で区切る必要があります。区切り記号は、例のように改行である必要はありません。

これはであるため、最小バイトが勝ちます。



各行の前後にスペースを入れることはできますか?
オリビエグレゴワール

@OlivierGrégoireはい、末尾の空白は問題ありません。
パベル

見出しの空白?
オリヴィエグレゴワール

@OlivierGrégoireええ、それは結構です。
パベル

回答:



8

R、69バイト

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

オンラインでお試しください!

  • @Giuseppeのおかげで-5バイト
  • @Robert Sのおかげで-3バイト

strrepinteger/%/%
ジュゼッペ

代わりにaインデックスを作成して完全に削除することもできます。オンラインで試してください!0...(n-1)
ジュゼッペ

私はばかだ...ありがとう!:D
digEmAll

@Giuseppe:また、私はちょうど代わりstrrepのと3バイト...(手のひらを顔に当てる)保存担当者を使用することができ、ロバートS. Iの削除質問に気づいた
digEmAll

8

Java(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それは自己完結型ではありません。
オリビエグレゴワール

どのように行わについては、次のように
candied_orange

@candied_orange同じことです。カウントにはインポートが必要です。
オリヴィエグレゴワール

なぜimport java.util.function.*;カウントされないのですか?
candied_orange

8

Haskell、41 40バイト

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

オンラインでお試しください!

単純な古い再帰:string p= ">"、collect pで始まり<、最後のchar以外のすべての前にpあり、再帰呼び出しの-前に1が置かれpます。nこのリストの最初の項目を取ります。

編集:@xnorのおかげで-1バイト。


1
バイトを保存するための奇妙な変更
xnor

6

Commodore BASIC V2(C64)、94バイト

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

バイトカウントについては完全にはわかりませんが、これは有効なプログラムを入力するためのテキスト表現に基づいています。BASIC V2はプログラムの「トークン化された」表現を使用するため、ディスク上では少し短くなります(91バイト)。

オンラインデモ

わずかに「手放し」:

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までの入力のみをサポートします
。行を区切るにはヌル文字を使用します。

偶然にも、すべての矢印描画文字は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

PowerShell62 56 50バイト

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

オンラインでお試しください!

0入力から入力までループし$n、各反復で2つの矢印文字列を作成します。次に、これらにインデックスを付け0..--$nて、正しい数の要素を引き出します。

KGlasierのおかげで6バイト節約されました。


私自身の解決策をいじって、あなたの数バイトを削減する方法を見つけました:ループを括弧で囲み、直接インデックス付けすることで4バイト節約できます。すなわちparam($n)(0..$n|%{($j='-'*$_++)+'>';"<$j"})[0..--$n]。そのため、$x2回書く必要はありません。
KGlasier

また、他では使用しないので++、in ($j='-'*$_++)を使用しないことで、さらに2バイトを節約でき$_ます。
KGlasier

1
@KGlasier Awesome-明らかなゴルフをありがとう!:)
AdmBorkBork


5

Haskell51 44バイト

xnoriterateリストの内包表記を使用)のおかげで-7バイト!

(`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 -m16 15 13 12バイト

シャギーのおかげで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

MathGolf17 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-without-ifステートメントがどのように機能する¿かは知っていますが、MathGolfでif {...} else {...}を作成する方法は?(たぶん、ここではなくチャットでこれを投稿する必要があります。しかし、if-elseを修正できれば1バイト節約できるかもしれません。)
ケビンクルーイッセン

1
@KevinCruijssen次の2つのコマンド/ブロックで動作すると思います。例えば¿12、真の場合は1をプッシュしますが、2、他、¿Å3*Å1+真の他の場合はトリプル次の要素1を追加します
ジョー・キング

@KevinCruijssen if / elseは、コードから2つの演算子またはブロックをポップします。ジョー・キングは彼の例では正しいのですが、あなたも行うことができます¿{"foo"}{"bar"}¿1{2}
maxb

@JoKingスライディング演算子のドキュメントを修正するためにTODOを追加します。
maxb

1
@KevinCruijssenのソリューションを使用して15バイト
Jo King

4

Japt -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
çは、最初のパラメーターを文字列に自動キャストするため、をドロップできます'
オリバー

1
uインデックスラッピングのおかげでメソッドは必要ないので、これは14バイトになります。
シャギー

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バイト。

-1の\0代わりに\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のみええ、バイトカウントに違いが出ない場合でも、より明確になります。その2番目のポイントについては..アイデアをありがとう!それでなんとか78までトリムできました。
attinat


!n--最初のコードブロックにまだあるXD
ASCIIのみ




3

、16バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。最終的にこの1つにつまずく前に、3つの17バイトのソリューションがありました。説明:

Nθ

入力n

Fθ«

n0インデックス付きの繰り返し回数。

⊘ι

-インデックスの半分の長さのsの線を描画します(切り捨て)。

↓>

矢印を描き、次の行に移動します。

‖T»

矢印をひっくり返して、すべてを反映します。

Fθ‖T

上記のループにはn反射がありますが、偶数回の反射が必要なので、別のn反射を実行します。





2

6502マシンコード(C64)、49バイト

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

まだBASICよりかなり短い;)これ255は、マシンの自然な整数サイズが8ビットしかないため、これまでの数値範囲しかありません。

オンラインデモ

使用法:(SYS49152,[n]たとえばSYS49152,3、チャレンジの例)

コメント付きの分解

         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バイト

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

オンラインでお試しください!

最初に"<"、の代わりに0、の代わりに1 "-"、そして代わりに2のリストを生成します">"

{ } 引数付きの関数 x

x{... }\0内部関数のx時間を適用します。初期値から開始し、0中間結果を保存します

|x

2- 0を2に、またはその逆を1のままにします

1, 1を追加

(1=*x)_最初は1にx等しいですか?はいの場合、1つの要素をドロップし、そうでない場合は0個の要素をドロップします(何もしません)

2,最初の">"矢印に2を追加します

x#リストが多すぎるため、最初xのリストのみを取得します

"<->" リストの要素(0/1/2)をこの文字列のインデックスとして使用します


説明をお願いしたいです(まだKの学習を始めていません。どのバージョンから始めればよいかわかりません...)
ガレンイワノフ

1
@GalenIvanov私は説明を書こうとしました、それが理にかなっていることを願っています。私の好きな言語に関心をお寄せいただきありがとうございます:)さまざまな利点と欠点を持つ複数の実装があります(kxのoriginalkonaoKおよび私は自分で作業しています)。aplチャットルームに参加して、詳細をお知らせしますか?
ngn

ありがとう、私はすでにそこにいる
ガレンイワノフ

2

05AB1E23 20バイト

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

オンラインでお試しください!

そのために05AB1Eまたは他のゴルフ言語を初めて使用します。どんなアイデアでも歓迎します。

-3 Kevin Cruijssenから


1
05AB1Eの世界へようこそ。最初の回答はすばらしい。私から+1。:) バイトを保存する"><"ことができ„><ます。組み込みコマンドは、であり、1、2、及び3文字ストリングのためあり'およびそれぞれ。ここに私が思いついた18バイトの代替案がありますが、おそらくもう少しゴルフができるかもしれません。まだ見たことがない場合は、05AB1Eページでゴルフのヒントをご覧ください。また、チャットで自由に質問してください
ケビンクルーッセン

1
@KevinCruijssenご意見ありがとうございます。私のコードとはかなり違うと感じているので、コードを使用するだけでは適切ではありませんが、モジュロ2のアイデアを使用して、数値が奇数かどうかを確認しました。また、2文字の文字列のアイデアを使用します。あなたが自分で18バイトバージョンを投稿した場合、私はまったく気にしません。
nedla2004

その場合の回答掲載しました。:)
ケビンクルーイッセン

2

C#(.NET Core)、90バイト

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

オンラインでお試しください!

Actionデリゲートを使用して、入力をプルし、リターンを必要としません。

ゴルフをしていない:

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は機能せず、最初の「>」出力文字列が欠落しています。
ミーアキャット


2

ES6、96の 82 79 70バイト

オンラインでお試しください!(@Oliverに感謝)

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

1
PPCGへようこそ!デフォルトでは、入力を変数として取得することは許可されていません。関数にするか(i=>コードの前に貼り付けるだけ!)、コマンドライン引数またはSTDINなどから作成する必要があります。
HyperNeutrino

@HyperNeutrino大丈夫、編集された答え。ただし、最も投票された回答には関数の本体のみが含まれていますが、問題ありません。とにかく私は部外者だ)
リンボ

リンクできますか?私はそれらのどれも無効であるとは思わない、少なくともトップ数ではない。
HyperNeutrino


1
最後の三項演算子を再配置して中央の括弧を削除すると、さらに数バイト:オンラインで試してください
オリバー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.