Xây dựng một máy vẽ kỹ thuật số


11

Vấn đề được chuyển thể từ cuốn sách Fortran 77 của Donald M. Monro

Giới thiệu

Máy vẽ kỹ thuật số được sử dụng rộng rãi để tạo ra các dạng bản vẽ, đồ thị và các kết quả hình ảnh khác nhau. Hầu hết các máy như vậy chỉ có thể di chuyển bút của chúng theo các hướng nhất định, thường là các bước đơn theo hướng X và Y hoặc cả hai. Một máy điển hình sẽ di chuyển theo một trong tám hướng được hiển thị trong Hình 1:

Hình 1 Hình 1

Thử thách

Viết chương trình không có các hàm lượng giác , lấy một số từ 0 đến 7 (đã bao gồm) làm đầu vào và xuất ra tọa độ tương ứng của các điểm cuối trong Hình. 1.

Đầu ra phải là một mảng hoặc danh sách có hai phần tử (nghĩa là (1, 0)hoặc [0,-1])

Bảng I / O

0 (1, 0)
1 (1, 1)
2 (0, 1)
3 (-1, 1)
4 (-1, 0)
5 (-1, -1)
6 (0, -1)
7 (1, -1)

Chiến thắng

Mã ngắn nhất tính bằng byte thắng


Có một rotate(x)hàm được tính là một hàm lượng giác? (nó chỉ xoay "khung vẽ" bằng xradian)
user41805

@Kritixi Không, hạn chế chỉ có trên cos, sin, tan, secv.v.
Beta Decay

Tôi khá chắc chắn rằng có một câu hỏi liên quan liên quan đến việc đi theo chu vi của một hình vuông có kích thước được chỉ định nhưng tôi không thể tìm thấy nó.
Neil

1
<s> Có thể </ s> Chúng tôi có thể 1 chỉ số thay vì 0 chỉ mục không?
Jonathan Allan

3
@Jonathan Không, nó phải bắt đầu lúc 0
Beta Decay

Câu trả lời:


5

Thạch , 8 byte

Hı*µḞ,ĊṠ

Sử dụng số học phức tạp dường như được cho phép.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Hı*µḞ,ĊṠ  Main link. Argument: n

H         Halve; yield n/2.
 ı*       Yield i^(n/2), where i is the imaginary unit. Since i = e^(iπ/2), this
          computes e^(inπ/4) = cos(nπ/4) + i×sin(nπ/4) = x + iy, where (x, y) is
          the coordinate pair of (nπ/4)/(2π) = n/8 turns along the unit circle.
   µ      Begin a new chain with argument z = x + iy.
    Ḟ     Real part of z; yield x.
      Ċ   Imaginary part of z; yield y.
     ,    Pair, yielding (x, y).
       Ṡ  Apply the sign function to x and y.

15

Python 2, 29 byte

lambda n:1j**(n/2)*(1+n%2*1j)

Trả về tọa độ dưới dạng số phức.


Ồ tốt đẹp Tôi thậm chí không nghĩ đến việc sử dụng số phức!
HyperNeutrino

Tất nhiên điều này không sử dụng các hàm lượng giác trong một ý nghĩa.
đã ngừng quay ngược chiều

@ceasetoturnc gặpclockwis Chắc chắn, nhưng nó đơn giản hóa phương trình cho đến khi chúng không còn nữa.
Vụ kiện của Quỹ Monica

7

Toán học, 24 byte

Sign@{12-8#+#^2,4#-#^2}&

Chức năng thuần túy, sử dụng Signvà biết nơi parabolas nhất định đi.


6

C, 103 86 74 73 70 byte

Cảm ơn @orlp vì đã lưu 12 15 byte!

f(n){n="biM1*#?["[n]/7;printf("%c%d %d",n&8?32:45,n/4&1,n%2*~-(n&2));}

Hãy thử trực tuyến!


1
"\16\17\13\7\6\5\9\15"[n] == "pw[1*#?i"[n]/7
orlp

@orlp Cảm ơn! Mặc dù chuỗi thực sự là "biM1*#?["bởi vì trong "\16\17\13\7\6\5\9\15"các giá trị là các số bát phân, do đó 16 == 14 ở dạng thập phân, 17 == 15, v.v.
Steadybox

1
!!(n&4) == n/4&1
orlp

1
n&2?n&1:-(n&1) == n%2*~-(n&2)
orlp


4

JavaScript (ES6), 41 36 byte

r=>[1-(6800>>r*2&3),(425>>r*2&3)-1]

Sử dụng hai bảng tra cứu đơn giản mã hóa 8 mục trong cơ sở 4 sau khi thêm một vào mỗi "chữ số". Phiên bản thay thế, sử dụng bảng tra cứu đơn giản hơn:

r=>["22100012"[r]-1,"12221000"[r]-1]

Phiên bản cũ (ngắn hơn 4 byte nhờ @Neil):

r=>[r>2&r<6?-1:r<2|r>6,r>4?-1:r%4&&1]

Cách tiếp cận ngây thơ bằng cách sử dụng một số tính toán đơn giản để tìm tọa độ X và Y riêng biệt ...


1
Phiên bản hiện tại của bạn đưa ra câu trả lời không chính xác cho 4 và 5 nhưng tôi nghĩ r&&(r<4)-(r>4)hoặc r%4&&1-(r&4)/2lưu một byte trên phiên bản cũ của bạn.
Neil

@Neil Hmm, tôi không nghĩ đó là một sửa chữa dễ dàng vì vậy tôi sẽ chuyển sang một phiên bản thay thế. Tuy nhiên, cảm ơn vì lời khuyên khác :-) Trông có thể chơi được, nhưng tôi không thấy cách nào ...
Sản phẩm ETH

Tôi nghĩ rằng tôi đã cạo thêm một chút nữa, nhưng vẫn chưa đủ ngắn:r=>[r>2&r<6?-1:r<2|r>6,r>4?-1:r%4&&1]
Neil

Bạn có thể lưu một byte với n=>[(s='22100012')[n]-1,s[n+6&7]-1].
Arnauld

3

TI-Basic, 23 byte

Prompt X
e^(i(pi)X/4
round({real(Ans),imag(Ans)},0

Giả sử máy tính của bạn ở chế độ radian; nếu cần phải có trong chương trình, thì đó là 25 byte.


Tôi nghĩ chế độ radian được bật theo mặc định, vì vậy bạn sẽ ổn.
Conor O'Brien

1

Thạch , 13 12 byte

Tôi vẫn khá tự tin là có ngắn hơn, nhưng tôi chưa tìm thấy gì, vì vậy tôi nghĩ rằng tôi đã đăng bài này

+2,ị6400b3¤’

Hãy thử trực tuyến! hoặc xem một bộ thử nghiệm

Làm sao?

+2,ị6400b3¤’ - Main link: n                        e.g. 7
+2           - n+2                                      9
  ,          - paired with n: [n+2,n]                   [9,7]
          ¤  - nilad followed by link(s) as a nilad      9th         7th
    6400     -     6400                                  v           v
        b3   -     to base 3: [2,2,2,1,0,0,0,1]         [2,2,2,1,0,0,0,1]
   ị         - index into (1-indexed and modular)       [2,0]
           ’ - decrement (vectorises)                   [1,-1]

Một phương thức khác , cũng là 12 byte :

_/,+/Ṡ  - Link 1: get next coordinate: current coordinate (list) e.g. [-1,-1]
_/      - reduce by subtraction                                       0
   +/   - reduce by addition                                         -2
  ,     - pair                                                        [0,-2]
     Ṡ  - sign (vectorises)                                           [0,-1]

2BÇ⁸¡ - Main link: n
2B    - 2 in binary: [1,0]
    ¡ - repeat
   ⁸  - left argument (n) times:
  Ç   -     last link (1) as a monad

1

C, 66 byte

f(n){printf("%d %d\n",(n-2)%4?n>2&n<6?-1:1:0,(n-4)%4?n>4?-1:1:0);}

mã kiểm tra

main(i)
{for(i=0;i<8;++i) f(i);}

các kết quả

1 0
1 1
0 1
-1 1
-1 0
-1 -1
0 -1
1 -1

0

C, 56 byte

d(n){printf("%d,%d",n+2&3?n+2&4?-1:1:0,n&3?n&4?-1:1:0);}

Tìm kiếm nhị phân đơn giản được thực hiện hai lần. Tìm kiếm đầu tiên được thực hiện trên n thay đổi bởi 2.

Đầu ra trực tuyến trên Ideone.

C, 53 byte

r;p(n){r?0:p(r=n+2);r=!printf("%d ",n&3?n&4?-1:1:0);}

Đầu ra không có dấu phẩy có thể được nén chặt hơn nữa bằng cách sử dụng lệnh gọi đệ quy.

Đầu ra trực tuyến trên Ideone.

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.