Toán tử ASCII


22

Thử thách

Đưa ra một toán tử ASCII từ danh sách bên dưới và một số n, hãy vẽ một đại diện ASCII của toán tử sử dụng toán tử đó làm ký tự với các phân đoạn dòng của toán tử có độ dài n .

Đầu vào

Một ký tự ASCII từ danh sách = + - x /và một số nguyên ntrong đó n >= 1. (Tôi đang sử dụng xthay vì */thay vì ÷, nhưng bạn có thể sử dụng một trong hai cách dễ dàng hơn). Đối với +x, bạn chỉ phải xử lý các số lẻ để tránh các vấn đề với căn chỉnh.

Đầu ra

Một bản vẽ ASCII của toán tử bao gồm các ký tự có các đoạn có độ dài n. Các phần nằm ngang nên có khoảng cách giữa các ký tự để bù chênh lệch khoảng cách dọc / ngang.

Quy tắc

Đây là , vì vậy mã ngắn nhất tính bằng byte thắng. Sơ hở tiêu chuẩn bị cấm.

Ví dụ

Đầu vào: + 3

  +
+ + +
  +

Đầu vào: = 4

= = = =
= = = =

Đầu vào: = 10

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

Đầu vào: - 2

- -

Đầu vào: / 10

         /
        /
       /
      /
     /
    /
   /
  /
 /
/

Đầu vào: x 7

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

bạn có thể thêm trường hợp thử nghiệm cho = 10?
Rod

1
Tôi giả sử "x" và "+" ngụ ý số lẻ? (Tôi chỉ thấy DrMcMoylex hỏi gần như cùng một câu hỏi.)
Martin Rosenau

1
@MartinRosenau Có, từ phần Đầu vào: "Đối với + và x, bạn chỉ phải xử lý các số lẻ để tránh các vấn đề với căn chỉnh."
corvus_192

Tại sao X và / không cách nhau?
Adám

1
khoảng trắng hàng đầu được phép là gì?
Adám

Câu trả lời:


5

Pip , 62 59 56 byte

55 byte mã, +1 cho -Scờ.

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

Lưu ý rằng giải pháp này hoạt động với đầu vào của ÷phép chia và *phép nhân, mặc dù nó sử dụng các ký tự đó để vẽ ASCII-art /x, tương ứng. OP đã làm rõ rằng điều này là ổn. Hãy thử trực tuyến!

Làm sao?

Đây là một phiên bản khoảng cách và nhận xét . Lưu ý rằng ablà các đối số dòng lệnh, tức là toán tử và kích thước tương ứng. Các -Sđiều khiển cờ như thế nào danh sách được xuất ra: nó tham gia vào dòng mới đầu tiên, nhưng tham gia bất kỳ danh sách lồng nhau trên không gian.

[                 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

Và đây là các phần riêng lẻ:

Phép nhân

Đối với mỗi hàng trong hình, chúng tôi tạo ra một chuỗi khoảng trắng và sau đó thay thế hai trong số chúng bằng ký tự đầu vào. Đối với hàng i, chúng tôi muốn thay thế khoảng trắng tại chỉ mục ib-1-i; nhưng lưu ý rằng cái sau có thể sử dụng chỉ số âm -1-i. (Nó thậm chí còn ngắn hơn vì biến vđược khởi tạo trước thành 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

Thêm vào

Sử dụng chiến lược từ tôi vẽ một hình vuông rỗng câu trả lời, chúng ta định nghĩa một hàm bọc lấy một +trong b/2các bản sao của đối số của nó và trả về kết quả là một danh sách các nhân vật. (Phân chia số nguyên //không cần thiết vì toán tử lặp chuỗi Xtự động cắt ngắn thành số nguyên.) Trước tiên, chúng tôi gọi hàm này trên một khoảng trắng, cho [" ";" ";"+";" ";" "]; sau đó, chúng tôi ánh xạ chức năng tương tự với kết quả đó, đưa ra [" ";" ";"+";" ";" "]hầu hết các dòng nhưng ["+";"+";"+";"+";"+"]trên đường trung tâm. Danh sách lồng nhau này sau đó là đầu ra, vì -Scờ, với khoảng trắng giữa tất cả các ký tự trên một hàng và dòng mới giữa các hàng.

(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ộ phận

Mỗi hàng có giữa b-10khoảng trắng, theo sau là ký tự đầu vào a.

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

Phép trừ

Tạo một hàng ngăn cách không gian của ký tự đầu vào. Lưu một bản sao cho sau này.

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

Bằng

Bước trừ được lưu trữ một nửa những gì chúng ta cần trong y- điều chỉnh gấp đôi nó.

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

Các xgiá trị giả có ở đó để đệm danh sách chính để lập chỉ mục mô-đun cung cấp một chỉ mục duy nhất cho mỗi ký tự đầu vào +-*÷=.


13

V , 78, 72, 71, 68, 65, 63, 62 , 61 byte

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

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

Như mọi khi, trận chiến cổ với 05AB1E thực sự rất thú vị!

Vì phần này chứa các ký tự không phải ASCII, nên đây là một 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

Điều này không tạo ra không gian hàng đầu trong đầu ra cho =-, nhưng điều này dường như được cho phép . Nếu điều này không được phép, hãy bình luận và tôi sẽ quay lại.

Giải trình

"Lệnh toàn cầu" (ví dụ ç) áp dụng một nhóm lệnh nhất định cho mọi dòng khớp với một biểu thức chính quy nhất định. Cú pháp là

ç<compressed regex>/<commands>

Đây là cách dễ nhất để mô phỏng câu lệnh có điều kiện / chuyển đổi. Trong câu trả lời ban đầu của tôi, tôi chỉ đơn giản là tạo toàn bộ nghệ thuật ASCII ở phía bên phải cho mỗi nhân vật khác nhau mà chúng tôi cần tìm kiếm. Tuy nhiên, rất nhiều trong số các đầu ra này yêu cầu các lệnh tương tự. Vì vậy, tôi kết hợp chúng. Lệnh đầu tiên ('Ç') thực sự là nghịch đảo của lệnh toàn cầu, nó áp dụng lệnh cho mọi dòng không khớp với biểu thức chính quy. Vì vậy, lệnh đầu tiên là:

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

Lệnh sau dành cho đầu vào '=' và '-'. Đây là hai thuận tiện dễ dàng và tương tự. Sau lệnh này, chúng tôi không cần xử lý thêm -.

ç^Ó         " 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

Từ đây chúng ta chỉ cần thực hiện một số lệnh bổ sung cho từng đầu vào có thể. Dành cho +:

ç+/         " 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 '+ '

Lệnh cho bằng là rất đơn giản. Chúng tôi chỉ cần nhân đôi nó với Ä. Dành cho /:

ç¯          " 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)

Cái cuối cùng là phức tạp nhất. Nó về cơ bản là một cổng của câu trả lời này .

ç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'

Vì vậy, đó là những gì nhiều dòng được sử dụng cho?
Conor O'Brien

@Conorobrien Có. Các çlệnh (cũng như tìm kiếm và thay thế, /?) tất cả phần mô phỏng của dòng lệnh vim, nơi bạn phải nhấn Enter để thực sự chạy lệnh
DJMcMayhem

13

05AB1E , 81 76 74 73 70 69 68 65 64 62 60 59 57 56 byte

Hiện nay trong cuộc chiến với các câu trả lời V . Tôi đang đến với bạn Tiến sĩ McMoylex: p.

Cũng trong cuộc chiến với câu trả lời Pip . Tôi sẽ theo dõi ông DLosc.


Mã số:

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

Hoặc ở dạng dễ đọc hơn:

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

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


1
Chúng ta lại bắt đầu ...: P
DJMcMayhem

1
@DrMcMoylex Hahaha, thời xưa tốt đẹp :).
Ad Nam

30
Dễ đọc hơn ... hoàn toàn ...
Oliver Ni

1
Đối với một định nghĩa nhất định của "có thể đọc được".
Matt Lacey


7

Python 3, 304 283 278 byte

Đủ đơn giản, chỉ cần tạo một ma trận ký tự và áp dụng các hoạt động khác nhau dựa trên đó là một hoạt động. Các =-đã dấu không gian nếu đó không phải là quá xấu.

EDIT: Cảm ơn @Shebang và @Rod vì những gợi ý của họ đã giúp tiết kiệm 21 byte!

EDIT2: Cảm ơn @Artyer vì đã tiết kiệm 5 byte!

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

Bạn có thể lưu 8 byte bằng cách loại bỏ if'-'==tdòng điều kiện và thay thế dòng trên nó bằng if t in'=-':b=[[t+' ']*s]*(2*(t>'-'))(tôi nghĩ).
Kade

bạn có thể gói các hàm bên trong một danh sách và chạy bằng exec: exec(['+ block','/ block','x block','= block','- block']['+/x=-'.find(t)])để lưu ~ 18 byte
Rod

Có, dấu cách / dòng mới được chấp nhận.
Yodle

Đối với dòng đầu tiên, hãy làm .split()(Không có đối số phân tách trên khoảng trắng). Trên dòng 6, bạn đã bỏ lỡ một khoảng trắng ( b=[[x+' 'for). Bạn có thể tạo dòng cuối cùng print(*map(''.join,b),sep='\n')cho 1 byte ít hơn.
Artyer

7

JavaScript (ES6), 238 225 215 202 196 byte

(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``

Có thể chơi golf, nhưng đó là một khởi đầu.


6

Scala, 275 byte

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

Sử dụng:

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

Giải trình:

Mã kiểm tra giá trị ascii của char để chọn đúng cách tạo hình ảnh. Các giá trị ascii của các toán tử trong câu hỏi là: ('+' -> 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 byte

(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`

Trường hợp \nđại diện cho nhân vật dòng chữ mới.


Trong Firefox 49, tôi nhận được SyntaxError: invalid property idnhư nó hiện đang được viết, nhưng việc thay đổi các backticks xung quanh dấu gạch chéo thành dấu nháy đơn đã khắc phục điều đó. (Tại sao bạn có backticks ở đó thay vì dấu nháy đơn?)
ETHproductions 8/11/2016

Ngoài ra, các kết quả đầu ra cho +, -=cái nhìn khác biệt so với các cuộc gọi thách thức đối với: "phần ngang nên có khoảng trống giữa các ký tự để bù đắp dọc chênh lệch khoảng cách / ngang."
Sản phẩm ETH

@ETHproductions a) typo b) xin lỗi, tôi đã bỏ qua điều đó, sẽ sửa sau.
Neil

Điều này là ngắn vô lý mặc dù. Tôi hy vọng sửa nó không thêm quá nhiều byte.
Sản phẩm ETH

@ETHproductions Cảm ơn. Tôi nghĩ rằng điều này làm với chi phí 19 byte.
Neil

4

APL Dyalog , 91 86 byte

Nhu cầu ⎕IO←0, được mặc định trên nhiều hệ thống. Lấy n làm đối số bên trái và một trong + - × = làm đối số bên phải.

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

Giải trình

{
    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

Toán học, 191 byte

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}," "],"
"," "]&

Chức năng ẩn danh. Lấy một chuỗi và một số làm đầu vào và trả về một chuỗi làm đầu ra. Không phải là ngắn nhất cho đến nay, nhưng vẫn vui vẻ để viết.


3

C, 396 byte

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

Gọi với:

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

2

SOML , 104 100 byte (không cạnh tranh)

    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

Đây là một loại cạnh tranh vì tôi khá chắc chắn rằng mọi thứ tôi sử dụng ở đây đều có tài liệu trên github trước ngày đăng câu hỏi này nhưng trình phân tích cú pháp không hỗ trợ cho một số chức năng mà tôi đã sử dụng.


2

PHP, 306 292 281 282 281 275 270 byte

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

Ôi cái này cồng kềnh ... cần chơi gôn hơn nữa.
Tôi có thể lưu 4 byte với ngắt dòng vật lý hoặc một byte bằng cách đặt "\ n" vào một biến.


1
Nice.cho "+", tôi nghĩ rằng bạn cần phải phù hợp với chiều cao và không phải luôn luôn 3. Ngoài ra, bạn nên có thể chơi gôn nhiều hơn để sử dụng if () thay vì case / break;
Crypto

2

C #, 744 byte

Tôi nghĩ nó dài khoảng 1 triệu ký tự, nhưng tôi không quan tâm, tôi rất vui vì đã giải quyết được điều này ...

Chơi gôn

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

Ung dung:

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

Kiểm tra:

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

Quá nhiều để dán và định dạng ở đây, tôi đã tạo ra một pastebin:

Quá khứ


Vui lòng đánh gôn và cung cấp số byte.
mbomb007

2

C, 331 byte

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

Toán tử được truyền dưới dạng mã ASCII ovà ký tự được tính vào n. Tôi chỉ thêm khoảng trắng giữa các ký tự theo chiều ngang vào dấu cộng, vì đây là ký tự duy nhất mà đầu ra sẽ bị biến dạng nếu tôi không và trong tác vụ, nó chỉ nói "nên". Tôi sử dụng hai vòng lặp lồng nhau đếm ngược (ngoại trừ -nơi tôi chỉ cần một dòng).

= Ba dòng, một trong số chúng trống rỗng, thẳng tiến

+sử dụng printfvì không gian

- thẳng về phía trước

/ có vòng lặp in bên trong ở mức 0 và bắt đầu tại bộ đếm của vòng lặp bên ngoài

xcó in vòng lặp bên trong tại bộ đếm của vòng lặp bên ngoài và "nghịch đảo" của nó n-i. Vẫn cần phải xem tại sao tôi lại ở đây.

Cuộc gọi mẫu:

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

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

Giảm 90 ký tự và bây giờ thật đau đớn khi nhìn vào ngay cả khi được mở rộng. : |


"Cũng có vẻ như đây là một thử thách cũ. Rất tiếc" Không có gì sai khi trả lời các thử thách cũ.
Steadybox
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.