สามเหลี่ยมง่ายมาก


47

เขียนโปรแกรมหรือฟังก์ชั่นที่รับจำนวนเต็มบวก (ผ่าน stdin, command line หรือ function arg) แล้วพิมพ์หรือคืนค่าสตริงของสามเหลี่ยมขนาดเล็กจำนวนมากเหล่านี้เรียงกันเข้าด้วยกันสลับกันตามจุดที่พวกมันชี้ไป:

 /\
/__\

1สามเหลี่ยมนี้เพียงอย่างเดียวคือการส่งออกถ้าใส่เป็น

หากอินพุตเป็น2เอาต์พุตจะเป็น

  ____
 /\  /
/__\/

หากอินพุตเป็น3เอาต์พุตจะเป็น

  ____
 /\  /\
/__\/__\

หากอินพุตเป็น4เอาต์พุตจะเป็น

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

และอื่น ๆ โปรแกรมของคุณต้องรองรับอินพุตได้สูงสุด 2 16 - 1 = 65535

รายละเอียด

  • สามเหลี่ยมซ้ายสุดชี้ขึ้นเสมอ
  • อาจมีช่องว่างต่อท้าย แต่อาจไม่มีช่องว่างนำหน้าที่ไม่จำเป็น
  • อาจมีบรรทัดใหม่ต่อท้ายที่เป็นตัวเลือก
  • โปรดทราบว่าสำหรับ1การส่งออกเป็นสองบรรทัดยาว แต่อย่างอื่นมันเป็นสาม สิ่งนี้จำเป็น
  • การส่งที่สั้นที่สุดในหน่วยไบต์ชนะ

คำตอบ:


32

Pyth, 44 42

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

บรรทัดแรก:

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

อีกสองบรรทัดถูกสร้างขึ้นโดยสังเกตว่าบรรทัดที่สองประกอบด้วย" /"และ"\ "สลับอินพุต + 1 ครั้งและบรรทัดที่สามประกอบด้วย"/"และ"__\"สลับในแบบเดียวกัน


158
การประท้วงออกมา 44 ยังคงเป็นปกติ 44 :(
เครื่องมือเพิ่มประสิทธิภาพ

4
42 . แน่นอน!
mbomb007

48
@Optimizer: ฉันคิดว่ามันสนุกไม่รู้จบที่ความโศกเศร้าของคุณต่อการปรากฏตัวของ 44 ได้รับคะแนนมากกว่าคำถามหรือคำตอบนี้
Alex A.

6
เพิ่งได้ 10 คำตอบที่ลึกลงไปในห่วงโซ่ 44 โซ่
ราศีสิงห์

3
@AlexA ฉันพบว่ามันสนุกอย่างไม่รู้จบที่ความสนุกของคุณต่อความโศกเศร้าของ Optimizer ที่มีต่อ 44 นั้นได้รับคะแนนเสียงมากกว่าคำถามหรือคำตอบนี้
isaacg

24

SQL, 182 175 173 187 ไบต์

ไม่ใช่ว่ามันจะสั้นที่สุด แต่ก็ยังน่าขบขันในการพยายามลด sql;) lol ฉันทำสิ่งนี้ใน Oracle 11 อย่างไรก็ตามสิ่งเหล่านี้ควรเป็น SQL พื้นฐาน [แก้ไข] ตามที่ระบุไว้ฉันไม่ได้ใช้กฎเมื่ออินพุต = 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หรือไม่ ถ้าเป็นเช่นนั้นจะช่วยให้คุณประหยัดไบต์
Alex A.

โอ้พระเจ้าที่ดี .. ที่ถั่ว แค่ลองมัน .. แล้วก็ "ไปเมือง" เพื่อหาช่องว่างที่ฉันสามารถทำได้ ... Oo ผู้อ่านคนนี้อ่านไม่ได้แล้วตอนนี้ .. แต่มันก็ยังทำงานอยู่;) ฮ่า ๆ (ฉันไม่อยากจะเชื่อเลยว่านามแฝงยังคงทำงานอย่างนั้น .. )
Ditto

ฉันสับสนมากในโหวต! Oo อยู่ใกล้กับขนาดที่เล็กที่สุด .. ยัง .. upvotes! ว้าววว
Ditto

2
ปกติแล้ว Upvotes จะแสดงว่าคนที่คุณชอบเป็นคนส่งความคิดสร้างสรรค์เพราะภาษาที่ใช้นั้นผิดปกติหรือมีเหตุผลหลายประการ จากประสบการณ์ของฉันมันเป็นเรื่องผิดปกติสำหรับคำตอบกอล์ฟสั้นที่สุดที่จะได้รับคะแนนสูงสุด ดังนั้นแม้ว่านี่อาจไม่ใช่คำตอบที่สั้นที่สุด แต่ชุมชนก็ถือว่าเป็นคำตอบที่ดี :)
อเล็กซ์ A.

@Alex .. เจ๋ง, น้ำเกรวี่ :) (ฉันจะต้องลองใน Excel ต่อไป ... lol)
Ditto

11

Python 2, 89 88 87 85 83 ชื่อ / 81 ไม่มีชื่อ

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

(ขอบคุณ @orlp สำหรับไบต์และ @xnor อีกสาม)

นี่คือฟังก์ชั่นที่รับค่า int nและส่งกลับสามเหลี่ยมเป็นสตริงโดยใช้วิธีการแบบแถวต่อแถว

เช่นprint f(10)ให้

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

สำหรับแถวแรกแทนการ(n>1)*ที่เราใช้1%n*ตั้งแต่1%nเป็น 0 ถ้าn == 11 n > 1และถ้า


1
คุณสามารถโกนตัวละครหันเข้า" /\\ " " /\ "
orlp

แลมบ์ดานี้ใช้งานใน Python 3 ไม่ได้หรือ
mbomb007

2
@ mbomb007 มีการแบ่งชั้นในนั้น
Sp3000

@orlp ให้ฉันตอนนี้เพื่อเพิ่มความสับสนเพิ่มเติม แต่ลบความคิดเห็นของฉัน;)
FryAmTheEggman

ฉันสงสัยว่ามี"\n".join()3 รายการแม้ว่ารายการนั้นจะใช้ในการลบองค์ประกอบแรกอย่างมีเงื่อนไข บางทีสิ่งที่ชอบb*(x+"\n")+y+"\n"+zสั้นกว่านี้?
xnor

7

JavaScript (ES6), 101 109

ทางยาวเกินไป

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

คำอธิบาย

ใช้ลูกศรไขมันสำหรับคำจำกัดความของฟังก์ชั่น ยิ่งไปกว่านั้นไม่มี{}บล็อก: ร่างกายฟังก์ชั่นการแสดงออกเดียวที่เป็นค่าตอบแทน f=(a,b,c)=>exprเทียบเท่ากับ

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

ภายในนิพจน์เดียวคุณไม่สามารถใช้คำสั่งเช่นifหรือvarแต่

  • พารามิเตอร์ที่มีค่าเริ่มต้นสามารถนำมาใช้เป็นตัวแปรท้องถิ่น
  • นิพจน์ที่มีเงื่อนไข?:ทำงานได้ดีแทนif else
  • คุณสามารถเพิ่ม subexpressions เพิ่มเติมโดยใช้เครื่องหมายจุลภาคหรือดีกว่าเป็นพารามิเตอร์ที่ไม่ได้ใช้กับฟังก์ชั่น ในกรณีนี้การกำหนดของ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 (โดยไม่ได้ตั้งใจใช้สตริงแม่แบบ ฯลฯ เพื่อให้ตรงกับคำตอบของคุณ)
Neil


6

Haskell 155 153 139 131 Bytes

ฉันพบวิธีที่แตกต่างกันเล็กน้อยซึ่งกลายเป็นสั้นกว่าวิธีดั้งเดิมของฉัน ความพยายามเริ่มต้นของฉันถูกรักษาไว้ด้านล่าง ก่อนหน้านี้เคล็ดลับการเล่นกอล์ฟได้รับการชื่นชม

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

ขอบคุณ Nimi สำหรับเคล็ดลับการเล่นกอล์ฟ


ความพยายามก่อนหน้า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

@nimi ขอบคุณสำหรับคำแนะนำของคุณ! เมื่อใช้พวกเขาฉันสามารถตีกอล์ฟโซลูชันดั้งเดิมของฉันได้ที่ 179 ไบต์ เมื่อพิจารณาวิธีการของฉันอีกครั้งฉันก็สามารถลดวิธีแก้ปัญหาของฉันเป็น 155 ไบต์ได้
ankh-morpork

1
คำแนะนำตอนที่สอง: foldr z["","",""]เป็นfoldr1 zเพราะรายการที่จะพับไม่เคยว่างเปล่า แทนการall(==' ') ที่คุณสามารถใช้==" "(<- สองช่องว่างในระหว่าง) เพราะมันจะถูกใช้ในการลบเส้นที่ว่างเปล่าในกรณีของ n = 1 " "และที่นี่บรรทัดแรกคือ ความหมายแรกของสามารถเขียนเป็นเส้นเดียว:t t n|odd...
nimi

4

CJam, 73 68 63 62 60 ไบต์

ต้องมีการเล่นกอล์ฟ ...

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

ทดสอบที่นี่

คำอธิบาย

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

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

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

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

4

จูเลีย 115 ไบต์

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

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อซึ่งยอมรับจำนวนเต็มและพิมพ์รูปสามเหลี่ยม f=n->(...)เรียกว่าให้มันชื่อเช่น

คำอธิบาย Ungolfed +:

function f(n)

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

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

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

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

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

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

ตัวอย่างผลลัพธ์:

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

ฉันค่อนข้างงอแงว่านี่มันนานมากแล้ว ฉันแน่ใจว่ามีโอกาสในการเล่นกอล์ฟมากมาย แต่พวกเขายังไม่ชัดเจนสำหรับฉันในขณะนี้ แจ้งให้เราทราบหากคุณมีข้อเสนอแนะหรือหากคุณต้องการคำอธิบายเพิ่มเติม!



3

C # 190

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

Ungolfed

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

1
เยี่ยมมาก! โปรดทราบว่าจะไม่ดีกว่าการใช้การwhileวนซ้ำแทนที่จะใช้การforวนซ้ำ ในกรณีนี้คุณสามารถบันทึก 2 ไบต์โดยรวมคำจำกัดความของmในการวนรอบการเริ่มต้นและ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):

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

Ungolfed:

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

ในขณะที่ StringBuilders รวดเร็วและน่ารักถ้าคุณต้องการนับไบต์ต่ำs+=เพื่อนของคุณคือ ที่จริงแล้วคุณกำลังลูปสามารถทำให้กะทัดรัดขึ้นเล็กน้อย ความสุข / สยองขวัญของตัวดำเนินการ++และ--หมายความว่าคุณสามารถทำงานส่วนใหญ่ในการตรวจสอบแบบมีเงื่อนไขfor(i=0;i++<=t;)(การตรวจสอบนี้ถ้าiน้อยกว่าหรือเท่ากับt นั้นเพิ่มขึ้นแล้ว ) คุณควรจะทำดีเพื่อกำหนดint iนอกสำหรับวงและนำมาใช้ใหม่ได้และเนื่องจากคุณสามารถรับประกันได้ว่าiจะไม่ลบสามารถสลับสำหรับi%2==0 i%2<1ด้วยการเปลี่ยนแปลงเหล่านี้จะบรรลุคะแนนย่อย 200byte ได้อย่างง่ายดาย
VisualMelon

1
นอกจากนี้ฉันสงสัยว่าคุณเขียนสิ่งนี้ใน LINQPad หรือที่คล้ายกันเนื่องจากการเข้าถึงEnumerableโดยทั่วไปต้องการusing System.Linqคำสั่งและฉันคิดว่าโดยทั่วไปแล้วมันตั้งใจที่จะรวมคำสั่งเหล่านั้นไว้ด้วย อย่างไรก็ตามในกรณีนี้ LINQ เท่านั้นที่สามารถแทนที่ด้วยvar s=" "+string.Join("____",new string[1+t/2])+n;ซึ่งไม่มี LINQ และสั้นกว่ารหัสปัจจุบัน;) มันรวมสตริง null จำนวนมากพร้อมกับสิ่งที่เราสนใจจริง ๆ "____" (1 + t / 2 เนื่องจากเราต้องการสตริงว่างอื่นเพื่อให้พอดีกับ "____" ก่อนหน้านี้) ตัวแปรnถูกประกาศเป็น "\ r \ n"
VisualMelon

สุดยอดเคล็ดลับ! ฉันลืมไปว่า Enumerable ต้องการ System.Linq ฉันแทบจะไม่ใส่ใจในทุกวันนี้ เคล็ดลับสำหรับลูปมีประโยชน์!
เทรนต์

ช้าไปหน่อย แต่คุณสามารถบันทึกได้ 4 ไบต์โดยใช้Console.Writeแทน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;}

คำอธิบาย

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

2

C # - 151 146 141 138

แรงบันดาลใจจากคำตอบของ @ bacchusbeale

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

Ungolfed

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

1
ดีมากไม่แน่ใจว่าฉันพลาดเรื่องนี้ไปก่อนได้อย่างไร การโอเวอร์โหลดnew Stringนั้นเป็นสิ่งใหม่สำหรับฉัน! ดูเหมือนว่าคุณจะพลาดt=""เวอร์ชันที่ตีกอล์ฟแม้ว่าสิ่งที่ดีกว่าที่จะทำคือเริ่มต้นtเป็น "\ n" คุณสามารถบันทึกคู่ของไบต์โดยผนวกกับtที่คุณพลิกbประหยัด "{}" t+=(b=!b)?"/":"__\\"บนสำหรับวง:
VisualMelon

1
@ คุณสามารถบันทึกอีกสองสามรายการถ้าคุณกำหนดไว้tก่อนหน้านี้sและเพิ่มลงtในสตริงแทนที่จะเป็น"\n")
VisualMelon

1

ไป, 156 144

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

Ungolfed:

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

เคล็ดลับที่แท้จริงเพียงอย่างเดียวที่นี่ (และมันก็ไม่ได้เป็นสิ่งที่ดี) คือการใช้ 3 ตัวสะสมดังนั้นฉันสามารถบีบโซลูชั่นลงไปที่ 1 ลูป

รหัสสามารถเรียกใช้ที่นี่: http://play.golang.org/p/urEO1kIjKv


เพียงใช้c += `__\` แทนif i<n{c+="_"}
MarcDefiant

@MarcDefiant อัปเดตขอบคุณ
Kristoffer Sall-Storgaard

1

> <> (ปลา) , 215 183 156 ไบต์

แก้ไข: Notepad ++ ให้ฉันเพิ่มอีก 5 ไบต์เนื่องจาก CR ดังนั้นจึงนับการแก้ไขตามลำดับ

เพิ่มขึ้นเล็กน้อยกอล์ฟ แต่มันเป็นโปรแกรมปลาครั้งแรกของฉันจนถึงตอนนี้> _ <ความต้องการไม่มีบรรทัดแรกที่ว่างสำหรับสามเหลี่ยม 1 เท่าสองเท่าของขนาดโปรแกรม

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

สามารถทดสอบได้ที่http://fishlanguage.com/ (Int บนสแต็กเริ่มต้นสำหรับความยาว)

คำอธิบาย:

       Start with initial stack as input number
99+0   Push 18 and 0 to the top of the stack
{:}    Shift the stack to the left (wraps), copy the top value, and shift it back to the left (i.e. copy bottom of stack to the top)
1=     Check to see if the top of the stack is equal to 1, pushes 1 for true, 0 for false
?.     If top of stack is zero, skip the ., otherwise jumps to x,y coordinates on top of stack (18,0). This skips the next 8 instructions
~~     Pop the top 2 values from the stack (if they're not popped by the jump)
"  "   Push the string literal "  " onto the stack
oo     Pop the top two values of stack and output them as characters
:2,    Copy top value of stack, ad divide by 2
:1%-   Since ><> uses float division, and doesn't have >= notation, remove the decimal part (if exists)
v      Redirect pointer down
/      Redirect pointer left
:0)    Copy top of stack, and see if its greater than 0 (1 for true, 0 for false)
?!v    If top of stack is non-zero, then ! is executed, which skips the next instruction (redirect), otherwise, code is redirected
"____" Push the literal "____" to the stack
oooo   Pop the top four values of stack and output them as characters
1-     Decrement the top of the stack by 1
!/     Ignore the redirect action.
       When the loop gets to 0, it goes to next line, and gets redirected to the left.
~      Pops the top of the stack (0 counter)
42     Pushes 4 and 2 to the stack
{:}    As before, copies the bottom of the stack to the top
1=?.   Also as before, if the initial value is 1, jump to (2,4) (skipping next 4 instructions
~~     Pop 2 values from stack if these instructions haven't been skipped
ao     Push 10 onto the stack and output it as a character (LF)
"/ "oo Push the literal "/ " onto the stack and output it
://    Copies the top of the stack then redirects to the line below, which then redirects to the left
:0)    Copies top of the stack and compares if its greater than 0
?!v    If it is, redirect to next line
"\"o   Push "\" to stack, then output it as a character
1-     Decrement top value of stack
:0)?!v If loop is not greater than 0, redirect to next line
       Either mode of redirect will loop to the left, and (potentially) skip the far right redirect because of the !
ao     Push 10 to stack and output it as a character (LF)
"/"o~  Push "/" to stack, then output it as a character. Pop top value of stack (the 0 from previous loop)
v      Redirects to next line, which then redirects to the right
:0)?!; If the top of the stack is not greater than 0, terminate (;)
"\__"  Pushes "\__" to the stack
ooo    Outputs top 3 stack values as characters ("__\")
1-     Decrement top of stack by 1
:0)?!; If the top of the stack is not greater than 0, terminate (;)
"/"o   Push "/" to top of stack then output it as a character
1-     Decrement top of stack by 1
!\     Ignore the redirect

1
ล่ามที่ดี! คุณทำเองหรือไม่?
Sp3000

ไม่แม้แต่น้อย : PI ใช้มันอย่างกว้างขวางเพื่อสอนภาษาตัวเอง ... และเพื่อแก้ไขข้อบกพร่อง ฉันเพิ่งเห็นภาษาที่ลอยอยู่รอบ ๆ และคิดว่ามันน่าสนใจมาก (เช่นต้องการลองหินอ่อน)
Fongoid

1

perl 109 108 106 106

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

ฉันคิดว่ามันไม่เป็นไรสำหรับกอล์ฟครั้งแรกของฉันฉันใช้ส่วนของ Vynce สำหรับบรรทัดแรกส่วนที่เหลือของรหัสของฉันเพื่อแก้ไขปัญหาบรรทัดใหม่ด้วยสามเหลี่ยม 1 อัน

ตอนนี้เพื่อดูว่าฉันสามารถย่อให้สั้นลง :)

แก้ไข : ช่องว่าง

แก้ไข 2 : แทนที่"\n"ด้วย$/

1:
 /\
/__\

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

1

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.
ระดับแม่น้ำเซนต์

@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

อาจแสดงผล (หากคุณติดตั้งfiglet ):

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

บันทึก 2 ตัวอักษรหากอินพุตจากตัวแปรแทนที่จะเป็น$1: 103

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

เข้าสู่วง:

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

จะแสดงผล (ประมาณ) เหมือนกัน:

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


 _ _ _ 
(_|_|_)

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

1
คุณควรโพสต์คำถามเกี่ยวกับ codegolf ในการใช้งาน figlet!
sergiol

1

Charcoal , 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-only อ่านสัญลักษณ์แสดงหัวข้อย่อยที่ 4 จาก OP
Veskah


1
@ ASCII-only Breaks on x = 3การแทนที่สตริงคือวิธีที่คุณเลี่ยงการปัดเศษของนายธนาคาร
Veskah

1
@mazzy คุณไม่สามารถสร้างบรรทัดแรกไม่เช่นนั้นจะเป็น102
ASCII เท่านั้น

0

C, 368 ไบต์

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

มันยิ่งกว่านั้นถ้าคุณนับ#includeข้อความ แต่เรียบเรียงเป็น gcc แม้ว่าจะมีคำเตือนโดยไม่มีข้อความเหล่านั้น ฉันรู้ว่ามันไม่ได้สั้นที่สุด แต่ฉันก็ยังชอบที่ฉันทำในซี


แมโคร#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 ขอบคุณแมวเพดาน

วงเล็บเหล่านั้นแนะนำสิ่งที่น้อยกว่า clunky แน่นอน

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.