Operator ASCII art

22

Wyzwanie

Biorąc pod uwagę operatora ASCII z poniższej listy i liczbę n, narysuj reprezentację ASCII operatora, używając tego operatora jako znaku z segmentami linii operatora o długości n .

Wkład

Znak ASCII z listy = + - x /i liczba całkowita ngdzie n >= 1. (Używam xzamiast *i /zamiast ÷, ale możesz użyć jednego z nich, w zależności od tego, które jest łatwiejsze). W przypadku +i xmusisz obsługiwać liczby nieparzyste, aby uniknąć problemów z wyrównaniem.

Wydajność

Rysunek ASCII operatora złożony z znaku o segmentach o długości n. Części poziome powinny mieć odstępy między znakami, aby zrównoważyć różnice odległości w pionie / poziomie.

Zasady

To jest , więc wygrywa najkrótszy kod w bajtach. Standardowe luki są zabronione.

Przykłady

Wkład: + 3

  +
+ + +
  +

Wkład: = 4

= = = =
= = = =

Wkład: = 10

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

Wkład: - 2

- -

Wkład: / 10

         /
        /
       /
      /
     /
    /
   /
  /
 /
/

Wkład: x 7

x     x
 x   x
  x x
   x
  x x
 x   x
x     x
Jodła
źródło
czy możesz dodać przypadek testowy = 10?
Rod
1
Zakładam, że „x” i „+” oznaczają liczby nieparzyste? (Właśnie zobaczyłem, że DrMcMoylex zadał prawie to samo pytanie.)
Martin Rosenau,
1
@MartinRosenau Tak, w sekcji Input: „W przypadku + i x wystarczy obsłużyć liczby nieparzyste, aby uniknąć problemów z wyrównaniem”.
corvus_192
Dlaczego X i / nie są rozdzielone?
Adám
1
czy dozwolone są wiodące białe znaki?
Adám

Odpowiedzi:

5

Pip , 62 59 56 bajtów

55 bajtów kodu, +1 dla -Sflagi.

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

Zauważ, że to rozwiązanie działa z danymi wejściowymi ÷dla dzielenia i *mnożenia, chociaż używa tych znaków do rysowania odpowiednio ASCII-art /i x. OP wyjaśniła, że to w porządku.Wypróbuj online!

W jaki sposób?

Oto częściowo rozstawiona i skomentowana wersja . Zauważ, że ai bsą argumentami wiersza poleceń, tj. Odpowiednio operatorem i rozmiarem. Te -Skontrole flag jak wykazy są wyprowadzane: łączy się na nowej linii pierwszej, ale dołącza żadnych zagnieżdżonych list na przestrzeniach.

[                 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

A oto poszczególne sekcje:

Mnożenie

Dla każdego wiersza na rysunku generujemy ciąg spacji, a następnie zastępujemy dwa z nich znakiem wejściowym. W przypadku wiersza ichcemy zastąpić spacje indeksem ii b-1-i; ale pamiętaj, że ten ostatni może używać indeksu ujemnego -1-i. (Jest nawet krótszy, ponieważ zmienna vjest wstępnie zainicjalizowana na 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

Dodanie

Stosując strategię z mojego Draw wydrążony kwadratowy odpowiedź, możemy zdefiniować funkcję, która owija +w b/2kopii jej argument i zwraca wynik w postaci listy znaków. (Dzielenie liczb całkowitych //nie jest konieczne, ponieważ operator powtarzania łańcuchów Xautomatycznie obcina się do liczb całkowitych.) Najpierw wywołujemy tę funkcję na spacji, podając [" ";" ";"+";" ";" "]; następnie mapujemy tę samą funkcję do tego wyniku, podając [" ";" ";"+";" ";" "]na większości linii, ale ["+";"+";"+";"+";"+"]na linii środkowej. Ta zagnieżdżona lista jest następnie wyprowadzana, z powodu -Sflagi, ze spacjami między wszystkimi znakami w wierszu i znakami nowej linii między wierszami.

(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

Podział

Każdy wiersz ma między b-1i 0spacje, po których następuje znak wejściowy 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

Odejmowanie

Utwórz oddzielony spacją wiersz znaku wejściowego. Zapisz kopię na później.

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

Równa się

Krok odejmowania przechowywał połowę tego, czego potrzebujemy - po yprostu dwukrotnie.

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

Wartości zastępcze xsłużą do uzupełnienia głównej listy, dzięki czemu modułowe indeksowanie daje unikalny indeks dla każdego wprowadzanego znaku +-*÷=.

DLosc
źródło
13

V , 78, 72, 71, 68, 65, 63, 62 , 61 bajtów

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

Wypróbuj online!

Jak zawsze bitwa pod szyją z 05AB1E jest naprawdę fajna!

Ponieważ zawiera znaki spoza ASCII, oto zrzut heksowy:

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

To tworzy wiodące spacje w danych wyjściowych dla =i -, ale wydaje się to dozwolone . Jeśli nie jest to dozwolone, możesz skomentować, a ja cofnę to.

Wyjaśnienie

„Polecenie globalne” (np. ç) Stosuje określony zestaw poleceń do każdego wiersza pasującego do określonego wyrażenia regularnego. Składnia jest następująca

ç<compressed regex>/<commands>

Jest to najprostszy sposób na symulację instrukcji warunkowej / przełącznika. W mojej oryginalnej odpowiedzi po prostu stworzyłem całą grafikę ASCII po prawej stronie dla każdej innej postaci, której musimy szukać. Jednak wiele z tych danych wyjściowych wymaga podobnych poleceń. Więc połączyłem je. Pierwsze polecenie („Ç”) jest w rzeczywistości odwrotnością polecenia globalnego, stosuje polecenie do każdej linii, która nie pasuje do wyrażenia regularnego. Więc pierwsze polecenie to:

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

Następujące polecenie służy do wprowadzania danych „=” i „-”. Te dwa są dogodnie łatwe i podobne. Po tym poleceniu nie potrzebujemy więcej przetwarzania -.

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

Stąd wykonujemy dodatkowe polecenia dla każdego możliwego wejścia. Dla +:

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

Polecenie równości jest bardzo proste. Po prostu to powielamy Ä. Dla /:

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

Ostatni jest najbardziej skomplikowany. Jest to po prostu część tej odpowiedzi .

ç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
źródło
więc do czego służy wiele linii?
Conor O'Brien
@Conorobrien Tak. çPolecenia (jak również wyszukiwania i zamiany, /i ?) wszystkie symulacji część linii poleceń Vima, gdzie trzeba nacisnąć enter aby rzeczywiście uruchomić komendę
DJMcMayhem
13

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

Obecnie w wojnie z V odpowiedź . Idę po ciebie Dr. McMoylex: str.

Także w wojnie z odpowiedzią Pip . Będę cię obserwował, panie DLosc.


Kod:

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

Lub w bardziej czytelnej formie:

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

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

Adnan
źródło
1
Znowu zaczynamy ...: P
DJMcMayhem
1
@DrMcMoylex Hahaha, stare dobre czasy :).
Adnan,
30
Bardziej czytelne ... całkowicie ...
Oliver Ni
1
Dla danej definicji „czytelnej”.
Matt Lacey,
1
Idę po ciebie, Adnan : P
DLosc
7

Python 3, 304 283 278 bajtów

To proste, po prostu tworzy macierz znaków i stosuje różne operacje w oparciu o to, która z nich jest. =I -mają spacje, jeśli to nie jest tak źle.

EDYCJA: Podziękowania dla @Shebang i @Rod za sugestie, które ostatecznie pozwoliły zaoszczędzić 21 bajtów!

EDIT2: Dzięki @Artyer za zapisanie 5 bajtów!

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')
niebieski
źródło
Możesz zaoszczędzić 8 bajtów, usuwając if'-'==tlinię warunku i zastępując jeden powyżej if t in'=-':b=[[t+' ']*s]*(2*(t>'-'))(myślę).
Kade,
możesz zawinąć funkcje w listę i uruchomić za pomocą exec: exec(['+ block','/ block','x block','= block','- block']['+/x=-'.find(t)])aby zapisać ~ 18 bajtów
Rod
Tak, końcowe spacje / znaki nowej linii są dopuszczalne.
Yodle,
W przypadku pierwszego wiersza wykonaj polecenie .split()(bez argumentów dzieli się na białe znaki). W linii 6 brakowało spacji ( b=[[x+' 'for). Możesz zrobić ostatnią linię print(*map(''.join,b),sep='\n')dla 1 mniej bajtów.
Artyer
7

JavaScript (ES6), 238 225 215 202 196 bajtów

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

Prawdopodobnie można grać w golfa, ale to dopiero początek.

ETHprodukcje
źródło
6

Scala, 275 bajtów

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

Stosowanie:

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

Wyjaśnienie:

Kod sprawdza wartość ascii znaku, aby wybrać właściwy sposób generowania obrazu. Wartości ascii tych operatorów to: ('+' -> 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
źródło
5

JavaScript (ES6), 156 bajtów

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

Gdzie \nreprezentuje dosłowny znak nowej linii.

Neil
źródło
W Firefoksie 49 otrzymuję SyntaxError: invalid property idto, co jest obecnie napisane, ale to zmieniło odwrotne ukośniki wokół ukośnika na apostrofy. (Dlaczego macie apostrofy zamiast apostrofów?)
ETHprodukcje
Ponadto, do wyjścia +, -i= wyglądają inaczej niż rozmowy wyzwaniem: „porcjach poziome powinny mieć odstępy między znakami, aby zrównoważyć pionowo / poziomo różnice odległości.”
ETHproductions
@ETHproductions a) literówka b) przepraszam, przeoczyłem to, naprawię później.
Neil,
Jest to jednak absurdalnie krótkie. Mam nadzieję, że naprawienie go nie doda zbyt wielu bajtów.
ETHproductions
@ETHproductions Thanks. Myślę, że robi to kosztem 19 bajtów.
Neil
4

Dyalog APL , 91 86 bajtów

Potrzebuje ⎕IO←0, co jest domyślne w wielu systemach. Traktuje n jako lewy argument, a jeden z + - × ÷ = jako prawy argument.

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

Wyjaśnienie

{
    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
}
Adám
źródło
3

Mathematica, 191 bajtów

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

Funkcja anonimowa. Pobiera ciąg i liczbę jako dane wejściowe i zwraca ciąg jako dane wyjściowe. Zdecydowanie nie najkrótszy, ale nadal fajnie się pisze.

LegionMammal978
źródło
3

C, 396 bajtów

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

Zadzwoń z:

int main()
{
   f('x', 5);
   return 0;
}
Steadybox
źródło
2

SOML , 104 100 bajtów (niekonkurencyjny)

    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

Jest to dość konkurencyjne, ponieważ jestem prawie pewien, że wszystko, czego tu użyłem, ma dokumenty na github przed datą opublikowania tych pytań, ale parser nie obsługuje niektórych funkcji, których użyłem, więc idk.

dzaima
źródło
2

PHP, 306 292 281 282 281 275 270 bajtów

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

Och, to jest nieporęczne ... potrzebuje dalszej gry w golfa.
Mógłbym zapisać 4 bajty z fizycznymi podziałami linii lub jeden bajt z wstawieniem „\ n” do zmiennej.

Tytus
źródło
1
Nice.for "+", myślę, że musisz dopasować wysokość, a nie zawsze 3. Również powinieneś móc grać w golfa więcej do użycia if () zamiast case / break;
Crypto,
2

C #, 744 bajtów

Myślę, że ma długość 1 miliona znaków, ale nie obchodzi mnie to, jestem tak szczęśliwy, że rozwiązałem ten problem ...

Gra w golfa:

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

Nie golfowany:

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

Testowanie:

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

Zbyt wiele do wklejenia i sformatowania tutaj, utworzyłem pastebin:

Pastebin

Pete Arden
źródło
Proszę zagrać w golfa i podać liczbę bajtów.
mbomb007,
2

C, 331 bajtów

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 jest przekazywany jako kod ASCII do o a liczba znaków do n. Dodałem tylko spacje między poziomo kolejnymi znakami do znaku plus, ponieważ był to jedyny, w którym wynik byłby zniekształcony, gdybym tego nie zrobił, a w zadaniu powiedział tylko „powinien”. Używam dwóch zagnieżdżonych pętli odliczających (oprócz- gdy potrzebuję tylko jednej linii).

= Trzy linie, jedna z nich pusta, prosto

+ za pomocą printf ze względu na spacje

- bezpośredni

/ wydrukuj wewnętrzną pętlę od zera i zacznij od licznika zewnętrznej pętli

x mają wydruk wewnętrznej pętli na liczniku pętli zewnętrznej i jej „odwrotność” n-i . Nadal muszę sprawdzić, dlaczego jestem tutaj osobno.

Przykładowe połączenie:

#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
źródło
1

Lua, 402 344 312 bajtów

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

Zmniejszono 90 znaków, a patrzenie na nie jest teraz bolesne nawet po rozwinięciu. : |

Paplać
źródło
„Wygląda też na to, że jest to stare wyzwanie. Ups” Nie ma nic złego w odpowiadaniu na stare wyzwania.
Steadybox