연산자 ASCII 아트


22

도전

아래 목록 의 ASCII 연산자와 숫자 n이 주어지면, 길이가 n 인 연산자의 선분을 가진 문자로 해당 연산자를 사용하여 연산자의 ASCII 표현을 그리십시오 .

입력

목록에서 ASCII 문자 = + - x /및 정수 . (내가 사용하고 대신 하고 대신 ,하지만 당신은 쉽게 중 어느 하나를 사용할 수 있습니다). 들어 와 , 당신은 단지 정렬에 문제를 피하기 위해 홀수를 처리 할 수 있습니다.nn >= 1x*/÷+x

산출

길이 n의 세그먼트를 가진 문자로 구성된 연산자의 ASCII 도면. 수평 부분은 수직 / 수평 거리 차이를 상쇄하기 위해 문자 사이에 공백이 있어야합니다.

규칙

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다. 표준 허점은 금지되어 있습니다.

입력: + 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 거의 같은 질문을 보았다.)
마틴 Rosenau

1
@MartinRosenau 예, 입력 섹션에서 : "+ 및 x의 경우 정렬 문제를 피하기 위해 홀수 만 처리하면됩니다."
corvus_192

왜 X와 / 간격이 없습니까?
Adám

1
공백이 허용됩니까?
Adám

답변:


5

, 62 59 56 바이트

55 바이트의 코드, -S플래그의 경우 +1

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

참고이 솔루션은 입력으로 작동 ÷부문과 *는 ASCII 예술을 그리는 그 문자를 사용하지만, 곱셈 /x각각. OP는 이것이 옳다는 것을 분명히 했습니다. 온라인으로 사용해보십시오!

방법?

여기의 부분 간격 및 주석 버전 . 참고 ab즉, 연산자와 각각 크기 명령 줄 인수입니다. -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, 우리는 인덱스의 공백을 대체 할 ib-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-10공백이 있고 입력 문자가 뒤에옵니다 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

빼기

공백으로 구분 된 입력 문자 행을 만드십시오. 나중에 사본을 저장하십시오.

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값은 기본 목록을 채우므로 모듈 식 인덱싱은의 각 입력 문자에 대해 고유 한 인덱스를 제공합니다 +-*÷=.


13

V , 78, 72, 71, 68, 65, 63, 62 , 61 바이트

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

온라인으로 사용해보십시오!

항상 그렇듯이 05AB1E와의 목과 싸움은 정말 재미 있습니다!

여기에는 비 ASCII 문자가 포함되어 있으므로 다음은 16 진 덤프입니다.

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

이것은의 출력에 선행 공백을 만들 않습니다 =하고 -있지만 이 허용 될 것으로 보인다 . 이것이 허용되지 않으면 자유롭게 의견을 말하고 롤백합니다.

설명

"전역 명령"(예 ç:)은 특정 정규식과 일치하는 모든 줄에 특정 명령 집합을 적용합니다. 문법은

ç<compressed regex>/<commands>

조건부 / 스위치 문을 시뮬레이션하는 가장 쉬운 방법입니다. 원래의 대답에서, 나는 우리가 검색해야 할 각각의 다른 문자에 대해 오른쪽에 전체 ASCII 아트를 만들었습니다. 그러나 이러한 많은 출력에는 비슷한 명령이 필요합니다. 그래서 나는 그것들을 결합했습니다. 첫 번째 명령 ( 'Ç')은 실제로 전역 명령의 역수이며 정규식과 일치 하지 않는 모든 행에 명령을 적용합니다 . 첫 번째 명령은 다음과 같습니다.

Ç=ü-        " 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 '+ '

equals 명령은 매우 간단합니다. 우리는 단지 그것을 복제합니다 Ä. 의 경우 /:

ç¯          " 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 답변전쟁 중 입니다 . 나는 당신을 위해오고 있습니다. Dr. McMoylex : p.

또한 핍 답변 과의 전쟁 . DLosc 씨를 be겠습니다.


암호:

Ç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 Hahaha, 좋은 옛날 :).
Adnan

30
더 읽기 ... 완전히 ...
Oliver Ni

1
"읽을 수있는"의 주어진 정의.
Matt Lacey


7

파이썬 3, 304 283278 바이트

간단히 말해서, 문자 행렬을 만들고 그 문자에 따라 다른 연산을 적용합니다. =-그 나쁘지 아니라면 후행 공백을했다.

편집 : 21 바이트를 절약 한 제안에 대해 @Shebang과 @Rod에게 감사드립니다!

EDIT2 : 5 바이트를 절약 한 @Artyer에게 감사드립니다!

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

if'-'==t조건 줄 을 제거하고 그 위의 줄을 if t in'=-':b=[[t+' ']*s]*(2*(t>'-'))(I think)로 바꾸면 8 바이트를 절약 할 수 있습니다 .
Kade

함수를 목록으로 감싸고 exec : exec(['+ block','/ block','x block','= block','- block']['+/x=-'.find(t)])를 사용하여 실행 하면 ~ 18 바이트를 절약 할 수 있습니다.
Rod

네, 후행 공백 / 줄 바꿈이 허용됩니다.
Yodle

첫 번째 줄의 경우 .split()(공백에 인수 분할 없음)를 수행하십시오. 6 행에서 공백 ( b=[[x+' 'for) 이 누락되었습니다 . print(*map(''.join,b),sep='\n')1 줄의 마지막 줄 을 덜 바이트로 만들 수 있습니다 .
Artyer

7

자바 스크립트 (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, '/'))

설명:

이 코드는 char의 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

자바 스크립트 (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현재 작성된대로 있지만 슬래시 주위의 백틱을 아포스트로피로 변경하면 문제가 해결되었습니다. (아포스트로피 대신 왜 백틱이 있습니까?)
ETHproductions

또한, 대 출력 +, -=의 과제 전화보다 다른 모습 "수평 부분은 수직 / 수평 거리의 차이를 상쇄하는 문자 사이의 공간을 가져야한다."
ETHproductions

@ETHproductions a) 오타 b) 죄송합니다. 간과하고 나중에 고칠 것입니다.
Neil

이것은 엄청나게 짧습니다. 고정하면 너무 많은 바이트가 추가되지 않기를 바랍니다.
ETHproductions

@ETHproductions 감사합니다. 나는 이것이 19 바이트의 비용으로 생각합니다.
Neil

4

Dyalog APL , 91 86 바이트

⎕IO←0많은 시스템에서 기본값 인 Needs가 필요 합니다. 소요 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에 대한 문서를 가지고 있지만 파서가 idk에 사용한 일부 기능을 지원하지 않기 때문에 경쟁이 치열합니다.


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 바이트를 절약 할 수 있습니다.


1
Nice.for "+", 나는 항상 3이 아니라 높이와 일치해야한다고 생각합니다. 또한 case / break 대신 if ()를 사용하기 위해 골프를 더 많이 할 수 있어야합니다.
Crypto

2

C #, 744 바이트

그것은 백만 자 길이와 같지만, 나는 상관하지 않습니다. 나는 이것을 해결하여 너무 행복합니다 ...

골프 :

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

언 골프 드 :

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


골프를 치고 바이트 수를 제공하십시오.
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. 수평으로 연속 된 문자 사이에 공백을 더하기 부호에만 추가했습니다. 왜냐하면 내가하지 않은 경우 출력이 왜곡되고 작업에서 "should"라고만 표시 되었기 때문입니다. 카운트 다운 된 두 개의 루프를 사용합니다 ( -한 줄만 필요한 경우 제외 ).

= 세 줄, 그중 하나는 비어 있고 직선입니다

+printf공백 때문에 사용

- 똑바로

/ 내부 루프를 0으로 인쇄하고 외부 루프의 카운터에서 시작

x내부 루프가 외부 루프의 카운터와 "inverse"에 인쇄되도록합니다 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

루아, 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.