Очень простые треугольники


47

Напишите программу или функцию, которая принимает положительное целое число (через stdin, командную строку или функцию arg) и печатает или возвращает строку из множества этих маленьких треугольников, связанных друг с другом, чередуя то, как они указывают:

 /\
/__\

Этот единственный треугольник является выходным, если на входе есть 1.

Если вход есть 2, то выход

  ____
 /\  /
/__\/

Если вход есть 3, то выход

  ____
 /\  /\
/__\/__\

Если вход есть 4, то выход

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

И так далее. Ваша программа должна поддерживать входы до 2 16 - 1 = 65535.

подробности

  • Крайний левый треугольник всегда указывает вверх.
  • Могут быть пробелы, но не может быть лишних начальных пробелов.
  • Там может быть необязательный завершающий перевод строки.
  • Обратите внимание, что для 1вывода две строки, но в противном случае это три. Это обязательно.
  • Самая короткая подача в байтах побеждает.

Ответы:


32

Pyth, 44 42

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

Первая строка:

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.

Остальные две линии генерируются, заметив , что вторая линия состоит из " /"и "\ "переменного вход + 1 раз, а третья строка состоит из "/"и "__\"чередуют таким же образом.


158
вычеркнул 44, все еще нормально 44 :(
Оптимизатор

4
42 . Конечно!
mbomb007

48
@Optimizer: я нахожу бесконечно забавным, что ваша печаль по поводу появления 44 получила больше голосов, чем вопрос или этот ответ.
Алекс А.

6
Только что получил 10 ответов в зачеркнутой 44 цепочке
Лев

3
@AlexA. Я нахожу бесконечно забавным, что ваше веселье из-за грусти Оптимизатора из-за появления 44 набрало больше голосов, чем вопрос или этот ответ.
Исаак

24

SQL, 182 175 173 187 байт

Не то, чтобы это когда-либо было самым коротким, но все еще забавно пытаться минимизировать sql;) lol Я сделал это в Oracle 11, однако, это должен быть базовый SQL. [edit], как указано, я не применял правило когда input = 1 - показывать только 2 строки. не могу придумать лучшего способа сделать это, однако, я сохранил пару байтов, изменив логику v;) добавление 2 раньше времени экономит пару байтов, не повторяя их позже [/ 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] удалил некоторые ненужные пробелы [/ edit1] [edit2] изменил && i на просто & i. Он сокращает 2 символа, но вынуждает пользователя дважды вводить число треугольников ...: PI понял, что мои "хорошие привычки кодирования" с использованием && я стоили 2 байта !! Ужас!! [/ Edit2]

Пояснение (примечание: я использую && 1 в этом объяснении, поэтому он запрашивает только один раз, приведенный выше & 1 экономит место кода, но запрашивает несколько раз;))

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

Выход

  SQL> accept i
  1
  SQL> /

   /\
  /__\


  SQL> accept i
  2
  SQL> /

    ____
   /\  /
  /__\/


  SQL> accept i
  3
  SQL> /

    ____
   /\  /\
  /__\/__\


  SQL> accept i
  12
  SQL> /

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


  SQL>

1
Будет ли это работать, чтобы удалить пространство после from? Если так, то это сэкономит вам байт.
Алекс А.

о, боже мой ... это безумие только что попробовал .. и затем "пошел в город", убирая, какие места я мог бы ... Оо Этот лох теперь нечитабельно ... но он работает до сих пор;) LOL (Я не могу поверить, что псевдонимы по-прежнему работают так .. О, хе-хе )
То же

Я ооочень смущен на upvotes! Оо Это далеко не самый маленький размер .. пока что ... голосует! Оо вау
То же

2
Как правило, подвыражающие слова означают, что людям нравится ваша заявка, потому что она креативная, используемый язык встречается редко или по ряду причин. По моему опыту, самый короткий ответ на гольф-код также является самым высоким за голосование. Так что, хотя это может быть не самый короткий ответ, сообщество сочло его хорошим. :)
Алекс А.

@ Алекс .. круто, подливка :) (в следующий раз мне придется попробовать это в Excel ... смеется)
То же

11

Python 2, 89 88 87 85 83 названных / 81 неназванных

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

(Спасибо @orlp за байт и @xnor за еще три)

Это функция, которая принимает int nи возвращает треугольники в виде строки, используя построчный подход.

например print f(10)дает

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

Для первой строки вместо того, (n>1)*чтобы использовать 1%n*, так 1%nкак 0, если n == 1и 1, если n > 1.


1
Вы можете сбрить персонажа, превратившись " /\\ "в " /\ ".
orlp

Разве эта лямбда не работает и в Python 3?
mbomb007

2
@ mbomb007 Там есть этажное подразделение
Sp3000

@orlp Позвольте мне добавить еще больше недоразумений, но
удаляю

Я с подозрением отношусь "\n".join()к 3 элементам, даже если список используется для условного удаления первого элемента. Может быть, что-то вроде b*(x+"\n")+y+"\n"+zкороче?
xnor

7

JavaScript (ES6), 101 109

Слишком долго

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

объяснение

Использование жирной стрелки для определения функции. Кроме того, нет {}блока: тело функции является единственным выражением, которое является возвращаемым значением. f=(a,b,c)=>exprэквивалентно

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

Внутри одного выражения вы не можете использовать такие выражения, как ifили var, но

  • параметры со значениями по умолчанию могут использоваться как локальные переменные
  • условные выражения ?:работают хорошо вместоif else
  • Вы можете добавить дополнительные подвыражения, используя оператор запятой или, что еще лучше, в качестве неиспользуемого параметра для функций. В этом случае присвоение wявляется вторым (неиспользованным) параметром функцииz

Мы можем переписать fфункцию как

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;
}

Тест в консоли Firefox / FireBug

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

Выход

 /\   
/__\ 

  ____
 /\  /
/__\/

  ____
 /\  /\   
/__\/__\ 

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

  ________________
 /\  /\  /\  /\  /\   
/__\/__\/__\/__\/__\ 

Красиво сделано! Вчера я потратил слишком много времени, пытаясь сократить его, и в лучшем случае мне удалось воспроизвести 109 различными способами. -8 это настоящий прыжок.
DocMax

Здорово. Не могли бы вы опубликовать объяснение? Я не совсем понимаю использованиеw
BadHorsie

Добавлено @BadHorse объяснение (действительно, на этот раз)
edc65

Из интереса я попытался сделать это без запаздывающих пробелов и придумал 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 (намеренно не используя строки шаблона и т. Д., Чтобы соответствовать вашему ответу).
Нил


6

Haskell 155 153 139 131 байт

Я нашел немного другой подход, который оказался короче, чем мой оригинальный метод. Моя первоначальная попытка сохранилась ниже. Как и прежде, советы по игре в гольф приветствуются.

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

Спасибо Ними за советы по игре в гольф.


Предыдущая попытка 197 179 байт

t n=putStr.unlines.dropWhile(all(==' ')).z(flip(++))(if odd n then["","\\","__\\"]else repeat"").z(++)["  "," /","/"].map(take(4*div n 2).cycle)$["____","\\  /","__\\/"]
z=zipWith

4
Некоторые подсказки для игры в гольф: (mod n 2)==0это even nили лучше использовать odd nи своп thenи elseчасть. concat.take(div n 2).repeatэто take(4*div n 2).cycleпотому , что все элементы списка имеют длину 4. Присвоить короткие имена для функций с длинными именами, например , z=zipWith- использовать z. Вы можете выбросить несколько пробелов ...repeat""else[....
Ними

@nimi Спасибо за ваши советы! Используя их, я смог воспроизвести свое оригинальное решение до 179 байтов. Пересмотрев мой подход, я также смог уменьшить свое решение до 155 байт.
Анк-Морпорк

1
Подсказки, часть II: foldr z["","",""]есть foldr1 z, потому что список для свертывания никогда не бывает пустым. Вместо этого all(==' ') вы можете использовать ==" "(<- два пробела между), потому что он используется для удаления пустой строки в случае n = 1 и здесь первая строка " ". Первое определение tможно записать в одной строке: t n|odd....
Ними

4

CJam, 73 68 63 62 60 байт

Это определенно нуждается в игре в гольф ...

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

Проверьте это здесь.

объяснение

"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 '__\'.";

4

Юлия, 115 байт

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

Это создает безымянную функцию, которая принимает целое число и печатает треугольники. Чтобы назвать его, дайте ему имя, например f=n->(...).

Ungolfed + объяснение:

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

Пример вывода:

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

Я очень расстроен, что это так долго. Я уверен, что есть множество возможностей для игры в гольф, но они мне пока не ясны. Дайте мне знать, если у вас есть какие-либо предложения или вы хотите получить дальнейшие объяснения!



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

Ungolfed

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

1
Хорошо сделано! Обратите внимание, что никогда не лучше использовать whileцикл, а использовать forцикл. В этом случае вы можете сохранить 2 байта, включив определение mв инициализацию цикла for и, b=!bв конце концов, как бы он ни вызывался. Вы также можете сэкономить, заменив stringи boolс var. Вы также не нуждаетесь в предложениях "()" вокруг n>1, и в этом s+=предложении вы можете использовать не короткое замыкание, &а не &&как побочные эффекты или разыменования, чтобы пойти не так. Наконец, 1>0короче true;)
VisualMelon

3

C #, 257 183 байта

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

Изменить: Благодаря подсказкам от @VisualMelon, сэкономлено 74 байта.

Я знаю, что это далеко не лучший язык для игры в гольф, но больше всего мне интересно узнать о различных нюансах C #, а не выигрывать соревнования. Это в основном порт этого ответа Pyth.

Я думаю, что циклы for можно было бы продолжить, но я не совсем уверен, как, учитывая встроенные в них третичные утверждения.

Пример (1, 2, 3, 10):

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

Ungolfed:

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

Хотя StringBuilders быстрые и красивые, если вам нужно небольшое количество байтов, s+=это ваш друг. Действительно, вы за петли можете сделать немного более компактным. Радость / ужас операторов ++and --означает, что вы можете выполнять большую часть работы в условной проверке for(i=0;i++<=t;)(эта проверка проверяет, iменьше или равна, а t затем увеличивает ее). Вы бы неплохо определили int iвнешний цикл for и использовали его повторно, и, поскольку вы можете гарантировать, что iон никогда не будет отрицательным, i%2==0можно поменять его местами i%2<1. С этими изменениями легко получить оценку ниже 200 байт.
VisualMelon

1
Кроме того, я подозреваю, что вы написали это в LINQPad или подобном, потому что для доступа к нему Enumerableобычно требуется using System.Linqдиректива, и я думаю, что обычно предполагается, что такие пункты включены. Однако в этом случае можно заменить только var s=" "+string.Join("____",new string[1+t/2])+n;один LINQ, который не содержит LINQ и короче текущего кода;) Он объединяет множество пустых строк вместе с тем, что нас действительно волнует, «____» (1 + t / 2 потому что нам нужна еще одна нулевая строка, чтобы соответствовать другой "____" раньше). Переменная nобъявлена ​​как "\ r \ n".
VisualMelon

Отличные советы! Я забыл, что Enumerable понадобится System.Linq, в эти дни я почти не обращаю внимания. Подсказка для петли удобна!
Трент

Немного поздно, но вы можете сэкономить 4 байта, используя Console.Writeвместо этогоConsole.WriteLine
Metoniem

2

Ява, 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;}

объяснение

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;
}

2

C # - 151 146 141 138

Вдохновленный ответом @ 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;}

Ungolfed

    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;
    }

1
Хорошо, не уверен, как я это пропустил, прежде чем комментировать другие ответы! Эта перегрузка new Stringявляется новой для меня! Похоже, вы пропустили свой t=""вариант игры в гольф, но лучше было бы инициализировать tкак "\ n". Вы можете сохранить несколько байтов, присоединяя к tгде вы щелкаете b, спасая «{}» на для цикла: t+=(b=!b)?"/":"__\\".
VisualMelon

1
@tis вы можете сохранить еще пару, если вы определите tранее sи добавите tк строке, а не "\n";)
VisualMelon

1

Идти, 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)}

Ungolfed:

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

Единственный реальный трюк здесь (и он даже не очень хороший) - это использование 3 аккумуляторов, чтобы я мог сконденсировать решение до 1 цикла.

Код можно запустить здесь: http://play.golang.org/p/urEO1kIjKv


просто используйте c += `__\` вместоif i<n{c+="_"}
MarcDefiant

@MarcDefiant Обновлено, спасибо
Кристоффер Салл-Сторгард

1

> <> (Рыба) , 215 183 156 байт

Изменить: Notepad ++ дал мне 5 дополнительных байтов из-за CR, поэтому изменил количество соответственно

Немного больше в гольфе, но это моя первая рыбная программа на данный момент> _ <Требование не иметь пустой первой строки для 1 треугольника удвоило размер программы.

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-

Можно проверить на http://fishlanguage.com/ (Int на начальном стеке для длины)

Объяснение:

       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

1
Хороший переводчик! Ты сделал это сам?
Sp3000

Даже немного. : PI широко использовал его, чтобы научить себя языку ... и отлаживать. Я просто видел, как язык плавает вокруг, и подумал, что это очень интересно (тоже хочу попробовать мрамор).
Фонгоид

1

Perl 109 108 106

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

Я думаю, что это нормально для моего первого гольфа, я использовал раздел Vynce для первой строки, а остальную часть своего кода, чтобы преодолеть проблему новой линии с 1 треугольником.

Теперь посмотрим, смогу ли я сократить его :)

Изменить : пробелы

Изменить 2 : заменено "\n"на$/

1:
 /\
/__\

4:
  ________
 /\  /\  /
/__\/__\/

1

С89, 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);}

Версия без гольфа:

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

Выход:

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

Стек переполняется, если я вхожу 65535(но не если вы компилируете -O3!), Но теоретически это должно работать ;-)

edit: программа теперь удовлетворяет требованию, что только две строки должны быть выведены, если 1передано программе edit 2: использовать int*вместоchar*


Вы можете заявить, mainкак main(c,v)**v;будто это работает.
FUZxxl

Мне было интересно, если вы могли бы сохранить что-то, используя cили nкак глобальную переменную, так что вам не нужно передавать этот параметр r(). Я не думаю, что ваш ответ соответствуетNote that for 1 the output is two lines long but otherwise it's three. This is required.
Level River St

@FUZxxl, к сожалению, это не работает :-(error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
MarcDefiant

@steveverrill исправил это, но мне нужно было удлинить код. Не удалось найти решение с глобальным nили cэто короче либо.
MarcDefiant

@MarcDefiant Вам удалось передать int**?
FUZxxl

1

C ++ stdlib, 194 байта

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;}

Тестовая программа:

#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;
}

1

Баш, 166 127 125 119 105 байт

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

В функции:

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

С некоторыми презентациями:

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

Может сделать (если у вас установлен figlet ):

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

Сохранить 2 символа, если ввод из переменной вместо $1: 103

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

В цикл:

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

Будет оказывать (примерно) то же самое:

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


 _ _ _ 
(_|_|_)

    _____       ____________________________________________________________
   |__ / |     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|    
  _______       ________________________________________________________________
 |__ /_  )     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
  |_ \/ /     /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
 |___/___|    
  ________      ________________________________________________________________
 |__ /__ /     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
  |_ \|_ \    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
 |___/___/    
 _____ _        ____________________________________________________________________
|__ / | |      /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
 |_ \_  _|    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
|___/ |_|     

1
Вам следует опубликовать вопрос о реализации Codegolf!
sergiol

1

Древесный уголь , 27 байт (неконкурентный)

Неконкурентоспособен, потому что язык ставит перед собой задачу.

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

FEN﹪鲫

Создайте список чередующихся битов длины nи зациклите их.

P×⁴_

Нарисуйте ____без перемещения курсора.

↗⊗¬ι↓

На первом и каждом другом треугольнике нарисуйте левую /сторону.

P↘²

Нарисуйте \сторону, не перемещая курсор.

↘⊗ι↑

На втором и каждом другом треугольнике \снова нарисуйте левую сторону, чтобы переместить курсор.

P↗⊗ι

На втором и каждом другом треугольнике нарисуйте правую /сторону, не перемещая курсор.


1
Ответы больше не должны быть помечены как неконкурентные
Джо Кинг

1

PowerShell , 116 95 байт

Большое спасибо Mazzy и ASCII-Only за сохранение 21 байта

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

Попробуйте онлайн!

Не допускается пустая строка для n = 1, как 14 14 байт. Это решение довольно умопомрачительно, теперь намного умнее с минимальным количеством повторяющегося кода. Округление Банкира все еще является настоящим дьяволом.


Пустая строка не допускается ???
Только для ASCII

@ Только для ASCII Прочитайте 4-ую точку пули из OP.
Веска


1
@ ASCII-only Разрывы на х = 3 Строка заменяет способ обхода округления банкира
Веска

1
@ mazzy, вы не можете сгенерировать первую строку, иначе это будет 102
только для ASCII

0

C 368 байт

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");}

Лучше, если вы посчитаете #includeутверждения, но они скомпилированы на gcc, хотя и с предупреждениями, без них. Я знаю, что это не самое короткое время, но мне все еще нравится, что я сделал это на C.


Макрос #define p(c)printf(c)короче вашей функции. Вы можете опустить возвращаемые типы для функций (они по умолчанию int). Вы также можете определить функцию вC89 стиле, как это main(c,v)char**v;{}. Это коротко дляint main(int c, char** v){}
MarcDefiant

0

Perl (простой) 131 125 120

довольно простой первый проход:

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

ой кому нужен явный int?

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

0

Пролог, 126 байт

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

Вызывать как $3.

Более читабельно:

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

Пример:

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

0

C #: 1 строка LINQ, 198 байт

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

0

Сетчатка , 88 байт (неконкурентная)

Неконкурентоспособен, потому что язык ставит перед собой задачу.

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

Попробуйте онлайн! Объяснение:

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

Замените ввод парой треугольников.

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

Умножьте треугольники на исходный ввод.

%`(.+)\1$
$1

Разделите треугольники на 2.

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

Удалите оставшуюся половину треугольника.

G`\S

Удалите первую строку, если она сейчас пуста.



0

C (gcc) , 117 115 байтов

-2 благодаря потолку.

Все эти скобки предполагают, что что-то менее неуклюжее, безусловно, возможно.

f(n,i,j){for(j=3-1/n;j--;puts("/"+(n%2|j>1)))for(i=0;i<n+(j<2)>>1;)printf("  %.4s"+2-j*!i++,"/__\\/\\  ____"+j*4);}

Попробуйте онлайн!



0

05AB1E , 37 байт

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

Попробуйте онлайн или проверьте первые 10 выходов .

Объяснение:

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)

0

Java 11, 122 байта

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

Попробуйте онлайн.

Объяснение:

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.