ผู้ประกอบการศิลปะ ASCII


22

ท้าทาย

รับASCIIผู้ประกอบการจากรายการด้านล่างและจำนวน n วาดเป็นตัวแทน ASCII ของผู้ประกอบการที่ใช้ประกอบการที่เป็นตัวละครที่มีส่วนของเส้นตรงความยาวผู้ประกอบการที่มีn

อินพุต

อักขระ ASCII จากรายการ= + - x /และจำนวนเต็มที่n n >= 1(ฉันใช้xแทน*และ/แทน÷แต่คุณสามารถใช้อันใดอันหนึ่งได้ง่ายกว่า) สำหรับ+และxคุณจะต้องจัดการกับตัวเลขคี่เพื่อหลีกเลี่ยงปัญหาเกี่ยวกับการจัดตำแหน่ง

เอาท์พุต

ASCII drawing ของโอเปอเรเตอร์ประกอบด้วยอักขระที่มีเซกเมนต์ที่มีความยาว n ส่วนแนวนอนควรมีช่องว่างระหว่างตัวละครเพื่อชดเชยความแตกต่างของระยะทางแนวตั้ง / แนวนอน

กฎระเบียบ

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

ตัวอย่าง

การป้อนข้อมูล: + 3

  +
+ + +
  +

การป้อนข้อมูล: = 4

= = = =
= = = =

การป้อนข้อมูล: = 10

= = = = = = = = = =
= = = = = = = = = =

การป้อนข้อมูล: - 2

- -

การป้อนข้อมูล: / 10

         /
        /
       /
      /
     /
    /
   /
  /
 /
/

การป้อนข้อมูล: x 7

x     x
 x   x
  x x
   x
  x x
 x   x
x     x

คุณสามารถเพิ่มกรณีทดสอบได้= 10หรือไม่
Rod

1
ฉันถือว่า "x" และ "+" หมายถึงเลขคี่หรือไม่ (ฉันเพิ่งเห็น DrMcMoylex ถามคำถามเดียวกันเกือบ)
Martin Rosenau

1
@MartinRosenau ใช่จากส่วนอินพุต: "สำหรับ + ​​และ x คุณต้องจัดการกับเลขคี่เพื่อหลีกเลี่ยงปัญหาการจัดตำแหน่ง"
corvus_192

ทำไม X และ / ไม่เว้นระยะ?
59

1
ช่องว่างชั้นนำอนุญาตให้ใช้ได้อย่างไร
59

คำตอบ:


5

Pip , 62 59 56 ไบต์

โค้ดขนาด 55 ไบต์ +1 สำหรับการ-Sตั้งค่าสถานะ

[sXbRA_AEv-_aM,b(Y^aWR_Xb/2s)MyRVsX,b.aYaXbJsxyRL2x]@Aa

โปรดทราบว่าโซลูชันนี้ทำงานร่วมกับอินพุตของ÷สำหรับการหารและ*การคูณแม้ว่าจะใช้อักขระเหล่านั้นเพื่อวาด ASCII-art /และxตามลำดับ OP ได้ชี้แจงว่ามันไม่เป็นไร ลองออนไลน์!

อย่างไร?

ต่อไปนี้เป็นรุ่นที่มีระยะห่างเพียงบางส่วนและแสดงความคิดเห็น ทราบว่าaและbเป็น args บรรทัดคำสั่งคือผู้ประกอบการและขนาดตามลำดับ การ-Sตั้งค่าสถานะควบคุมวิธีการแสดงรายการ: มันเข้าร่วมในการขึ้นบรรทัดใหม่ก่อน แต่รวมรายการที่ซ้อนกันบนช่องว่าง

[                 Build a list of all possible figures:
 sXbRA_AEv-_aM,b   0 - Multiplication
 (Y^aWR_Xb/2s)My   1 - Addition
 RVsX,b.a          2 - Division
 YaXbJs            3 - Subtraction
 x                 4 - Empty
 yRL2              5 - Equals
 x                 6 - Empty
] @ Aa            Index, mod 7, with ASCII value of a

และนี่คือแต่ละส่วน:

การคูณ

สำหรับแต่ละแถวในรูปภาพเราสร้างสตริงของช่องว่างแล้วแทนที่สองบรรทัดด้วยอักขระอินพุต สำหรับแถวiเราต้องการแทนที่ช่องว่างที่ดัชนีiและb-1-i; -1-iแต่ทราบว่าหลังสามารถใช้ดัชนีลบ (มันสั้นกว่านี้เพราะตัวแปรvจะถูกกำหนดค่าเริ่มต้นเป็น negati v e 1)

sXbRA_AEv-_aM,b
            M,b  Map this function to range(b):
sXb                Space, repeated b times
     _             Function arg
      AE           (Implicitly) convert to list and append element...
        v-_        -1 minus function arg
   RA              Replace the characters at those indices...
           a       ... with input character
                 The resulting list is output with one item per line

การเพิ่ม

ใช้กลยุทธ์จากฉันวาดตารางกลวงคำตอบที่เรากำหนดฟังก์ชั่นที่ล้อมเป็น+ในb/2สำเนาของการโต้แย้งและผลตอบแทนเป็นรายการของตัวอักษร (จำนวนเต็มส่วน//ไม่จำเป็นเพราะผู้ประกอบการสตริงซ้ำXตัดทอนโดยอัตโนมัติเพื่อจำนวนเต็ม.) ครั้งแรกที่เราเรียกใช้ฟังก์ชันนี้ในพื้นที่ให้[" ";" ";"+";" ";" "]; จากนั้นเราแมปฟังก์ชันเดียวกันกับผลลัพธ์นั้นโดยให้[" ";" ";"+";" ";" "]บนบรรทัดส่วนใหญ่ แต่["+";"+";"+";"+";"+"]บนเส้นกึ่งกลาง รายการที่ซ้อนกันนี้จะถูกส่งออกเนื่องจาก-Sธงมีช่องว่างระหว่างตัวละครทั้งหมดในแถวและขึ้นบรรทัดใหม่ระหว่างแถว

(Y^aWR_Xb/2s)My
                 Anonymous function:
      _Xb/2        Function arg, repeated b/2 times (implicitly rounded down)
   aWR             Wrap a in two copies of the above
  ^                Split resulting string into list of chars
 Y               Yank that function into y
(          s)    Apply function y to space
             My  Map y to that result

แผนก

แต่ละแถวมีระหว่างb-1และเว้นวรรคตามด้วยตัวท่าน0a

RVsX,b.a
    ,b    Range(b)
  sX      Space, repeated that many times (works itemwise)
      .a  Concatenate a (itemwise)
RV        Reverse (puts the larger number of spaces at the beginning)
          Outputs newline-separated

การลบ

สร้างแถวที่คั่นด้วยช่องว่างของอักขระอินพุต บันทึกสำเนาไว้ใช้ภายหลัง

YaXbJs
 aXb    b copies of a
    Js  Join on space
Y       Yank into y (overwrites the function from earlier, but we're done using it anyway)
        This is a string, so it just gets output

เท่ากับ

ขั้นตอนการลบเก็บครึ่งหนึ่งของสิ่งที่เราต้องการใน - yแค่เพิ่มเป็นสองเท่า

yRL2  (Implicitly) convert y to list and repeat it twice
      Outputs newline-separated

จำลองxค่าจะมีการแผ่นรายการหลักเพื่อให้การจัดทำดัชนี modular +-*÷=ให้ดัชนีที่ไม่ซ้ำสำหรับแต่ละตัวท่านใน


13

V , 78, 72, 71, 68, 65, 63, 62 , 61 ไบต์

Ç=ü-/Àé X
ç^Ó/é Àä$
ç+/ÀÄM|ÀR+ 
ç=/Ä
ç¯/lòhYpX
çx/rxòl3Äjxlrx

ลองออนไลน์!

และเช่นเคยการต่อสู้คอและคอกับ 05AB1E นั้นสนุกจริงๆ!

เนื่องจากสิ่งนี้มีอักขระที่ไม่ใช่ ASCII นี่คือ hexdump:

0000000: c73d fc2d 2fc0 e920 580a e75e d32f e920  .=.-/.. X..^./. 
0000010: c0e4 240a e72b 2fc0 c44d 7cc0 522b 200a  ..$..+/..M|.R+ .
0000020: e73d 2fc4 0ae7 af2f 6cf2 6859 7058 0ae7  .=/..../l.hYpX..
0000030: 782f 7278 f26c 33c4 6a78 6c72 78         x/rx.l3.jxlrx

นี้จะสร้างช่องว่างนำในการส่งออกสำหรับ=และ-แต่นี้ดูเหมือนว่าจะได้รับอนุญาต หากไม่ได้รับอนุญาตโปรดแสดงความคิดเห็นและฉันจะย้อนกลับ

คำอธิบาย

"คำสั่งทั่วโลก" (เช่นç) ใช้ชุดคำสั่งบางอย่างกับทุกบรรทัดที่ตรงกับ regex ที่แน่นอน ไวยากรณ์คือ

ç<compressed regex>/<commands>

นี่เป็นวิธีที่ง่ายที่สุดในการจำลองคำสั่งเงื่อนไข / สวิตช์ ในคำตอบดั้งเดิมของฉันฉันเพียงแค่สร้าง ASCII-art ทั้งหมดทางด้านขวาสำหรับอักขระที่แตกต่างกันที่เราต้องการค้นหา อย่างไรก็ตามเอาต์พุตจำนวนมากเหล่านี้ต้องการคำสั่งที่คล้ายกัน ดังนั้นฉันรวมพวกเขา คำสั่งแรก ('Ç') จริง ๆ แล้วเป็นอินเวอร์สของคำสั่งโกลบอลมันใช้คำสั่งกับทุกบรรทัดที่ไม่ตรงกับ regex ดังนั้นคำสั่งแรกคือ:

Ç=ü-        " On every line not containing an '=' or an '-' (e.g. inputs '/', '+', and 'x'):
    /Àé     "   Insert *n* spaces
        X   "   Delete one of them

คำสั่งต่อไปนี้ใช้สำหรับอินพุต '=' และ '-' ทั้งสองนี้ง่ายและสะดวกคล้ายกัน หลังจากคำสั่งนี้เราไม่ต้องการการประมวลผลอีกต่อ-ไป

ç^Ó         " On every line that starts with non-whitespace (e.g. every line not affected by our previous command):
   /é       "   Insert one space
            "   Move back a character
      À     "   Make *n* copies
       ä$   "   Of every character on this line

จากตรงนี้เราแค่ทำคำสั่งพิเศษสำหรับแต่ละอินพุตที่เป็นไปได้ สำหรับ+:

ç+/         " On every line containing a '+':
   ÀÄ       "   Make *n* copies of this line
     M|     "   Move to the first character of the middle line
       À    "   *n* times:
        R+  "   Replace the next two characters with '+ '

คำสั่งสำหรับเท่ากับตรงไปตรงมามาก Äเราเพียงแค่ทำซ้ำด้วย สำหรับ/:

ç¯          " On every line containing a '/':
  /l        "   Move one character to the right
    ò       "   Recursively:
     h      "     Move one character to the left
      Yp    "     Make a copy of this line
        X   "     Delete one character
         ò  "   End loop (implicit)

อันสุดท้ายนั้นซับซ้อนที่สุด เป็นพื้นของคำตอบนี้

çx              " On every line containing a 'x':
  /rx           "   Replace the first character with an 'x'
     ò          "   Recursively:
      l         "     Move one char to the right
       3Ä       "     Make 3 copies of this line
         j      "     Move down one line
          x     "     Delete one char
           l    "     Move one char to the right
            rx  "     Replace this char with an 'x'

ดังนั้นสิ่งที่ใช้หลายบรรทัด?
Conor O'Brien

@Conorobrien ใช่ çคำสั่ง (เช่นเดียวกับการค้นหาและแทนที่/และ?) ส่วนหนึ่งจำลองของบรรทัดคำสั่งที่เป็นกลุ่มของที่คุณจะต้องกด Enter เพื่อเรียกใช้คำสั่งจริง
DJMcMayhem

13

05AB1E , 81 76 74 73 70 69 68 65 64 62 60 59 57 56 ไบต์

ปัจจุบันในการทำสงครามกับคำตอบ V ฉันจะมาหาคุณดร. McMoylex: p

นอกจากนี้ในการทำสงครามกับคำตอบ Pip ฉันจะดูคุณมิสเตอร์ DLosc


รหัส:

Ç6&"¹s<ú.s.Bívy¹'xQiÂðñ}, ¹×S)»¹'=Qƒ= ;ƒ¹})D¦»»Rû.c"#è.V

หรือในรูปแบบที่อ่านได้มากขึ้น:

  Ç6&
"¹s<ú.s.Bívy¹'xQiÂðñ},
 ¹×S)»¹'=Qƒ=
 ;ƒ¹})D¦»»Rû.c"
#è.V

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!


1
เราจะไปที่นี่อีกครั้ง ... : P
DJMcMayhem

1
@DrMcMoylex ฮ่าฮ่าฮ่าเวลาเก่าดี :)
Adnan

30
อ่านง่ายขึ้น ... ทั้งหมด ...
Oliver Ni

1
สำหรับคำนิยามที่กำหนดของ "readable"
Matt Lacey


7

Python 3, 304 283 278 ไบต์

ง่ายพอเพียงแค่สร้างเมทริกซ์ของตัวอักษรและใช้การดำเนินการต่าง ๆ ตามที่เป็นอยู่ =และ-มีช่องว่างต่อท้ายว่าที่ไม่เลวร้ายเกินไป

แก้ไข: ขอบคุณ @Shebang และ @Rod สำหรับคำแนะนำซึ่งจบลงด้วยการประหยัด 21 ไบต์!

EDIT2: ขอบคุณ @Artyer สำหรับการบันทึก 5 ไบต์!

t,s=input().split()
s=int(s)
r=range(s)
b=[[' ']*s for x in r]
exec(['for x in r:b[s//2][x]=b[x][s//2]=t','b=[t*s]'+'*2'*(t=='='),'for x in r:b[x][s-x-1]='+'b[x][x]='*(t=='x')+'t'][(t>'+')+(t in'x/')])
if t in'-=+':b=[[x+' 'for x in l]for l in b]
print(*map(''.join,b),sep='\n')

คุณสามารถบันทึก 8 ไบต์โดยลบif'-'==tบรรทัดเงื่อนไขและแทนที่หนึ่งข้างบนด้วยif t in'=-':b=[[t+' ']*s]*(2*(t>'-'))(ฉันคิดว่า)
Kade

คุณสามารถห่อฟังก์ชั่นภายในรายการและรันโดยใช้ exec: exec(['+ block','/ block','x block','= block','- block']['+/x=-'.find(t)])เพื่อบันทึก ~ 18 ไบต์
Rod

ใช่ช่องว่างต่อท้าย / บรรทัดใหม่เป็นที่ยอมรับ
Yodle

สำหรับบรรทัดแรกให้ทำ.split()(ไม่มี args แยกบนช่องว่าง) ในบรรทัด 6 คุณพลาดช่องว่าง ( b=[[x+' 'for) คุณสามารถสร้างบรรทัดสุดท้ายprint(*map(''.join,b),sep='\n')ด้วย 1 ไบต์ที่น้อยกว่า
Artyer

7

JavaScript (ES6), 238 225 215 202 196 ไบต์

(c,n)=>[...Array(i=n*(c=="="?4:c+1-1?2:c<"-"?n+n:n+1))].map(_=>--i%(n+(c=='/'|c>'w'||n))?c>'w'?i%n&&~-i%(n+2)?" ":c:c<'-'?i%(n*2)-n&&(~i&1|(n/2^i/n/2))?" ":c:c=="/"?i%n?" ":c:i%2?c:" ":`
`).join``

อาจจะเป็นสนามกอล์ฟ แต่มันเป็นการเริ่มต้น


6

สกาลา, 275 ไบต์

(i,c)=>if(c<44){val b=(" "*(i-1)+"+\n")*((i-1)/2)
b+"+ "*i+"\n"+b}else
if(c<46)"- "*i else
if(c<48)i-1 to(0,-1)map(" "*_+"/\n")mkString else
if(c<62)"= "*i+"\n"+"= "*i
else{val a=0 to i/2-1 map(x=>" "*x+"x"+" "*((i/2-x)*2-1)+"x"+" "*x+"\n")mkString;a+" "*(i/2)+"x"+a.reverse}

การใช้งาน:

val f:((Int,Char)=>String)=...
print(f(10, '/'))

คำอธิบาย:

การทดสอบรหัสสำหรับค่า ascii ของถ่านเพื่อเลือกวิธีที่เหมาะสมในการสร้างภาพ ค่า ascii ของตัวดำเนินการที่เป็นปัญหาคือ: ('+' -> 43), ('-' ->45), ('/' -> 47), ('=' -> 61), ('x' -> 120)

(i,c)=>                              //define a function
  if(c<44){                            //if c is a plus
    val b=(" "*(i-1)+"+\n")*((i-1)/2)    //define the top/bottom part b as (i-1)/2 times (i-1) spaces, a plus sign and a newlineine
    b+"+ "*i+"\n"+b                      //return b, i times a plus and a space, a newline and b
  }else if(c<46)                       //if c is a '-'
    "- "*i                               //return "- " repeated i times
  else if(c<48)                        //if c is a '/'
    i-1 to(0,-1)                         //create a range from i-1 to 0 in steps of -1
    map(" "*_+"/\n")                     //map each number to that number of spaces plus a "/" and a newline
    mkString                             //join them together
  else if(c<62)                        //if c is '='
    "= "*i+"\n"+"= "*i                   //return "= " repeated i times, a newline and "= " repeated i times again
  else{                                //if c if 'x'
    val a=                               //define a, which will be the top part, as...
      0 to i/2-1                         //a range from 0 to i/2-1
      map(n=>                            //map each number n to
        " "*n                              //n spaces
        +"x"                               //plus an "x"
        +" "*((i/2-n)*2-1)                 //plus ((i/2)-n)*2-1 spaces
        +"x"                               //plus an "x"
        +" "*n                             //plus n spaces
        +"\n"                              //and a newline
      )mkString;                         //join them
    a+" "*(i/2)+"x"+a.reverse          //return a, i/2 spaces, "x" and the reverse of a 
  }

5

JavaScript (ES6), 156 ไบต์

(c,n)=>[...Array(n--)].map((_,i,a)=>a.map((_,j)=>({'/':a=i+j-n,x:a&&i-j,'-':a=i+i-n,'+':a&&j+j-n,'=':a+2&&a-2}[c]?' ':c)).join(c=='='|c<'/'?' ':'')).join`\n`

โดย\nแสดงถึงอักขระบรรทัดใหม่ตามตัวอักษร


ใน Firefox 49 ฉันได้รับSyntaxError: invalid property idตามที่เขียนในขณะนี้ แต่เปลี่ยน backticks รอบเครื่องหมายสแลชเป็นเครื่องหมายอัญประกาศกำหนดว่า (ทำไมคุณถึงมี backticks อยู่ที่นั่นแทนที่จะเป็น apostrophes?)
ETHproductions

นอกจากนี้ผลสำหรับ+, -และ=ที่แตกต่างกันดูกว่าสายที่ท้าทายสำหรับ "ส่วนแนวนอนควรจะมีช่องว่างระหว่างตัวอักษรเพื่อชดเชยแนวตั้ง / ความแตกต่างของระยะทางแนวนอน."
ETHproductions

@ ETHproductions a) พิมพ์ผิดข) ขอโทษฉันมองข้ามว่าจะแก้ไขในภายหลัง
Neil

แม้ว่ามันจะสั้นอย่างน่าขัน ฉันหวังว่าการแก้ไขจะไม่เพิ่มจำนวนมากเกินไป
ETHproductions

@ETHproductions ขอบคุณ ฉันคิดว่าสิ่งนี้จะมีราคา 19 ไบต์
Neil

4

Dyalog APL , 91 86 ไบต์

ความต้องการ⎕IO←0ซึ่งเป็นค่าเริ่มต้นในหลาย ๆ ระบบ ใช้อาร์กิวเมนต์nเป็นซ้ายและหนึ่งใน+ - ×÷ =เป็นอาร์กิวเมนต์ที่ถูกต้อง

{s←⌈⍎⍕32
t' '
d←⌽∘.=⍨⍺
s2 6:t[d∨⌽d6=s]
5=s:t[↑,/2↑¨∨/¨(⌊⍺÷2)=⍳⍺ ⍺]
(2-s)(2×⍺)⍴t}

คำอธิบาย

{
    s     3  2              calculate ceil(3 f 2), where f is the given symbol
    t  ' '                     create a string with a space before the symbol
    d   ∘.=⍨                  Boolean \ diagonal
    s  2 6: t[d   d  6 = s]  if ÷ or × index t with one or both diagonals
 find coordinates that are in the middle of at least one dimension
 pad with zeros for spacing
 use that to index into t
    5 = s: t[  ,/ 2↑¨ ∨/¨ (⌊  ÷ 2) =   ⍺]
 - or =:
    (2 - s) (2 × ⍺)  t        one or two rows of double-spaced symbols
}

3

Mathematica, 191 ไบต์

e=#~Mod~2==1&;StringRiffle[Normal@SparseArray[{a_,b_}/;(a+b==d+1||a==b)[e@b&&a<3,,e@b&&(a==⌈d/2⌉||b==d),,e@b&&a<2,,a+b==d+1][[Last@ToCharacterCode@#~Mod~10]]:>#,{d=#2,2d-1}," "],"
"," "]&

ฟังก์ชั่นไม่ระบุชื่อ รับสตริงและตัวเลขเป็นอินพุตและส่งคืนสตริงเป็นเอาต์พุต ไม่ใช่คนที่สั้นที่สุด แต่ก็ยังสนุกในการเขียน


3

C, 396 ไบต์

#define p(x) printf(x);
i,j,k,m;f(char s,int n){i=k=0;if(s==45)for(;i<n;++i)p("- ")m=n/2;if(s==43)for(;i<n;++i)for(j=0;j<=m;++j)if(i-m)p(j-m?"  ":"+\n")else{for(;k<n;++k)p("+ ")p("\n")j+=m;}if(s==61)for(;i<2;++i){for(k=0;k<n;++k)p("= ")p("\n")}j=n;if(s==47)for(;i<n;++i){--j;for(k=0;k<j;++k)p(" ")p("/\n")}if(s==120)for(;i<n;++i){k=m-abs(m-i);for(j=0;j<n-k;++j)p(j-k?" ":"x")p(i-m?"\bx\n":"\n")}}

โทรด้วย:

int main()
{
   f('x', 5);
   return 0;
}

2

SOML , 104 100 ไบต์ (ไม่แข่งขัน)

    Cd³³b»E +=?ce*d+e{t}bd*Oe{t}} ==?b*tt} -=?b*t} /=?bc*b{j:d+p}} x=?"”cb*e{jj⁴⁴d;d+++tGG;c+;}XOdoe{O

นี่เป็นการแข่งขันประเภทหนึ่งเนื่องจากฉันค่อนข้างมั่นใจว่าทุกอย่างที่ฉันใช้ที่นี่มีเอกสารบน GitHub ก่อนวันที่โพสต์คำถามนี้


2

PHP, 306 292 281 282 281 275 270 ไบต์

$r=str_pad("",2*$n=$argv[2],($c=$argv[1])." ")."\n";if(",">$c)$r=($m=str_repeat(str_pad($c,$n," ",0)."\n",$n/2))."$r$m";if(9<$c)$r.=$r;if(w<$c)for($r=$c;$i<$n;$r[$i*(2+$n)]=$r[++$i*$n-1]=x)$r[$i*$n+$i+$n]="\n";if("/"==$c)for($r=$s="";$i++<$n;$s.=" ")$r="$s/\n$r";echo$r;

โอ้นี่มันใหญ่มาก ... ต้องการเล่นกอล์ฟต่อไป
ฉันสามารถบันทึก 4 ไบต์ด้วยการแบ่งบรรทัดแบบฟิสิคัลหรือหนึ่งไบต์ด้วยการใส่ "\ n" ลงในตัวแปร


1
นิสัยดีสำหรับ "+" ฉันคิดว่าคุณต้องตรงกับความสูงและไม่เสมอไป 3. นอกจากนี้คุณควรเล่นกอล์ฟได้มากกว่านี้หาก () แทนที่จะใช้เคส / ตัวแบ่ง
Crypto

2

C #, 744 ไบต์

ฉันคิดว่ามันมีความยาว 1 ล้านตัวอักษร แต่ฉันไม่สนใจฉันมีความสุขมากที่ฉันแก้ไขปัญหานี้ ...

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

string A(string s,int n){string O="";Func<string,int,string>R=(a,b)=>{return string.Join("",Enumerable.Repeat(a,b))+"\r\n";};switch(s){case"+":for(int i=0;i<n;i++){if(i==n/2){O+=R("+",n);}else{O+="+".PadLeft(n-n/2,' ').PadRight(n-n/2,' ')+"\r\n";}}return O;case"=":return R("=",n)+R("=",n);case "-":return R("-",n);case "/":for(int i=n;i>0;i--){O+="/".PadLeft(i)+"\r\n";}return O;case "x":int x=0;string[]r=new string[n];for(int i=n;i>0;i--){if(n-x-x<0){O+="x".PadLeft(x+1)+"\r\n";break;}string row=string.Join("",Enumerable.Repeat(" ",x))+"x"+string.Join("",Enumerable.Repeat(" ",n-x-x))+"x"+"\r\n";O+=row;x++;r[x]=row;if(i==n/2)break;}for(int i=r.Length-1;i>0;i--){if(string.IsNullOrEmpty(r[i]))continue;O+=r[i];}return O;default:return "";}}

Ungolfed:

public string A(string s, int n)
{
  string O = "";

  Func<string, int, string> R = (a, b) =>
  {
    return string.Join("", Enumerable.Repeat(a, b)) + "\r\n";
  };

  switch (s)
  {
    case "+":
      for (int i = 0; i < n; i++)
      {
        if (i == n / 2)
        {
          O += R("+", n);
        }
        else
        {
          O += "+".PadLeft(n - n / 2, ' ').PadRight(n - n / 2, ' ') + "\r\n";
        }
      }
      return O;
    case "=":
      return R("=", n) + R("=", n);
    case "-":
      return R("-", n);
    case "/":
      for (int i = n; i > 0; i--)
      {
        O += "/".PadLeft(i) + "\r\n";
      }
      return O;
    case "x":
      int x = 0;
      string[] r = new string[n];
      for (int i = n; i > 0; i--)
      {
        if (n - x - x < 0)
        {
          O += "x".PadLeft(x + 1) + "\r\n";
          break;
        }
        string row = string.Join("", Enumerable.Repeat(" ", x))
          + "x"
          + string.Join("", Enumerable.Repeat(" ", n - x - x)) + "x" + "\r\n";
        O += row;
        x++;
        r[x] = row;
        if (i == n / 2)
          break;
      }
      for (int i = r.Length - 1; i > 0; i--)
      {
        if (string.IsNullOrEmpty(r[i]))
          continue;
        O += r[i];
      }
      return O;
    default:
      return "";
  }
}

การทดสอบ:

+: 3, 5, 7, 9, 11
/: 7, 8, 9, 10
-: 3, 4, 5, 6
=: 3, 4, 5, 6, 7
x: 5, 7, 9, 11

มากเกินไปที่จะวางและจัดรูปแบบที่นี่ฉันสร้าง pastebin:

Pastebin


กรุณาตีกอล์ฟและให้นับไบต์
mbomb007

2

C, 331 ไบต์

i,j;f(o,n){if(47==o)for(i=n;i;puts("")){for(j=i--;j--;putchar(j?32:o)){}}
if(43==o)for(i=n;i--;puts("")){for(j=n;j--;printf(i==n/2||!j?"+ ":" ")){}}
if(45==o)for(i=n;i--;putchar(o)){}
if(61==o)for(i=3;i--;puts("")){for(j=n;j--;putchar(i&1?32:o)){}}
if(120==o)for(i=n;i;puts("")){for(j=0;j++<n;putchar(j==i||j==n-i+1?o:32)){}i--;}}

ผู้ประกอบการจะถูกส่งเป็นรหัส ASCII เข้าและนับจำนวนตัวอักษรลงในo nฉันเพิ่มช่องว่างระหว่างอักขระตามลำดับแนวนอนลงในเครื่องหมายบวกเท่านั้นเนื่องจากนี่เป็นสิ่งเดียวที่เอาท์พุทน่าจะผิดเพี้ยนไปถ้าฉันไม่ได้และในงานมันบอกว่า "ควร" เท่านั้น ฉันใช้ลูปซ้อนกันสองตัวนับถอยหลัง (ยกเว้น-ตำแหน่งที่ฉันต้องการเพียงหนึ่งบรรทัด)

= สามบรรทัดหนึ่งในนั้นว่างตรงไปข้างหน้า

+ใช้printfเพราะช่องว่าง

- ตรงไปข้างหน้า

/ พิมพ์วนรอบด้านที่ศูนย์และเริ่มที่ตัวนับลูปภายนอก

xมีการพิมพ์วนรอบภายในที่ตัวนับลูปภายนอกและ "อินเวอร์ส" ของn-iมัน ยังคงต้องดูว่าทำไมฉันถึงอยู่ทีละคนที่นี่

ตัวอย่างการโทร:

#include <stdio.h>
/*  =       61
    +       43
    -       45
    /       47
    Space   32
    x       120
*/
int main(int argc, char **argv){
    printf("%s\n%s\n",argv[1], argv[2]);
    f(*argv[1],strtol(argv[2],NULL,10));
}

1

Lua, 402 344 312 ไบต์

312:

r,p,b,x=string.rep,print,' ','x'function d(s,n)h,l=(n+1)/2,s..b;e=r(l,n)if s=='-'then p(e)elseif s=='='then p(e)p(e)else for f=1,n do p(s=='/'and(r(b,n-f)..s)or s=='+'and(f~=h and r(' ',n-1)..'+'or r('+ ',n))or f<h and r(b,f-1)..x..r(b,n-2*f)..x or f>h and r(b,n-f)..x..r(b,2*f-2-n)..x or r(b,f-1)..x)end end end

344:

r,p,b,x=string.rep,print,' ','x'function d(s,n)h,l=(n+1)/2,s..b;e=r(l,n)if s=='-'then p(e)elseif s=='='then p(e)p(e)else for f=1,n do if s=='/'then p(r(b,n-f)..s)elseif s=='+'then p(f~=h and r(' ',n-1)..'+'or r('+ ',n))elseif s=='x'then p(f<h and r(b,f-1)..x..r(b,n-2*f)..x or f>h and r(b,n-f)..x..r(b,2*f-2-n)..x or r(b,f-1)..x)end end end end

402:

r,p,b,x=string.rep,print,' ','x'function d(s,n)h=(n+1)/2;if s=='-'then p(r(s..b,n))end;if s=='='then p(r(s..b,n))p(r(s..b,n))end;if s=='/'then for i=1,n do p(r(b,n-i)..s)end end;if s=='+'then for i=1,n do p(i~=h and r(' ',n-1)..'+'or r('+ ',n))end end;if s=='x'then for i=1,n do if i<h then p(r(b,i-1)..x..r(b,n-2*i)..x)elseif i>h then p(r(b,n-i)..x..r(b,-n+2*i-2)..x)else p(r(b,i-1)..x)end end end end

ลดลง 90 ตัวอักษรและตอนนี้มันเจ็บปวดที่จะมองแม้เมื่อขยาย : |


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