Seni operator ASCII

22

Tantangan

Diberikan operator ASCII dari daftar di bawah ini dan angka n, gambar representasi ASCII dari operator yang menggunakan operator itu sebagai karakter dengan segmen garis dari operator yang memiliki panjang n .

Memasukkan

Karakter ASCII dari daftar = + - x /dan bilangan bulat di nmana n >= 1. (Saya menggunakan xbukan *dan /bukannya ÷, tetapi Anda bisa menggunakan salah satunya, mana yang lebih mudah). Untuk +dan x, Anda hanya perlu menangani angka ganjil untuk menghindari masalah dengan penyelarasan.

Keluaran

Gambar ASCII operator yang terdiri dari karakter dengan segmen panjang n. Bagian horisontal harus memiliki spasi di antara karakter untuk mengimbangi perbedaan jarak vertikal / horizontal.

Aturan

Ini adalah , jadi kode terpendek dalam byte menang. Celah standar dilarang.

Contohnya

Memasukkan: + 3

  +
+ + +
  +

Memasukkan: = 4

= = = =
= = = =

Memasukkan: = 10

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

Memasukkan: - 2

- -

Memasukkan: / 10

         /
        /
       /
      /
     /
    /
   /
  /
 /
/

Memasukkan: x 7

x     x
 x   x
  x x
   x
  x x
 x   x
x     x
Yodle
sumber
dapatkah Anda menambahkan test case untuk = 10?
Rod
1
Saya menganggap "x" dan "+" menyiratkan angka ganjil? (Saya baru saja melihat DrMcMoylex mengajukan pertanyaan yang hampir sama.)
Martin Rosenau
1
@ MartinRosenau Ya, dari bagian Input: "Untuk + dan x, Anda hanya perlu menangani angka ganjil untuk menghindari masalah dengan penyelarasan."
corvus_192
Mengapa X dan / tidak ditempatkan?
Adem
1
apakah memimpin spasi putih diizinkan?
Adem

Jawaban:

5

Pip , 62 59 56 byte

55 byte kode, +1 untuk -Sbendera.

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

Perhatikan bahwa solusi ini bekerja dengan input ÷untuk divisi dan *untuk perkalian, meskipun menggunakan karakter tersebut untuk menggambar ASCII-art /dan x, masing-masing. OP telah mengklarifikasi bahwa ini baik-baik saja. Cobalah online!

Bagaimana?

Inilah versi yang diberi spasi dan dikomentari sebagian . Catat itu adan bmerupakan argumen baris perintah, yaitu operator dan ukurannya masing-masing. The -Skontrol bendera bagaimana daftar adalah output: itu bergabung pada baris pertama, tetapi bergabung setiap daftar bersarang pada ruang.

[                 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

Dan inilah bagian-bagiannya:

Perkalian

Untuk setiap baris dalam gambar, kami menghasilkan string spasi dan kemudian ganti dua dengan karakter input. Untuk baris i, kami ingin mengganti spasi di indeks idan b-1-i; tetapi perhatikan bahwa yang terakhir dapat menggunakan indeks negatif -1-i. (Ini bahkan lebih pendek karena variabel vdiinisialisasi ke 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

Tambahan

Menggunakan strategi dari saya Gambarlah persegi berongga jawaban, kita mendefinisikan sebuah fungsi yang membungkus +di b/2salinan argumen dan mengembalikan hasil sebagai daftar karakter. (Divisi integer //tidak diperlukan karena operator pengulangan string Xsecara otomatis memotong ke integer.) Pertama, kita memanggil fungsi ini pada spasi, memberi [" ";" ";"+";" ";" "]; kemudian, kami memetakan fungsi yang sama untuk hasil itu, memberi [" ";" ";"+";" ";" "]pada sebagian besar garis tetapi ["+";"+";"+";"+";"+"]pada garis tengah. Daftar bersarang ini kemudian di-output, karena -Sflag, dengan spasi di antara semua karakter di baris dan baris baru di antara baris.

(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

Divisi

Setiap baris memiliki antara b-1dan 0spasi, diikuti oleh karakter input 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

Pengurangan

Buat baris karakter input yang dipisahkan spasi. Simpan salinan untuk nanti.

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

Sama dengan

Langkah pengurangan disimpan setengah dari apa yang kita butuhkan di - cukup ygandakan.

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

xNilai-nilai dummy ada untuk pad daftar utama sehingga pengindeksan modular memberikan indeks unik untuk setiap karakter input di +-*÷=.

DLosc
sumber
13

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

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

Cobalah online!

Seperti biasa, pertempuran leher-dan-leher dengan 05AB1E benar-benar menyenangkan!

Karena ini berisi karakter non-ASCII, berikut adalah 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

Ini memang menciptakan spasi di output untuk =dan -, tetapi ini tampaknya diizinkan . Jika ini tidak diizinkan, jangan ragu untuk berkomentar dan saya akan mengembalikannya.

Penjelasan

"Perintah global" (misalnya ç) menerapkan seperangkat perintah tertentu untuk setiap baris yang cocok dengan regex tertentu. Sintaksnya adalah

ç<compressed regex>/<commands>

Ini adalah cara termudah untuk mensimulasikan pernyataan kondisi / switch. Dalam jawaban asli saya, saya hanya menciptakan seluruh seni ASCII di sisi kanan untuk setiap karakter berbeda yang perlu kita cari. Namun, banyak dari output ini membutuhkan perintah yang sama. Jadi saya menggabungkannya. Perintah pertama ('Ç') sebenarnya adalah kebalikan dari perintah global, itu menerapkan perintah untuk setiap baris yang tidak cocok dengan regex. Jadi perintah pertama adalah:

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

Perintah berikut adalah untuk input '=' dan '-'. Keduanya mudah dan mirip. Setelah perintah ini, kita tidak perlu lagi diproses -.

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

Dari sini kita hanya melakukan beberapa perintah tambahan untuk setiap input yang memungkinkan. Untuk +:

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

Perintah untuk equals sangat mudah. Kami hanya menduplikasi Ä. Untuk /:

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

Yang terakhir adalah yang paling rumit. Ini pada dasarnya adalah port dari jawaban ini .

ç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'
DJMcMayhem
sumber
Jadi, untuk apa beberapa baris digunakan?
Conor O'Brien
@Cororobrien Ya. The çperintah (serta pencarian dan mengganti, /dan ?) semua bagian simulasi dari baris perintah vim, di mana Anda harus tekan enter untuk benar-benar menjalankan perintah
DJMcMayhem
13

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

Saat ini dalam perang dengan jawaban V . Saya datang untuk Anda, Dr. McMoylex: hlm.

Juga dalam perang dengan jawaban Pip . Aku akan mengawasimu, Tuan DLosc.


Kode:

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

Atau dalam bentuk yang lebih mudah dibaca:

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

Menggunakan pengkodean CP-1252 . Cobalah online!

Adnan
sumber
1
Ini dia lagi ...: P
DJMcMayhem
1
@DrMcMoylex Hahaha, masa lalu yang baik :).
Adnan
30
Lebih mudah dibaca ... sepenuhnya ...
Oliver Ni
1
Untuk definisi yang diberikan "dapat dibaca".
Matt Lacey
7

Python 3, 304 283 278 byte

Cukup sederhana, cukup buat matriks karakter dan terapkan operasi yang berbeda berdasarkan yang mana. The =dan -telah spasi jika itu tidak terlalu buruk.

EDIT: Terima kasih kepada @Shebang dan @Rod untuk saran mereka yang akhirnya menghemat 21 byte!

EDIT2: Terima kasih kepada @Artyer karena telah menghemat 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')
Biru
sumber
Anda dapat menyimpan 8 byte dengan menghapus if'-'==tbaris kondisi dan mengganti yang di atasnya dengan if t in'=-':b=[[t+' ']*s]*(2*(t>'-'))(saya pikir).
Kade
Anda dapat membungkus fungsi-fungsi di dalam daftar dan menjalankan menggunakan exec: exec(['+ block','/ block','x block','= block','- block']['+/x=-'.find(t)])to save ~ 18 bytes
Rod
Ya, spasi tambahan / baris baru dapat diterima.
Yodle
Untuk baris pertama, lakukan .split()(No args split pada whitespace). Pada saluran 6, Anda melewatkan spasi ( b=[[x+' 'for). Anda dapat membuat baris terakhir print(*map(''.join,b),sep='\n')dengan 1 byte lebih sedikit.
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``

Mungkin bisa bermain golf, tapi ini awal.

Produksi ETH
sumber
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}

Pemakaian:

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

Penjelasan:

Kode tes untuk nilai ascii dari char untuk memilih cara yang benar untuk menghasilkan gambar. Nilai ascii dari operator yang dimaksud adalah: ('+' -> 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 
  }
corvus_192
sumber
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`

Dimana \nmewakili karakter baris baru literal.

Neil
sumber
Di Firefox 49, saya mendapatkan SyntaxError: invalid property idapa yang saat ini ditulis, tetapi mengubah backticks di sekitar slash ke apostrophes memperbaikinya. (Mengapa Anda memiliki backticks di sana alih-alih apostrof?)
ETHproduk
Juga, output untuk +, -dan =terlihat berbeda dari tantangan, panggilan untuk: "Bagian horisontal harus memiliki ruang antara karakter untuk mengimbangi perbedaan jarak vertikal / horizontal."
ETHproduk
@ ETHproductions a) salah ketik) maaf, saya mengabaikan itu, akan memperbaikinya nanti
Neil
Ini sangat pendek. Saya harap memperbaikinya tidak menambahkan terlalu banyak byte.
ETHproduk
@ ETHproduk Terima kasih. Saya pikir ini tidak dengan biaya 19 byte.
Neil
4

Dyalog APL , 91 86 byte

Kebutuhan ⎕IO←0, yang merupakan standar pada banyak sistem. Mengambil n sebagai argumen kiri, dan salah satu dari + - × ÷ = sebagai argumen benar.

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

Penjelasan

{
    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
}
Adm
sumber
3

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

Fungsi anonim. Mengambil string dan angka sebagai input, dan mengembalikan string sebagai output. Bukan yang terpendek sejauh ini, tetapi masih menyenangkan untuk menulis.

LegionMammal978
sumber
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")}}

Telepon dengan:

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

SOML , 104 100 byte (tidak bersaing)

    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

Ini semacam bersaing karena saya cukup yakin bahwa semua yang saya gunakan di sini memiliki dokumen di github sebelum tanggal posting pertanyaan ini tetapi parser tidak memiliki dukungan untuk beberapa fungsi yang saya gunakan jadi idk.

dzaima
sumber
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;

Ooh ini besar ... perlu golf lebih lanjut.
Saya bisa menyimpan 4 byte dengan linebreak fisik atau satu byte dengan meletakkan "\ n" ke dalam variabel.

Titus
sumber
1
Bagus untuk "+", saya pikir Anda harus mencocokkan ketinggian dan tidak selalu 3. Juga Anda harus bisa bermain golf lebih banyak jika () bukannya case / break;
Crypto
2

C #, 744 Bytes

Ini seperti 1 juta karakter, saya pikir, tapi saya tidak peduli, saya sangat senang bahwa saya menyelesaikan ini ...

Golf:

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

Tidak Disatukan:

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

Pengujian:

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

Terlalu banyak untuk di-paste dan diformat di sini, saya membuat pastebin:

Pastebin

Pete Arden
sumber
Silakan golf dan berikan jumlah byte.
mbomb007
2

C, 331 Bytes

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

Operator diteruskan sebagai kode ASCII odan karakter diperhitungkan n. Saya hanya menambahkan spasi antara karakter berturut-turut secara horizontal ke dalam tanda plus, karena ini adalah satu-satunya di mana output akan terdistorsi jika saya tidak dan dalam tugas itu hanya tertulis "harus". Saya menggunakan dua loop bersarang menghitung mundur (kecuali untuk- mana saya hanya perlu satu baris).

= Tiga Baris, salah satunya kosong, lurus ke depan

+ menggunakan printf karena spasi

- lurus ke depan

/ cetak lingkaran dalam di nol dan mulai dari counter lingkaran luar

x memiliki cetak lingkaran dalam di counter lingkaran luar dan "terbalik" n-i . Masih perlu melihat mengapa saya tidak ada di sini.

Contoh panggilan:

#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));
}
Florian
sumber
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

90 karakter berkurang dan sekarang menyakitkan untuk melihat bahkan ketika diperluas. : |

Pengobrol
sumber
"Sepertinya juga ini adalah tantangan lama. Ups" Tidak ada yang salah dengan menjawab tantangan lama.
Steadybox