Proste strzałki drukowania

23

Do ćwiczeń golfowych wykonywałem zadania w Intro mojej dziewczyny do klasy Python. Odkryłem, że przy tym zadaniu było wiele strategii, które były bardzo zbliżone do liczby postaci i jestem pewien, że ludzie tutaj mogą znaleźć jeszcze lepsze sposoby. Chociaż jestem najbardziej zainteresowany sposobami zrobienia tego w Pythonie, chciałbym wiedzieć, jak najbardziej gra w golfa ten program, dlatego jest to golf golfowy i wygrywa najkrótsza odpowiedź.

Zasady:

Zadanie opisano poniżej. Użytkownik powinien zostać poproszony o dwukrotne wprowadzenie danych, chociaż monity nie muszą nic mówić i mogą być w innej kolejności.

Obowiązują standardowe luki.


Zadanie 3: Strzały

Napisz program, który monituje użytkownika o podanie kilku kolumn, a on wydrukuje wzór, jak pokazano poniżej. Możesz założyć, że użytkownik poda liczby dodatnie. Twój program powinien obsługiwać zarówno lewą, jak i prawą strzałkę. Oto kilka przykładowych przebiegów:

How many columns? 3
Direction? (l)eft or (r)ight: r
*
 *
  *
 *
*
How many columns? 5
Direction? (l)eft or (r)ight: l
    *
   *
  *
 *
*
 *
  *
   *
    *
aks.
źródło
23
To wygląda jak domowe ... nieważne.
TessellatingHeckler,
Czy dozwolone są spacje w każdej linii?
lirtosiast,
@ThomasKwa tak.
aks.
Czy możemy używać znaków kontrolnych do poruszania kursorem, jak w tym pytaniu ?
lirtosiast,
@ThomasKwa Pewnie ... chociaż szczerze mówiąc, nie jestem pewien, co to znaczy i jestem zainteresowany widzeniem tego w akcji.
aks.

Odpowiedzi:

8

Pyth, 23 bajty

Może, ale nie musi być ważny, na podstawie odpowiedzi na ten komentarz . Niezależnie od tego uważam to za schludne, a jeśli jest niepoprawne, inne odpowiedzi w języku Pyth są również nieprawidłowe. ;) Cóż, to jest ważne , ponieważ najwyraźniej przegapiłem rażąco oczywiste. : /

EDYCJA: WON !!!! TAK !!!! Pierwszy raz! :RE

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

Demo na żywo.

kirbyfan64sos
źródło
1
m+*\ d\*Qzamiast tego wyliczenia. Oszczędza 2 bajty.
Jakube,
7

Pyth, 27

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

Wypróbuj online

Podstawową ideą jest zbudowanie jednego ciągu, który, powiedzmy 5, wygląda następująco:

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

A potem odwróć to do góry nogami, jeśli otrzymamy ljako nasz wkład. Następnie bierzemy wszystkie oprócz ostatniego input-1wiersza tego ciągu i drukujemy go.

FryAmTheEggman
źródło
7

Python 2, 81 79 bajtów

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

Być może nadal można grać w golfa, ale zobaczymy :)

Sp3000
źródło
2
Fajny pomysł na zmienne li r. Nie zdawałem sobie sprawy, że dane wejściowe są evaledytowane w tym samym środowisku co kod.
xnor
4

Pyth, 30 28 27 bajtów

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

Wypróbuj online.

Najwyraźniej jestem obecnie związany z FryAmTheEggman z zupełnie innym podejściem. (Myślę, że jeden jest genialny.)

Przykład

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

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

Wyjaśnienie

 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
źródło
@ Pietu1998 Nadal jestem zainteresowany podstawowym opisem tego, co robisz. Widzę, że masz tylko 1 pętlę i nie ma mapy ani lambda ...
aks.
@aks. Dodałem wyjaśnienie.
PurkkaKoodari,
4

PowerShell, 91 85 102 bajtów

$c=(Read-Host)-1;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[(Read-Host)-eq'l']|%{" "*$_+"*"}
  • Pobiera kolumny, przechowuje je $c. Odejmujemy jeden, ponieważ każda kolumna ma również *i interesuje nas tylko, ile wymaganych jest spacji.
  • Jeśli wprowadzona wartość to a 1, wydrukuj *i wyjdź - reszta skryptu nie robi różnicy. +
  • Następna sekcja najpierw określa kierunek i sprawdza, czy jest to -eqprzydatne l, a następnie tworzy tablicę na podstawie indeksowania w tablicę dynamicznie generowanych tablic na podstawie wartości $c. Magia. Zasadniczo potrzebujemy tyle spacji na linię.
  • Na przykład dla 5 rtej kolekcji będzie trzymać (0,1,2,3,4,3,2,1,0).
  • Bierze tablicę i %przesyła ją do pętli Foreach-Object , gdzie wypisujemy ciąg X liczby spacji, a następnie*

Przykładowe użycie:

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

Edytuj - usunięto zmienną $epoprzez bezpośrednie przesłanie kolekcji
Edit2 - teraz poprawnie odpowiada za 1 kolumnę

+ Jeśli nadal obowiązkowe jest przyjmowanie danych wejściowych dla kierunku dla strzałek 1-kolumnowych (twierdzę, że nie jest), możemy zamienić pozycję Read-Hosti stracić jeszcze kilka bajtów poprzez ponowne wprowadzenie $dzmiennej, dla 106 :

$c=(Read-Host)-1;$d=Read-Host;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[$d-eq'l']|%{" "*$_+"*"}
AdmBorkBork
źródło
Spróbuj umieścić 1 kolumnę, a po lewej - otrzymasz 2-kolumnową strzałkę w prawo. Spróbuj wstawić 1 kolumnę i dobrze - pojawi się błąd „Podany argument spoza zakresu prawidłowych wartości”. Myślałem, że twoje 85 będzie w stanie pokonać, unikając podwojonych zakresów. Ale nie mogę się nawet zbliżyć. Biorąc pod uwagę strzałkę z 1 kolumną, obecnie mam 112 znaków. > _ <
TessellatingHeckler
1
@TessellatingHeckler Thanks - poprawiono.
AdmBorkBork,
1
To zwiększyło twoje do 102, a moje do 102. Nie mogę już dłużej na to patrzeć, ale musi być jeszcze jeden, który mogę usunąć ...: D
TessellatingHeckler
4

TI-BASIC, 75 65 57 54 50 47 bajtów

Dzięki @ThomasKwa za prawidłowe obliczenie bajtów i grę w golfa 10 bajtów .

Przetestowane na moim TI-84 + Silver Edition.

Pierwsze zgłoszenie TI-BASIC, mile widziane sugestie dotyczące gry w golfa (nie znam jeszcze wielu lew). Jeśli nazwa odgrywa rolę w wyświetlanej pamięci, to miała ona 3 znaki zamiast 1 (sprawdziłem liczbę bajtów na moim kalkulatorze). Ten program jest ograniczony ograniczeniami outputfunkcji (myślę o strzałkach o długości 4), ale prawdopodobnie mógłbym się przełączyć na text, który wyświetla się graficznie, jeśli jest zbyt mała.

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

Pamiętaj, że to również nie wyczyści ekranu ani go nie zatrzyma.

Naprawdę czuję, że równanie, którego używam, może być bardziej golfa. Wyłączenie końcowego znaku cudzysłowu jest również błędem.

kapusta
źródło
@ThomasKwa Thanks! Zrobię to teraz.
cole
2
Po drugie: Ansjest bezpłatny, ponieważ nie używasz go do wprowadzania danych i Output(nie modyfikujesz Ans. Użyj go i pozbądź się zmiennej A. Możesz przypisać za pomocą -2(Str1="R; nie ma potrzeby warunkowego.
lirtosiast
1
@ThomasKwa dziękuję za wskazówki, wygląda na to, że mam sposoby na przejście w TI-BASIC.
cole
3
Po trzecie: naprawdę nie ma potrzeby pomnożenia wartości przez -2. Po prostu zrób Str1="Rdrugą linię. To czyni czwartą linię Output(I,(1-2Ans)abs(I-L)+AL+1,"*, która daje ci 4 dodatkowe bajty. Ale poczekaj, istnieje idiom dla (1-2Ans)- to cos(πAns), co oszczędza jeden bajt, plus jeszcze jeden, ponieważ otrzymujemy otwarty nawias za darmo!
lirtosiast
1
Zdobycie umiejętności gry w golfa w dowolnym języku wymaga jedynie ćwiczenia; dotrzesz tam.
lirtosiast
2

Python 2, 89 bajtów

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

Działa prawie identycznie jak moja odpowiedź w języku Pyth, po prostu obliczając poprawną liczbę spacji w locie.

PurkkaKoodari
źródło
2

PowerShell, 104 102 97 bajtów

# 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. jeśli chcesz go uruchomić ponownie, otwórz nowy PowerShell lub rv ozresetuj stan zmiennej.

W porównaniu do tego, jak zwięzli są inni, to boli. [Boli mniej w 97 niż w 122]. Dwie części, żadna z nich nie jest bardzo zaskakująca; odczytuje wiele kolumn, korzysta z tablicowego indeksu trójskładnikowego-operatora-zastępcy, aby uzyskać przesunięcie, i przechodzi przez funkcję fali rozpoczynającą się od przesunięcia (i modyfikację, aby się nie przewracała mod 0).

(A ouch, czy spędziłem wieki na tej funkcji falowej, nie mogąc dostrzec mojego nieporozumienia i wpisując wszystkie to-nie-LISP-, uczciwe pareny).

TessellatingHeckler
źródło
2
To cholernie genialne.
AdmBorkBork,
2

Python 2, 98 89 bajtów

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

Trochę dłużej.


Stosowanie

$ python2 test.py
3
"l"
  *
 *
*
 *
  *
Zach Gates
źródło
Również najwyraźniej zepsuty. NameError: name 'l' is not defined, NameError: name 'd' is not defined.
TessellatingHeckler
Sprawdź użycie. @TessellatingHeckler
Zach Gates
Ach, sprytnie. Ale twoje 1-kolumnowe strzały mają dwie głowice strzał. (Myślę, że można grać w golfa dalej, nie przechowując ii dwcale, po prostu używając range(P())i if P()=='l'...)
TessellatingHeckler
Dzięki za sugestie! Naprawiłem także podwójne strzały. @TessellatingHeckler
Zach Gates
Nie można przetestować bankomat, ale prawdopodobnie można by było zrobić coś takiego f=[...][::2*('r'>input())-1]rzeczywiście
SP3000
2

Perl, 85 bajtów

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

Stosowanie:

perl 59874.pl <<< '6
r'
Dom Hastings
źródło
4
Podoba mi się, jak nazywasz swoje skrypty czymś, co później rozpoznasz ...
mbomb007
@ mbomb007 haha! Wiesz, tak naprawdę nie nazywam tego skryptu, ale pomyślałem, że najlepiej nazwać coś prostego dla instrukcji użytkowania ... simplearrows2.plnie wydaje się tak dobre! : P
Dom Hastings,
2

PHP, 156 bajtów

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

Tworzy dwie tablice, takie jak to:

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

następnie używa unii tablicowej $s+$tlub$t+$s łączy je i array_spliceusuwa element na środku. Na koniec użyj<?=join()

Fabian Schmengler
źródło
z argumentami CLI zamiast STDIN mój kod byłby o 8 bajtów krótszy;)
Fabian Schmengler
2

Python 2, 111 109 104 bajtów

Całkiem proste rozwiązanie. Jestem pewien, że można więcej grać w golfa. Dla tych, którzy nie wiedzą, ~x+njest taki sam jak 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," ")

Wypróbuj online

Edycja : To było golfem do ostatniej linii:

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

Matlab, 109 105 96 bajtów

Dzięki @beaker za uratowanie mnie 9 bajtów .

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
źródło
Możesz zapisać 9 bajtów, jeśli zastąpisz dwa wiersze wstawiając kody ascii słowemx=x*10+32;
zlewka
@beaker Bardzo sprytny, dzięki!
Luis Mendo,
1

Rubin, 118 bajtów

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{ - dwa razy oczywiście ...

l,d=gets.split; - uzyskaj dane wejściowe

l=l.to_i; - zmień długość na liczbę całkowitą

a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a; - utwórz tablicę z zakresu od 0 do długości

(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"} - iteruj, obracaj w struny, aby tworzyć strzały

Niezupełnie najlepszy golf w historii, ale, hej.

Ziemniak Ziemniaczany Kanapka
źródło
1

PowerShell, 98 94 bajtów

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

Gdybym mógł znaleźć sposób na umieszczenie Read-Host dla kierunku wewnątrz pętli foreach-object, ale poprosiłbym o to tylko raz, gdybym mógł zapisać kilka bajtów.

Edycja: 94 bajty. Zamiast testować dla lewej, test dla prawej (upraszcza pętlę).

Oryginalny 98 bajtów:

$c=(Read-Host)-1;$d=Read-Host;if($c){0..$c+($c-1)..0|%{if($d-eq'l'){$_=$c-$_}' '*$_+'*'}}else{'*'}
Jonathan Leech-Pepin
źródło
Resetowanie $_zmiennej - podstępny Hobbit. Bardzo sprytne i dzisiaj czegoś się nauczyłem.
AdmBorkBork,
@TimmyD Very tricks. A następnie przełącz instrukcję if, aby zaoszczędzić jeszcze więcej.
Jonathan Leech-Pepin
0

> <> , 60 bajtów

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

2 zmarnowane bajty w dolnej linii, jak irytujące!

Ze względu na to, jak działa wejście w> <>, nie można „czekać” na wejście - i polecenie sprawdza, czy znak wejściowy jest dostępny na STDIN. Jeśli tak, wypycha wartość ASCII tego znaku, a popycha -1, jeśli nie.

Oznacza to, że aby móc korzystać z tego programu, numer i kierunek muszą być już gotowe na STDIN, np 3r Dla strzałki wielkości 3 skierowanej w prawo. Nie jestem pewien, czy to dyskwalifikuje ten wpis, daj mi znać, co myślisz: o)

Napiszę też opis, jeśli ktoś tego chce.

Sok
źródło
W pewnym sensie czeka na dane wejściowe, jeśli spróbujesz uruchomić go w powłoce, więc myślę, że to w porządku. Bardziej martwi mnie fakt, że oczekuje się, że dane wejściowe będą jednocyfrowe (chyba że mam wprowadzić :10?)
Sp3000
Doskonały punkt, nie myślałem o wkładzie powyżej 9. Powrót do tablicy kreślarskiej!
Sok
1
Zostawiłem komentarz do głównego pytania w celu wyjaśnienia, na wszelki wypadek
Sp3000,
0

PHP, 154 bajty

Wygląda naprawdę powtarzalnie, ale robi pożądane:

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

Działa z wiersza poleceń, takich jak:

php arrow.php 5 l
php arrow.php 5 r
wstawić nazwę tutaj
źródło
-1

Python, 88 bajtów

Edytowane

n=input()-1
x=raw_input()>'l'
for i in range(2*n+1):print" "*(n*x+(-1)**x*abs(n-i))+"*"
orgesleka
źródło