Bangun Plotter Digital

11

Masalah diadaptasi dari buku Fortran 77 oleh Donald M. Monro

pengantar

Mesin plot digital banyak digunakan untuk menghasilkan berbagai bentuk gambar, grafik dan hasil foto lainnya. Sebagian besar mesin tersebut dapat memindahkan pena mereka hanya ke arah tertentu, biasanya sebagai langkah tunggal dalam arah X dan Y atau keduanya. Mesin khas akan bergerak di salah satu dari delapan arah yang ditunjukkan pada Gambar. 1:

Gambar 1 Fig. 1

Tantangan

Tulis program tanpa fungsi trigonometri yang mengambil angka dari 0 hingga 7 (inklusif) sebagai input dan output koordinat titik akhir yang sesuai pada Gambar. 1.

Output harus berupa array atau daftar dengan dua elemen (yaitu (1, 0)atau [0,-1])

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

Kemenangan

Kode terpendek dalam byte menang

Peluruhan Beta
sumber
Apakah rotate(x)fungsi dihitung sebagai fungsi trigonometri? (itu hanya memutar "kanvas" oleh xradian)
user41805
@Kixii Tidak, batasannya hanya pada cos, sin, tan, secdll.
Beta Decay
Saya cukup yakin ada pertanyaan terkait yang melibatkan mengikuti perimeter dari ukuran yang ditentukan tetapi saya tidak dapat menemukannya.
Neil
1
<s> Bisakah </s> Bolehkah kita 1 indeks bukannya 0 indeks?
Jonathan Allan
3
@ Jonathan Tidak, itu harus dimulai pada 0
Beta Decay

Jawaban:

5

Jelly , 8 byte

Hı*µḞ,ĊṠ

Menggunakan aritmatika kompleks tampaknya diizinkan.

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
15

Python 2, 29 byte

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

Mengembalikan koordinat sebagai bilangan kompleks.

orlp
sumber
Oh bagus. Saya bahkan tidak berpikir untuk menggunakan bilangan kompleks!
HyperNeutrino
Tentu saja ini menggunakan fungsi trigonometri.
Berhenti menghidupkan counterclockwis
@ceasedtoturncounterclockwis Tentu, tetapi menyederhanakan persamaan sampai mereka tidak lagi ada.
Dana Gugatan Monica
7

Mathematica, 24 byte

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

Berfungsi murni, menggunakan Signdan mengetahui ke mana parabola tertentu pergi.

Greg Martin
sumber
6

C, 103 86 74 73 70 byte

Terima kasih kepada @orlp karena telah menghemat 12 15 byte!

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

Cobalah online!

Steadybox
sumber
1
"\16\17\13\7\6\5\9\15"[n] == "pw[1*#?i"[n]/7
orlp
@ orlp Terima kasih! Meskipun string sebenarnya "biM1*#?[", karena dalam "\16\17\13\7\6\5\9\15"nilainya adalah angka oktal, jadi 16 == 14 dalam desimal, 17 == 15 dan seterusnya.
Steadybox
1
!!(n&4) == n/4&1
orlp
1
n&2?n&1:-(n&1) == n%2*~-(n&2)
orlp
68 byte
ceilingcat
4

JavaScript (ES6), 41 36 byte

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

Menggunakan dua tabel pencarian sederhana yang mengkodekan 8 entri di basis 4 setelah menambahkan satu ke setiap "digit". Versi alternatif, menggunakan tabel pencarian yang lebih sederhana:

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

Versi lama (4 byte lebih pendek berkat @Neil):

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

Pendekatan naif menggunakan beberapa perhitungan sederhana untuk menemukan koordinat X dan Y secara terpisah ...

Produksi ETH
sumber
1
Versi Anda saat ini memberikan jawaban yang salah untuk 4 dan 5 tetapi saya rasa salah r&&(r<4)-(r>4)atau r%4&&1-(r&4)/2menyimpan byte pada versi lama Anda.
Neil
@Neil Hmm, saya tidak berpikir itu perbaikan yang mudah jadi saya hanya akan beralih ke versi alternatif. Terima kasih atas tip lainnya :-) Ini terlihat seperti golf, tapi saya tidak melihat caranya ...
ETHproduksi
Saya pikir saya telah mencukur sedikit lebih banyak, masih belum cukup pendek meskipun:r=>[r>2&r<6?-1:r<2|r>6,r>4?-1:r%4&&1]
Neil
Anda dapat menyimpan byte dengan 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

Asumsikan kalkulator Anda dalam mode radian; jika itu perlu dalam program, maka itu adalah 25 byte.

pizzapants184
sumber
Saya pikir mode radian aktif secara default, jadi Anda harus baik-baik saja.
Conor O'Brien
1

Jelly , 13 12 byte

Saya masih cukup yakin ada yang lebih pendek, tetapi saya belum menemukan apa pun, jadi saya pikir akan memposting ini

+2,ị6400b3¤’

Cobalah online! atau lihat test suite

Bagaimana?

+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]

Sebuah metode alternatif , juga 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
Jonathan Allan
sumber
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);}

kode uji

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

hasil

1 0
1 1
0 1
-1 1
-1 0
-1 -1
0 -1
1 -1
RosLuP
sumber
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);}

Pencarian biner sederhana dilakukan dua kali. Pencarian pertama dilakukan pada n digeser oleh 2.

Output online pada Ideone.

C, 53 byte

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

Output tanpa koma dapat dipadatkan bahkan lebih menggunakan panggilan rekursif.

Output online pada Ideone.

2501
sumber