Narysuj trójkąt z gwiazdką


57

Zainspirowany zadaniem programowania 101, oto zadanie, które, miejmy nadzieję, nie jest zbyt łatwe lub jest duplikatem (trochę trudno szukać takich rzeczy).

Wejście:

  • Dodatnia liczba całkowita n >= 1.

Wynik:

  • n linie gwiazdek, gdzie każda nowa linia ma jedną gwiazdkę więcej niż poprzednia linia, i zaczyna się od jednej gwiazdki w pierwszej linii.

Główne zasady:

  • To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach.
  • Ponieważ kurs jest nauczany w C ++, chętnie widzę rozwiązania w C ++.

Przypadek testowy (n = 5):

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

6
Nie duplikat, tylko podzbiór Generuj trójkąt prostokątny .
manatwork 10.10.16

2
Wolne miejsca treningowe na każdej linii?
Luis Mendo,

2
Czy końcowa nowa linia jest akceptowalna?
Fatalize

1
Czy dozwolona jest nowa linia wiodąca?
Riley,

Nie widzę powodu, dla którego nie.
Sickboy,

Odpowiedzi:


41

Vim, 8 bajtów

o <Esc><C-V>{r*J

Pobiera dane wejściowe w buforze readahead, więc jeśli dane wejściowe to 15, wpisz to, a następnie kod powyżej. To jest głupia zasada, ale wydaje się być dozwolona . Jeśli masz dane wejściowe w rejestrze "a, po prostu trzymasz się @aprzodu (10). Jeśli masz go z pliku początkowego, D@"zamiast tego wstawisz (11).

Opiera się na nadużyciach :set autoindent, co jest domyślne w regulaminie vimgolf.com i domyślne w Vimie 8 (i i tak wszyscy go używają).

  • o <Esc>: Za pomocą argumentu liczbowego, jeśli tekst zaczyna się od białych znaków, a ty tak :set autoindent, Vim drga i tworzy kaskadę wcięć.
  • <C-V>{r*: Zamień wszystkie te spacje w *s. Używam blokowania wizualnego, więc nawet jeśli twoje kiepskie ustawienia wcięć cicho grupują spacje w tabulatory, nadal otrzymasz odpowiednią liczbę *s.
  • J: Począwszy od oniestety pozostawił pustą linię na górze. To usuwa to.

1
Ta odpowiedź jest niesamowicie imponująca. Jedna z najfajniejszych odpowiedzi Vima, jakie widziałem.
DJMcMayhem

1
Wygląda jak ryba. Lub rakieta.
Stephan Bijzitter,

1
Drgnąłem trochę i zwolniłem Vima, -u NONEżeby zobaczyć to sam ... To nie działało, wygląda autoindentna to, że jest włączone w domyślnym vimrc , a nie w samym vimie 8, więc musiałem go włączyć ręcznie. Ale czapki z głów za pomysłowość tej odpowiedzi! Ale dlaczego jest tylko jedna spacja na nową linię? Dlaczego działa tylko ze spacjami, ale nie z innymi postaciami? Wydaje mi się, że wciąż muszę się wiele nauczyć :)
Christian Rondeau

Począwszy od O <Esc>nie będzie wymagać Jna końcu.
primo

1
@udioica pojedynczy znak nowej linii jest ogólnie uważany za akceptowalny.
primo

23

JavaScript (ES6), 31 bajtów

Ten obejmuje zarówno wiodące, jak i końcowe łamanie linii.

Zaczynamy od łańcucha szawierającego tylko podział linii. Następnie przetwarzamy nwywołania rekurencyjne, dodając gwiazdkę po lewej stronie tego ciągu przy każdej iteracji. Łączenie wszystkich łańcuchów pośrednich prowadzi do oczekiwanego wyniku.

f=(n,s=`
`)=>n?s+f(n-1,'*'+s):s

Bez gwiazdki 36 bajtów

f=(n,s=`
`)=>n?s+f(n-1,atob`Kg`+s):s

Jak to działa ?
Alexis_A,

1
@Alexis_A - dodałem krótki opis.
Arnauld,

3
Ładna rekurencyjna odpowiedź; Nigdy bym nie pomyślał o technice, której używasz s. Możesz sprawić, że będzie nieco mniej tajemniczy n?s+f(n-1,'*'+s):s.
ETHproductions 10.10.16

19

05AB1E , 7 6 bajtów

Wykorzystuje kodowanie CP-1252 .

'*×.p»

8-bajtowa wersja bez gwiazdki:

žQTè×.p»

Wypróbuj online!

Wyjaśnienie

Przykład z wykorzystaniem danych wejściowych n = 5

'*      # push "*"
        # STACK: "*"
  ×     # repeat input number times
        # STACK: "*****"
   .p   # get prefixes of string
        # STACK: ['*', '**', '***', '****', '*****']
     »  # join by newlines
        # implicit print

@TheBitByte 10žQSè×.p»jest logicznym rozszerzeniem tej odpowiedzi, aby uzyskać to, czego chciałeś za nagrodę, i to tylko 10 bajtów. Daj Emignie nagrodę, jeśli nikt nie pobije 10 bajtów haha.
Magic Octopus Urn

1
@carusocomputing: TžQè×.p»ma nawet 8 bajtów.
Emigna

Wciąż próbując nauczyć się języka, brakowało instrukcji T; myślałem, że to dziwne, że było mnóstwo wypchnięć Base2, ale nie baza 10. Muszę przeszukać całą zawartość pliku info.txt, aby móc cokolwiek zrobić w tym języku heh.
Magic Octopus Urn

@ carusocomputing niektóre polecenia są naprawdę łatwe do pominięcia, zwłaszcza jeśli znasz inny sposób na zrobienie tego :)
Emigna,

1
@carusocomputing: Nie jesteś pewien, o czym mówisz. Jedyne polecenie listy, którego tu używam », to polecenie przeznaczone specjalnie do łączenia list z ogranicznikami w ciąg (i Szrujnowałoby to). Ale wiele poleceń 05AB1E powoduje wektoryzację, tak.
Emigna

15

PowerShell, 21 bajtów

1..$args[0]|%{'*'*$_}

Pętle od 1do wejścia $args[0], każda iteracja używa mnożenia łańcucha, aby utworzyć ciąg z tylu $_gwiazdek. Domyślne zachowanie niejawnego Write-Outputna końcu ma nowy wiersz separatora, więc otrzymujemy to za darmo.

PS C:\Tools\Scripts\golfing> .\draw-asterisk-pattern.ps1 5
*
**
***
****
*****

PS C:\Tools\Scripts\golfing> .\draw-asterisk-pattern.ps1 2
*
**

PS C:\Tools\Scripts\golfing> .\draw-asterisk-pattern.ps1 7
*
**
***
****
*****
******
*******

13

Python 2, 37 34 bajtów

i=1;exec"print'*'*i;i+=1;"*input()

Ideone

ijest inicjowany 1;
następnie execpolecenia, aby wykonać następujący ciąg kodu, więc należy go zbudować;
ciąg jest następujący, "print'*'*i;i+=1;"ale *następujący ciąg ma pierwszeństwo przed execi nakazuje, aby najpierw powtórzyć ciąg znaków input(); komenda teraz wykonuje długi łańcuch, który działa jak pętla, ing inny ciąg wzrostem długości, ponownie używając powtórzyć znak , a następnie zwiększany o .
execprint*'*'ii+=1

Pyton 3, 41 bajtów:
def f(n):i=1;exec("print('*'*i);i+=1;"*n) ; lub
lambda n,i=1:exec("print('*'*i);i+=1;"*n)


13

Galaretka , 6 5 bajtów

”*ẋþY

TryItOnline

W jaki sposób?

”*ẋþY - Main link: n
”*    - literal string "*"
   þ  - form outer product with the dyadic function:
  ẋ   -     repeat list (right input is an implicit range(n), Jelly defaults to 1-based)
            so the outer product is like:
            [[i*'*' for i in range(1,len("*")+1)] for x in range(1,n+1)]
    Y - join with line feeds
      - implicit print

Bounty:
Nie jestem pewien, co to jest klauzula no ordinals, ponieważ postać jest odnośnikiem porządkowym.
Bezpośrednie wyszukiwanie byłoby po prostu 42Ọẋþ³Ydla 7 bajtów - gdzie ³dostaje nas dane wejściowe)
Krótka, nieco pośrednia metoda byłaby, dla 8 bajtów , “)’Ọẋþ³Y- gdzie szukamy ')'na stronie kodowej galaretki, która jest indeksowana 1, więc “)’daje 42.


coś interesującego dzieje się, gdy użyjesz wiodącego 0 na wejściu, np. spróbuj „0414141” jako danych wejściowych. Nie znam się na golfie, więc nie wiedziałbym, od czego zacząć próbować to wyjaśnić.
Łukasz

Myślę, że jest on oceniany jako ciąg, a zatem iteruje się w poprzek, ponieważ ciąg jest iterowalny, a następnie każdy znak jest oceniany na liczbę całkowitą, ponieważ wszystkie są cyframi (na przykład błąd „hi”)
Jonathan Allan,

11

C #, 42 bajty

f=n=>n<1?"":f(n-1)+"\n"+new string('*',n);

Pełny program z przypadkiem testowym:

using System;

namespace DrawAnAsteriskPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int,string>f= null;
            f=n=>n<1?"":f(n-1)+"\n"+new string('*',n);

            Console.WriteLine(f(5));
        }
    }
}

Potrzebujesz go, ponieważ jest to funkcja rekurencyjna.
adrianmp

dobrze. Nie widziałem tego
Cyoce,


9

GNU sed , 25 24 20 + 1 (flaga n) = 21 bajtów

Edycja: 4 bajty mniej na podstawie komentarzy Riley

x;G;:;P;s:\n.:*\n:;t

Wypróbuj online!

Uruchom przykład: dane wejściowe są w formacie jednoargumentowym, który dla sed jest dozwolony na podstawie tego konsensusu

me@LCARS:/PPCG$ sed -nf draw_triangle.sed <<< "0000"

*
**
***
****

W wyjściu znajduje się wiodąca nowa linia, ale jest to dozwolone przez PO.

Wyjaśnienie:

x;G             # prepend a newline to unary string
:               # start loop
   P            # print first line only
   s:\n.:*\n:   # shift one unary char from 2nd line to 1st, converted to a '*'
t               # repeat

Jeśli Pprzegrywasz przed zmianą i dozwolone jest wprowadzenie nowej linii, nie potrzebujesz /0$/. Jeśli nowa linia nie jest dozwolona, ​​nadal możesz zapisać bajt za pomocą x;G;:;/*/P;s:\n.:*\n:;t. Zapytałem o wiodącą nową linię, ale jeszcze nie słyszałem.
Riley,

8

Matlab, 26 23 bajtów

Dobry stary Matlab ...

@(n)tril(repmat('*',n))

Ma końcowe białe spacje. trildaje niższą trójkątną matrycę.

edycja: zapisane 2 bajty dzięki Luisowi Mendo


Masz rację - dzięki - wciąż niezbyt konkurencyjny: P
matematyka

8

C ++ - 92 96 bajtów

#include<string>
int main(){int n;std::string s;scanf("%d",&n);for(;n--;)puts((s+="*").data());}

Wypróbuj online

Nie golfowany:

//this one hurts, but c++ strings are mutable
#include<string> 
int main(){
    int n;
    //this one hurts as well
    std::string s; 
    //read input to n
    //longer than 'std::cin>>n', but no #include<iostream> needed
    scanf("%d",&n); 
    // same as 'while(n--)', also characterwise, but way cooler
    for(;n--;) 
        //add a '*' the string
        //data() does the same as c_str()
        //puts automatically adds an '\n'
        puts((s+="*").data()); 
}

powinno być „int main () {}” dla +4 bajtów.

prawda, cholera - tak niestandardowe zachowanie gcc / ideone
Anedar

7

Meduza , 12 11 9 bajtów

\P$'*
  i

Wypróbuj online!

Wyjaśnienie

Powyższy program jest równoważny z następującym funkcjonalnym pseudokodem:

\            P      $       i        '*
map_prefixes(print, reshape(input(), '*'))

$(Reshape) tworzy ciąg Ngwiazdek. \Ptworzy funkcję, która pobiera listę (lub ciąg znaków) i przekazuje każdy ze swoich przedrostków do P(drukuj). Stąd, to sukcesywnie drukuje ciągi 1do Ngwiazdek.


7

R, 45 bajtów

W przypadku podejścia w pętli:

for(i in 1:scan())cat(rep("*",i),"\n",sep="")

6

Brachylog , 12 bajtów

yke:"*"rj@w\

Wypróbuj online!

Zakłada się, że nowa linia końcowa jest dopuszczalna

Wyjaśnienie

yk                The range [0, …, Input - 1]
  e               Take one element I of that range
   :"*"rj         Juxtapose "*" I times to itself
         @w       Write that string followed by a new line
           \      False: backtrack to another element of the range

Brak nowej linii, 15 bajtów

-:"*"rj:@[f~@nw

Wypróbuj online!

Ten działa, biorąc wszystkie prefiksy "*" × Input.


6

Haskell, 35 38 bajtów

Zrozumienie listy dzięki nim:

f x=unlines[[1..n]>>"*"|n<-[1..x]]

Stara wersja:

f 0=""
f n=f(n-1)++([1..n]>>"*")++"\n"

Alternatywna wersja:

g n=([1..n]>>"*")++"\n"
f n=[1..n]>>=g

Możesz użyć ([1..n]>>"*")zamiast, replicate n'*'aby zapisać bajt. Liczę też tylko 39 bajtów.
Laikoni,

Ładna alternatywna wersja! Myślę jednak, że liczba bajtów jest wciąż równa jeden i powinna wynosić 38. (Zobacz np. Tutaj ) Problemem może być nowa linia, po f 0=""której liczona jest jako jeden bajt, ale w niektórych edytorach tekstowych jest pokazywana jako dwa bajty / znaki.
Laikoni,

Dzięki! Widzę teraz, że początkowo dodawałem końcowy znak nowej linii, kiedy liczyłem znaki. Nie popełnię tego błędu ponownie!
Craig Roy

2
Możesz przełączyć się na liście ze zrozumieniem: f x=unlines[[1..n]>>"*"|n<-[1..x]].
nimi

6

Pyth, 7 bajtów

VQ*\*hN

Znalazłem bajt dzięki @ETHproductions Wypróbuj online

przy użyciu techniki @ PIetu1998

6 bajtów

j*L*\*S

Niezła odpowiedź! Można wymienić "*"z \*.
ETHproductions 10.10.16

@ETHproductions Nigdy o tym nie wiedziałem, dzięki!
Dignissimus

Możesz usunąć kolejny bajt za pomocą mapy. j*L\*S(w tym Szakres, pomnóż każdy *Lprzez „*” \*, join przez nowy wiersz) Pyth wstawia ukryte Q na końcu.
PurkkaKoodari,

jm*\*hma również 6 bajtów.
hakr14

6

2sable , 24 11 bajtów

>G')Ç>çJN×,

Wypróbuj online!

I żadnych śladów gwiazdek! Grał w golfa od 24 do 11 dzięki @Emigna .

Wyjaśnienie:

>G')Ç>çJN×,
>            Push input+1
 G           For N in range (1,input+1)
  ')Ç>çJ     Push '*' by getting ascii code for ')' and adding 1
        Nx,  Print '*' repeated N times

1
Kilka wskazówek. õVYIw żaden sposób nie wpływa na kod i można go usunąć. 1+jest taki sam jak >. Jeśli utworzysz gwiazdkę w pętli, możesz ją również usunąć UX. Użycie ×zamiast wewnętrznej pętli oszczędza jeszcze więcej bajtów. Bez zmiany metody można zmniejszyć to do 11 bajtów lub mniej.
Emigna

1
Miły! Wkrótce
dokonam

Czy możesz dodać wyjaśnienie?
Bufor

Wspaniały kod, gratuluję zdobycia nagrody! Wygląda na to, że bot społecznościowy przyznał tylko 25, a nie oryginalne 50, ponieważ zapomniałem przyznać nagrodę przed upływem terminu, przepraszam za to.
Bufor

1
Nie martw się o to. Cieszę się, że osiągnąłem 100 powtórzeń. @TheBitByte
Geno Racklin Asher

6

Brain-Flak 75 bajtów

Obejmuje +3 za -A

{(({})[()]<{({}[()]<(((((()()()){}()){})){}{})>)}{}((()()()()()){})>)}{}

Wypróbuj online!


Wyjaśnienie:

{(({})[()]<                                                        >)}
#reduce the top element by one until it is 0 after doing the following
#Push this element back on to act as a counter for the next step.
#(counts down from input to 0 we'll call this counter)

           {({}[()]<                          >)}
           #reduce the top element by one until it is 0 after doing the following
           #(counts down from counter to 0)

                    (((((()()()){}()){})){}{})  
                    #push 42 (the ASCII code for *)

                                                 {}
                                                 #pop the counter used to push
                                                 #the right number of *s

                                                   ((()()()()()){})
                                                   #push a 10 (newline)

                                                                      {}
                                                                      #pop the null byte

obejmuje to bajt zerowy w danych wyjściowych? Nie sądzę, że jest to dozwolone ...
Zniszczalna cytryna

Nie, mam na myśli bajt zerowy
Destructible Lemon

@DestructibleWatermelon Tak, chyba tak. Łatwa naprawa. Dzięki.
Riley,

6

Dyalog APL , 8 bajtów

'*'⍴⍨¨⍳

zmaterializuj listę składającą się z

'*' ciąg „*”

⍴⍨ przekształcony przez

¨ każdy z

liczby całkowite od 1 do argumentu.

Wypróbuj APL online!


Wygląda mi na 8 bajtów.
Erik the Outgolfer

1
jeśli może być pojedynczym bajtem:(,⍕⊢)⌸⍳
ngn 13.01.18

@ngn To jest bardzo sprytne! Opublikuj jako własne. Możesz rzeczywiście liczyć to jako jeden bajt, który piszesz 7 bytes<sup>SBCS</sup>.
Adám

5

V , 8 bajtów

Àé*hòlÄx

Wypróbuj online!


O tak Àé hòlÄ!
Jonathan Allan

2
@JonathanAllan Hej, przynajmniej jest bardziej czytelny niż Jelly. (Do mnie);)
DJMcMayhem

Strona kodowa Jelly jest, jak sądzę, całkiem dobrze zorganizowana. Sprawdź przegląd strony Atomy na wiki opracowanej niedawno przez Lynn.
Jonathan Allan,

3
@JonathanAllan Tak, uwierzyłbym. To może nie wyglądać tak, ale mnemoniki V są dobrze zorganizowane dzięki kluczom, których używasz do wpisywania ich w vimie. Więc moim rozwiązaniem w języku vim-key jest <M-@><M-i>*h<M-r>l<M-D>x(m oznacza meta, co oznacza alt). Wszystkie te są całkiem dobre mnemoniki do tego, co robi polecenie.
DJMcMayhem

5

JavaScript (ES6), 34 bajty

f=x=>x?f(x-1)+`
`+'*'.repeat(x):''

5

Perl 6 , 23 bajtów

{.put for [\~] '*'xx$_}

(Jeśli dane wyjściowe mogą być listą „linii” bez znaków nowej linii, .put for można je usunąć)

Wyjaśnienie:

# bare block lambda with implicit parameter 「$_」
{
  .put            # print with trailing newline
    for           # for every one of the following
      [\~]        # produce using concatenation operator
        '*' xx $_ # list repeat '*' by the input
}

(Zobacz dokumentację, producejeśli nie rozumiesz, co [\~] ...się dzieje)


5

Perl 5, 22 20 bajtów

say"*"x$_ for 1..pop

Uruchom go za pomocą -Eprzełącznika, aby uzyskać say.

$ perl -E 'say"*"x$_ for 1..pop' 5
*
**
***
****
*****

Napisany jako pełny program wyglądałby tak:

use strict;
use feature 'say';

# get the argument
my $limit = pop @ARGV;

foreach my $i (1 .. $limit) { 
    say "*" x $i; 
}

Nie jestem pewien, czy potrzebuję dodatkowych bajtów dla przełącznika wiersza poleceń.
simbabque

Uważam, że -Eflaga liczy się jako 1 dodatkowy bajt.
ETHproductions 10.10.16

Co powiesz na przyjęcie liczby jako parametru wejściowego zamiast parametru? perl -E 'say"*"x$_ for 1..<>' <<< 5
manatwork 10.10.16

@manatwork tak, to by działało. Nie jestem jednak dobry w liczeniu. Nie jestem pewien, czy to dozwolone.
simbabque 10.10.16

1
-Ejest bezpłatny (ponieważ zastępuje to, -eco i tak byłoby potrzebne). Jeśli naprawdę chcesz pobrać liczbę z wiersza poleceń (dlaczego nie, nawet jeśli <>jest 1 bajt krótszy i dozwolony), powinieneś użyć popzamiast shift(2 bajty krótszy)! W każdym razie, witamy na PPCG, cieszę się, że grasz w golfa!
Dada,

5

Perl, 19 bajtów

-4 bajty dzięki @Tonowi Hospelowi i jego przeróbce rozwiązania!

eval"s//*/;say;"x<>

Potrzebuje wolnej flagi -E(lub -M5.010) do uruchomienia. Pobiera liczbę z danych wejściowych:

perl -E 'eval"s//*/;say;"x<>' <<< "5"

1
Możesz zrobić evaltaką samą długość jak forroztwór (używając <>zamiast pop) zeval"s//*/;say;"x<>
Ton Hospel 10.10.16

@TonHospel Ineed, miło! dzięki!
Dada,

5

J, 11 8 bajtów

Zaoszczędzone 3 bajty dzięki kilometrom!

]\@#&'*'

Oto rozkład:

(]\@#&'*') x
x (]\@#) '*'
]\ (x # '*')

Teraz ten ostatni brzmi „przedrostki ( ]\) ciągu składającego się z xkopii '*'”. Przestrzegać:

   5 ]\@# '*'
*
**
***
****
*****
   ]\ 5# '*'
*
**
***
****
*****
   ]\ 5 # '*'
*
**
***
****
*****
   ]\@#&'*' 5
*
**
***
****
*****

Przypadek testowy

   f =: ]\@#&'*'
   f 3
*
**
***
   f 5
*
**
***
****
*****
   f 1
*
   f 2
*
**
   f &. > ;/1+i.10
+-+--+---+----+-----+------+-------+--------+---------+----------+
|*|* |*  |*   |*    |*     |*      |*       |*        |*         |
| |**|** |**  |**   |**    |**     |**      |**       |**        |
| |  |***|*** |***  |***   |***    |***     |***      |***       |
| |  |   |****|**** |****  |****   |****    |****     |****      |
| |  |   |    |*****|***** |*****  |*****   |*****    |*****     |
| |  |   |    |     |******|****** |******  |******   |******    |
| |  |   |    |     |      |*******|******* |*******  |*******   |
| |  |   |    |     |      |       |********|******** |********  |
| |  |   |    |     |      |       |        |*********|********* |
| |  |   |    |     |      |       |        |         |**********|
+-+--+---+----+-----+------+-------+--------+---------+----------+

Starsze, 11-bajtowe rozwiązania

'*'#~"+1+i.

To jest równoważne

'*' #~"0 1 + i.

1 + i.jest zasięgiem [1, x]. Następnie '*' #~"0zastosowano do tego zakresu kształty (element) kopii '*'.

Program bonusowy:

[:#&'*'\#&1

To jest widelec z czapką #&'*'\zastosowany do wyniku danych #&1wejściowych. #&1daje tablicę xjedynek i #&'*'\kształty '*'do prefiksów tej tablicy.

Przypadki testowe

   f1 =: '*'#~"+1+i.
   f2 =: [:#&'*'\#&1
   f1 1
*
   f2 2
*
**
   f1 3
*
**
***
   f2 4
*
**
***
****
   f2 5
*
**
***
****
*****
   f1 5
*
**
***
****
*****
   (f1;f2)3
+---+---+
|*  |*  |
|** |** |
|***|***|
+---+---+
   f1;f2
f1 ; f2
   (f1;f2)5
+-----+-----+
|*    |*    |
|**   |**   |
|***  |***  |
|**** |**** |
|*****|*****|
+-----+-----+
   (f1;f2)10
+----------+----------+
|*         |*         |
|**        |**        |
|***       |***       |
|****      |****      |
|*****     |*****     |
|******    |******    |
|*******   |*******   |
|********  |********  |
|********* |********* |
|**********|**********|
+----------+----------+

Można również uzyskać prefiksy ciągu nkopii '*'dla 8 bajtów, używając]\@#&'*'
mil

@miles: i kolejna 9-bajtowa wersja:'*'"0\@i.
Jonah

5

Vim, 22 , 18 klawiszy

O <esc>J:h r<cr>lyEZZ<C-v>{@"

Ogromne uznanie dla @Udioica za wymyślenie niesamowitej odpowiedzi vim, którą rozwinąłem. Ta odpowiedź nie zawiera gwiazdek, w nadziei na wygranie nagrody.

Wyjaśnienie:

Dane wejściowe są wpisywane przed pozostałą częścią programu. Udioica wymyślił tę niesamowitą sztuczkę. Pisanie <n>O <esc>spowoduje utworzenie piramidy spacji i jednej pustej linii, o ile :set autoindentwłączysz. Ta opcja jest domyślnie włączona w vimie 8 i neovimie, choć nie w starszych wersjach vima. Ponieważ tworzy to również dodatkową linię, używamy Jdo łączenia tej linii z następną, co skutecznie usuwa linię poniżej nas.

W tym momencie musimy zastąpić wszystkie te spacje gwiazdkami. Gdybym nie martwił się użyciem gwiazdek w kodzie, wybrałbym tylko wizualnie całą rzecz <C-v>{i typ r*, który zastępuje każdy znak zaznaczenia gwiazdką. Ale nie mogę tego zrobić.

Dlatego otwieramy strony pomocy na :h r. Interesującą rzeczą jest to, że w oknie vima ta strona jest wyświetlana jako:

                            r
r{char}         Replace the character under the cursor with {char}.
                ...

Z kursorem na pierwszym „r”. Jednak sam plik faktycznie zawiera ten tekst:

                            *r*
r{char}         Replace the character under the cursor with {char}.
                ...

Całkiem wygodne. Poruszamy się więc nad jednym znakiem li szarpamy tekst za r*pomocą yE([y] ank do [E] tego słowa).

Aby zamknąć ten bufor, używamy skrótu do zapisania pliku ZZ. Teraz wybieramy wizualnie nasze spacje i uruchamiamy szarpany tekst tak, jakbyśmy to zrobili @". Działa to, ponieważ „@” uruchamia następujący rejestr jako naciśnięcia klawiszy vim, a „jest domyślnym rejestrem dla szarpania.


Chcesz wyjaśnić, jak to działa?
corvus_192

@ corvus_192 Dodałem szersze wyjaśnienie, a także trochę więcej golfa.
DJMcMayhem

Czy wielkość pliku danych nie powinna być dodawana do liczby bajtów?
aross

@aross rozmiar pliku pomocy? Nie, ponieważ ten plik jest instalowany wraz z vimem i jest funkcją domyślną.
DJMcMayhem

5

C, 47 46 45 43 bajtów

Pobiera dane z wiersza poleceń

f(n){for(n&&f(n-1);~n;putchar(n--?42:10));}

Zasadniczo, jeśli n nie jest równe 0, powtórz na n-1. u góry rekurencji, gdzie n wynosi 0, po prostu wypisuje nową linię, pętla for kończy się, gdy n wynosi -1 lub ~ n wynosi zero, w przeciwnym razie wypisuje ASCII 42, który jest „*”. Wypróbuj na ideone

C ++ 58 bajtów + 19 za włączenie iostream jest 77

#include<iostream>
int f(int n){for(n&&f(n-1);~n;std::cout<<(n--?"*":"\n"));}

main(c,v)char**v;
{
    f(atoi(v[1]));
}

a.exe 3
*
**
***

Wydaje mi się, że współpracuję z &&: n?f(n-1):0n&&f(n-1).
manatwork 11.10.16

@manatwork Thanks bud. zapisywanie kolejnego bajtu
cleblanc

W ideone nadruk 2 trójkątów na końcu jest jeszcze jeden „\ n”: * ** *** * ** *** **** ***** Mówię przypadek 0 koniec przypadku zwrot, wydrukuj \ n więcej
RosLuP

@RosLup Tak, drukuje wiodący i końcowy znak nowej linii. Myślę, że OP stwierdził, że było to w porządku w jego komentarzach.
cleblanc

4

Siatkówka , 14 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1.

.+
$**
.
$`$&¶

Wypróbuj online!

Wyjaśnienie

.+
$**

Zmień dane wejściowe Nw Ngwiazdki.

.
$`$&¶

Zamień każdą gwiazdkę na wszystko, włącznie z tą gwiazdką (to jest $`$&) i linefeed (to the ).



4

Cubix , 22 bajty

?(.;I:^;/-.@o;(!\>'*oN

Przetestuj online! Generuje końcowy znak nowej linii.

Na początku nie byłem pewien, czy uda mi się dopasować to do 2-sześcianu, ale ostatecznie wszystko poszło dobrze:

    ? (
    . ;
I : ^ ; / - . @
o ; ( ! \ > ' *
    o N
    . .

Dodam wyjaśnienie, kiedy będę miał czas, mam nadzieję, że dzisiaj.


Wyjaśnienie w najbliższym czasie? : P
FlipTack
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.