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
    *
   *
  *
 *
*
 *
  *
   *
    *

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.


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.


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 :)


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

@ 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']|%{" "*$_+"*"}

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.


@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.


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).


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

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'

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()


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," ")

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,:)]))

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.


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{'*'}

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.


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

-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))+"*"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.