Tam giác rất đơn giản


47

Viết chương trình hoặc hàm lấy số nguyên dương (thông qua stdin, dòng lệnh hoặc hàm arg) và in hoặc trả về một chuỗi gồm nhiều hình tam giác nhỏ này được xếp chồng lên nhau, xen kẽ theo cách chúng chỉ:

 /\
/__\

Tam giác duy nhất này là đầu ra nếu đầu vào là 1.

Nếu đầu vào là 2, đầu ra là

  ____
 /\  /
/__\/

Nếu đầu vào là 3, đầu ra là

  ____
 /\  /\
/__\/__\

Nếu đầu vào là 4, đầu ra là

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

Và như vậy. Chương trình của bạn phải hỗ trợ đầu vào tối đa 2 16 - 1 = 65535.

Chi tiết

  • Tam giác ngoài cùng bên trái luôn luôn hướng lên trên.
  • Có thể có không gian dấu nhưng có thể không có không gian hàng đầu không cần thiết.
  • Có thể có một dòng mới tùy chọn.
  • Lưu ý rằng đối 1với đầu ra dài hai dòng nhưng nếu không thì là ba dòng. Điều này là bắt buộc.
  • Đệ trình ngắn nhất tính bằng byte thắng.

Câu trả lời:


32

Bình thường, 44 42

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

Dòng đầu tiên:

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.

Hai dòng khác được tạo bằng cách nhận thấy rằng dòng thứ hai bao gồm " /""\ "xen kẽ đầu vào + 1 lần, và dòng thứ ba bao gồm "/""__\"xen kẽ theo cùng một kiểu.


158
tấn công 44 vẫn bình thường 44 :(
Trình tối ưu hóa

4
42 . Tất nhiên!
mbomb007

48
@Optimizer: Tôi thấy vô cùng thú vị khi nỗi buồn của bạn về sự xuất hiện của 44 đã nhận được nhiều phiếu hơn so với câu hỏi hoặc câu trả lời này.
Alex A.

6
Chỉ cần có 10 câu trả lời sâu trong chuỗi 44 bị gạch bỏ
Leo

3
@AlexA. Tôi thấy thật thú vị khi sự thích thú của bạn đối với nỗi buồn của Trình tối ưu hóa về sự xuất hiện của 44 đã nhận được nhiều phiếu hơn so với câu hỏi hoặc câu trả lời này.
isaacg

24

SQL, 182 175 173 187 byte

Không phải điều này sẽ là ngắn nhất, nhưng vẫn rất vui khi cố gắng giảm thiểu sql;) lol Tôi đã làm điều này trong Oracle 11, tuy nhiên, đây phải là SQL cơ bản. [sửa] như đã chỉ ra, tôi đã không áp dụng quy tắc khi input = 1 - chỉ hiển thị 2 dòng. Tuy nhiên, tôi không thể nghĩ ra cách nào tốt hơn để làm điều đó, tôi đã lưu một vài byte bằng cách sửa đổi logic v;) thêm 2 trước để tiết kiệm một vài byte bằng cách không phải lặp lại sau [/ 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] đã xóa một số khoảng trắng không cần thiết [/ edit1] [edit2] đã thay đổi && i thành & i. Nó cắt giảm 2 ký tự, nhưng buộc người dùng phải nhập số tam giác hai lần ...: PI nhận ra "thói quen mã hóa tốt" của tôi khi sử dụng && tôi đã tốn 2 byte !! Kinh dị!! [/ edit2]

Giải thích (lưu ý: Tôi sử dụng && 1 trong phần giải thích này để nó chỉ nhắc một lần, & 1 ở trên sẽ tiết kiệm không gian mã, nhưng nhắc nhiều lần;))

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

Đầu ra

  SQL> accept i
  1
  SQL> /

   /\
  /__\


  SQL> accept i
  2
  SQL> /

    ____
   /\  /
  /__\/


  SQL> accept i
  3
  SQL> /

    ____
   /\  /\
  /__\/__\


  SQL> accept i
  12
  SQL> /

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


  SQL>

1
Nó sẽ làm việc để loại bỏ không gian sau from? Nếu vậy sẽ tiết kiệm cho bạn một byte.
Alex A.

Chúa ơi .. đó là hạt dẻ. chỉ cần thử nó .. và sau đó "đi đến thị trấn" tước bỏ những khoảng trống mà tôi có thể ... Oo Người hút này không thể đọc được .. nhưng nó vẫn hoạt động;) lol (Tôi không thể tin được các bí danh vẫn hoạt động như vậy .. Oo hehe )
Ditto

Tôi đang bối rối trên upvotes! Oo Không có nơi nào gần kích thước nhỏ nhất .. chưa .. upvotes! Ôi chao.
Ditto

2
Upvote thường biểu thị rằng mọi người thích bài đăng của bạn vì nó sáng tạo, ngôn ngữ được sử dụng là không phổ biến hoặc bất kỳ lý do nào. Theo kinh nghiệm của tôi, không có gì lạ khi câu trả lời golf ngắn nhất cũng được bình chọn cao nhất. Vì vậy, trong khi đây có thể không phải là câu trả lời ngắn nhất, cộng đồng đã coi đó là một câu trả lời tốt. :)
Alex A.

@Alex .. tuyệt vời, hấp dẫn :) (tôi sẽ phải thử điều này trong Excel tiếp theo ... lol)
Ditto

11

Python 2, 89 88 87 85 83 có tên / 81 chưa được đặt tên

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

(Cảm ơn @orlp cho một byte và @xnor cho ba người khác)

Đây là một hàm lấy trong một int nvà trả về các tam giác dưới dạng một chuỗi bằng cách sử dụng cách tiếp cận theo từng hàng.

ví dụ như print f(10)cho

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

Đối với hàng đầu tiên, thay vì (n>1)*chúng tôi sử dụng 1%n*, vì 1%nlà 0 nếu n == 1và 1 nếu n > 1.


1
Bạn có thể cạo một nhân vật, biến " /\\ "thành " /\ ".
orlp

Không phải lambda này cũng hoạt động trong Python 3 sao?
mbomb007

2
@ mbomb007 Có một bộ phận sàn trong đó
Sp3000

@orlp Cho phép tôi ngay bây giờ, để thêm sự nhầm lẫn, nhưng xóa nhận xét của tôi;)
FryAmTheEggman

Tôi nghi ngờ về "\n".join()3 mục, ngay cả khi danh sách được sử dụng để loại bỏ có điều kiện phần tử đầu tiên. Có lẽ một cái gì đó như b*(x+"\n")+y+"\n"+zlà ngắn hơn?
xnor

7

JavaScript (ES6), 101 109

Đường quá dài

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

Giải trình

Sử dụng mũi tên chất béo để định nghĩa chức năng. Hơn nữa, không có {}khối: thân hàm là một biểu thức duy nhất là giá trị trả về. f=(a,b,c)=>exprtương đương với

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

Trong một biểu thức, bạn không thể sử dụng các câu như ifhoặc var, nhưng

  • tham số với giá trị mặc định có thể được sử dụng làm biến cục bộ
  • biểu thức điều kiện ?:hoạt động tốt thay vìif else
  • bạn có thể thêm nhiều biểu thức con bằng cách sử dụng toán tử dấu phẩy hoặc thậm chí tốt hơn là tham số không được sử dụng cho các hàm. Trong trường hợp này, phép gán wlà tham số thứ hai (không sử dụng) cho hàmz

Chúng ta có thể viết lại fhàm như

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

Kiểm tra trong bảng điều khiển Firefox / FireBug

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

Đầu ra

 /\   
/__\ 

  ____
 /\  /
/__\/

  ____
 /\  /\   
/__\/__\ 

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

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

Làm tốt lắm! Tôi đã dành quá nhiều thời gian dài ngày hôm qua để tìm cách rút ngắn nó và tốt nhất quản lý để tái tạo 109 theo những cách khác nhau. -8 là một bước nhảy.
DocMax

Mát mẻ. Bạn có thể gửi một lời giải thích? Tôi không hiểu đầy đủ về việc sử dụngw
BadHorsie 30/03/2015

@BadHorse đã thêm lời giải thích (thực sự, lần này)
edc65

Vì hứng thú, tôi đã cố gắng thực hiện nó mà không theo dấu khoảng trắng và đưa ra 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)cho 119 (cố tình không sử dụng chuỗi mẫu, v.v. để phù hợp với câu trả lời của bạn).
Neil


6

Haskell 155 153 139 131 byte

Tôi tìm thấy một cách tiếp cận hơi khác biệt hóa ra ngắn hơn phương pháp ban đầu của tôi. Nỗ lực ban đầu của tôi được bảo tồn dưới đây. Cũng như trước đây, mẹo chơi golf được đánh giá cao.

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

Cảm ơn Nimi cho các mẹo chơi golf.


Lần thử trước 197 179 Byte

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
Một số gợi ý cho việc chơi golf: (mod n 2)==0even nhoặc sử dụng tốt hơn odd nvà trao đổi thenelsemột phần. concat.take(div n 2).repeattake(4*div n 2).cyclebởi vì tất cả các thành phần danh sách có độ dài 4. Gán tên ngắn cho các hàm có tên dài, ví dụ z=zipWith- sau đó sử dụng z. Bạn có thể đá ra một vài khoảng trống ...repeat""else[....
nimi

@nimi Cảm ơn gợi ý của bạn! Sử dụng chúng, tôi có thể đánh golf giải pháp ban đầu của mình tới 179 byte. Bằng cách xem xét lại cách tiếp cận của tôi, tôi cũng có thể giảm giải pháp của mình xuống 155 Byte.
ankh-morpork

1
Gợi ý, phần II: foldr z["","",""]foldr1 z, bởi vì danh sách cần gấp không bao giờ trống. Thay vì all(==' ') bạn có thể sử dụng ==" "(<- hai khoảng trắng ở giữa), bởi vì nó được sử dụng để xóa dòng trống trong trường hợp n = 1 và ở đây là dòng đầu tiên " ". Định nghĩa đầu tiên tcó thể được viết trong một dòng duy nhất : t n|odd....
nimi

4

CJam, 73 68 63 62 60 byte

Điều này chắc chắn cần một số golf ...

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

Kiểm tra nó ở đây.

Giải trình

"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

Julia, 115 byte

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

Điều này tạo ra một hàm không tên chấp nhận một số nguyên và in các hình tam giác. Để gọi nó, đặt tên cho nó, vd f=n->(...).

Ungolfed + giải thích:

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

Ví dụ đầu ra:

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

Tôi khá thất vọng vì điều này quá dài. Tôi chắc chắn có nhiều cơ hội chơi gôn nhưng chúng không rõ ràng với tôi vào lúc này. Hãy cho tôi biết nếu bạn có bất kỳ đề xuất nào hoặc nếu bạn muốn giải thích thêm!


3

CJam, 68 62 60 byte

Theo như tôi có thể thấy, đây là một cách tiếp cận hoàn toàn khác so với giải pháp khác của CJam. Điều này có thể được chơi golf rất nhiều.

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

Dùng thử trực tuyến tại đây


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

Ung dung

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
Công việc tốt đẹp! Lưu ý rằng không bao giờ tốt hơn để sử dụng một whilevòng lặp, thay vì sử dụng một forvòng lặp. Trong trường hợp này, bạn có thể lưu 2 byte bằng cách bao gồm định nghĩa mtrong khởi tạo vòng lặp for và b=!btrong điều cuối cùng bất kể nó được gọi là gì. Bạn cũng có thể tiết kiệm bằng cách thay thế stringboolbằng var. Bạn cũng không cần "()" xung quanh n>1các mệnh đề và trong s+=mệnh đề bạn có thể sử dụng mạch &không ngắn hơn &&là không có tác dụng phụ hoặc các quy định sai. Cuối cùng, 1>0ngắn hơn true;)
VisualMelon

3

C #, 257 183 byte

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

Chỉnh sửa: Nhờ các mẹo từ @VisualMelon, đã lưu 74 byte.

Tôi biết đó là ngôn ngữ tốt nhất để chơi gôn, nhưng tôi chủ yếu tìm hiểu về các sắc thái khác nhau của C #, hơn là chiến thắng trong cuộc thi. Đây về cơ bản là một cổng của câu trả lời Pyth này .

Tôi nghĩ rằng các vòng lặp có thể được đánh gôn hơn nữa, nhưng tôi không chắc chắn bằng cách nào, đưa ra các tuyên bố đại học được nhúng trong chúng.

Ví dụ (1, 2, 3, 10):

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

Ung dung:

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

Mặc dù StringBuilders rất nhanh và đáng yêu, nhưng nếu bạn muốn số lượng byte thấp, s+=là bạn của bạn. Thật vậy, bạn cho các vòng lặp có thể được làm nhỏ gọn hơn một chút. Niềm vui / nỗi kinh hoàng của các nhà khai thác ++--điều hành có nghĩa là bạn có thể thực hiện hầu hết các công việc trong kiểm tra có điều kiện for(i=0;i++<=t;)(kiểm tra này nếu inhỏ hơn hoặc bằng t sau đó tăng nó). Bạn sẽ làm tốt việc xác định int ibên ngoài vòng lặp for và sử dụng lại nó, và vì bạn có thể đảm bảo rằng nó isẽ không bao giờ âm, i%2==0có thể được hoán đổi i%2<1. Với những thay đổi này, điểm số phụ 200byte dễ dàng đạt được.
VisualMelon

1
Ngoài ra, tôi nghi ngờ bạn đã viết điều này trong LINQPad hoặc tương tự, bởi vì việc truy cập Enumerablethường đòi hỏi một using System.Linqchỉ thị và tôi nghĩ rằng thường có ý định bao gồm các điều khoản như vậy. Tuy nhiên , trong trường hợp này, LINQ duy nhất có thể được thay thế bằng var s=" "+string.Join("____",new string[1+t/2])+n;không chứa LINQ và ngắn hơn mã hiện tại;) Nó kết hợp rất nhiều chuỗi null cùng với những gì chúng tôi thực sự quan tâm, "____" (1 + t / 2 bởi vì chúng ta cần một chuỗi null khác để khớp với "____" khác trước đó). Biến nđược khai báo là "\ r \ n".
VisualMelon

Lời khuyên tuyệt vời! Tôi quên rằng Enumerable sẽ cần System.Linq, tôi hầu như không chú ý những ngày này. Các mẹo cho vòng lặp là tiện dụng!
Warner

Hơi muộn một chút, nhưng bạn có thể tiết kiệm 4 byte bằng cách sử dụng Console.Writethay vìConsole.WriteLine
Metoniem

2

Java, 185

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

Giải trình

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

Lấy cảm hứng từ câu trả lời của @ 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;}

Ung dung

    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
Đẹp, không chắc làm thế nào tôi bỏ lỡ điều này trước khi bình luận về các câu trả lời khác! Sự quá tải đó new Stringlà một cái mới đối với tôi! Bạn dường như đã bỏ lỡ t=""từ phiên bản chơi gôn, mặc dù điều tốt hơn nên làm là khởi tạo tlà "\ n". Bạn có thể lưu một vài byte bằng cách thêm vào tnơi bạn lật b, lưu "{}" trên vòng lặp for : t+=(b=!b)?"/":"__\\".
VisualMelon

1
@tis bạn có thể lưu thêm một vài chi tiết nếu bạn xác định ttrước svà thêm tvào chuỗi chứ không phải "\n";)
VisualMelon

1

Đi, 156 144

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

Ung dung:

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

Thủ thuật thực sự duy nhất ở đây (và thậm chí không phải là một mẹo hay) là sử dụng 3 ắc quy để tôi có thể ngưng tụ giải pháp xuống còn 1 vòng.

Mã này có thể được chạy ở đây: http://play.golang.org/p/urEO1kIjKv


chỉ cần sử dụng c += `__\` thay vìif i<n{c+="_"}
MarcDefiant

@MarcDefiant Cập nhật, cảm ơn
Kristoffer Sall-Storgaard

1

> <> (Cá) , 215 183 156 byte

Chỉnh sửa: Notepad ++ đã cho tôi thêm 5 byte do CR, do đó, số lượng đã được sửa đổi cho phù hợp

Chơi gôn nhiều hơn một chút, nhưng đây là chương trình cá đầu tiên của tôi cho đến nay> _ <Yêu cầu không có dòng đầu tiên trống cho 1 tam giác nhân đôi kích thước của chương trình.

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-

Có thể kiểm tra tại http : // fishl Language.com/ (Int trên ngăn xếp ban đầu cho chiều dài)

Giải trình:

       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
Thông dịch viên tốt đẹp! Bạn đã làm điều đó cho mình?
Sp3000

Thậm chí không một chút. : PI đã sử dụng nó rộng rãi để dạy bản thân ngôn ngữ ... và để gỡ lỗi. Tôi chỉ thấy ngôn ngữ trôi nổi xung quanh và nghĩ rằng nó rất thú vị (cũng muốn thử viên bi).
Fongoid

1

perl 109 108 106

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

Tôi nghĩ rằng điều này là ổn cho golf đầu tiên của tôi, tôi đã sử dụng phần của Vynce cho dòng đầu tiên, với phần còn lại của mã của tôi để vượt qua vấn đề dòng mới với 1 hình tam giác.

Bây giờ để xem nếu tôi có thể rút ngắn nó :)

Chỉnh sửa : khoảng trắng

Chỉnh sửa 2 : thay thế "\n"bằng$/

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

Một phiên bản vô văn hóa:

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

Đầu ra:

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

Ngăn xếp tràn ra nếu tôi nhập 65535(nhưng không phải nếu bạn biên dịch với -O3!), Nhưng về mặt lý thuyết thì nó sẽ hoạt động ;-)

chỉnh sửa: chương trình hiện đáp ứng yêu cầu chỉ xuất ra hai dòng nếu 1được chuyển đến chương trình chỉnh sửa 2: sử dụng int*thay vìchar*


Bạn có thể tuyên bố mainnhư main(c,v)**v;thể nó hoạt động.
FUZxxl

Tôi đã tự hỏi nếu bạn có thể lưu một cái gì đó bằng cách có choặc nlà một biến toàn cục, vì vậy bạn không phải truyền tham số đó cho r(). Tôi không nghĩ câu trả lời của bạn tuân thủNote that for 1 the output is two lines long but otherwise it's three. This is required.
Level River St

@FUZxxl thật không may, điều này không hoạt động :-(error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
MarcDefiant

@steveverrill đã sửa nó, nhưng tôi cần phải làm lại mã. Không thể tìm thấy giải pháp với toàn cầu nhoặc cngắn hơn.
MarcDefiant

@MarcDefiant Bạn có thể vượt qua int**?
FUZxxl

1

Stdlib C ++, 194 byte

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

Chương trình kiểm tra:

#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 byte

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

Trong một chức năng:

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

Với một số bài thuyết trình:

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

Có thể kết xuất (nếu bạn đã cài đặt figlet ):

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

Lưu 2 ký tự nếu đầu vào từ biến thay vì $1: 103

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

Vào vòng lặp:

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

Sẽ kết xuất (xấp xỉ) giống nhau:

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


 _ _ _ 
(_|_|_)

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

1
Bạn nên đăng một câu hỏi về một codegolf thực hiện figlet!
sergiol

1

Than , 27 byte (không biên dịch)

Không soạn thảo vì ngôn ngữ hoãn thử thách.

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

FEN﹪鲫

Tạo một danh sách các bit có chiều dài xen kẽ nvà lặp qua chúng.

P×⁴_

Vẽ ____mà không di chuyển con trỏ.

↗⊗¬ι↓

Trên hình tam giác đầu tiên và khác, vẽ bên trái /.

P↘²

Vẽ \mặt bên mà không di chuyển con trỏ.

↘⊗ι↑

Trên hình tam giác thứ hai và mỗi hình khác, vẽ bên trái \một lần nữa để di chuyển con trỏ.

P↗⊗ι

Trên hình tam giác thứ hai và mỗi hình khác, vẽ /cạnh phải, không di chuyển con trỏ.


1
Câu trả lời không còn phải được đánh dấu là không cạnh tranh nữa
Jo King

1

PowerShell , 116 95 byte

Xin chân thành cảm ơn Mazzy và ASCII-Chỉ để lưu 21 byte

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

Hãy thử trực tuyến!

Không cho phép một dòng trống cho n = 1 đã ăn như 14 10 byte. Giải pháp này kháchết não bây giờ thông minh hơn nhiều với số lượng mã lặp lại tối thiểu. Làm tròn ngân hàng vẫn là ma quỷ thực sự.


Là một dòng trống không được phép ???
ASCII - chỉ

@ ASCII-Chỉ đọc điểm đạn thứ 4 từ OP.
Veskah


1
@ ASCII chỉ Phá vỡ trên x = 3 Chuỗi thay thế là cách bạn vượt qua vòng làm việc của ngân hàng
Veskah

1
@mazzy bạn không thể tạo dòng đầu tiên, nếu không nó sẽ là 102
ASCII - chỉ

0

C, 368 byte

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

Sẽ tốt hơn nếu bạn đếm các #includebáo cáo, nhưng nó được biên dịch trên gcc, mặc dù có cảnh báo, không có chúng. Tôi biết nó không phải là ngắn nhất cho đến nay, nhưng tôi vẫn thích rằng tôi đã làm nó trong C.


Macro #define p(c)printf(c)ngắn hơn chức năng của bạn. Bạn có thể bỏ qua các kiểu trả về trên các hàm (chúng mặc định là int). Bạn cũng có thể định nghĩa hàm C89theo kiểu như thế này main(c,v)char**v;{}. Đó là viết tắt củaint main(int c, char** v){}
MarcDefiant 30/03/2015

0

Perl (đơn giản) 131 125 120

khá đơn giản vượt qua đầu tiên:

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

oh ai cần int int?

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

0

Prolog, 126 byte

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

Gọi như thế $3.

Dễ đọc hơn:

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

Thí dụ:

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

0

C #: 1 dòng LINQ, 198 byte

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

Võng mạc , 88 byte (không lọc)

Không soạn thảo vì ngôn ngữ hoãn thử thách.

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

Hãy thử trực tuyến! Giải trình:

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

Thay thế đầu vào bằng một cặp tam giác.

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

Nhân các tam giác với đầu vào ban đầu.

%`(.+)\1$
$1

Chia các tam giác cho 2.

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

Loại bỏ nửa tam giác còn lại.

G`\S

Xóa dòng đầu tiên nếu nó trống.




0

05AB1E , 37 byte

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

Hãy thử trực tuyến hoặc xác minh 10 đầu ra đầu tiên .

Giải trình:

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 byte

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

Hãy thử trực tuyến.

Giải trình:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.