Дуже прості трикутники


47

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

 /\
/__\

Цей єдиний трикутник - це вихід, якщо вхід є 1.

Якщо вхід є 2, вихід є

  ____
 /\  /
/__\/

Якщо вхід є 3, вихід є

  ____
 /\  /\
/__\/__\

Якщо вхід є 4, вихід є

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

І так далі. Ваша програма повинна підтримувати входи до 2 16 - 1 = 65535.

Деталі

  • Найменший лівий трикутник завжди спрямований вгору.
  • Можуть бути пробіли, але вони можуть бути непотрібними.
  • Можливо, необов'язковий кінцевий новий рядок.
  • Зверніть увагу, що для 1виходу є два рядки, але в іншому випадку це три. Це потрібно.
  • Виграє найкоротше подання в байтах .

Відповіді:


32

Піта, 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 отримала більше голосів, ніж питання чи ця відповідь.
— isaacg

24

SQL, 182 175 173 187 байт

Не те, що це коли-небудь буде найкоротшим, але все ж цікаво намагатися мінімізувати sql;) lol Я це робив в Oracle 11, однак, вони повинні бути базовими SQL. [редагувати], як було зазначено, я не застосовував правило, коли input = 1 - показувати лише 2 рядки. не можу придумати кращого способу зробити це, однак, я зберег пару байтів, змінивши логіку v;) додавання 2 достроково економить пару байтів, не повторюючи це пізніше [/ редагувати]

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? Якщо так, то ви збережете байт.
— Алекс А.

о, добрий пане .. це горіхи. просто спробував .. а потім "поїхав у місто", викреслюючи, які простори я міг ... Oo Цей присоска нечитабельний зараз .., але він працює досі;) lol (я не можу повірити, що псевдоніми все ще працюють так .. Oo hehe )
— Дітто

Я так заплутався в нагорах! Оо Це ніде не найменший розмір .. все ж .. оновлення! Оу вау
— Дітто

2
Оновлення зазвичай позначають, що людям подобається ваша публікація, оскільки вона творча, використовувана мова є нечастою або з будь-якої кількості причин. На мій досвід, нечасто, щоб найменший відповідь на гольф також був найвищим голосом. Тож, хоча це може бути не найкоротшою відповіддю, громада вважає це гарним. :)
— Олексій А.

@ Алекс .. круто, підтягнути :) (мені доведеться спробувати це в Excel далі ... lol)
— Дітто

11

Пітон 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 Дозвольте зараз додавати подальше плутанину, але видаляючи мій коментар;)
— FryAmTheEggman

Я підозріло ставився до "\n".join()трьох елементів, навіть якщо список використовується для умовного видалення першого елемента. Можливо, щось на кшталт 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 байт.
— ankh-morpork

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=n÷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->(...).

Недоліки + пояснення:

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

Безумовно

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в ініціалізацію циклу, і 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.

Я думаю, що петлі можуть бути додатково гольф, але я не зовсім впевнений, як, з огляду на вкладені в них третинні заяви.

Приклад (1, 2, 3, 10):

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

Безголівки:

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+=це ваш друг. Дійсно, ви для петель можна зробити трохи більш компактними. Радість / жах операторів ++і --операторів означає, що ви можете виконати більшу частину роботи в умовах умовної перевірки for(i=0;i++<=t;)(це перевіряється, якщо iвона менша або дорівнює, t ніж збільшується). Ви б добре визначити int iзовнішню петлю для циклу та повторно використовувати її, і оскільки ви можете гарантувати, що iвона ніколи не буде негативною, i%2==0її можна замінити i%2<1. За допомогою цих змін легко досягти підрахунку 200-байт.
— VisualMelon

1
Також я підозрюю, що ви написали це в LINQPad або подібному, тому що для доступу Enumerableзазвичай потрібна using System.Linqдиректива, і я думаю, що загалом передбачається, що такі пропозиції включаються. Однак у цьому випадку єдиний LINQ можна замінити таким, var s=" "+string.Join("____",new string[1+t/2])+n;який не містить 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;}

Безумовно

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

Безголівки:

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 Оновлено, спасибі
— Kristoffer Sall-Storgaard

1

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

Редагувати: «Блокнот ++» дав мені 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

Я думаю, що це добре для мого першого гольфу, я використав розділ Винса для першого рядка, а решта мого коду, щоб подолати нову проблему з 1 трикутником.

Тепер, щоб побачити, чи можу я її скоротити :)

Редагувати : Пробіл

Редагувати 2 : замінено "\n"на$/

1:
 /\
/__\

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

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

Негольована версія:

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!), Але теоретично він повинен працювати ;-)

редагувати: програма тепер виконує вимогу, що у разі 1передачі в програму редагування 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

Bash, 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

Може відобразитись (якщо у вас встановлена філетка ):

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

Збережіть 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
Ви повинні залишити питання про кодовий гольф реалізації філе!
— сергіол

1

Вугілля деревне , 27 байт (неконкурентне)

Неконкурентований, оскільки мова ставить перед собою виклик.

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

FEN﹪鲫

Створіть список змінних бітів довжини nта петлі над ними.

P×⁴_

Малюйте, ____не рухаючи курсором.

↗⊗¬ι↓

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

P↘²

Намалюйте \сторону, не рухаючи курсором.

↘⊗ι↑

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

P↗⊗ι

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


1
Відповіді більше не потрібно позначати як неконкурентоспроможні
— Jo King

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 10 байт. Це рішення є доволі розумним мозку тепер набагато розумнішим з мінімальною кількістю повторного коду. Округлення банкіра все ще є власне дияволом.


Чи пустий рядок не дозволений ???
— Лише ASCII

@ Тільки ASCII Прочитайте четверту точку кулі з ОП.
— Веска


1
@ ASCII Перерви лише на x = 3 Заміна рядка - це те, як ви обійти округлення банкіра
— Вешка

1
@mazzy ви не можете створити перший рядок, інакше це буде 102
— лише для ASCII

0

С, 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.