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


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