เอาท์พุทเต็นท์คว่ำลง


27

รับจำนวนเต็มส่งออกเต็นท์คว่ำ

อินพุตกำหนดทั้งขนาดของเต็นท์ (ค่าสัมบูรณ์) และระบุว่าทางเข้าอยู่ทางด้านซ้าย (จำนวนลบ) หรือด้านขวา (ตัวเลขบวก)

If input = -1:
____
\/_/

If input = -2:
________
\  /   /
 \/___/

If input = -3:
____________
\    /     /
 \  /     /
  \/_____/

If input = 1:
____
\_\/

If input = 2:
________
\   \  /
 \___\/

If input = 3:
____________
\     \    /
 \     \  /
  \_____\/

et cetera

โปรดทราบว่าด้านบนของเต็นท์ (เช่นบรรทัดสุดท้าย) มี2 * abs(input) - 1ขีดล่าง

ต้องไม่มีช่องว่างนำหน้าเช่นว่าบรรทัดแรกเริ่มต้นด้วยขีดล่างโดยตรง

0สมมติว่าการป้อนข้อมูลที่ไม่เคยจะเป็น

รหัสของคุณควรสั้นที่สุด

ความท้าทายนี้จะขึ้นอยู่กับความท้าทายมินิแชทโดย Helka Hombaซึ่งได้รับอนุญาตให้นำไปใช้ในความท้าทายที่แท้จริงภายใต้เงื่อนไขของใบอนุญาตสาธารณะงานอดิเรกของเคลวิน


1
ช่องว่างต่อท้ายตกลงหรือไม่ ความหมายเราสามารถส่งออกสี่สาย 12 ความยาว (สี่เหลี่ยม) สำหรับการป้อนข้อมูลได้3หรือไม่
AdmBorkBork

1
@TimmyD พวกเขาจะได้รับอนุญาต
user48538

2
@ TimmyD แน่ใจว่าคนนั้นอาจจะเป็นคนที่หลงทางในสิ่งอื่นเช่นกันฉันไม่แน่ใจว่าที่โซ่เริ่ม ฉันแค่คิดว่าเราได้เห็นสิ่งเหล่านี้เพียงพอแล้ว
นาธาเนียล

5
ฉันล้มเหลวในการดูว่าคำถามนั้นคล้ายคลึงกันจากระยะไกลอย่างไร แน่นอนว่าพวกเขาเป็นทั้งความท้าทายแบบ ASCIIที่มีตัวเลขและให้คุณทำซ้ำสิ่งที่nแต่สิ่งที่ความคล้ายคลึงกันสิ้นสุดลง ถ้ามันใกล้เคียงกับการล่อลวงเราไม่ควรท้าทายความสามารถในแบบ ASCIIอีกต่อไป
DJMcMayhem

2
@ นาธาเนียลแนวทางที่ยอมรับของเราสำหรับความท้าทายสองข้อที่ซ้ำซ้อนคือว่าคำตอบจากหนึ่งสามารถนำกลับมาใช้ (แข่งขัน) ในอื่น ๆ ที่มีการปรับเปลี่ยนน้อยหรือไม่มีเลย การท้าทายนำสิ่งแปลกใหม่มาสู่โต๊ะไม่ใช่ส่วนหนึ่งของแนวทางนั้นหรือไม่ โปรดใช้ downvotes สำหรับความท้าทายที่คุณต้องการกีดกันหรือเพียงเพิกเฉยต่อสิ่งเหล่านี้หากพวกเขาไม่คิดว่าพวกเขาน่าสนใจและปล่อยให้คนที่สนุกกับพวกเขา
Martin Ender

คำตอบ:


11

MATL , 55 53 52 51 ไบต์

|95cy4*Y"DXytPEt0*yvG0>?P_]!'\/ 'w)95JG|G0<yEq:++&(

ลองออนไลน์!

คำอธิบาย

อนุญาตNแสดงว่าอินพุต รหัสดำเนินการในสามขั้นตอน

ครั้งแรกบรรทัดแรกของ 4*Nขีดล่างถูกสร้างเป็นสตริงและแสดงขึ้น (ซึ่งลบออกจากสแต็ก)

ประการที่สอง "กรอบ" ของเต็นท์ถูกสร้างขึ้นโดยใช้เครื่องหมายทับสองประเภท ในการทำเช่นนี้อาร์เรย์ 2D ที่เป็นตัวเลขจะถูกสร้างขึ้นซึ่งมี1และ2สอดคล้องกับเครื่องหมายสแลชทั้งสองประเภทและ0สำหรับพื้นที่

นี่เป็นการเชื่อมโยงสี่เมทริกซ์:

  1. เมทริกซ์ตัวตนของขนาดabs (N);
  2. เมทริกซ์ที่มีขนาดเท่ากันที่บรรจุ2ในเส้นทแยงมุม
  3. เมทริกซ์ null ที่มีขนาดเท่ากัน
  4. สำเนาของเมทริกซ์ 2

การเชื่อมเมทริกซ์ทั้งสี่เหล่านี้เข้าด้วยกันในแนวตั้งให้ใช้N=3เป็นตัวอย่าง4*N × Nเมทริกซ์ต่อไปนี้:

1 0 0
0 1 0
0 0 1
0 0 2
0 2 0
2 0 0
0 0 0
0 0 0
0 0 0
0 0 2
0 2 0
2 0 0

(ซึ่งย้ายไปเริ่มดูเหมือนเต็นท์)

ตอนนี้เราดูแลสัญลักษณ์ของอินพุต '\/ 'ถ้ามันเป็นบวกเราก็ไขว้เมทริกซ์ข้างต้นและดัชนีลงในสตริง การจัดทำดัชนี 1-based และแบบแยกส่วนเพื่อให้1กลายเป็น'\', 2กลายเป็น'/'และ0จะกลายเป็น' 'การผลิตแถวถ่าน 2D

\    /     /
 \  /     / 
  \/     /  

ในทางกลับกันถ้าอินพุตเป็นลบเราจะพลิก4*N × Nเมทริกซ์ในแนวตั้งและลบเลขคณิตในการคำนวณ

-2  0  0
 0 -2  0
 0  0 -2
 0  0  0
 0  0  0
 0  0  0
-2  0  0
 0 -2  0
 0  0 -2
 0  0 -1
 0 -1  0
-1  0  0

ดัชนี-1ตอนนี้หมายถึง'/'และเพื่อ-2 '\'นั่นคือสแลชทั้งสองประเภทได้รับการสับเปลี่ยนตามที่ต้องการ transposing และทำดัชนีลงในสายอักขระอีกครั้ง'\/ 'จึงให้เต็นท์ที่กลับด้าน:

\     \    /
 \     \  / 
  \     \/  

ประการที่สามขีดล่างต้องถูกกรอกเป็นส่วนหนึ่งของแถวสุดท้ายของอาร์เรย์ถ่าน 2 มิติ abs(N)ตำแหน่งแนวนอนของสายนี้ขึ้นอยู่กับสัญญาณของการป้อนข้อมูลและความยาวของมันคือ

เมื่อช่องว่างที่เกี่ยวข้องถูกแทนที่ด้วยเครื่องหมายขีดล่างผลลัพธ์จะปรากฏโดยปริยายใต้บรรทัดเริ่มต้นของขีดล่างที่แสดงอยู่แล้วในขั้นตอนแรก


ไม่ควรขีดเส้นใต้ที่จุดเริ่มต้นเป็นช่องว่างหรือไม่
DJMcMayhem

@DJMcMayhem ขออภัยคุณหมายถึงอะไร
Luis Mendo

เมื่อฉันเรียกใช้รหัสของคุณบรรทัดแรกคือขีดเส้นใต้ทั้งหมด zyabin ที่ให้ผลผลิตไม่ได้มีสิ่งนั้น
DJMcMayhem

@DJMcMayhem ฉันไม่ได้ติดตาม บรรทัดแรกในกรณีทดสอบคือขีดล่างใช่ไหม? และคำตอบอื่น ๆ (ไม่ใช่ของคุณ) ก็ทำเช่นนั้นด้วย?
Luis Mendo

1
@DJMcMayhem :-D แปลกจริง ๆ ลองเบราว์เซอร์อื่นหรือไม่?
Luis Mendo

9

Javascript (ES6), 139 ไบต์

สร้างเต็นท์แบบวนซ้ำ:

f=(N,n=N>0?N:-N,i=0,r=(j,i)=>' _'[i||0].repeat(j),a=`\\${r(i)}/`,b=r(n*2+i-1,+!i))=>n--?f(N,n,i+2)+`
`+r(n)+(N<0?a+b+'/':'\\'+b+a):r(i*2,1)

Ungolfed และแสดงความคิดเห็น

f = (
  N,                                  // N is the original parameter (remains unchanged)
  n = N > 0 ? N : -N,                 // n is initialized to abs(N)
  i = 0,                              // i is the row counter (*2)
  r = (j, i) => ' _'[i||0].repeat(j), // helper function to repeat ' ' or '_' j times
  a = `\\${r(i)}/`,                   // a = '\ /' pattern
  b = r(n*2+i-1, +!i)                 // b = padding pattern filled with ' ' or '_'
) =>
  n-- ?                               // if we haven't made it yet to the top row:
    f(N, n, i+2) + `\n` +             //   - compute next row(s) / append line break
    r(n) +                            //   - append leading spaces
    (N < 0 ? a+b+'/' : '\\'+b+a)      //   - append a/b patterns according to N sign
  :                                   // else:
    r(i*2, 1)                         //   - return top row, made of '_' characters

ตัวอย่าง

var f=(N,n=N>0?N:-N,i=0,r=(j,i)=>' _'[i||0].repeat(j),a=`\\${r(i)}/`,b=r(n*2+i-1,+!i))=>n--?f(N,n,i+2)+`
`+r(n)+(N<0?a+b+'/':'\\'+b+a):r(i*2,1)

console.log(f(3));
console.log(f(-4));


6

Python 2, 143 141 139 138 137 ไบต์

-2 bytes ต้องขอบคุณ @ Sp3000 (ไม่จำเป็นต้องใส่วงเล็บ exec ใน Python 2)
-1 byte ด้วย @ Sp3000 (การใช้งานcmp)

def f(n):d=cmp(n,0);a,b='\/'[::-d];s=n*d;x=2*s-1;y=4*s;print'_'*y;i=0;exec"print' '*i+(b+' '*(y-3-x-i-i)+a+'_ '[s-i>1]*x+a)[::d];i+=1;"*s

ทดสอบที่ideone

ก่อนอื่นเรามาดูกันว่าnมันเป็นลบและทำให้d +1เป็น-1ถ้าไม่ใช่หรือไม่
จากนั้นเราเลือกเครื่องหมายสแลชสองอันaและbใช้dเช่นนั้นa='\', b='/'เมื่อnเป็นบวกและa='/', b='\'เมื่อใดnเป็นลบ
ชุดเราต่อไปซึ่งอาจทำได้โดยs=abs(n) จากนั้นเราคำนวณจำนวนที่ด้านบน (ด้านล่างของภาพ) ซึ่งเป็นจำนวนของด้านข้างของเต็นท์ด้วย จากนั้นเราคำนวณจำนวนที่ฐานของเต็นท์ (ด้านบนของรูปภาพ) และเก็บไว้เนื่องจากจะใช้ในการวนรอบเพื่อสร้างส่วนที่เหลือของเต็นท์ ตอนนี้เราพิมพ์ฐานของเต็นท์ใช้ s=n*d
_x=2*s-1
_y=4*s
print'_'*y
จากนั้นเราพิมพ์ส่วนที่เหลือของเต๊นท์โดยดำเนินsการคำสั่งการพิมพ์ด้วยตัวแปรวนลูปiเริ่มต้น0ซึ่งเพิ่มขึ้นโดย1สำหรับแต่ละคำสั่งการพิมพ์
ส่วนที่เหลือของเต็นท์แล้วมีy-3-x-i-iช่องว่างในประตูและxช่องว่างในร่างกายจนด้านบนจะถึงเมื่อs-i>1ประเมินการเท็จ, การเลือกจาก_ สำหรับบวกซ้ายประตูเต็นท์ทั้งหมดของเต็นท์ไม่รวมช่องว่างนำคือกลับไปหน้าดังนั้นจึงเป็นสิ่งที่ตรงกันข้ามในขณะที่ในเชิงบวก 'ขวาประตูเต็นท์ไม่ได้อยู่กับ'_ '
[::d]


@ Sp3000 cmp(0,0)กลับมาอย่างน่าเสียดาย0
Jonathan Allan

5

Python 2, 121 ไบต์

def f(n):i=k=abs(n);print'_'*k*4;exec"print' '*(k-i)+r'\\\%%s%\*%c%%*sc/'[n<0::2]%(' _'[i<2]*(2*k-1))%(2*i-1,47);i-=1;"*k

การจัดรูปแบบสตริงจำนวนมาก


5

C #, 215 214 ไบต์

string t(int N){var n=N<0;N=n?-N:N;var t=new string('_',4*N);for(int i=0;i<N;){string f=new string(i<N-1?' ':'_',2*N-1),p=new string(' ',2*N-2*i-2);t+='\n'+new string(' ',i++)+'\\'+(n?p+'/'+f:f+'\\'+p)+'/';}return t;}

มีความเป็นไปได้ที่จะบันทึกไม่กี่ไบต์เมื่อใช้งานusing s=string;ล่วงหน้า

s t(int N){var n=N<0;N=n?-N:N;var t=new s('_',4*N);for(int i=0;i<N;){s f=new s(i<N-1?' ':'_',2*N-1),p=new s(' ',2*N-2*i-2);t+='\n'+new s(' ',i++)+'\\'+(n?p+'/'+f:f+'\\'+p)+'/';}return t;}

ซึ่งจะเป็น 15 (โดยใช้) + 184 (เมธอด) = 199 ไบต์


5
ยินดีต้อนรับสู่ PPCG, BackFromExile!
Erik the Outgolfer

ขอต้อนรับสู่ PPCG! คำตอบแรกที่ดีมาก +1 ฉันพยายามที่จะหาอะไรที่จะเล่นกอล์ฟ (ค่อนข้างนานตั้งแต่ฉันเขียนโปรแกรมใน C #) และในที่สุดก็สามารถหาสิ่งเดียวสำหรับ -1 ไบต์: ถ้าคุณเปลี่ยนครั้งแรกvarภายใน for-loop เป็นstringคุณสามารถลบ วินาทีvar (รวมถึงพื้นที่เพื่อบันทึกไบต์) ดังนั้นvar fจะกลายเป็นstring fและจะกลายเป็น;var p= ,p=
Kevin Cruijssen

4

TSQL, 195 ไบต์

แข็งแรงเล่นกอล์ฟ:

DECLARE @ INT=-2
DECLARE @b INT=ABS(@),@i INT=0PRINT REPLICATE('_',4*@b)z:SET @i+=1PRINT SPACE(@i-1)+'\'+STUFF(REPLICATE(IIF(@i<@b,' ','_'),4*@b-2*@i),@b*2-IIF(@<0,@i*2-1,0),1,IIF(@<0,'/','\'))+'/'IF @i<@b GOTO z

Ungolfed:

DECLARE @ INT=-2

DECLARE @b INT=ABS(@),@i INT=0

PRINT REPLICATE('_',4*@b)
z:
  SET @i+=1
  PRINT 
    SPACE(@i-1)+'\'
    +STUFF(REPLICATE(IIF(@i<@b,' ','_'),
      4*@b-2*@i),@b*2-IIF(@<0,@i*2-1,0),1,IIF(@<0,'/','\'))
    +'/'
IF @i<@b GOTO z

ซอ


4

V , 66 ไบต์

é /ä
"aDoÀñá_>ñ^hr\A\/ò^hÄX$2é_Ó_/ òÄÒ_ñ/-
ddÍܨ[ _]*©Ü¨ *©/ܲ¯±

ลองออนไลน์!

นี่เป็นวิธีการที่ไร้เดียงสาดังนั้นฉันจะลองตีมันอีกในวันนี้ โซลูชันนี้มีอักขระที่ไม่สามารถพิมพ์ได้ดังนั้นนี่คือ hexdump:

0000000: e920 2fe4 0a22 6144 6f1b c0f1 e15f 3ef1  . /.."aDo...._>.
0000010: 5e68 725c 415c 2f1b f25e 68c4 5824 32e9  ^hr\A\/..^h.X$2.
0000020: 5fd3 5f2f 20f2 c4d2 5ff1 2f2d 0a64 64cd  _._/ ..._./-.dd.
0000030: dca8 5b20 5f5d 2aa9 dca8 202a a92f dcb2  ..[ _]*... *./..
0000040: afb1                                     ..

4

05AB1E , 52 ไบต์

Ä©'_4®*×,FNð×'\®·<N>®Qi'_ëð}×®N>-·ð×®¹Qi'\ës'/}s'/J,

คำอธิบาย

                                                     # implicit input, call this A
Ä©                                                   # store abs(A) in register for later use
  '_4®*×,                                            # print 4*A underscores (tent floor)
         F                                           # for each non-floor section in range(N)
          Nð×'\                                      # push N spaces at the beginning of the 
                                                     # row followed by a backslash
                  N>®Qi'_ëð}                         # if we're on the last row push an
                                                     # underscore, else a space
               ®·<          ×                        # repeat that char abs(A)*2-1 times
                             ®N>-·ð×                 # push 2*(abs(A)-(N+1)) spaces
                                    ®¹Qi'\ës'/}      # if input is positive push backslash
                                                     # else push a slash
                                               s'/   # move that char between the 2 sections
                                                     # of spaces
                                                  J, # join the row and print

ลองออนไลน์!


4

PowerShell v2 +, 217 205 190 187 184 ไบต์

param($b)"_"*(($a=[math]::Abs($b))*4);$z,$y='/\'[($b=$b-lt0),!$b]
((($x=1..$a|%{($w=" "*($_-1))+$z+" "*(2*($a-$_))+$y+(' ','_')[$_-eq$a]*($a*2-1)+$y+$w})|%{-join$_[($a*4)..0]}),$x)[$b]

รับอินพุต$bเป็นจำนวนเต็ม โปรดทราบว่าหาก$bเป็นค่าลบคุณจะต้องล้อมรอบมันด้วย parens อย่างชัดเจนเพื่อให้เหมาะสม (ดูตัวอย่าง) มิฉะนั้น PowerShell จะคิดว่าเป็นสตริง

ไม่ว่าทิศทางของเต็นท์จะหันไปทางใดบรรทัดแรกก็เหมือนกัน ที่4*abs(input)จริงแล้วพวกเขาหลายคน หมายเลขดังกล่าวจะถูกเก็บไว้$aเพื่อใช้ในภายหลัง นอกจากนี้ตอนนี้ที่เรามีค่าสัมบูรณ์ของ$bเก็บไว้ใน$aเราหัน$bเป็นบูลีนสำหรับการเข้าสู่ระบบของตนและเลือกทับของเราเก็บไว้ในและ$y$z

บรรทัดถัดไปคือการสร้างและกำหนดผลลัพธ์และมันก็ดูดีดังนั้นขอแบ่งมันออกมา

เรากำลังจัดทำดัชนีหลักลงในอาร์เรย์สององค์ประกอบที่(big long calculations saved into $x)หรืออยู่บนพื้นฐานของ$x$b

การคำนวณเป็นที่ที่ตัวเต็นท์ถูกสร้างขึ้น 1..$a|%{...}เราห่วงจาก การวนซ้ำแต่ละครั้งเรากำลังสร้างแถวตัวเต็นท์ เราเริ่มต้นด้วยช่องว่างจำนวนหนึ่งเท่ากับบรรทัด # ที่เราเปิดอยู่-1เพื่อให้จัดชิดซ้ายอย่างเหมาะสม ที่จัดเก็บไว้ใน$wภายหลังและตัดแบ่งด้วยเครื่องหมายทับ ($ z ตาม$b) จากนั้นตามจำนวนช่องว่างของช่องประตูจากนั้นทับอีกช่องจาก$yนั้นขีดเส้นใต้หรือช่องว่างขึ้นอยู่กับว่าเราอยู่บนบรรทัดล่างหรือไม่ จากนั้นสแลชอีก$yอันและสุดท้ายก็เป็นจำนวนที่เหมาะสมของช่องว่างต่อท้าย ( $w) เพื่อสร้างสตริงสี่เหลี่ยม $xที่ส่งผลให้อาเรย์ของสตริงถูกเก็บไว้ใน

หากเลือกครึ่งซ้ายของอาเรย์ (นั่น$bคือFalseเนื่องจากอินพุตเป็นค่าบวก) ดังนั้นเราจำเป็นต้องวนซ้ำ$xและย้อนกลับรายการโฆษณาแต่ละรายการ - นี่คือที่ที่ช่องว่างต่อท้ายเข้ามาเล่น มันช่วยให้เราสามารถย้อนกลับเส้นตรงแทนที่จะคำนวณระยะทางใหม่

ถ้า$bเป็นTrueเช่นนั้น$xจะเลือกครึ่งทางขวาของอาร์เรย์แทน

ไม่ว่ากรณีใดตอนนี้ไปป์ไลน์จะมีอาร์เรย์ของสตริง เอาท์พุทโดยปริยายWrite-Outputเกิดขึ้นเมื่อโปรแกรมเสร็จสมบูรณ์โดยขึ้นบรรทัดใหม่ระหว่างองค์ประกอบ

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (-5)
____________________
\        /         /
 \      /         / 
  \    /         /  
   \  /         /   
    \/_________/    

PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (4)
________________
\       \      /
 \       \    / 
  \       \  /  
   \_______\/   

3

Haskell, 187 184 183 ไบต์

f x=unlines$[(n*4)%'_']++((' '#)<$>[0..n-2])++['_'#(n-1)]where m#i=i%' '++'\\':m!i++"/";m!i|x>0=(2*n-1)%m++'\\':(2*(n-i-1))%' '|q<-2*(n-i-1)=q%' '++'/':(2*n-1)%m;n=abs x;m%c=c<$[1..m]

ฉันรู้สึกว่านี่ไม่ใช่คะแนนที่ยอดเยี่ยมสำหรับ Haskell ดังนั้นยินดีต้อนรับความคิดเห็นใด ๆ สำหรับการปรับปรุง

  • บันทึก 3 ไบต์ด้วย@Myridium
  • บันทึก 1 ไบต์ขอบคุณ@nimi

Ungolfed

tent :: Int -> String
tent x = unlines $ [replicate (n*4) '_'] ++ (row ' '<$>[0..n-2]) ++ [row '_' (n-1)]
    where row m i = replicate i ' ' ++ "\\" ++ dir m i ++ "/"
          -- direction selector
          dir m i | x > 0 = side m ++ "\\" ++ entrance i ' '
                  | 1 > 0 = entrance i ' ' ++ "/" ++ side m
          side = replicate (2*n-1)
          entrance i = replicate (2*(n-i-1))
          n = abs x

ดีกว่า 290 ไบต์ฉันกำลังจะโพสต์ ...
Myridium

คุณไม่ควรเพิ่มmainเพื่อให้มันยอมรับstdinว่าเป็นอินพุตหรือไม่
Myridium

คุณสามารถโพสต์ฟังก์ชั่นเดียวเว้นแต่คำถามจะระบุเป็นอย่างอื่น มีเมตาดาต้าสำหรับกฎทั่วไปในการตอบฉันจะพยายามค้นหาให้คุณ
sudee

1
คุณสามารถบันทึก 2 ไบต์โดยการเปลี่ยนที่ที่คุณเติมอักขระเดียวเพื่อใช้:อักขระ คือการเปลี่ยนแปลงไป"\\" ++ entrance... '\\':entrance
Myridium

1
อย่าเสีย "อย่างอื่น" ยาม : คุณสามารถเปลี่ยนไป|1>0=(2*(n-i-1))%' ' |q<-2*(n-i-1)=q%' '
nimi

2

C, 240 207 193 ไบต์

#define P putchar
a,j,l,m;g(x,y,z){for(m=y+z+1;m--;P(m^z?l?32:95:x));}f(n){g(32,(a=abs(n))*4,0);for(P(10),j=2*(l=a)-1;l--;){for(m=a;--m>l;P(32));P(92);m=n>0?g(92,j,l*2):g(47,l*2,j);puts("/");}}

ในครั้งนี้ฉันปรับฟังก์ชั่น g (... ) เพื่อใช้งานลูปเดี่ยว

#define P putchar
a,j,l,m;g(x,y,z){for(;y--;P(l?32:95));for(P(x);z--;P(l?32:95));}f(n){g(32,(a=abs(n))*4,0);l=a;j=2*a-1;P(10);for(;l--;){for(m=a;--m>l;P(32));P(92);m=n>0?g(92,j,l*2):g(47,l*2,j);puts("/");}}

เวลานี้มาโคร X ดีกว่าเนื่องจากฟังก์ชัน g (... ) และเนื่องจาก y และ z เป็นพารามิเตอร์ในขอบเขตใหม่ฉันจึงสามารถลดมันลงในขอบเขตของ g

#define P putchar
#define X(x,y,z){for(k=0;k++<y;P(l?32:95));P(x);for(k=0;k++<z;P(l?32:95));}
a,i,j,k,l,m;f(n){for(l=a=abs(n);i++<a*4;P(95));j=2*a-1;P(10);while(l--){for(m=a;--m>l;P(32));P(92);if(n>0)X(92,j,l*2)else X(47,l*2,j)puts("/");}}

ทดสอบกับฟังก์ชั่นหลักนี้ สิ่งนี้จะทำให้กอล์ฟเล็กลงมาก

main(c,v)char**v;
{
    f(atoi(v[1]));
}

2

C # 241 231 ไบต์

บันทึก 10 ไบต์ด้วย @Kevin Cruijssen

using s=System.String;s f(int N){var f=N<0;N=N>0?N:-N;var o=new s('_',N*4);for(int j=0,z;j<N;){z=-2*j+2*N-2;var O=j>N-2?'_':' ';o+='\n'+new s(' ',j)+'\\'+new s(' ',z)+(f?'/':O)+new s(O,j++*2)+(f?O:'\\')+new s(' ',z)+'/';}return o;}

เวอร์ชั่นเก่า:

string f(int N){var f=N<0;N=N>0?N:-N;var o=new string('_',N*4);for(int j=0;j<N;){int z=-2*j+2*N-2;var O=j>N-2?'_':' ';o+='\n'+new string(' ',j)+'\\'+new string(' ',z)+(f?'/':O)+new string(O,j++*2)+(f?O:'\\')+new string(' ',z)+'/';}return o;}

แต่เดิมมีnew string(...)เพียงFunc<char,int,string>แต่บันทึกหนึ่งไบต์โดยใช้ตัวสร้าง ฉันหวังว่าint-> charมีความหมายโดยนัย

ค่อนข้างแน่ใจว่าคณิตศาสตร์ของฉันสามารถแก้ไขได้เช่นกัน แต่ฉันมองไม่เห็น


1
คุณสามารถตีกอล์ฟเพิ่มได้อีก แรกของทั้งหมดที่คุณสามารถเอาint ก่อนโดยเพิ่มสำหรับวง:z= int j=0,zและเนื่องจากคุณใช้งานstringค่อนข้างมากคุณสามารถใช้นามแฝงได้using s=System.String;ดังนั้นผลรวมจะกลายเป็น: using s=System.String;s f(int N){var f=N<0;N=N>0?N:-N;var o=new s('_',N*4);for(int j=0,z;j<N;){z=-2*j+2*N-2;var O=j>N-2?'_':' ';o+='\n'+new s(' ',j)+'\\'+new s(' ',z)+(f?'/':O)+new s(O,j++*2)+(f?O:'\\')+new s(' ',z)+'/';}return o;}( 231 ไบต์ )
Kevin Cruijssen

1

Swift 2.2 421 ไบต์

ดี ... นี่คือความพยายาม

แข็งแรงเล่นกอล์ฟ:

let t={(s:String,n:Int)->String in return String(count:n,repeatedValue:Character(s))};let e={(n:Int)in var w=[String]();w.append(t("_",abs(n)*4));let c = abs(n);let d = n>0 ? "/": "\\";let f = n>0 ? "\\": "/";for var i in 0...abs(n)-1 {w.append(t(" ",i)+d+t(" ",c*2-2-(2*i))+f+(i<c-1 ?t(" ",2*c-1)+f:t("_",2*c-1)+f)+(n>0 ?t(" ",i):""));};w=n<0 ?w:w.map(){String($0.characters.reverse())};print(w.joinWithSeparator("\n"))}

UnGolfed:

let t={(s:String,n:Int) -> String in
    return String(count:n,repeatedValue:Character(s))
};
let e={(n:Int) in
    var w=[String]();
    w.append(t("_",abs(n)*4));
    let c = abs(n);
    let d = n>0 ? "/": "\\";
    let f = n>0 ? "\\": "/";
    for var i in 0...abs(n)-1 {
        w.append(t(" ",i)+d+t(" ",c*2-2-(2*i))+f+(i<c-1 ?t(" ",2*c-1)+f:t("_",2*c-1)+f)+(n>0 ?t(" ",i):""));
    };
    w=n<0 ?w:w.map(){String($0.characters.reverse())};
    print(w.joinWithSeparator("\n"))
}

1

PHP, 143 ไบต์

$t=str_repeat;echo$t(_,4*$s=$k=abs($n=$argv[1]));for(;$k--;$p.=" "){$f=$t("  ",$k);$r=$t($k?" ":_,2*$s-1);echo"
$p\\",$n<0?"$f/$r/":"$r\\$f/";}

ทำงานด้วย php -r '<code>' <parameter>

ทำให้พังถล่ม

$t=str_repeat;  // function name to variable saves 10-1 bytes
echo$t(_,4*$s=$k=abs($n=$argv[1])); // print bottom
for(
    ;
    $k--;   // $k from abs($n-1) to 0
    $p.=" "                 // create padding
)
{
    $f=$t("  ",$k);         // create front
    $r=$t($k?" ":_,2*$s-1); // create side/roof
    echo"\n$p\\",$n<0
        ?"$f/$r/"   // print, entrance left
        :"$r\\$f/"  // print, entrance right
    ;
}

1

แบตช์ 289 ไบต์

@echo off
set/pn=
set u=
for /l %%i in (2,1,%n:-=%)do call set u=_%%u%%_
echo _%u%__%u%_
set l=
set m=%u%/_%u%
if %n% gtr 0 set m=%u%_\%u%
set m=%m:_= %
for /l %%i in (2,1,%n:-=%)do call:l
set m=%m: =_%
:l
echo %l%\%m%/
set l= %l%
if %n% gtr 0 set m=  %m:~0,-2%
set m=%m:~2%

ใช้อินพุตบน STDIN เริ่มต้นด้วยการสร้างสตริงของ2*(abs(n)-1)ขีดล่าง ซ้ำแล้วซ้ำอีกบวกอีก 4 ขีดสำหรับฐานของเต็นท์ ส่วนที่เหลือของเต็นท์แล้วประกอบด้วยเยื้อง (ซึ่งเพิ่มขึ้น 1 ในแต่ละบรรทัด) ซึ่งเป็นตรงกลางของเต็นท์และ\ /กลางเต็นท์เริ่มต้นเป็น2*(abs(n)-1)ช่องว่างบวกอย่างใดอย่างหนึ่ง\หรือ/บวกช่องว่าง (ซึ่งฉันไม่สามารถเป็นตัวแทนใน Markdown) รวมทั้ง2*(abs(n)-1)ช่องว่างอื่น ฉันใช้สตริงขีดเส้นใต้อีกครั้งและเปลี่ยนเป็นช่องว่างเพื่อความสะดวก แต่เปลี่ยนช่องว่างกลับเป็นขีดล่างสำหรับบรรทัดสุดท้าย แต่ละบรรทัดจะลบช่องว่างสองช่องออกจากด้านหนึ่งของกลางเต็นท์แม้ว่านักกอล์ฟจะเล็กน้อยที่จะย้ายช่องว่างทั้งสองไปยังจุดเริ่มต้นของสตริงก่อนถ้าจำเป็น


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