Einfache Druckpfeile

23

Zum Üben im Golf habe ich die Aufgaben im Intro-to-Python-Kurs meiner Freundin ausgeführt. Ich fand heraus, dass es für diese Aufgabe mehrere Strategien gab, die in der Anzahl der Charaktere sehr nahe kamen, und ich bin sicher, dass die Leute hier noch bessere Wege finden können. Obwohl ich am meisten an Möglichkeiten interessiert bin, dies in Python zu tun, würde ich gerne wissen, welche Möglichkeiten dieses Programm bietet. Daher ist dies Codegolf und die kürzeste Antwort gewinnt.

Die Regeln:

Die Zuordnung ist unten aufgeführt. Der Benutzer sollte zweimal zur Eingabe aufgefordert werden, obwohl die Eingabeaufforderungen nichts zu sagen haben und sich in einer anderen Reihenfolge befinden können.

Es gelten Standardlücken.


Aufgabe 3: Pfeile

Schreiben Sie ein Programm, das den Benutzer zur Eingabe einer Reihe von Spalten auffordert und das Muster wie unten gezeigt druckt. Sie können davon ausgehen, dass der Benutzer positive Zahlen liefert. Ihr Programm sollte sowohl mit dem linken als auch mit dem rechten Pfeil umgehen können. Hier einige Beispielläufe:

How many columns? 3
Direction? (l)eft or (r)ight: r
*
 *
  *
 *
*
How many columns? 5
Direction? (l)eft or (r)ight: l
    *
   *
  *
 *
*
 *
  *
   *
    *
aks.
quelle
23
Das sieht aus wie zu Hause ... oh, egal.
TessellatingHeckler
Sind Leerzeichen in jeder Zeile zulässig?
Lirtosiast
@ ThomasKwa ja.
aks.
Können wir, wie in dieser Frage, Steuerzeichen verwenden, um den Cursor zu bewegen ?
Lirtosiast
@ThomasKwa Sicher ... obwohl ich ehrlich gesagt nicht sicher bin, was das bedeutet und ich daran interessiert bin, es in Aktion zu sehen.
aks.

Antworten:

8

Pyth, 23 Bytes

Kann gültig oder ungültig sein, basierend auf der Antwort auf diesen Kommentar . Ungeachtet dessen fand ich dies ordentlich, und wenn es ungültig ist, sind die anderen Pyth-Antworten ebenfalls ungültig. ;) Na ja, es ist gültig , weil ich anscheinend das offensichtlichste verpasst habe. : /

EDIT: Ich habe gewonnen !!!! JAAA!!!! Das erste Mal! : D

j+_J_Wqz\r.e+*dkb*\*QtJ

Live-Demo.

kirbyfan64sos
quelle
1
m+*\ d\*Qstattdessen aufzählen Ding. Spart 2 Bytes.
Jakube,
7

Pyth, 27

j<tQ_Wqz\l++Jm+*\ d\*Q_PJtJ

Probieren Sie es online aus

Die Grundidee hier ist, eine Zeichenfolge zu erstellen, die beispielsweise wie folgt aussieht:

*
 *
  *
   *
    *
   *
  *
 *
*
 *
  *
   *
    *

Und dann drehen Sie es auf den Kopf, wenn wir lals Eingabe erhalten. Dann nehmen wir alle bis auf die letzten input-1Zeilen dieser Zeichenfolge und drucken sie aus.

FryAmTheEggman
quelle
7

Python 2, 81 79 Bytes

c=input()
r=1
l=0
exec"print' '*(%sabs(c-r))+'*';r+=1;"%("c+~"*input())*(2*c-1)

Könnte noch golffähig sein, aber wir werden sehen :)

Sp3000
quelle
2
Gute Idee mit den Eingaben Variablen sein lund r. Ich hatte nicht bemerkt, dass die Eingabe evalin derselben Umgebung wie der Code erfolgt.
Xnor
4

Pyth, 30 28 27 Bytes

VtyQ+*+*tQJqz\r_WJ.a-hNQd\*

Probieren Sie es online aus.

Anscheinend bin ich derzeit mit FryAmTheEggman mit einem ganz anderen Ansatz verbunden. (Ich denke, dass man genial ist.)

Beispiel

$ python pyth.py spa.p
r
3
*
 *
  *
 *
*

$ python pyth.py spa.p
l
5
    *
   *
  *
 *
*
 *
  *
   *
    *

Erläuterung

 tyQ                              (columns * 2) - 1
V                               loop N through range(the above)
        tQ                                columns - 1 (maximum number of spaces)
       *                                multiplied by
           qz\r                           1 if direction == "r" else 0
          J                               also save that 1 or 0 to J
      +                               plus
                  .a-hNQ                    abs(N - columns + 1)
               _WJ                      negate that if direction == "r"
     *                  d           that many spaces
    +                    \*       add the star and print
PurkkaKoodari
quelle
@ Pietu1998 Ich interessiere mich immer noch für eine grundlegende Beschreibung dessen, was du tust. Ich sehe, Sie haben nur 1 Schleife und keine Karte oder Lambda ...
aks.
@aks. Ich habe eine Erklärung hinzugefügt.
PurkkaKoodari
4

PowerShell, 91 85 102 Bytes

$c=(Read-Host)-1;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[(Read-Host)-eq'l']|%{" "*$_+"*"}
  • Ruft die Spalten ab und speichert sie in $c. Wir subtrahieren eine, weil jede Spalte auch eine hat *und uns nur interessiert, wie viele Leerzeichen benötigt werden.
  • Wenn der eingegebene Wert a war 1, wird gedruckt *und beendet - der Rest des Skripts spielt keine Rolle. +
  • Im nächsten Abschnitt wird zunächst die Richtung -eqabgefragt und geprüft l, ob dies tatsächlich der Fall ist. Anschließend wird ein Array basierend auf der Indizierung in ein Array dynamisch generierter Arrays basierend auf dem Wert von erstellt $c. Zauber. Im Wesentlichen ist dies die Anzahl der Leerzeichen pro Zeile, die wir benötigen.
  • Zum Beispiel 5 rwürde für diese Sammlung gelten (0,1,2,3,4,3,2,1,0).
  • Nimmt das Array und leitet es in eine Foreach-Object- %Schleife weiter, in der wir eine Zeichenfolge mit einer Anzahl von X Leerzeichen ausgeben*

Anwendungsbeispiel:

PS C:\Tools\Scripts\golfing> .\simple-printing-arrows.ps1
6
r
*
 *
  *
   *
    *
     *
    *
   *
  *
 *
*

Bearbeiten - Variable $edurch direktes Weiterleiten der Sammlung entfernen. Bearbeiten2 -
Kontiert jetzt korrekt 1 Spalte

+ Wenn die Eingabe der Richtung für einspaltige Pfeile immer noch obligatorisch ist (ich behaupte, dass dies nicht der Fall ist), können wir die Position von tauschen Read-Hostund ein paar weitere Bytes verlieren, indem wir die $dVariable für 106 erneut einfügen :

$c=(Read-Host)-1;$d=Read-Host;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[$d-eq'l']|%{" "*$_+"*"}
AdmBorkBork
quelle
Versuchen Sie, eine Spalte nach links zu setzen, und Sie erhalten einen Pfeil nach rechts mit zwei Spalten. Versuchen Sie, eine Spalte nach rechts zu setzen. Sie erhalten den Fehler "Angegebenes Argument außerhalb des gültigen Wertebereichs". Ich dachte, Ihre 85 wären zu schlagen, wenn Sie die doppelten Reichweiten meiden. Aber ich komme nicht mal näher. Ich rechne mit einem 1-Spalten-Pfeil und habe derzeit 112 Zeichen. > _ <
TessellatingHeckler
1
@TessellatingHeckler Danke - korrigiert.
AdmBorkBork
1
Das hat deine auf 102 erhöht und meine auf 102. Ich kann es nicht lassen, das länger anzustarren, aber es muss noch eine geben, die ich löschen kann ...: D
TessellatingHeckler
4

TI-BASIC, 75 65 57 54 50 47 Bytes

Vielen Dank an @ThomasKwa für die korrekte Byte-Berechnung und das Golfen von 10 Bytes .

Getestet auf meinem TI-84 + Silver Edition.

Erste TI-BASIC Einreichung, Golf Vorschläge willkommen (ich kenne noch nicht viele Tricks). Wenn der Name einen Faktor im angezeigten Speicher spielt, waren dies 3 Zeichen anstelle von 1 (ich habe die Byteanzahl auf meinem Rechner selbst überprüft). Dieses Programm ist durch die outputFunktionseinschränkungen begrenzt (ich denke an Pfeile der Länge 4), aber ich könnte wahrscheinlich auf umschalten text, was grafisch angezeigt wird, wenn das eine zu geringe Länge hat.

Prompt L,Str1
Str1="R
For(I,1,2L-1
Output(I,(1-2Ans)abs(I-L)+AnsL+1,"*
End

Beachten Sie, dass dadurch auch der Bildschirm nicht gelöscht oder angehalten wird.

Ich habe wirklich das Gefühl, dass die Gleichung, die ich benutze, mehr Golf spielen kann. Es fühlt sich auch so falsch an, das endende Anführungszeichen auszuschließen.

cole
quelle
@ ThomasKwa Vielen Dank! Das mache ich jetzt.
Cole
2
Zweitens: Ansist kostenlos, da Sie es nicht für Eingaben verwenden und Output(nicht ändern Ans. Verwenden Sie es und entfernen Sie die Variable A. Sie können zuweisen mit -2(Str1="R; keine Notwendigkeit für eine Bedingung.
Lirtosiast
1
@ThomasKwa danke für die Tipps, sieht so aus, als hätte ich in TI-BASIC noch einiges vor.
Cole
3
Drittens: Es ist wirklich nicht nötig, den Wert mit zu multiplizieren -2. Mach einfach Str1="Rfür die zweite Zeile. Das ist die vierte Zeile Output(I,(1-2Ans)abs(I-L)+AL+1,"*, die Ihnen 4 weitere Bytes einbringt. Aber warte, es gibt ein Idiom für (1-2Ans)- es cos(πAns)spart ein Byte plus eins mehr, weil wir die offene Klammer kostenlos bekommen!
Lirtosiast
1
Das Erlernen des Golfsports in einer beliebigen Sprache erfordert nur Übung. Du wirst dahin kommen.
Lirtosiast
2

Python 2, 89 Bytes

c=input()-1
d=raw_input()>'l'
for j in range(2*c+1):print' '*(d*c-(2*d-1)*abs(c-j))+'*'

Funktioniert fast identisch mit meiner Pyth-Antwort und berechnet nur die richtige Anzahl von Leerzeichen im laufenden Betrieb.

PurkkaKoodari
quelle
2

PowerShell, 104 102 97 Byte

# 97 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];($j=2*$c)..0|%{' '*[Math]::Abs($o++%($j+!$j)-$c)+'*'}

3
r
*
 *
  *
 *
*

# Previous 102 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];(2*$c)..0|%{
' '*[Math]::Abs($o++%(2*($c+(!$c+0)))-$c)+'*'}

NB. Wenn Sie es erneut ausführen möchten, öffnen Sie eine neue PowerShell oder rv osetzen Sie den Variablenstatus zurück.

Verglichen mit der Knappheit der anderen tut das weh. [Tut mit 97 weniger weh als mit 122]. Zwei Teile, von denen keiner sehr überraschend ist; Liest eine Reihe von Spalten, verwendet einen Array-Index-Ternär-Operator-Ersatz, um einen Versatz zu erhalten, und durchläuft eine Wellenfunktion, die am Versatz beginnt (und eine Optimierung, damit es nicht umkippt mod 0).

(Und autsch habe ich ewig mit dieser Wellenfunktion verbracht, ohne mein Missverständnis zu erkennen und all die ehrlichen Parens, die es nicht gibt, zu tippen).

TessellatingHeckler
quelle
2
Das ist verdammt genial.
AdmBorkBork
2

Python 2, 98 89 Bytes

f=[' '*n+'*'for n in range(input())]
if'l'==input():f=f[::-1]
print'\n'.join(f+f[-2::-1])

Etwas länger.


Verwendung

$ python2 test.py
3
"l"
  *
 *
*
 *
  *
Zach Gates
quelle
Auch anscheinend kaputt. NameError: name 'l' is not defined, NameError: name 'd' is not defined.
TessellatingHeckler
Überprüfen Sie die Verwendung. @TessellatingHeckler
Zach Gates
Ahh, schlau. Ihre einspaltigen Pfeile haben jedoch zwei Pfeilspitzen. (Ich denke, Sie könnten es weiter Golf spielen, indem Sie nicht speichern iund düberhaupt, nur mit range(P())und if P()=='l'...)
TessellatingHeckler
Danke für die Vorschläge! Ich habe auch die Doppelpfeile repariert. @TessellatingHeckler
Zach Gates
Kann nicht atm testen, aber man kann wohl so etwas wie tut f=[...][::2*('r'>input())-1]eigentlich
SP3000
2

Perl, 85 Bytes

($-,$_)=<>;$,=$/;@}=map$"x$_.'*',0..--$-;@}=reverse@}if/l/;print@},map$}[$--$_],1..$-

Verwendung:

perl 59874.pl <<< '6
r'
Dom Hastings
quelle
4
Mir gefällt, wie Sie Ihren Skripten einen Namen geben, den Sie später
wiedererkennen werden
@ mbomb007 haha! Weißt du, ich nenne meine Skripte nicht so, aber ich dachte, es wäre am besten, etwas Einfaches für die Gebrauchsanweisung zu nennen ... simplearrows2.plscheint nicht so gut zu sein! : P
Dom Hastings
2

PHP, 156 Bytes

<?for($c=1+fgets(STDIN);--$c;$s[-$c]=$t[]=sprintf("%{$c}s","*"));arsort($s);$a=fgetc(STDIN)==r?$s+$t:$t+$s;array_splice($a,count($a)/2,1)?><?=join("
",$a);

Erstellt zwei Arrays wie folgt:

$t = [
    0 => "  *"
    1 => " *"
    2 => "*"
]
$s = [
    -1 => "*"
    -2 => " *"
    -3 => "  *"
]

Verwenden Sie dann die Array-Vereinigung $s+$toder $t+$skombinieren Sie sie und array_spliceentfernen Sie das Element in der Mitte. Zuletzt ausgegeben mit<?=join()

Fabian Schmengler
quelle
mit CLI-Argumenten anstelle von STDIN wäre mein Code 8 Bytes kürzer;)
Fabian Schmengler
2

Python 2, 111 109 104 Bytes

Ziemlich einfache Lösung. Ich bin sicher, es kann mehr Golf gespielt werden. Für diejenigen, die nicht wissen, ~x+nist das gleiche wie n-1-x.

n=input()
r=range(n)
r+=r[-2::-1]
for i in[r,[~x+n for x in r]]['r'>raw_input()]:print"*".rjust(i+1," ")

Probieren Sie es online aus

Bearbeiten : Dies wurde in die letzte Zeile gespielt:

if'r'>d:r=[~x+n for x in r]
for i in r:print"*".rjust(i+1," ")
mbomb007
quelle
2

Matlab, 109 105 96 Bytes

Vielen Dank an @beaker, der mir 9 Bytes gespart hat .

x=eye(input(''));if(input('','s')<114),x=fliplr(x);end
x=x*10+32;disp(char([x;x(end-1:-1:1,:)]))
Luis Mendo
quelle
Sie können 9 Bytes sparen, wenn Sie die beiden Zeilen, in die die ASCII-Codes eingefügt werden, durchx=x*10+32;
Becher vom
@beaker Sehr clever, danke!
Luis Mendo
1

Ruby, 118 Bytes

2.times{l,d=gets.split;l=l.to_i;a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a;(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"}}

2.times{ - natürlich zweimal ...

l,d=gets.split; - Holen Sie sich die Eingabe

l=l.to_i; - Länge in eine ganze Zahl ändern

a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a; - Erstellen Sie ein Array aus dem Bereich von 0 bis zur Länge

(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"} - iterieren, in die Saiten drehen, um die Pfeile zu machen

Nicht gerade der beste Golf aller Zeiten, aber hey.

PotatoOmeletteSandwich
quelle
1

PowerShell, 98 94 Bytes

$c=(Read-Host)-1;$d=Read-Host;if($c){$c..0+1..$c|%{if($d-eq'r'){$_=$c-$_}' '*$_+'*'}}else{'*'}

Wenn ich einen Weg finden könnte, den Read-Host für die Richtung in die foreach-object-Schleife zu setzen, aber erst dann zur Eingabe auffordern könnte, wenn ich in der Lage wäre, ein paar Bytes zu speichern.

Edit: 94 Bytes. Anstatt nach links zu testen, testen Sie nach rechts (vereinfacht die Schleife).

Ursprüngliche 98 Byte:

$c=(Read-Host)-1;$d=Read-Host;if($c){0..$c+($c-1)..0|%{if($d-eq'l'){$_=$c-$_}' '*$_+'*'}}else{'*'}
Jonathan Leech-Pepin
quelle
Zurücksetzen der $_Variablen - trickreicher Hobbit. Sehr klug und ich habe heute etwas gelernt.
AdmBorkBork
@TimmyD Sehr trickreich. Und dann die if-Anweisung umschalten, um noch mehr zu sparen.
Jonathan Leech-Pepin
0

> <> 60 Bytes

i"1l"i=&-:&*&:?!\:1-:}c0.
~/?:<-$?&::&;!?l<oao"*"
1/  \o" "-

2 verschwendete Bytes in der unteren Zeile, wie irritierend!

Aufgrund der Funktionsweise der Eingabe in> <> kann nicht auf die Eingabe igewartet werden. Der Befehl prüft, ob in STDIN ein Eingabezeichen verfügbar ist. Ist dies der Fall, wird der ASCII-Wert dieses Zeichens und andernfalls -1 übertragen.

Dies bedeutet, dass für die Verwendung dieses Programms die Nummer und die Richtung bereits auf STDIN bereit sein müssen, z. B. 3rfür einen nach rechts zeigenden Pfeil der Größe 3. Ich bin mir nicht sicher, ob das diesen Eintrag disqualifiziert, lass mich deine Gedanken wissen: o)

Ich werde auch eine Beschreibung schreiben, wenn jemand eine will.

Sok
quelle
In gewisser Weise wartet es auf Eingaben, wenn Sie versuchen, es in einer Shell auszuführen, also denke ich, dass das in Ordnung ist. Ich bin mehr besorgt über die Tatsache, dass dies erwartet, dass die Eingabe eine einzelne Ziffer sein wird (es sei denn, ich soll :für 10
eingeben
Ein ausgezeichneter Punkt, ich hatte nicht über Eingaben über 9 nachgedacht. Zurück zum Zeichenbrett!
Sok
1
Ich habe einen Kommentar zur Hauptfrage zur Klärung
hinterlassen
0

PHP, 154 Bytes

Es sieht wirklich repetitiv aus, aber es tut das Gewünschte:

$c=$argv[1];$b=l==$argv[2]?1:0;$a=$b?$c:-1;function a($a){echo strrev(str_pad('*',$a))."\n";}while($b?--$a:++$a<$c)a($a+1);while($b?++$a<=$c:1<$a--)a($a);

Läuft von der Kommandozeile aus wie:

php arrow.php 5 l
php arrow.php 5 r
insertusernamehere
quelle
-1

Python, 88 Bytes

Bearbeitet

n=input()-1
x=raw_input()>'l'
for i in range(2*n+1):print" "*(n*x+(-1)**x*abs(n-i))+"*"
orgesleka
quelle