Zeichnen Sie einige expandierende Pfeile


25

Bei dieser Herausforderung geht es darum, eine Reihe von wachsenden ASCII-Kunstpfeilen zu drucken. Ich werde das Muster in Worten beschreiben, aber es könnte einfacher sein zu sehen, wie der Anfang dieser Serie aussieht:

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

Ein Pfeil mit der Länge n enthält eine Pfeilspitze ( <oder >) und n-1Striche ( -). Ein nach rechts zeigender Pfeil hat zuerst die Striche und dann a >. Ein nach links zeigender Pfeil beginnt mit <und wird von den Bindestrichen gefolgt. Die Serie besteht aus einem nach nrechts gerichteten Pfeil, gefolgt von einem nach links gerichteten Pfeil mit einer Länge von n von 1 bis unendlich.

Um die Herausforderung abzuschließen, schreiben Sie ein Programm oder eine Funktion, die eine Eingabe, eine Ganzzahl i >= 1und die ersten iPfeile ausgibt . Die Pfeile sind einzeln, nicht in Rechts-Links-Paaren. i=3Deshalb sollten Sie Folgendes ausgeben:

>
<
->

Sie können eine Liste von Zeichenfolgen zurückgeben oder nacheinander drucken. Beim Drucken müssen die Pfeile durch ein konsistentes Trennzeichen begrenzt werden, das nicht wie im Beispiel ein Zeilenumbruch sein muss.

Das ist , also gewinnen die wenigsten Bytes.



Können wir vor / nach jeder Zeile Leerzeichen setzen?
Olivier Grégoire

@ OlivierGrégoire Ja, nachgestellte Leerzeichen sind in Ordnung.
Pavel

Und Überschrift Leerzeichen?
Olivier Grégoire

@ OlivierGrégoire Ja, das ist in Ordnung.
Pavel

Antworten:



8

R , 69 Bytes

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

Probieren Sie es online!

  • -5 Bytes dank @ Giuseppe
  • -3 Bytes dank @Robert S.

strreperzwingt sein zweites Argument, integerdamit Sie /anstelle von%/%
Giuseppe

Sie können es auch aganz loswerden, indem Sie 0...(n-1)stattdessen die Indexierung durchführen : Probieren Sie es online aus!
Giuseppe

Ich bin ein Idiot ... danke! : D
digEmAll

@ Giuseppe: auch ich habe gerade die gelöschte Frage von Robert S. bemerkt. Ich kann rep anstelle von strrep verwenden und 3 Bytes speichern ... (facepalm)
digEmAll

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

Probieren Sie es online!

Erklärungen

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 Das ist nicht in sich geschlossen.
Olivier Grégoire

Wie wäre es so gemacht ?
candied_orange

@candied_orange Es ist dasselbe: Die Importe werden in der Zählung benötigt.
Olivier Grégoire

Warum zählt nicht import java.util.function.*;?
candied_orange

8

Haskell, 41-40 Bytes

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

Probieren Sie es online!

Einfache alte Rekursion: Beginnen Sie mit string p= ">", collect p, a <vor allen Zeichen von pund einem rekursiven Aufruf mit einem -Zeichen vor p. Nimm die ersten nGegenstände dieser Liste.

Bearbeiten: -1 Byte dank @xnor.


1
Eine seltsame Änderung , um ein Byte zu speichern.
Xnor

6

Commodore BASIC V2 (C64), 94 Byte

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

Die Anzahl der Bytes ist nicht ganz sicher. Sie basiert auf der Textdarstellung für die Eingabe des gültigen Programms. Auf der Festplatte ist es etwas kürzer (91 Byte), da BASIC V2 eine "tokenisierte" Darstellung von Programmen verwendet.

Online Demo

Leicht "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

Selbstmodifizierender Brainfuck , 55 Bytes

Eingabe als Zeichencode übernehmen.
Unterstützt nur Eingaben bis zu 255.
Verwenden Sie das Nullzeichen, um Zeilen zu trennen.

Zufällig werden alle pfeilzeichnenden Zeichen als BF-Befehle verwendet. Leider werden (derzeit) keine Bytes gespeichert.

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

Probieren Sie es online!

Erläuterung

 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 Bytes

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

Die Ausgabe ist eine Liste von Zeichenfolgen. Probieren Sie es hier online aus .

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]

Probieren Sie es online!

Schleifen von 0bis zu Eingabe $n, wobei jede Iteration zwei Pfeilzeichenfolgen erzeugt. Diese werden dann mit indexiert 0..--$n, um die richtige Anzahl von Elementen herauszuziehen.

6 Bytes gespart dank KGlasier.


Ich habe mit meiner eigenen Lösung herumgespielt und einen Weg gefunden, um ein paar Bytes an Ihrer zu sparen: Sie können 4 Bytes sparen, indem Sie die Schleife in Klammern setzen und direkt indizieren. dh param($n)(0..$n|%{($j='-'*$_++)+'>';"<$j"})[0..--$n]. Jetzt müssen Sie also nicht $xzweimal schreiben .
KGlasier

Sie können auch zwei weitere Bytes speichern , indem nicht mit ++in ($j='-'*$_++)wie Sie nicht verwenden $_anderswo.
KGlasier

1
@KGlasier Super - danke für die offensichtlichen Golfplätze! :)
AdmBorkBork

5

Python 3, 53 Bytes

Meine erste Codegolf-Antwort.

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

-10 Bytes dank Jo King


5

Haskell , 51 44 Bytes

-7 Bytes dank xnor ( iterateüber Listenverständnis)!

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

Probieren Sie es online!

Erklärung / Ungolfed

Die Verwendung von do-notation erspart uns eine concat, und die Verwendung der Infix-Notation ermöglicht eine punktfreie Funktion mit take:

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

5

Japt -m, 16 15 13 12 Bytes

1 Byte dank Shaggy gespeichert

g<i>)iUUz ç-

Testen Sie es online

Erläuterung:

-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! Sehr klug, danke!
Oliver


4

MathGolf , 17 15 Bytes

Dank Jo King und Kevin Cruijssen 2 Bytes gespart

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

Probieren Sie es online!

Erläuterung

Der 15-Byte-Ansatz unterscheidet sich von meiner ursprünglichen Lösung. Ich kann keine Anerkennung für die Implementierung geben.

{                 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

Wie funktioniert das if/elsein MathGolf? Ich weiß, wie die if-without-else- und else-without-if-Anweisungen funktionieren, aber wie man ein if {...} else {...} in MathGolf mit erstellt ¿. (Vielleicht sollte ich das im Chat posten, anstatt hier. Aber ich könnte vielleicht 1 Byte sparen, wenn ich das Wenn-Sonst-
Problem

1
@ KevinCruijssen Ich denke, es funktioniert mit den nächsten beiden Befehlen / Blöcken. ZB ¿12wird 1 drücken, wenn wahr, sonst 2, ¿Å3*Å1+wird eins hinzufügen, wenn wahr, sonst das nächste Element verdreifachen
Jo King

@KevinCruijssen Mit dem Befehl if / else werden zwei Operatoren oder Blöcke aus dem Code entfernt. Jo King hat in seinem Beispiel Recht, aber Sie könnten auch ¿{"foo"}{"bar"}oder tun ¿1{2}.
Maxb

@JoKing Ich werde ein TODO hinzufügen, um die Dokumente für die Slicing-Operatoren zu korrigieren.
Maxb

1
15 Bytes mit @ KevinCruijssens Lösung
Jo King

4

Japt -m , 14 Bytes

"<>"¬hUUz ç-)q

Probieren Sie es online!

Aktualisiert mit einer völlig neuen Methode.

Erläuterung:

                  #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
çwandelt den ersten Parameter automatisch in eine Zeichenfolge um, sodass Sie die Zeichenfolge ablegen können '.
Oliver

1
Sie brauchen die uMethode nicht, da der Index umbrochen wird. Das können also 14 Bytes sein.
Shaggy

4

C (gcc) , 80 77 76 74 71 Bytes

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

Probieren Sie es online!

-3 Bytes mit der Idee von nur ASCII .

-1 mit \0statt\n

-5 Teile neu anordnen


Die Ausgabe enthält ein Trailing \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
}

das könnte klarer sein? idk
ASCII


@ Nur ASCII Ja, das sollte klarer sein, auch wenn es für bytecount keinen Unterschied macht. Was den zweiten Punkt betrifft ... danke für die Idee! Schaffte es damit auf 78 zu reduzieren.
12.


XD hast du noch !n--im ersten Codeblock
ASCII




3

Kohle , 16 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Ich hatte drei 17-Byte-Lösungen, bevor ich schließlich über diese gestolpert bin. Erläuterung:

Nθ

Eingabe n.

Fθ«

Wiederholungszeiten n, 0-indiziert.

⊘ι

Zeichnen Sie eine Linie mit -der halben Länge des Index (abgeschnitten).

↓>

Zeichne die Pfeilspitze und gehe zur nächsten Zeile.

‖T»

Reflektiere alles und drehe die Pfeilspitzen um.

Fθ‖T

Die obige Schleife hat nReflexionen, aber wir brauchen eine gerade Anzahl von Reflexionen, führen Sie also weitere nReflexionen durch.


3

Sauber , 76 73 Bytes

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

Probieren Sie es online!

Verwendet die nette Tatsache, ['-','-'..]die gleichbedeutend ist ['--'..], um ein bisschen zu sparen.


3

JavaScript, 49 Bytes

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

Probieren Sie es online!


Wow, ziemlich cool
Limbo

... aber es macht weiter 10000, während meine ES6-Lösung noch funktioniert: D Wie auch immer, deine Lösung ist sehr cool)
Limbo

2

Powershell, 51 Bytes

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

2

6502 Maschinencode (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

Immer noch ziemlich viel kürzer als BASIC ;) Dieser hat einen Zahlenbereich nur bis zu, 255weil die natürliche Ganzzahlgröße der Maschine nur 8 Bit hat.

Online-Demo

Verwendung: SYS49152,[n] (zB SYS49152,3für das Beispiel aus der Challenge)

Kommentierte Demontage :

         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}

Probieren Sie es online!

Zuerst generieren wir Listen mit 0 anstelle von "<", 1 anstelle von "-"und 2 anstelle von ">":

{ } Funktion mit Argument x

x{... }\0wende die inneren Funktionszeiten xan, beginnend mit einem Anfangswert von0 und die Zwischenergebnisse erhalten bleiben

|x umkehren

2- Ersetzen Sie 0 durch 2 und umgekehrt, und behalten Sie die Einsen bei

1, 1 voranstellen

(1=*x)_ ist der erste von x gleich 1? Wenn ja, lösche ein Element, andernfalls lösche 0 Elemente (mache nichts)

2, stellen Sie der Initiale eine 2 voran ">" Pfeil

x# Wir haben ein bisschen zu viele Listen, nehmen Sie also nur die erste x von ihnen

"<->" Verwenden Sie die Elemente der Listen (0/1/2) als Indizes in dieser Zeichenfolge


Ich möchte um eine Erklärung bitten (ich habe noch nicht angefangen K zu lernen, ich weiß nicht mit welcher Version ich anfangen soll ...)
Galen Ivanov

1
@GalenIvanov Ich habe versucht, eine Erklärung zu schreiben, ich hoffe, es macht Sinn. danke für dein interesse an meiner lieblingssprache :) es gibt mehrere implementierungen mit unterschiedlichen vor- und nachteilen ( kx's original , kona , oK und ich arbeite alleine). Möchten Sie sich im apl-Chatroom anmelden, damit ich Ihnen weitere Informationen geben kann?
13.

Danke, ich bin schon da
Galen Ivanov

2

05AB1E , 23 20 Bytes

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

Probieren Sie es online!

Zum ersten Mal mit 05AB1E oder einer anderen Golfsprache. Irgendwelche Ideen willkommen.

-3 von Kevin Cruijssen


1
Willkommen in der Welt von 05AB1E und schöne erste Antwort. +1 von mir. :) "><"kann sein „><, ein Byte zu speichern. Es gibt builtins für 1, 2 und 3 char Strings, wobei ', , und sind. Hier ist eine 18-Byte-Alternative, die ich mir ausgedacht habe, aber vielleicht könnte man ein bisschen mehr Golf spielen. Wenn Sie es noch nicht gesehen haben, haben wir Tipps zum Golfen auf der 05AB1E- Seite und können auch im Chat Fragen stellen .
Kevin Cruijssen

1
@ KevinCruijssen Vielen Dank für Ihre Ideen. Ich fühle mich nicht richtig, wenn ich nur Ihren Code verwende, da er sich ziemlich anders anfühlt als der meine, aber ich habe die Idee von Modulo 2 verwendet, um zu prüfen, ob eine Zahl ungerade ist. Ich verwende auch die Zwei-Zeichen-Zeichenfolge-Idee. Es würde mir überhaupt nichts ausmachen, wenn Sie die 18-Byte-Version selbst veröffentlichen würden.
nedla2004

In diesem Fall habe ich meine Antwort gepostet . :)
Kevin Cruijssen

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

Probieren Sie es online!

Verwendet einen Aktionsdelegaten , um die Eingabe abzurufen, und erfordert keine Rückgabe.

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 Funktioniert nicht, da die erste ">" Ausgabezeichenfolge fehlt.
Erdmännchen


2

ES6, 96 82 79 70 Bytes

Probieren Sie es online! (Danke an @Oliver)

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

1
Willkommen bei PPCG! Standardmäßig ist die Eingabe als Variable nicht zulässig. Sie müssen es entweder zu einer Funktion machen (setzen Sie einfach ein i=>Häkchen vor Ihren Code!) oder aus einem Befehlszeilenargument oder STDIN oder so.
HyperNeutrino

@HyperNeutrino okay, bearbeitete Antwort. Die am häufigsten gewählte Antwort enthält jedoch nur den Hauptteil der Funktion, ist aber in Ordnung. Sowieso bin ich Außenseiter)
Limbo

Kannst du es verlinken? Ich denke nicht, dass einer von ihnen ungültig ist, zumindest nicht die Top-Wenigen.
HyperNeutrino

1
Noch ein paar Bytes: Versuchen Sie es online
Oliver

1
Noch ein paar Bytes, wenn Sie den letzten ternären Operator neu anordnen und die mittlere Klammer entfernen: Versuchen Sie es online
Oliver

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.