Thực hiện một máy tính đồ họa


12

Đã có nhiều câu hỏi liên quan đến máy tính; tuy nhiên, dường như không có bất kỳ liên quan đến việc thực hiện một máy tính vẽ đồ thị.

Các thách thức

Bạn phải viết một chương trình hoàn chỉnh lấy nhiều công thức làm đầu vào từ STDIN và vẽ đồ thị cho STDOUT. Đầu vào sẽ có hình thức f1(x)=x^2-x-1. Sẽ có một số ftheo sau là một số 0-9 (đã bao gồm), theo (x)=sau là công thức cho biểu đồ. Chương trình của bạn sẽ có thể lấy đầu vào, đồ thị, lấy thêm đầu vào, đồ thị, v.v.

Đây là mã golf.

Biểu đồ của bạn nên có phạm vi trục X từ -5 đến 5, với độ phân giải ít nhất một điểm mỗi 1/2 đơn vị. Yêu cầu trục Y là như nhau. Điều này có vẻ như là một phạm vi nhỏ so với các máy tính hiện đại, nhưng rất có thể nó sẽ không đáng kể trong việc tăng này. Biểu đồ nên có trục được vẽ trên chúng, với các dấu tick ở dạng +số nguyên.

Công thức nên được đánh giá với thứ tự hoạt động bình thường. Sẽ không có bất kỳ tiệm cận đứng / vùng không xác định trong các công thức này. Biến sẽ luôn là x. Nếu hai công thức được nhập với cùng một số phương trình, thì công thức cũ nhất sẽ bị xóa và thay thế bằng công thức mới. Công thức trống nên đánh giá bằng không. Vì có thể công thức không phải lúc nào cũng cho bội số 1/2, nên bạn phải làm tròn đến 1/2 gần nhất.

Khi một công thức được vẽ đồ thị, dòng của nó sẽ được hình thành từ số lượng của công thức. Khi một đường ngang qua một trục, trục sẽ được vẽ trên đầu. Khi hai dòng giao nhau, không có vấn đề gì được hiển thị.

Ví dụ đầu vào

f1(x)=x+1

Đầu ra

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

Đầu vào

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

Đầu ra

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

Đầu vào

f1(x)=-x  

(lưu ý, chương trình của bạn có thể từ chối đầu vào này và chỉ ngoại trừ 0-x hoặc x * -1, nhưng điều này phải được ghi lại)

Đầu ra

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

Câu trả lời:


5

Perl, 177 ký tự (chuyển đổi dòng lệnh +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}'

Mỗi chủ đề meta này , tôi tin rằng điều này sẽ được tính là 178 ký tự trong tổng số.

Giống như giải pháp Ruby, tôi cũng đang sử dụng evalvà thay thế ^bằng **.

Các phân tích đầu vào vừa là vô cùng mong manh và vô cùng mạnh mẽ cùng một lúc: f1(x)=có thể được viết như f 1 ( x ) =hoặc foo 1 bar =hoặc thậm chí chỉ 1=, nhưng mọi thứ rất lạ có thể xảy ra nếu bạn thay thế fvới một cái gì đó không phải là một, tuyên bố Perl phụ không hiệu quả hợp lệ. Bạn đã được cảnh báo.

Các chi tiết quan tâm khác bao gồm cách vẽ trục dọc, khai thác thực tế là XOR bitwise của các ký tự +|W. Rõ ràng, điều này sẽ không hoạt động trên các hệ thống EBCDIC.

Đầu ra được kết xuất thành một hàm băm của mảng, không phải là một mảng của mảng - hóa ra là cần ít ký tự hơn để cắt ngắn các khóa băm thành số nguyên và sau đó lặp qua một lát băm hơn để đảm bảo rằng một mảng không được lập chỉ mục với các giá trị âm. Tôi có thể tắt thêm hai ký tự nếu không phải vì cách gây phiền nhiễu mà Perl intcắt ngắn các giá trị âm về 0, điều đó buộc tôi phải đánh số các hàng đầu ra từ 2 đến 22 thay vì 0 đến 20 để tránh làm tròn các tạo tác ở cạnh trên của khu vực đầu ra.

Tôi sử dụng chuyển đổi chuỗi thành số tự do của Perl trong phân tích cú pháp đầu vào, trong đó tôi sử dụng toàn bộ chuỗi 1(x)=làm chỉ mục mảng (nó được chuyển đổi thành chỉ 1).

Tôi cũng có thể lưu thêm ba ký tự (và làm cho việc phân tích cú pháp mạnh hơn một chút) bằng cách thay thế s/\d.*=/;/;$f[$&]=$_bằng /\d.*=/;$f[$&]=$', nhưng sau đó tôi phải dành cùng số lượng ký tự phụ để viết $'như $'\''trong một chuỗi shell được trích dẫn. Tôi cho rằng về mặt kỹ thuật tôi sẽ không phải đếm những thứ đó, nhưng cảm giác giống như gian lận.


6

Ruby, 200 ký tự

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

Việc triển khai ruby ​​đơn giản bằng cách sử dụng trình đánh giá tiêu chuẩn cho các biểu thức ( ^sẽ được thay thế để các ví dụ nêu trên hoạt động tốt). Nó không phải là rất mạnh mẽ và giả định đầu vào chính xác như được chỉ định trong câu hỏi.


Trên dòng thứ năm, bạn có thể thay đổi y*0.5để y/2và thoát khỏi hai nhân vật? Tôi không biết Ruby, vì vậy tôi có thể không đúng.
PhiNotPi

2
@PhiNotPi Thật không may, điều này sẽ không hoạt động. y/2không chia số nguyên.
Howard

Bạn có thể sử dụng loop{}thay vì ()while 1?
defhlt

Tìm thấy điều này thông qua liên kết trên thanh bên sang bên phải. Điều này được thực hiện khá tốt. Tôi đã có một số niềm vui khi cố gắng để có được cái này nhỏ hơn, nhưng tôi chỉ tìm thấy 9 byte , một byte dựa trên các chữ hợp lý được giới thiệu trong ruby ​​2.1 (?).
blutorange

5

Python 2: 320 ký tự

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)

Có thể rút ngắn lại, nhưng tôi là một người mới ở đây :)

Làm Nmột biến lãng phí 9 ký tự nhưng tôi thích nó tốt hơn theo cách đó.

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.