ความท้าทายทางเรขาคณิต


23

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

การป้อนข้อมูล

อินพุตจะอยู่ในรูปแบบของ (shapeIdentifier)(size)(inverter)การป้อนข้อมูลจะอยู่ในรูปแบบของ

แต่รูปร่างคือตัวระบุขนาดและอินเวอร์เตอร์คืออะไร

ตัวระบุรูปร่างเป็นตัวระบุสำหรับประเภทของรูปร่างที่คุณจะทำกับ*s ต่อไปนี้เป็นตัวระบุรูปร่าง:

  • s - จัตุรัส
  • t - สามเหลี่ยม

ขนาดจะอยู่ระหว่าง1-20และเป็นขนาดของรูป

อินเวอร์เตอร์เป็นหรือไม่รูปร่างจะถูกลงคว่ำซึ่งจะเขียนแทนด้วยหรือ+ -หมายเหตุ: s3-== (เท่ากับ) s3+เพราะกำลังสองเป็นสมมาตร อย่างไรก็ตามt5-! = t5+(ไม่เท่ากับ)

ช่องว่างต่อท้ายนั้นไม่เป็นไรในผลลัพธ์ แต่ช่องว่างชั้นนำไม่

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

Input: s3+
Output:
***
***
***

Input: t5+

Output:
  *
 ***
*****

Input: t3-
Output:
***
 *

หมายเหตุพิเศษ

อินพุตสามเหลี่ยมจะเป็นเลขคี่เสมอดังนั้นสามเหลี่ยมจะลงท้ายด้วย 1 *ที่ด้านบนเสมอ

ขนาดของรูปสามเหลี่ยมคือขนาดของฐานถ้าอินเวอร์เตอร์เป็น และมีขนาดของด้านบนถ้าอินเวอร์เตอร์เป็น+-


3
ในฐานะคนที่กำลังใช้รูปทรงเรขาคณิตตอนนี้ (และกำลังศึกษาเพื่อหารูปทรงเรขาคณิตขั้นสุดท้าย) ฉันสามารถพูดด้วยความมั่นใจ 100%: รูปทรงเรขาคณิตนั้นแน่นอนไม่สนุกเลย ... D:
Ashwin Gupta

คำตอบ:


9

Pyth, 40 36 34 32 ไบต์

-1 ไบต์โดย @isaacg

JstPz_W}\+zjl#m.[J*\*-J*}\tzyd;J

เครื่องหมายอัฒภาคภายในแลมบ์ดาตอนนี้เป็นค่าทั่วโลกของตัวแปรแลมบ์ดาซึ่งเป็นคุณลักษณะที่ช่วยประหยัดหนึ่งไบต์

                         Implicit: z = input
JstPz                    J = size.
_W }\+z                  Reverse if "+" in z
j l# m                J  Join the nonempty lines in map lambda d:... over range(J)
      .[J            ;   Pad the following with spaces (;) to length J
         *\*               "*", this many times:
            -J*}\tzyd        J if "t" not  in z,
                             otherwise the correct number for a triangle.

ลองมันนี่

ชุดทดสอบ


1
นานเกินไป แต่เต้น Japt by 15 bytes? ฉัน
แทบ

ทางออกที่ดี! คุณสามารถบันทึกไบต์โดยแทนที่qez\+ด้วย}\+zเพราะ+สามารถปรากฏในตำแหน่งสุดท้ายเท่านั้น
isaacg

6

Pyth, 38 ไบต์

JsPtzj?}\szm*\*JJ_W}\-zm.[J*\*hyd;/hJ2

ชุดทดสอบ

ตรงไปตรงมาตามที่ได้รับ ฉันหวังว่าฉันจะสามารถรวมตรรกะบางอย่างเข้ากับสองรูปร่าง แต่ปัจจุบันแยกออกจากกัน


5

JavaScript (ES6), 142 146 147

แก้ไข 1 ไบต์บันทึก thx @ETHproductions แก้ไข 2 ไบต์ sve thx @ user81655

i=>([,a,b]=i.match`.(.+)(.)`,Array(l=i<'t'?+a:-~a/2).fill('*'.repeat(a)).map((r,i)=>l-a?(' '.repeat(i=b<'-'?--l:i)+r).slice(0,a-i):r).join`
`)

ทดสอบ (ทำงานใน FireFox)

F=i=>(
  [,a,b]=i.match`.(.+)(.)`,
  Array(l=i<'t'?+a:-~a/2).fill('*'.repeat(a))
  .map((r,i)=>l-a?(' '.repeat(i=b<'-'?--l:i)+r).slice(0,a-i):r)
  .join`\n`
)

function test() { O.textContent=F(I.value) }

test()
Input: <input id=I oninput="test()" value="t11-"/>
<pre id=O></pre>


\d-> .เนื่องจากมีการรับประกันว่าไม่ใช่ตัวเลขหนึ่งหลักก่อนและหลัง
ETHproductions

@ETHproductions ถูกต้องขอบคุณ
edc65

ดี ฉันคิดว่านี่เป็นอัลกอริทึมที่ดีที่สุดใน JS ไม่สามารถหาอันที่สั้นกว่านี้ได้
ETHproductions

i.match(/.(.+)(.)/)->i.match`.(.+)(.)`
user81655

@ user81655 คำใบ้ที่ดีขอบคุณ
edc65

5

Python 2, 106 ไบต์

s=raw_input()
n=int(s[1:-1])
for i in[range(1,n+1,2),n*[n]][s<'t'][::2*('+'in s)-1]:print('*'*i).center(n)

เอาท์พุทเป็นรูปสี่เหลี่ยมผืนผ้าที่สมบูรณ์แบบแต่ละบรรทัดมีช่องว่างท้ายซึ่งฉันคิดว่าโอเคตามความเห็นใน OP

หมายเหตุ: ฉันยังไม่แน่ใจว่าinputได้รับอนุญาตใน Python 2 หรือไม่สำหรับปัญหาเช่นนี้ ...


4

Japt, 62 60 55 52 51 ไบต์

V=Us1 n;U<'t?Vo ç*pV):0oV2 £S²pY iY'*pV-X})·z2*!Uf-

ลองออนไลน์!

สิ่งแรกที่เราต้องทำคือหาว่ารูปร่างของเรานั้นใหญ่แค่ไหน มันค่อนข้างง่าย:

      // Implicit: U = input string, S = space
V=    // Set variable V to
Us1   // everything after the first char of U,
n;    // converted to a number. This turns e.g. "12+" into 12.

ตอนนี้เราจัดระเบียบรูปร่างของผลลัพธ์:

U<'t?      // If U comes before "t" lexicographically (here, if the first char is "s"),
Vo         //  make a list of V items,
ç*pV)      //  and set each item to V asterisks.
:0oV2      // Otherwise, create the range [0, V) with steps of 2 (e.g. 7 -> [0,2,4,6]),
£       }) //  and map each item X and index Y to:
S²pY       //   Repeat 2 spaces Y times. This creates a string of Y*2 spaces.
iY'*pV-X   //   At position Y in this string (right in the middle), insert V-X asterisks.
·          // Join with newlines.

โดยตอนนี้เราได้ดูแลขนาดและรูปร่างของผลผลิต สิ่งที่เหลือคือการหมุน สามเหลี่ยมกำลังชี้ขึ้นดังนั้นเราจำเป็นต้องพลิกพวกมันถ้าถ่านตัวที่สามเป็น+ :

!Uf-    // Take the logical not of U.match("-").
        // If U contains "-", this returns false; otherwise, returns true.
2*      // Multiply by two. This converts true to 2, false to 0.
z       // Rotate the list 90° that many times.
        // Altogether, this turns the shape by 180° if necessary.

งานของเราที่นี่ก็เสร็จเรียบร้อยแล้ว :-)


4

Python 2, 235 193 167 157 Bytes

ปรับปรุง:

เพิ่มประสิทธิภาพที่สำคัญบางอย่างโดยใช้ list comprehensions and str.center () ฉันมีความรู้สึกว่าฉันสามารถทำอะไรได้มากกว่านี้อีกแล้วจะได้ดูใหม่ในภายหลัง

อัปเดต 2

บันทึก 10 ไบต์ด้วยคำแนะนำของ Sherlock9 ขอบคุณมาก! :)

d=raw_input()
x=int(d[1:-1])
o="\n".join("*"*x for i in range(x))if d<"t"else"\n".join(("*"*i).center(x)for i in range(x,0,-2))
print o[::-1]if"+"in d else o

คำตอบเก่า

d=raw_input()
x=int(d[1:-1])
if "s" in d:
 for y in range(x):
    o+="*"*x+"\n"
 o=o[:-1]
else:
 b=0
 while x+1:
    o+=" "*b+"*"*x+" "*b+"\n"
    x-=2
    b+=1
 o=o[:-1]
 if d[-1]=="+":
    o=o[::-1]
print o

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

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

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


คุณนับได้อย่างไร เมื่อใช้wcสิ่งนี้จะทำให้ฉันมีจำนวนไบต์ที่ 235 ฉันผิดหรือเปล่า?
ბიმო

1
นี่คือ 235 ไบต์ คำแนะนำการเล่นกอล์ฟ: ใช้แท็บแทนสองช่องว่างซึ่งใช้ได้ใน Python 2 และจะตัดออก 5 ไบต์
Doorknob

นอกจากนี้คุณไม่จำเป็นต้องใช้การraw_inputใช้inputช่วยให้คุณประหยัด 4 ไบต์ ยิ่งไปกว่านั้นคุณไม่จำเป็นต้องใช้วงเล็บในบรรทัดที่สองและการไม่ใช้ตัวแปรxเลย (โดยใช้if"s"in d) จะช่วยให้คุณประหยัดอีก 9 ไบต์
ბიმო

2
@DenkerAffe เมื่อนับในหน้าต่างลบ 1 ไบต์สำหรับแต่ละบรรทัดใหม่ - บรรทัดใหม่คือ 2 ไบต์ใน Windows แต่ 1 ไบต์ในสภาพแวดล้อมอื่น ๆ
edc65

1
ก่อนอื่นคุณสามารถลบ[]วงเล็บในแต่ละการjoinเรียกฟังก์ชัน ที่สองif d<"t"elseสั้นกว่าและใช้งานได้เพราะ"s3+"<"t"<"t3+"ใน Python ประการที่สามและelse"\n".join .center(x)forไม่มีที่ว่าง. มันไม่จำเป็น ประการที่สี่การprint o[::-1]if"+"in d else oที่ผมจัดใหม่สิ่งที่สองไบต์ (หนึ่งช่องว่างระหว่าง]และifและอีกระหว่างifและ "+".
Sherlock9

3

JavaScript ขนาด 220 ไบต์

q=s=>+s.slice(1,s.length-1);f=s=>s[0]=="s"?("*".repeat(q(s))+"\n").repeat(q(s)):Array.apply(0,Array(-~(q(s)/2))).map((_,n)=>(s[s.length-1]=="-"?~~(q(s)/2)-n:n)).map(n=>(" ".repeat(q(s)/2-n)+"*".repeat(n*2+1))).join("\n")

ทำงานด้วย f(input here)

ลองที่นี่!

สี่เหลี่ยมมีการขึ้นบรรทัดใหม่ แต่สามเหลี่ยมไม่มี คำอธิบาย:

q=s=>+s.slice(1,s.length-1);                                                                                                                                                                                                 Define a function, q, that takes returns the argument, without the first and last character, casted into an integer.
                            f=s=>                                                                                                                                                                                            Define a function, f, that takes one argument, s. (This is the main function)
                                 s[0]=="s"?                                                                                                                                                                                  If the first character of s is "s" then...
                                           ("*".repeat(q(s))     )                                                                                                                                                           Repeat the "*" character q(s) times.
                                           (                +"\n")                                                                                                                                                           Append a newline to that
                                                                  .repeat(q(s))                                                                                                                                              Repeat that q(s) times.
                                                                               :                                                                                                                                             Else... (the first character of s isn't "s")
                                                                                Array.apply(0,Array(          ))                                                                                                             Create an array of length...
                                                                                Array.apply(0,Array(-~(q(s)/2)))                                                                                                             floor(q(s)/2)+1
                                                                                                                .map((_,n)=>                                   )                                                             Map each element, _ with index n to...
                                                                                                                .map((_,n)=>(s[s.length-1]=="-"?              ))                                                             If the last element of s is "-" then...
                                                                                                                .map((_,n)=>(s[s.length-1]=="-"?~~(q(s)/2)-n  ))                                                             floor(q(s)/2)-n
                                                                                                                .map((_,n)=>(s[s.length-1]=="-"?            : ))                                                             Else...
                                                                                                                .map((_,n)=>(s[s.length-1]=="-"?             n))                                                             Just n
                                                                                                                                                                .map(n=>                                        )            Map each element into...
                                                                                                                                                                .map(n=>(" ".repeat(q(s)/2-n)                   )            Repeat " ", q(s)/2-n times.
                                                                                                                                                                .map(n=>(                   )+"*".repeat(n*2+1)))            Append "*", repeated 2n+1 times.
                                                                                                                                                                .map(n=>(" ".repeat(        )+"*".repeat(n*2+1))).join("\n") Join with newlines

ความยาวของบรรทัดแรกของคุณคือ 338 ตัวอักษร ฉันใช้จอภาพหนึ่งจอและครึ่งหนึ่งในการแสดงผล
isanae


1
ฉันจะไม่คลิกลิงก์ Tinyurl แบบสุ่ม แต่ลองตรวจสอบอีกครั้ง ไม่ว่าในกรณีใดลองหลีกเลี่ยงแถบเลื่อนในกล่องรหัสทำให้อ่านยากขึ้น
isanae

1
@ Loovjo ฉันคิดว่าเขาหมายถึงบรรทัดแรกของคำอธิบาย ฉันมักจะเยื้องคำอธิบายของฉันมากกว่าสไตล์นี้สำหรับคำตอบ JavaScript ดังนั้นคุณไม่จำเป็นต้องเลื่อนเพื่อดูครึ่งหนึ่งของมัน
user81655

@ user81655 ใช่ฉันหมายถึงคำอธิบาย ตอนนี้ฉันเข้าใจความสับสนแล้ว!
isanae

3

Python 2, 157 132 ไบต์

def f(s):
 S=int(s[1:-1])
 for n in([range(1,S+2,2),range(S,0,-2)]['-'in s],[S]*S)['s'in s]:
  print "{:^{S}}".format('*'*n,S=S)

ความพยายามครั้งแรกยืนยันว่า +/-ในตอนท้ายนั้นเป็นทางเลือกการกำจัดสิ่งนั้นทำให้ฉันโกนหนวดออก

ความคิดที่นี่คือการทำรายการที่สามารถโยนลงในเอาท์พุททั่วไป ส่วนที่ยากที่สุดคือการแยกความยาวออกจากอินพุต


สำหรับการรับความยาวที่ฉันใช้x=int(d[1]if len(d)<4 else d[1:3])กับ d เป็นสตริงการป้อนข้อมูล นั่นคือ 5 ไบต์ที่สั้นกว่าโซลูชันของคุณ คุณยังอยู่ข้างหน้าคำตอบของงูหลามฉันต้องพยายามเข้าใจสิ่งที่คุณทำที่นั่นและเอาชนะคุณในครั้งต่อไป! :)
Denker

1
จริงๆแล้วx=int(d[1:-1])จะสั้นกว่ามากแค่เห็นในคำตอบของงูหลาม
Denker

@ DenkerAffe ไม่ว่าด้วยเหตุผลใดก็ตามฉันจำได้ว่าอินเวอร์เตอร์นั้นเป็นทางเลือกดังนั้นมันจึงใช้งานไม่ได้ แต่ฉันเดาว่าฉันเพิ่งสร้างมันขึ้นมา
wnnmaw

2

เรติน่า , 102 85 ไบต์

จำนวนไบต์ถือว่าสมมติว่าซอร์สโค้ดถูกเข้ารหัสตาม ISO 8859-1

\d+
$0$*:¶
^((\w)+):(:+)
$1$2$3$2¶$0
m`s$|:t

)`(.+)¶-(\D*)
-$2¶$1
m`^.

G`.
T`ts:` *

ลองออนไลน์

ฉันจะลองเล่นกอล์ฟนี้อีกทีในภายหลัง


Notepad ++ บอกว่ารหัสของคุณคือ 89 ไบต์ไม่ 85. ฉันใช้การเข้ารหัส ISO-8859-1 และไปในการแก้ไข> EOL การแปลง> รูปแบบ Unix / Linux และใช้งานแทน\n \r\nBase64 ของเนื้อหา: XGQrCiQwJCo6wrYKXigoXHcpKyk6KDorKQokMSQyJDMkMsK2JDAKbWBzJHw6dAoKKWAoLispwrYtKFxEKikKLSQywrYkMQptYF4uCgpHYC4KVGB0czpgICo=(คัดลอกโดยตรงจาก Notepad ++) วิธีแก้ปัญหาออนไลน์ใด ๆ ที่น่าประหลาดใจพอที่จะทำให้ฉันมี 85 ไบต์ ... ฮัม ...
Ismael Miguel

@IsmaelMiguel มีบางอย่างที่ต้องเลิกด้วย Notepad ++ นับอย่างไร พวกเขาเป็นไบต์เดียวใน ISO 8859-1 (มีค่า 182)
Martin Ender

2

อย่างจริงจัง 54 ไบต์

,#i's=`≈;'**@½≈";#dXdXεj' +"£n`@`≈;'**n`@Iƒ('-=WXa0WXü

ลองใช้ออนไลน์

,#i                                                    Take input, push chars separately
   's=                                   Iƒ            IF the first char is "s":
                                `      `@                run the quoted function
                                 ≈;'**n                  make list of n strings of n *'s
      `                       `@                       ELSE run the quoted function:
       ≈;                                                make two copies of int n
         '**                                             use one to make string of n *'s
            @½≈                                          cut the other in half (e.g. 5->2)
               "           "£n                           run n/2 times the quoted function:
                ;#                                        copy the string as list of chars
                  dXdX                                    discard the last 2 *'s
                      εj                                  join back into string
                        ' +                               prepend a space
                                           ('-=WX 0WX  IF the third character is "-":
                                                 a       invert the stack
                                                     ü pop and print the entire stack

@Mego: เห็น#dXdXεjไหม การเลื่อนตำแหน่ง STRING ????


2

ES6, 178 172 159 bytes

s=>(p=s.match(/d+|./g),u=n=+p[1],m=n+1>>1,t=' '.repeat(n)+'*'.repeat(n),v=s<'t'?0:p[2]<'-'?(u=m,1):-1,[...Array(s<'t'?n:m)].map(_=>t.substr(u,u,u+=v)).join`
`)

งานนี้เกิดจากการสังเกตที่น่าสนใจที่ฉันทำ หากคุณทำซ้ำnช่องว่างและnเครื่องหมายดอกจันคุณจะได้รับ (เช่นn=5นี้):

     *****

ตอนนี้ใช้สตริงย่อยด้วยการเริ่มต้นและความยาวเท่ากัน:

     |*****| (5)
    | ***| (4)
   |  *| (3)

t5สตริงเหล่านี้เป็นสายที่เราต้องการสำหรับ

แก้ไข: บันทึกแล้ว 6 ไบต์ขอบคุณ @ edc65

แก้ไข: บันทึกไว้ 13 ไบต์ขอบคุณที่ซ่อนu+=vในอาร์กิวเมนต์ที่สามsubstrซึ่งทำให้ฉันสามารถทำให้การเริ่มต้นทำได้ง่ายขึ้น


@ThomasKwa หือหลังจากผมคงtจัดการรหัสมันกลับกลายเป็นว่าwและuกลายเป็นเทียบเท่าและบันทึกฉันไบต์พอที่จะพาฉันกลับลงไปที่ 178!
Neil

[,b,c]=s.matchและในภายหลังs<'t'... ควรบันทึกไบต์ (Firefox เท่านั้น)
edc65

@ edc65 เพียงแค่ไม่บันทึกการแข่งขันในsช่วยให้ฉันใช้s<'t'ซึ่งช่วยฉัน 6 ไบต์ขอบคุณ
Neil

2

MATL , 48 ไบต์

' *'jt4Y2m)U1$l't'Gm?2MQ2/:1L3$)R!P!R'+'Gm?P]]Q)

ใช้เวอร์ชันปัจจุบัน (10.1.0)ของภาษา / คอมไพเลอร์

รหัสยอมรับอักขระอินพุตตามลำดับ: all s11+,11s+และแม้กระทั่ง1+s1จะเป็นสายการป้อนข้อมูลที่ถูกต้อง

แก้ไข (30 กรกฎาคม 2016): รหัสที่เชื่อมโยงแทนที่1L3$)ด้วยY)เพื่อให้สอดคล้องกับการเปลี่ยนแปลงล่าสุดในภาษา

ลองออนไลน์!

คำอธิบาย

' *'        % push string. Will be indexed into to obtain final result
j           % input string
t           % duplicate
4Y2         % predefined literal string '0123456789'
m           % logical index of digits in input string
)           % index into input string to obtain substring with digits
U           % convert to number
1$l         % generate square of ones with that size
't'         % push character 't'
G           % push input string
m           % true if input string contains 't'
?           % if so...
  2M        % push argument of call to function `l`, i.e. square size
  Q2/       % add 1 and divide by 2. Call result T
  :         % generate vector [1, 2, ... T]
  1L        % predefined literal representing Matlab's `:` index
  3$)       % two dimensional index. Transforms square into rectangle
  R         % remove (set to zero) lower-left corner
  !P!       % flip horizontally
  R         % remove lower-left corner. This gives inverted triangle
  '+'       % push character '+'
  G         % push input
  m         % true if input contains '+'
  ?         % if so...
    P       % flip vertically
  ]         % end if
]           % end if
Q           % add 1. This gives array of values 1 and 2
)           % index string ' *' with this array to produce char array
            % implicitly display that char array

1

C, 259 ไบต์

#define x(y);)putchar(y)
#define m(n)for(n=0;n++<
#define T {m(q)i x(32);m(q)s-i*2 x(42);puts("");}
main(q,v,i,s)char**v;{s=atoi(v[1]+1);if(*v[1]=='s')m(i)s*s x(42)&&!(i%s)&&puts("");else if(strchr(v[1],'+'))for(i=s/2+1;i-->0;)T else for(i=-1;i++<s/2+1;)T}

ungolfed

main(q,v,i,size)char**v; // neat way of declaring variables
{
    size=atoi(v[1]+1);
    if(*v[1]=='s')
    {
        for(i=0;i++<size*size;)
        {
            putchar(42); // returns 42 (true)
            if(!(i%size))
                puts("");
        }
    }
    else if(strchr(v[1],'+')) // if finds plus sign
    {
        for(i=size/2+1;i-->0;) // iterate the height of the triangle
        {
            for(q=0;q++<i;)putchar(32); // conveniently i is the number os spaces before each line
            for(q=0;q++<size-i*2;) putchar(42);
            puts("");
        }
    }
    else for(i=-1;i++<size/2+1;) // does the same as above but inverted order
    {
        for(q=0;q++<i;)putchar(32);
        for(q=0;q++<size-i*2;)putchar(42);
        puts("");
    }
}

ข้อเสนอแนะและคำติชมยินดีมาก


1

ทับทิม, 99

->s{n=s[1,2].to_i
n.times{|i|d=(s.ord-115)*(s[-1]<=>?,)*(n-1-i*2)
d<1&&puts((?**(n+d)).center(n))}}

คำนวณความสูงnและความกว้างเฉลี่ย ของสี่เหลี่ยมจัตุรัสหรือสามเหลี่ยมnโดยการลาดเอียงของด้านข้างมาก (ดังนั้นความกว้างของรูปสามเหลี่ยมที่คำนวณได้คือ 2n-1 ที่ฐาน, 1 ที่ส่วนปลาย) แต่พิมพ์เฉพาะแถวที่ไม่เกินnอักขระ

ungolfed ในโปรแกรมทดสอบ

f=->s{                         #take a string as an argument
  n=s[1,2].to_i                #take 2 characters starting at index 1 and convert to a number for the size
  n.times{|i|                  #iterate through n rows    
    d=                         #calculate how many stars "MORE THAN" n we need on a row
    (s.ord-115)*               #ascii code for 1st character of string - 115 : s-->0, t-->1
    (s[-1]<=>?,)*              #compare last character of input with comma character - --> +1 + --> -1
    (n-1-i*2)                  #row number * 2: 0 at centre, positive above it, negative below it
    d<1&&                      #only output if d is nonpositive (i.e we need less than n or exactly n stars)
    puts((?**(n+d)).center(n)) #print n+d stars, centred in a field of n characters padded by whitespace
  }
}

f[gets.chomp]

1

Jolf, 37 ไบต์, ไม่ใช่การแข่งขัน

ฉันได้เพิ่มฟังก์ชั่นหลังจากโพสต์ความท้าทายนี้ดังนั้นจึงไม่สามารถนำมาพิจารณาเพื่อยอมรับได้ นี่คือการเข้ารหัสใน ISO-8859-7 ลองกรณีทดสอบทั้งหมดที่นี่

onFiΒ€ioSgiγ?='sn―sΒ'*―TΒ1'*?='-SZiγγ

ส่วนที่ 1: การแยกสตริง

onFiΒ€ioSgi
on          set n to
  Fi         the first entity of i (the shape identifier)
    Β       set Β (beta) to
     €i      the "inside" of i (in this case, the size) as a number
       oS   set S to
         gi  the last entity of i (the inverter)

ส่วนที่ 2: การได้รับผลลัพธ์

γ?='sn―sΒ'*―TΒ1'*
γ                 set γ (gamma) to the result of the following expression
 ?='sn             if n is the character s,
      ―sΒ'*         then return a pattern "s" (a square) made with "*"s
           ―TΒ1'*    otherwise, return a pattern "T" (triangle) that is centered and
                     has a scale factor of 1, made with "*"s

ส่วนที่ 3: การย้อนกลับผลลัพธ์

?='-SZiγγ
?='-S     if S is a "-"
     Ziγ   return γ, inverted across its lines
        γ  otherwise, return γ untouched
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.