그래프 계산기 구현


12

계산기와 관련된 많은 질문이있었습니다. 그러나 그래프 계산기를 구현하는 것으로 보이지는 않습니다.

도전

STDIN의 입력으로 여러 수식을 가져 와서 STDOUT에 그래프로 작성하는 완전한 프로그램을 작성해야합니다. 입력은 형식을 취합니다 f1(x)=x^2-x-1. 그 f뒤에 숫자 0-9 (포함), 뒤에 (x)=, 그래프로 나타낼 수식이 있습니다. 프로그램은 입력, 그래프, 더 많은 입력, 그래프 등을 취할 수 있어야합니다.

이것은 코드 골프입니다.

그래프는 X 축 범위가 -5에서 5 사이 여야하며 1/2 단위마다 최소 한 점의 해상도를 가져야합니다. Y 축 요구 사항은 동일합니다. 이것은 현대 계산기와 비교할 때 작은 범위처럼 보이지만 이것을 늘리는 데 사소한 것일 수 있습니다. 그래프 +에는 정수 형식의 눈금이있는 축이 그려 져야합니다 .

공식은 정상적인 작동 순서로 평가해야합니다. 이 공식에는 수직 점근선 / 정의되지 않은 영역이 없습니다. 변수는 항상 x입니다. 동일한 수식 번호로 두 수식을 입력하면 가장 오래된 수식을 지우고 새 수식으로 바꿔야합니다. 빈 수식은 0으로 평가되어야합니다. 수식이 항상 1/2의 좋은 배수를 제공하지는 않을 가능성이 높으므로 가장 가까운 1/2로 반올림해야합니다.

수식을 그래프로 표시 할 때 그 선은 수식의 숫자로 구성되어야합니다. 선이 축을 가로 지르면 축이 맨 위에 그려 져야합니다. 두 선이 서로 교차 할 때 표시되는 것은 중요하지 않습니다.

입력 예

f1(x)=x+1

산출

          +       1
          |      1
          +     1
          |    1
          +   1
          |  1
          + 1
          |1
          +
         1|
+-+-+-+-+-+-+-+-+-+-+
       1  |
      1   +
     1    |
    1     +
   1      |
  1       +
 1        |
1         +
          |
          +

입력

f2(x)=(x^2)^0.25

산출

          +       1
          |      1
          +     1
          |    1
          +   1
          |  1
2222      + 1    2222
    222   |1  222
       22 + 22
         2|2
+-+-+-+-+-+-+-+-+-+-+
       1  |
      1   +
     1    |
    1     +
   1      |
  1       +
 1        |
1         +
          |
          +

입력

f1(x)=-x  

(프로그램이 0-x 또는 x * -1을 제외하고이 입력을 거부하는 것은 허용되지만 문서화해야합니다)

산출

1         +
 1        |
  1       +
   1      |
    1     +
     1    |
2222  1   +      2222
    2221  |   222
       22 + 22
         2|2
+-+-+-+-+-+-+-+-+-+-+
          |1
          + 1
          |  1
          +   1
          |    1
          +     1
          |      1
          +       1
          |        1
          +         1

답변:


5

Perl, 177 자 (+1 명령 행 스위치)

perl -nE 's!\^!**!g;s!x!(\$k/2-6)!g;s/\d.*=/;/;$f[$&]=$_;my%a;for$k(@x=2..22){$i=0;$a{int 12.5-2*eval}[$k-2]=$i++for@f}$p="|";$$_[10]=$p^=W,$a{12}=[$p."-+"x10],say map$_//$",@$_ for@a{@x}'

이 메타 스레드 당 총 178 자로 계산해야한다고 생각합니다.

Ruby 솔루션 eval과 마찬가지로을 사용 하고로 바꾸고 ^있습니다 **.

입력 구문 분석은 매우 취약 함과 동시에 믿을 수 없을만큼 강력한 둘 다 : f1(x)=같이 쓸 수있다 f 1 ( x ) =거나 foo 1 bar =또는 단지 1=,하지만 당신은 대체하면 아주 이상한 일들이 일어날 수있는 f유효한, 측면 불 유효한 펄 문이 아닌 뭔가. 경고를 받았습니다.

관심의 다른 세부 사항은 문자의 비트 XOR는 사실 활용 수직 축이 그려지는 방식, 포함 +|입니다 W. 분명히 이것은 EBCDIC 시스템에서 작동하지 않습니다.

출력은 배열이 아닌 배열의 해시로 렌더링됩니다. 해시 키를 정수로 명시 적으로 자른 다음 해시 슬라이스를 반복하여 배열이되지 않도록하는 데 필요한 문자 수는 더 적습니다. 음수 값으로 색인됩니다. Perl이 int음수 값을 0으로 자르지 않으면 두 개의 문자를 더 줄일 수 있습니다. 출력 영역의.

입력 구문 분석에서 Perl의 자유 문자열-숫자 변환을 사용합니다. 여기서 전체 문자열 1(x)=을 배열 인덱스로 사용합니다 (단 1로 변환됩니다).

나는 할 수도 저장 세 이상의 문자 (및 구문 분석이 약간 더 강력하게) 대체함으로써 s/\d.*=/;/;$f[$&]=$_함께 /\d.*=/;$f[$&]=$',하지만 내가 쓰기에 추가로 같은 수의 문자를 지출해야 할 것 $'같은 $'\''단일 인용 쉘 문자열입니다. 기술적으로 나는 그것들을 세지 않아도 될 것이라고 생각하지만, 속임수처럼 느껴집니다.


6

루비, 200 자

f={}
r=0..20
(f[gets[1]]=$_[6..-1].gsub /\^/,'**'
s=r.map{' '*21}
f.map{|n,k|r.map{|y|x=y*0.5-5
v=(2*eval(k)).round
v.abs<11&&y!=10&&s[10-v][y]=n
s[y][10]='+|'[y%2]
s[10][y]='+-'[y%2]}}
puts s)while 1

표현식에 표준 평가자를 사용하는 일반 루비 구현입니다 ( ^위의 예제가 제대로 작동하도록 대체 될 것입니다). 매우 강력하지 않으며 질문에 지정된대로 입력을 가정합니다.


다섯 번째 줄에, 당신은 변경 될 수 있습니다 y*0.5y/2두 개의 문자를 제거? 루비를 모르므로 옳지 않을 수 있습니다.
PhiNotPi

2
@PhiNotPi 불행히도 이것은 작동하지 않습니다. y/2정수 나누기를 수행합니다.
Howard

loop{}대신 사용할 수 있습니까 ()while 1?
defhlt

사이드 바의 링크를 통해 오른쪽에 있습니다. 이것은 꽤 잘 이루어졌습니다. 나는이 작은 것을 얻으려고 약간의 재미를 가졌지 루비 2.1 (?)에 도입 된 합리적인 리터럴에 의존하는 9 바이트 만 발견했습니다 .
blutorange

5

파이썬 2 : 320 자

N=20
r=range(N+1)
d={}
while(1):
 l=raw_input()
 d[l[1]]=l[6:].replace('^','**')
 g=[[' ']*(N+1) for i in r]
 for n,f in d.items():
  for x in r:
   v=N/2+int(round(2*eval(f.replace('x','(%f)'%(x/2.0-N/4)))))
   if 0<=v<=N:g[N-v][x]=n
 for i in r:
  g[i][N/2]='+|'[i%2]
  g[N/2][i]='+-'[i%2]
 for l in g:print''.join(l)

아마도 더 짧아 질 수도 있지만, 나는 이것에 약간의 초보자입니다 :)

N변수를 만들면 9 문자가 낭비되지만 그렇게하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.