Bardzo proste trójkąty

47

Napisz program lub funkcję, która przyjmuje dodatnią liczbę całkowitą (za pomocą stdin, wiersza poleceń lub funkcji arg) i wypisuje lub zwraca ciąg wielu z tych małych trójkątów połączonych ze sobą, naprzemiennie w taki sposób, w jaki wskazują:

 /\
/__\

Ten jedyny trójkąt jest wyjściem, jeśli wejście jest 1.

Jeśli wejście jest 2, wyjście jest

  ____
 /\  /
/__\/

Jeśli wejście jest 3, wyjście jest

  ____
 /\  /\
/__\/__\

Jeśli wejście jest 4, wyjście jest

  ________
 /\  /\  /
/__\/__\/

I tak dalej. Twój program musi obsługiwać wejścia do 2 16 - 1 = 65535.

Detale

  • Najbardziej wysunięty w lewo trójkąt zawsze wskazuje w górę.
  • Mogą występować spacje końcowe, ale może nie być niepotrzebnych spacji wiodących.
  • Może występować opcjonalny znak nowej linii.
  • Zauważ, że na 1wyjściu są dwa wiersze, ale w przeciwnym razie trzy. To jest wymagane.
  • Najkrótsze przesłanie w bajtach wygrywa.
Hobby Calvina
źródło

Odpowiedzi:

32

Pyth, 44 42

ItQpdd*\_*4/Q2)jbms<*dQhQ,c" /\ "2,\/"__\\

Pierwsza linia:

ItQpdd*\_*4/Q2)
ItQ           )    If the input is not 1
   pdd             Print two spaces
      *\_*4/Q2     Then groups of 4 underscores, repeated input/2 times.

Te dwie linie są generowane przez zauważyć, że druga linia obejmuje " /"i "\ "naprzemiennie wejściu + 1 razy, a trzecia linia składa się z "/"i "__\"naprzemiennie w taki sam sposób.

isaacg
źródło
158
skreślony 44 jest nadal normalny 44 :(
Optimizer
4
42 . Oczywiście!
mbomb007
48
@Optimizer: Uważam za nieskończenie zabawne, że twój smutek z powodu pojawienia się 44 otrzymał więcej głosów niż pytanie lub odpowiedź.
Alex A.
6
Właśnie dostałem 10 odpowiedzi głęboko w przekreślonym łańcuchu 44
Leo
3
@AlexA. Uważam to za nieskończenie zabawne, że twoje rozbawienie smutkiem Optimizera z powodu pojawienia się 44 osób uzyskało więcej głosów niż pytanie lub odpowiedź.
isaacg
24

SQL, 182 175 173 187 bajtów

Nie, żeby to kiedykolwiek było najkrótsze, ale nadal zabawnie jest próbować zminimalizować sql;) lol Zrobiłem to w Oracle 11, jednak powinny to być podstawowe SQL. [edytuj], jak wskazano, nie zastosowałem reguły when input = 1 - pokaż tylko 2 linie. nie mogę wymyślić lepszego sposobu, aby to zrobić, jednak zaoszczędziłem kilka bajtów, modyfikując logikę v;) dodanie 2 z wyprzedzeniem pozwala zaoszczędzić kilka bajtów, ponieważ nie muszę powtarzać tego później [/ edit]

select decode(&i,1,'',rpad('  ',v,'____')||z)||rpad(' /',v,'\  /')||decode(y,1,'\')||z||rpad('/',v-1,'__\/')||decode(y,1,'__\')from(select 2+floor(&i/2)*4v,mod(&i,2)y,chr(10)z from dual);

[edit1] usunął niepotrzebne spacje [/ edit1] [edit2] zmienił && i na just & i. Zmniejsza 2 znaki, ale zmusza użytkownika do dwukrotnego wprowadzenia # trójkątów ...: PI zdał sobie sprawę, że moje „dobre nawyki kodowania” przy użyciu && i kosztowały 2 bajty !! Horror!! [/ edit2]

Objaśnienie (uwaga: używam && 1 w tym objaśnieniu, więc pyta tylko raz, powyższy & 1 oszczędza miejsce na kod, ale pyta wiele razy;))

 select  -- line 1
     decode(&&1,1,'',   -- don't need line 1 if input is 1
     rpad('  ',v,'____') || z ) || -- every pair of triangles
     -- line 2
     rpad(' /',v,'\  /') ||  -- every pair of triangles
          decode(y,1,'\') || z || -- add the final triangle, input: 1,3,5 etc.
     -- line 3
     rpad('/',v-1,'__\/') ||  -- every pair of triangles
          decode(y,1,'__\')   -- add the final triangle, input: 1,3,5 etc.
from (select 2+floor(&&i/2)*4 v,   -- common multiplier. 4 extra chars for every triangle pair
             mod(&&i,2) y,  -- Flag for the final triangle (odd inputs, 1,3,5, etc)
             chr(10) z  -- CR, here to save space.
        from dual);

Wynik

  SQL> accept i
  1
  SQL> /

   /\
  /__\


  SQL> accept i
  2
  SQL> /

    ____
   /\  /
  /__\/


  SQL> accept i
  3
  SQL> /

    ____
   /\  /\
  /__\/__\


  SQL> accept i
  12
  SQL> /

    ________________________
   /\  /\  /\  /\  /\  /\  /
  /__\/__\/__\/__\/__\/__\/


  SQL>
Tak samo
źródło
1
Czy zadziałałoby usunięcie przestrzeni później from? Jeśli tak, uratuje ci to bajt.
Alex A.,
o dobry Boże ... to szalone. po prostu spróbowałem… a potem „poszedłem do miasta” rozbijałem jakie przestrzenie mogłem ... Oo Ten frajer jest teraz nieczytelny .. ale nadal działa;) lol (NIE mogę uwierzyć, że aliasy nadal tak działają .. Oo hehe )
Ditto,
Tak bardzo jestem zdezorientowany głosami! Oo, to nigdzie w pobliżu najmniejszego rozmiaru ... jeszcze ... entuzjastów! O wow.
Ditto
2
Upvotes zwykle oznaczają, że Twoje zgłoszenie się podoba, ponieważ jest kreatywne, użyty język jest rzadki lub z wielu różnych powodów. Z mojego doświadczenia wynika, że ​​najkrótsza odpowiedź na kod golfowy jest również najwyżej oceniana. Chociaż może to nie być najkrótsza odpowiedź, społeczność uznała ją za dobrą. :)
Alex A.
@Alex .. fajnie, sos :) (Będę musiał spróbować tego w Excelu dalej ... lol)
Ditto
11

Python 2, 89 88 87 85 83 o nazwie / 81 bez nazwy

f=lambda n:1%n*("  "+n/2*4*"_"+"\n")+(" /\ "*n)[:2+2*n]+"\n"+("/__\\"*n)[:n-~n+n%2]

(Dzięki @orlp za bajt i @xnor za kolejne trzy)

Jest to funkcja, która przyjmuje wartość int ni zwraca trójkąty jako ciąg znaków, stosując podejście rząd po rzędzie.

np. print f(10)daje

  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

W pierwszym rzędzie zamiast (n>1)*używamy 1%n*, ponieważ 1%nwynosi 0 if n == 1i 1 if n > 1.

Sp3000
źródło
1
Możesz ogolić postać, zamieniając się " /\\ "w " /\ ".
orlp
Czy ta lambda nie działa również w Pythonie 3?
mbomb007
2
@ mbomb007 Jest tam podział podłogi
Sp3000
@orlp Pozwólcie mi teraz dodać jeszcze więcej zamieszania, ale
usuwam
Jestem podejrzliwy w stosunku "\n".join()do 3 elementów, nawet jeśli lista służy do warunkowego usunięcia pierwszego elementu. Być może coś takiego b*(x+"\n")+y+"\n"+zjest krótsze?
xnor
7

JavaScript (ES6), 101 109

Zbyt długo

f=(n,z=a=>a.repeat(n/2))=>(n>1?'  '+z('____')+'\n ':' ')+z('/\\  ',w=' /'[++n&1]+'\n')+w+z('/__\\')+w

Wyjaśnienie

Używanie grubej strzałki do definicji funkcji. Ponadto brak {}bloku: ciało funkcji jest pojedynczym wyrażeniem, które jest wartością zwracaną. f=(a,b,c)=>exprjest równa

function f(a,b,c)
{
  return expr;
}

Wewnątrz jednego wyrażenia nie można używać instrukcji takich jak iflub var, ale

  • parametry o wartościach domyślnych mogą być używane jako zmienne lokalne
  • wyrażenia warunkowe ?:działają dobrze zamiastif else
  • możesz dodać więcej podwyrażeń za pomocą operatora przecinków lub nawet lepiej jako nieużywany parametr do funkcji. W tym przypadku przypisanie wjest drugim (nieużywanym) parametrem funkcjiz

Możemy przepisać ffunkcję jako

f = function(n) {
  var z = function(a) { // use current value of n (that changes)
    return a.repeat(n/2);
  };
  var result;
  if (n > 1) {
    result = '  ' + z('____') + '\n '; // top row if more than 1 triangle
  else
    result = ' '; // else just the blank
  ++n; // increase n, so invert even/odd
  w = ' /'[n&1]+'\n'; //  blank if n is now even, else '/' if n is now odd
  // the next rows will end in "/\" or "\  /" based on n even/odd
  result +=  z('/\\  ') + w; // offset by the blank char added before
  result += z('/__\\') + w;
  return result;
}

Test w konsoli Firefox / FireBug

console.log(f(1),f(2),f(3),f(4),f(9))

Wynik

 /\   
/__\ 

  ____
 /\  /
/__\/

  ____
 /\  /\   
/__\/__\ 

  ________
 /\  /\  /
/__\/__\/

  ________________
 /\  /\  /\  /\  /\   
/__\/__\/__\/__\/__\ 
edc65
źródło
Ładnie wykonane! Wczoraj spędziłem zdecydowanie za dużo czasu, szukając skrócenia, a co najwyżej udało mi się odtworzyć 109 na różne sposoby. -8 to niezły skok.
DocMax,
Chłodny. Czy możesz opublikować wyjaśnienie? Nie do końca rozumiem użyciew
BadHorsie
Dodano wyjaśnienie @BadHorse (naprawdę, tym razem)
edc65
Zainteresowany próbowałem to zrobić bez spacji końcowych i wymyśliłem n=>(n>1?' '+'____'.repeat(n/2)+'\n':'')+' /\\ '.repeat(n).slice(0,n*2+2-n%2)+'\n'+'/__\\'.repeat(n).slice(0,n*2+1+n%2)119 (celowo nie używając ciągów szablonów itp., Aby dopasować odpowiedź).
Neil
6

Haskell 155 153 139 131 bajtów

Znalazłem nieco inne podejście, które okazało się krótsze niż moja pierwotna metoda. Moja oryginalna próba została zachowana poniżej. Tak jak poprzednio, wskazówki dotyczące gry w golfa są mile widziane.

m n=unlines.dropWhile(=="  ").z["  "," /","/"].foldr1 z$map t[1..n]
t n|odd n=["","\\","__\\"]
t _=["____","  /","/"]
z=zipWith(++)

Dzięki Nimi za wskazówki dotyczące gry w golfa.


Poprzednia próba 197 179 bajtów

t n=putStr.unlines.dropWhile(all(==' ')).z(flip(++))(if odd n then["","\\","__\\"]else repeat"").z(++)["  "," /","/"].map(take(4*div n 2).cycle)$["____","\\  /","__\\/"]
z=zipWith
ankh-morpork
źródło
4
Kilka wskazówek dotyczących gry w golfa: (mod n 2)==0jest even nlub lepiej użyć odd ni zamienić część theni else. concat.take(div n 2).repeatto take(4*div n 2).cycledlatego, że wszystkie elementy listy mają długość 4. Przypisz krótkie nazwy do funkcji o długich nazwach, np. z=zipWith- następnie użyj z. Możesz wykopać kilka pól ...repeat""else[....
nimi
@nimi Dziękujemy za podpowiedzi! Korzystając z nich, udało mi się zagrać w golfa w moim oryginalnym rozwiązaniu do 179 bajtów. Po ponownym przemyśleniu mojego podejścia udało mi się również zmniejszyć moje rozwiązanie do 155 bajtów.
ankh-morpork
1
Wskazówki, część II: foldr z["","",""]jest foldr1 z, ponieważ lista do złożenia nigdy nie jest pusta. Zamiast tego all(==' ') możesz użyć ==" "(<- dwie spacje między nimi), ponieważ służy on do usuwania pustej linii w przypadku n = 1, a tutaj jest pierwsza linia " ". Pierwsza definicja tmoże być napisany w jednym wierszu: t n|odd....
nimi
4

CJam, 73 68 63 62 60 bajtów

To zdecydowanie wymaga gry w golfa ...

S2*l~:I2/'_4**N]I(g*S"\\  /"'\{I2md@*@@*'/\@}:F~N"__\\/"_W<F

Sprawdź to tutaj.

Wyjaśnienie

"Print the first line:";
S2*l~:I2/'_4**N]I(g*

S2*                  "Push a string with 2 spaces.";
   l~:I              "Read and eval the input, store it in I.";
       2/            "Divide by two to get the number of top segments.";
         '_4**       "Push '____' and repeat it by the number of segments.";
              N]     "Push a newline and wrap everything in an array.";
                I(g* "Get sign(I-1) and repeat the array that often. This is a no-op
                      for I > 1 but otherwise empties the array.";

"Print the other two lines. The basic idea is to define block which takes as arguments
 a repeatable 4-character string as well as another string which only gets printed for
 even I.";
S"\\  /"'\{I2md@*@@*'/\@}:F~N"__\\/"_W<F

S                                        "Push a space.";
 "\\__/"'\                               "Push the string '\__/' and the character \.";
          {             }:F~             "Store this block in F and evaluate it.";
           I2md                          "Get I/2 and I%2 using divmod.";
               @*                        "Pull up the second argument and repeat it I%2
                                          times. This turns it into an empty string for
                                          even I.";
                 @@                      "Pull up I/2 and the 4-character string.";
                   *                     "Repeat the string I/2 times.";
                    '/\@                 "Push a / and reorder the three line parts.";
                            N            "Push a newline.";
                             "__\\/"_W<F "Call F again, with '__\/' and '__\'.";
Martin Ender
źródło
4

Julia, 115 bajtów

n->(m=2;p=println;k=n%2>0?m+1:m;e=m<k?"":"/";t=" /\\ ";b="/__\\";if n>1 p("  "*"_"^4m)end;p(t^k*" "*e);p(b^k*e))

Tworzy to nienazwaną funkcję, która akceptuje liczbę całkowitą i drukuje trójkąty. Aby to nazwać, nadaj mu nazwę, np f=n->(...).

Niegolfowane + wyjaśnienie:

function f(n)

    m = n ÷ 2                    # Number of upside down triangles
    p = println                  # Store println function to save space
    k = n % 2 > 0 ? m + 1 : m    # Number of right side up triangles
    e = m < k ? "" : "/"         # n even? End lines with a /

    # Top of the triangle
    t = " /\\ "

    # Bottom of the triangle
    b = "/__\\"

    # Print the bottoms of any upside down triangles
    # * performs string concatenation
    # ^ performs string repetition
    if n > 1
        println("  " * "_"^4m)
    end

    # Print the triangle tops (these have two trailing spaces
    # if the last triangle isn't upside down)
    println(t^k * " " * e)

    # Print the triangle bottoms
    println(b^k * e)
end

Przykładowe dane wyjściowe:

julia> for i = 1:10 f(i) end
 /\  
/__\
  ____
 /\  /
/__\/
  ____
 /\  /\  
/__\/__\
  ________
 /\  /\  /
/__\/__\/
  ________
 /\  /\  /\  
/__\/__\/__\
  ____________
 /\  /\  /\  /
/__\/__\/__\/
  ____________
 /\  /\  /\  /\  
/__\/__\/__\/__\
  ________________
 /\  /\  /\  /\  /
/__\/__\/__\/__\/
  ________________
 /\  /\  /\  /\  /\  
/__\/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Jestem dość zaskoczony, że to tak długo. Jestem pewien, że istnieje wiele możliwości gry w golfa, ale w tej chwili nie są dla mnie jasne. Daj mi znać, jeśli masz jakieś sugestie lub dodatkowe wyjaśnienia!

Alex A.
źródło
3

CJam, 68 62 60 bajtów

O ile widzę, jest to zupełnie inne podejście niż inne rozwiązanie CJam. Można w to dużo grać w golfa.

"/__\\ /\\"4/]ri:R(['/"  /"'_4*"__\\"'\L]3/R*<+zR1>SS+*\W%N*

Wypróbuj online tutaj

Optymalizator
źródło
3

C # 190

void f(int n){string s=(n>1)?"\n  ":"",t=" /",u = "/";bool b=true;int m=n;while(m-->0){s+=(n>1&&b&&m>0)?"____":"";t+=b?"\\":"  /";u+=b?"__\\":"/";b=!b;}Console.Write("{0}\n{1}\n{2}",s,t,u);}

Bez golfa

void f(int n)
{
string s = (n > 1) ? "\n  " : "", t = " /", u = "/";
bool b = true;
int m = n;
while(m-->0)
{
s += (n > 1 && b && m>0) ? "____" : "";
t += b ? "\\" : "  /";
u += b ? "__\\" : "/";
b = !b;
}
Console.Write("{0}\n{1}\n{2}",s,t,u);
}
Bacchusbeale
źródło
1
Dobra robota! Zauważ, że nigdy nie lepiej używać whilepętli, a raczej forpętli. W takim przypadku możesz zaoszczędzić 2 bajty, włączając definicję mw inicjalizacji pętli for, a b=!bna końcu, jak to się nazywa. Można również dokonać oszczędności przez zastąpienie stringi boolz var. Nie potrzebujesz także „()” wokół n>1klauzul, a w s+=klauzuli możesz użyć zwarcia, &a nie &&ponieważ nie ma żadnych skutków ubocznych lub dereferencji, które mogłyby się nie udać. Wreszcie 1>0jest krótszy niż true;)
VisualMelon
3

C #, 257 183 bajtów

void C(int t){int i;var n="\r\n";var s="  "+string.Join("____",new string[1+t/2])+n;for(i=0;i++<=t;)s+=i%2<1?"\\ ":" /";s+=n;for(i=0;i++<=t;)s+=i%2<1?"__\\":"/";Console.WriteLine(s);}

Edycja: Dzięki wskazówkom @VisualMelon zapisano 74 bajty.

Wiem, że nie jest to najlepszy język do gry w golfa, ale najbardziej interesuje mnie nauka o różnych niuansach C #, niż wygrywanie zawodów. Jest to w zasadzie port tej odpowiedzi w języku Pyth.

Myślę, że pętle for można by dalej grać w golfa, ale nie jestem do końca pewien, jak, biorąc pod uwagę zawarte w nich trzeciorzędowe stwierdzenia.

Przykład (1, 2, 3, 10):

 /\   
/__\  
  ____
 /\  /
/__\/
  ____
 /\  /\ 
/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Nie golfowany:

void C2(int t)
{
    int i;
    var n="\r\n";
    var s="  "+string.Join("____",new string[1+t/2])+n;
    for(i=0;i++<=t;)
        s+=i%2<1?"\\ ":" /";
    s+=n;
    for(i=0;i++<=t;)
        s+=i%2<1?"__\\":"/";
    Console.WriteLine(s);
}
Trent
źródło
Chociaż StringBuilders są szybkie i piękne, jeśli chcesz mieć niską liczbę bajtów, s+=jest twoim przyjacielem. Rzeczywiście, jesteś za pętle mogą być nieco bardziej kompaktowe. Radość / horror operatorów ++i --oznaczają, że możesz wykonać większość pracy w ramach kontroli warunkowej for(i=0;i++<=t;)(to sprawdza, czy ijest mniejsza lub równa, t a następnie ją zwiększa). Dobrze byłoby zdefiniować int izewnętrzną pętlę for i użyć jej ponownie, a ponieważ możesz zagwarantować, że inigdy nie będzie ona ujemna, i%2==0możesz ją zamienić i%2<1. Dzięki tym zmianom można łatwo uzyskać wynik poniżej 200 bajtów.
VisualMelon
1
Podejrzewam również, że napisałeś to w LINQPadzie lub podobnym, ponieważ dostęp do Enumerablezwykle wymaga using System.Linqdyrektywy i myślę, że generalnie zamierzone jest włączenie takich klauzul. Jednak w tym przypadku jedyny LINQ można zastąpić, var s=" "+string.Join("____",new string[1+t/2])+n;który nie zawiera LINQ i jest krótszy niż obecny kod;) Łączy wiele ciągów zerowych z tym, na czym nam naprawdę zależy, „____” (1 + t / 2 ponieważ potrzebujemy kolejnego łańcucha zerowego, aby pasował do innego „____” wcześniej). Zmienna njest zadeklarowana jako „\ r \ n”.
VisualMelon
Świetne wskazówki! Zapomniałem, że Enumerable będzie potrzebował System.Linq, w dzisiejszych czasach ledwo zwracam uwagę. Poręczna końcówka pętli jest przydatna!
Trent
Trochę późno, ale możesz zaoszczędzić 4 bajty, używając Console.WritezamiastConsole.WriteLine
Metoniem
2

Java, 185

String f(int n){int i;String s="";if(n>1){s="  ";for(i=0;i<n/2;i++)s+="____";s+='\n';}for(i=0;i<=n;)s+=i++%2<1?" /":"\\ ";s+='\n';for(i=0;i<=n;i++)s+=i%2<1?i<n?"/_":"/":"_\\";return s;}

Wyjaśnienie

String f(int n) {
    int i;
    String s = "";
    if (n > 1) {
        s = "  ";
        for (i = 0; i < n / 2; i++) {
            s += "____";
        }
        s += '\n';
    }
    for (i = 0; i <= n; i++) {
        s += i % 2 < 1 ? " /" : "\\ ";
    }
    s += '\n';
    for (i = 0; i <= n; i++) {
        s += i % 2 < 1 ? i < n ? "/_" : "/" : "_\\";
    }
    return s;
}
Ypnypn
źródło
2

C # - 151 146 141 138

Zainspirowany odpowiedzią @ bacchusbeale

string f(int n){string t="\n",s=n>1?"  "+new string('_',n/2*4)+t:"";for(var b=n<0;n-->=0;t+=b?"__\\":"/",b=!b)s+=b?"\\ ":" /";return s+t;}

Bez golfa

    string f(int n)
    {
        string t = "\n", s = n > 1 ? "  " + new string('_', n / 2 * 4) + t : "";
        for (var b = n < 0; n-- >= 0; t += b ? "__\\" : "/", b = !b)
            s += b ? "\\ " : " /";
        return s + t;
    }
tia
źródło
1
Fajnie, nie jestem pewien, jak to przegapiłem, zanim skomentowałem inne odpowiedzi! To przeciążenie new Stringjest dla mnie nowe! Wygląda na to, że przegapiłeś swoją t=""wersję z golfem, choć lepiej byłoby zainicjować ją tjako „\ n”. Można zaoszczędzić kilka bajtów przez dołączenie do tktórej klapki b, oszczędzając „{}” na pętli for: t+=(b=!b)?"/":"__\\".
VisualMelon
1
@tis można zaoszczędzić kilka więcej, jeśli można zdefiniować tprzed si dodać tdo łańcucha zamiast "\n";)
VisualMelon
1

Iść, 156 144

func f(n int){a,b,c:="  ","","";for i:=0;i<=n;i++{if i<n/2{a+="____"};if i%2<1{b+=" /";c+="/"}else{b+=`\ `;c+=`__\`}};print(a+"\n"+b+"\n"+c)}

Nie golfowany:

func f(n int) {
    a, b, c := "  ", "", ""   // Initialize 3 accumulators
    for i := 0; i <= n; i++ { // For each required triangle
        if i < n/2 {          // Yay integer math
            a += "____"
        }
        if i%2 < 1 {          // Even, uneven, (are we drawing up or downslope?)
            b += " /"
            c += "/"
        } else {
            b += `\ `
            c += `__\`
        }
    }
    print(a + "\n" + b + "\n" + c)
}

Jedyną prawdziwą sztuczką (i wcale nie jest dobrą) jest użycie 3 akumulatorów, dzięki czemu mogę skondensować rozwiązanie do 1 pętli.

Kod można uruchomić tutaj: http://play.golang.org/p/urEO1kIjKv

Kristoffer Sall-Storgaard
źródło
po prostu użyj c += `__\` zamiastif i<n{c+="_"}
MarcDefiant
@MarcDefiant Zaktualizowano, dzięki
Kristoffer Sall-Storgaard,
1

> <> (Ryby) , 215 183 156 bajtów

Edycja: Notepad ++ dał mi 5 dodatkowych bajtów z powodu CR, więc zmodyfikowane liczniki odpowiednio

Nieco bardziej golfowy, ale to jak dotąd mój pierwszy program rybny> _ <Wymóg, aby nie mieć pustej pierwszej linii dla 1 trójkąta, podwoił rozmiar programu.

99+0{:}1=?.~~"  "oo:2,:1%-v
-1  oooo  "____"  v!?  )0:/!
" /"oa~~.?=1}:{24~/:oo
v!?)0:-1o"\"v!?)0:/!-1ooo"  /"
/v   ~o"/"oa/!
!\:0)?!;"\__"ooo1-:0)?!;"/"o1-

Może przetestować na http://fishlanguage.com/ (Int na początkowym stosie dla długości)

Wyjaśnienie:

       Start with initial stack as input number
99+0   Push 18 and 0 to the top of the stack
{:}    Shift the stack to the left (wraps), copy the top value, and shift it back to the left (i.e. copy bottom of stack to the top)
1=     Check to see if the top of the stack is equal to 1, pushes 1 for true, 0 for false
?.     If top of stack is zero, skip the ., otherwise jumps to x,y coordinates on top of stack (18,0). This skips the next 8 instructions
~~     Pop the top 2 values from the stack (if they're not popped by the jump)
"  "   Push the string literal "  " onto the stack
oo     Pop the top two values of stack and output them as characters
:2,    Copy top value of stack, ad divide by 2
:1%-   Since ><> uses float division, and doesn't have >= notation, remove the decimal part (if exists)
v      Redirect pointer down
/      Redirect pointer left
:0)    Copy top of stack, and see if its greater than 0 (1 for true, 0 for false)
?!v    If top of stack is non-zero, then ! is executed, which skips the next instruction (redirect), otherwise, code is redirected
"____" Push the literal "____" to the stack
oooo   Pop the top four values of stack and output them as characters
1-     Decrement the top of the stack by 1
!/     Ignore the redirect action.
       When the loop gets to 0, it goes to next line, and gets redirected to the left.
~      Pops the top of the stack (0 counter)
42     Pushes 4 and 2 to the stack
{:}    As before, copies the bottom of the stack to the top
1=?.   Also as before, if the initial value is 1, jump to (2,4) (skipping next 4 instructions
~~     Pop 2 values from stack if these instructions haven't been skipped
ao     Push 10 onto the stack and output it as a character (LF)
"/ "oo Push the literal "/ " onto the stack and output it
://    Copies the top of the stack then redirects to the line below, which then redirects to the left
:0)    Copies top of the stack and compares if its greater than 0
?!v    If it is, redirect to next line
"\"o   Push "\" to stack, then output it as a character
1-     Decrement top value of stack
:0)?!v If loop is not greater than 0, redirect to next line
       Either mode of redirect will loop to the left, and (potentially) skip the far right redirect because of the !
ao     Push 10 to stack and output it as a character (LF)
"/"o~  Push "/" to stack, then output it as a character. Pop top value of stack (the 0 from previous loop)
v      Redirects to next line, which then redirects to the right
:0)?!; If the top of the stack is not greater than 0, terminate (;)
"\__"  Pushes "\__" to the stack
ooo    Outputs top 3 stack values as characters ("__\")
1-     Decrement top of stack by 1
:0)?!; If the top of the stack is not greater than 0, terminate (;)
"/"o   Push "/" to top of stack then output it as a character
1-     Decrement top of stack by 1
!\     Ignore the redirect
Fongoid
źródło
1
Niezły tłumacz! Zrobiłeś to sam?
Sp3000,
Ani trochę. : PI intensywnie go używał, by uczyć się języka ... i debugować. Właśnie zobaczyłem, jak język się unosi i pomyślałem, że jest bardzo interesujący (chcę także wypróbować Marbles).
Fongoid
1

perl 109 108 106

$i=<>;$t=join$/,$i-1?"  "."_"x($i/2)x4:(),$m.=(" /")[$_&1]||"\\ ",$b.=("/")[$_&1]||"__\\"for 0..$i;print$t

Myślę, że to jest w porządku dla mojego pierwszego golfa, użyłem sekcji Vynce dla pierwszej linii, z resztą mojego kodu, aby ominąć nowy problem z 1 trójkątem.

Teraz sprawdź, czy uda mi się to skrócić :)

Edycja : białe znaki

Edycja 2 : zastąpiona "\n"przez$/

1:
 /\
/__\

4:
  ________
 /\  /\  /
/__\/__\/
Caek
źródło
1

C89, 150

r(p,q,n)int*p,*q;{n?printf(p),r(q,p,n-1):puts(p);}main(c,v)int**v;{c=atoi(v[1]);if(c>1)printf("  "),r("","____",c-1);r(" /","\\ ",c);r("/","__\\",c);}

Wersja bez golfa:

r(p, q, n) char *p, *q; {
    if(n > 0) {
        printf(p);
        r(q, p, n-1); /* swap p and q */
    } else {
        puts(p);
    }
}

main(c, v) char**v; {
    c = atoi(v[1]);
    if(c>1) {
        printf("  ");
        r("", "____", c - 1);
    }
    r(" /", "\\ ", c);
    r("/", "__\\", c);
}

Wyjście:

$ seq 1 3 10 | xargs -n1 ./triangles
 /\
/__\
  ________
 /\  /\  /
/__\/__\/
  ____________
 /\  /\  /\  /\
/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Stos przepełnia się, jeśli wejdę 65535(ale nie jeśli się kompilujesz -O3!), Ale teoretycznie powinien działać ;-)

edit: program spełnia teraz wymaganie, aby wyprowadzić tylko dwa wiersze, jeśli 1zostanie przekazany do programu edit 2: użyj int*zamiastchar*

MarcDefiant
źródło
Można zadeklarować mainjako main(c,v)**v;czy zadziała.
FUZxxl
Zastanawiałem się, czy można zapisać coś o konieczności club njako zmienną globalną, dzięki czemu nie trzeba przechodzić ten parametr r(). Nie wydaje mi się, żeby twoja odpowiedź była zgodnaNote that for 1 the output is two lines long but otherwise it's three. This is required.
Level River St
@FUZxxl niestety to nie działa :-(error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
MarcDefiant
@steveverrill naprawił to, ale musiałem wydłużyć kod. Nie można znaleźć rozwiązania globalnego nlub cteż krótszego.
MarcDefiant,
@MarcDefiant Czy zdałeś egzamin int**?
FUZxxl,
1

C ++ stdlib, 194 bajty

string f(int n){char* p[]={"____"," /\\ ","/__\\"};int x[]={(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},i,j;string s=n>1?"  ":"";for (i=n>1?0:1;i<3;s+=++i<3?"\n":"")for (j=0;j<x[i];)s+=p[i][j++%4];return s;}

Program testowy:

#include <string>
#include <iostream>

using namespace std;

string f(int n)
{
    char* p[]={"____"," /\\ ","/__\\"};
    int x[]={(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},i,j;
    string s=n>1?"  ":"";
    for (i=n>1?0:1;i<3;s+=++i<3?"\n":"")
        for (j=0;j<x[i];)
            s+=p[i][j++%4];
    return s;
}

int main(int argc, char* argv[])
{
    cout << f(10);
    return 0;
}
Oleg
źródło
1

Bash, 166 127 125 119 105 bajtów

printf -v l %$[$1/2]s;(($1%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r

W funkcji:

triangle() {
    printf -v l %$[$1/2]s;(($1%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r
}

Z niektórymi prezentacjami:

for i in {1..5} 10 31;do
    paste -d\  <(
        figlet -fsmall $i |
             sed 's/^/         /;s/^ *\(.\{10\}\)$/\1  /;$d'
    ) <(triangle $i)
  done

Może renderować (jeśli masz zainstalowany figlet ):

        _      
       / |    /\  
       | |   /__\
       |_|   
      ___      ____
     |_  )    /\  /
      / /    /__\/
     /___|   
      ____     ____
     |__ /    /\  /\  
      |_ \   /__\/__\
     |___/   
     _ _       ________
    | | |     /\  /\  /
    |_  _|   /__\/__\/
      |_|    
      ___      ________
     | __|    /\  /\  /\  
     |__ \   /__\/__\/__\
     |___/   
   _  __       ____________________
  / |/  \     /\  /\  /\  /\  /\  /
  | | () |   /__\/__\/__\/__\/__\/
  |_|\__/    
    _____      ____________________________________________________________
   |__ / |    /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |   /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|   

Zapisz 2 znaki, jeśli wprowadzasz zmienną zamiast $1: 103

printf -v l %$[i/2]s;((i%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r

W pętlę:

for i in {1..3} {31..34};do
    [ $i == 31 ] && figlet -fsmall ...
    paste -d\  <(
        figlet -fsmall $i |
            sed 's/^/         /;s/^ *\(.\{10\}\)$/\1   /;$d'
    ) <(
        printf -v l %$[i/2]s;((i%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r
    )
  done

Czyni (w przybliżeniu) to samo:

        _       
       / |     /\  
       | |    /__\
       |_|    
      ___       ____
     |_  )     /\  /
      / /     /__\/
     /___|    
      ____      ____
     |__ /     /\  /\  
      |_ \    /__\/__\
     |___/    


 _ _ _ 
(_|_|_)

    _____       ____________________________________________________________
   |__ / |     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|    
  _______       ________________________________________________________________
 |__ /_  )     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
  |_ \/ /     /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
 |___/___|    
  ________      ________________________________________________________________
 |__ /__ /     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
  |_ \|_ \    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
 |___/___/    
 _____ _        ____________________________________________________________________
|__ / | |      /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
 |_ \_  _|    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
|___/ |_|     
F. Hauri
źródło
1
Powinieneś opublikować pytanie dotyczące codegolf implementacji figlet!
sergiol
1

Węgiel drzewny , 27 bajtów (niekonkurencyjny)

Niekonkurencyjny, ponieważ język jest późniejszy niż wyzwanie.

FEN﹪鲫P×⁴_↗⊗¬ι↓P↘²↘⊗ι↑P↗⊗ι

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

FEN﹪鲫

Wygeneruj listę naprzemiennych bitów długości ni zapętl je.

P×⁴_

Rysuj ____bez przesuwania kursora.

↗⊗¬ι↓

Na pierwszym i co drugim trójkącie narysuj lewą /stronę.

P↘²

Narysuj \bok bez poruszania kursorem.

↘⊗ι↑

Na drugim i co drugim trójkącie narysuj \ponownie lewą stronę, aby przesunąć kursor.

P↗⊗ι

Na drugim i co drugim trójkącie narysuj prawą /stronę, nie przesuwając kursora.

Neil
źródło
1
Odpowiedzi nie muszą już być oznaczane jako niekonkurujące
Jo King
1

PowerShell , 116 95 bajtów

Ogromne podziękowania dla Mazzy i ASCII-Only za oszczędność 21 bajtów

param($n)@("  "+"_"*4*($x=$n-shr1))[$n-eq1]
" /"+"\  /"*$x+"\"*($a=$n%2)
"/"+"__\/"*$x+"__\"*$a

Wypróbuj online!

Nie zezwalając na pustą linię dla n = 1 zjadł jak 14 10 bajtów. To rozwiązanie jest całkiem martwe jak mózg, teraz znacznie mądrzejsze przy minimalnej ilości powtarzanego kodu. Zaokrąglanie bankierów to wciąż prawdziwy diabeł.

Veskah
źródło
Czy pusta linia nie jest dozwolona?
Tylko ASCII,
@ Tylko ASCII Przeczytaj czwarty punkt z OP.
Veskah
cholera
tylko ASCII,
1
@ Tylko ASCII Przerwy na x = 3 Zastąpienie łańcucha polega na ominięciu zaokrąglania przez bankiera
Veska
1
@ mazzy nie możesz wygenerować pierwszego wiersza, w przeciwnym razie byłby to 102
tylko ASCII
0

C, 368 bajtów

void p(char* c){printf(c);}
int x(int s,int f){int t=0,p=s;for(int i=0;i<f;i++){if(p==1){t++;p=0;}else{p=1;}}return t;}
int main(int argc,char* argv[]){int t=atoi(argv[1]);if(t>1){p("  ");for(int i=0;i<x(0,t);i++)
{p("____");}p("\n");}for(int i=0;i<x(1,t);i++){p(" /\\ ");}if(t%2==0){p(" /");}p("\n");
for(int i=0;i<x(1,t);i++){p("/__\\");}if(t%2==0){p("/");}p("\n");}

To więcej, jeśli policzysz #includeinstrukcje, ale skompilowane na gcc, choć z ostrzeżeniami, bez nich. Wiem, że zdecydowanie nie jest najkrótszy, ale nadal podoba mi się, że zrobiłem to w C.

Hej, Lama
źródło
Makro #define p(c)printf(c)jest krótsze niż twoja funkcja. Możesz pominąć typy zwracane przez funkcje (domyślnie są to int). Możesz także zdefiniować funkcję w C89takim stylu main(c,v)char**v;{}. To krótkoint main(int c, char** v){}
MarcDefiant
0

Perl (prosty) 131 125 120

dość proste pierwsze przejście:

$i=<>;print join"\n",$i-1?"  "."_"x(4*int($i/2)):(),join("",map{(" /","\\ ")[$_%2]}0..$i),join"",map{("/","__\\")[$_%2]}0..$i

och, kto potrzebuje wyraźnej int?

$i=<>;print join"\n",$i-1?"  "."_"x($i/2)x4:(),join("",map{(" /","\\ ")[$_%2]}0..$i),join"",map{("/","__\\")[$_%2]}0..$i
Vynce
źródło
0

Prolog, 126 bajtów

A+B:-writef(A,B).
$N:-(N>1,"  %r\n"+['____',N//2];!),(0is N/\1,T='/';T='')," %r%w\n"+['/\\  ',N/2,T],"%r%w\n"+['/__\\',N/2,T].

Wywołaj jak $3.

Bardziej czytelny:

triangle(N):-
    (   N > 1
    ->  writef("  %r\n", ['____', N//2])
    ;   true
    ),
    (   0 is N mod 2
    ->  T = '/'
    ;   T = ''
    ),
    writef(" %r%w\n", ['/\\  ', N/2, T]),
    writef("%r%w\n", ['/__\\', N/2, T]).

Przykład:

?- findall(N,between(1,10,N),NN), maplist($, NN), !.
 /\  
/__\
  ____
 /\  /
/__\/
  ____
 /\  /\  
/__\/__\
  ________
 /\  /\  /
/__\/__\/
  ________
 /\  /\  /\  
/__\/__\/__\
  ____________
 /\  /\  /\  /
/__\/__\/__\/
  ____________
 /\  /\  /\  /\  
/__\/__\/__\/__\
  ________________
 /\  /\  /\  /\  /
/__\/__\/__\/__\/
  ________________
 /\  /\  /\  /\  /\  
/__\/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/
NN = [1, 2, 3, 4, 5, 6, 7, 8, 9|...].
Kay
źródło
0

C #: 1 wiersz LINQ, 198 bajtów

string f(int n){return(n>1?"  ":"")+string.Join("\n",new[]{"____"," /\\ ","/__\\"}.Zip(new[]{(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},(s,l)=>string.Join(s,new string[n+1]).Substring(0,l)).Where(x=>x.Any()));}
Oleg
źródło
0

Siatkówka , 88 bajtów (niekonkurencyjne)

Niekonkurencyjny, ponieważ język jest późniejszy niż wyzwanie.

K`  ____¶ /\  /¶/__\/
%`....$
$+*$&
%`(.+)\1$
$1
(  (____)*)__(¶.*)  /(¶.*)/
$1$3$4
G`\S

Wypróbuj online! Wyjaśnienie:

K`  ____¶ /\  /¶/__\/

Zastąp dane wejściowe parą trójkątów.

%`....$
$+*$&

Pomnóż trójkąty przez oryginalne wejście.

%`(.+)\1$
$1

Podziel trójkąty przez 2.

(  (____)*)__(¶.*)  /(¶.*)/
$1$3$4

Usuń lewy pół trójkąt.

G`\S

Usuń pierwszy wiersz, jeśli jest teraz pusty.

Neil
źródło
0

Perl 6 , 83 bajtów

{~["  {'____'x$_/2-.5}
"x($_>2),'/\  'x$_/2~($!='/'x$_%2),"
"~'/__\\'x$_/2~$!]}o*+1

Wypróbuj online!

Anonimowy blok kodu, który pobiera liczbę i zwraca ciąg znaków.

Jo King
źródło
0

05AB1E , 37 bajtów

≠iðð'_I2÷4*×J}„ /„\ ‚I>∍J'/…__\‚I>∍J»

Wypróbuj online lub sprawdź pierwsze 10 wyników .

Wyjaśnienie:

i            } # If the (implicit) input is NOT 1:
                #   i.e. 1 → 0 (falsey)
                #   i.e. 5 → 1 (truthy)
  ðð            #  Push two spaces "  "
    '_         '#  Push string "_"
      I         #  Push the input
       2÷       #  Integer-divide it by 2
                #   i.e. 5 → 2
         4*     #  And then multiply it by 4
                #   i.e. 2 → 8
           ×    #  Repeat the "_" that many times
                #   i.e. "_" and 8 → "________"
            J   #  Join everything on the stack together to a single string
                #   i.e. "  ________"
 /             # Push string " /"
   \           # Push string "\ "
               # Pair them together: [" /","\ "]
      I>        # Push the input+1
               # Extend the list to that size
                #  i.e. [" /","\ "] and 2 → [" /","\ "]
                #  i.e. [" /","\ "] and 6 → [" /","\ "," /","\ "," /","\ "]
         J      # Join the list together to a single string
                #  i.e. [" /","\ "] → " /\ "
                #  i.e. [" /","\ "," /","\ "," /","\ "] → " /\  /\  /\ "
'/             '# Push string "/"
  __\          # Push string "__\"
               # Pair them together: ["/","__\"]
       I>       # Push the input+1
               # Extend the list to that size
                #  i.e. ["/","__\"] and 2 → ["/","__\"]
                #  i.e. ["/","__\"] and 6 → ["/","__\","/","__\","/","__\"]
          J     # Join the list together to a single string
                #  i.e. ["/","__\"] → "/__\"
                #  i.e. ["/","__\","/","__\","/","__\"] → "/__\/__\/__\"
»               # Join the entire stack with a newline delimiter
                #  i.e. " /\ " and "/__\" → " /\ \n/__\"
                #  i.e. "  ________", " /\  /\  /\ " and "/__\/__\/__\"
                #   → "  ________\n /\  /\  /\ \n/__\/__\/__\"
                # (and output the result implicitly)
Kevin Cruijssen
źródło
0

Java 11, 122 bajty

n->(n>1?"  "+"_".repeat(n/2*4)+"\n":"")+" /\\ ".repeat(n).substring(0,++n*2)+"\n"+"/__\\".repeat(n).substring(0,n/2*4+n%2)

Wypróbuj online.

Wyjaśnienie:

n->                   // Method with integer parameter and String return-type
  (n>1?               //  If the input is larger than 1:
    "  "              //   Return two spaces
    +"_".repeat(      //   Appended with "_" repeated the following amount of times:
          n/2         //    The input integer-divided by 2
             *4)      //    And then multiplied by 4
    +"\n"             //   Appended with a newline
   :                  //  Else:
    "")               //   Return nothing
  +" /\\ ".repeat(n)  //  Appended with " /\ " repeated the input amount of times
    .substring(0,     //   After which we only leave the first `x` characters, where `x` is:
      ++n             //    Increase the input by 1 first with `++n`
         *2)          //    And then multiply it by 2
                      //     i.e. For input 1, `x` becomes 4 here
                      //     i.e. For input 6, `x` becomes 14 here
  +"\n"               //  Appended with a newline
  +"/__\\".repeat(n)  //  Appended with "/__\" repeated the input amount of times
    .substring(0,     //   After which we only leave the first `y` characters, where `y` is:
      n/2             //    The input+1 integer-divided by 2
         *4           //    Then multiplied by 4
           +n%2)      //    And then the input+1 modulo-2 added
                      //     i.e. For input 1, `y` becomes 4 here
                      //     i.e. For input 6, `y` becomes 13 here
Kevin Cruijssen
źródło