สร้างพลอตเตอร์ดิจิตอล


11

ปัญหาดัดแปลงมาจากหนังสือFortran 77โดย Donald M. Monro

บทนำ

เครื่องพล็อตดิจิตอลถูกนำมาใช้กันอย่างแพร่หลายในการผลิตภาพวาดกราฟและผลภาพอื่น ๆ เครื่องส่วนใหญ่สามารถเลื่อนปากกาได้ในบางทิศทางโดยปกติจะเป็นขั้นตอนเดียวในทิศทาง X และ Y หรือทั้งสองอย่าง เครื่องทั่วไปจะเคลื่อนที่ในหนึ่งในแปดทิศทางที่แสดงในรูปที่ 1:

รูปที่ 1 รูปที่ 1

ท้าทาย

เขียนโปรแกรมที่ไม่มีฟังก์ชันตรีโกณมิติซึ่งใช้ตัวเลขตั้งแต่ 0 ถึง 7 (รวม) เป็นอินพุตและเอาต์พุตพิกัดที่สอดคล้องกันของจุดปลายในรูปที่ 1

ผลลัพธ์ควรเป็นอาร์เรย์หรือรายการที่มีสององค์ประกอบ (เช่น(1, 0)หรือ[0,-1])

ตาราง 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)

การชนะ

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


ที่ไม่rotate(x)ฟังก์ชั่นนับเป็นฟังก์ชั่นตรีโกณมิติ? (มันแค่หมุน "ผ้าใบ" โดยxเรเดียน)
user41805

@Kritixi ไม่ข้อ จำกัด เป็นเพียงอย่างเดียวcos, sin, tan, secและอื่น ๆ
Beta Decay

ฉันค่อนข้างแน่ใจว่ามีคำถามที่เกี่ยวข้องที่เกี่ยวข้องกับการติดตามเส้นรอบวงของสี่เหลี่ยมจัตุรัสที่ระบุ แต่ฉันหามันไม่เจอ
Neil

1
<s> สามารถ </s> เราขอ 1 ดัชนีแทน 0 ดัชนีได้ไหม
Jonathan Allan

3
@ Jonathan ไม่ต้องเริ่มต้นที่ 0
Beta Decay

คำตอบ:


5

เยลลี่ 8 ไบต์

Hı*µḞ,ĊṠ

อนุญาตให้ใช้การคำนวณเชิงซ้อนได้

ลองออนไลน์!

มันทำงานอย่างไร

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 ไบต์

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

ส่งคืนพิกัดเป็นจำนวนเชิงซ้อน


ดี. ฉันไม่ได้คิดถึงการใช้ตัวเลขที่ซับซ้อน!
HyperNeutrino

แน่นอนว่านี่ใช้ฟังก์ชันตรีโกณมิติในแง่หนึ่ง
หยุดที่จะเปลี่ยนรหัสผ่านเมื่อ

@ceasedtoturncounterclock แน่นอน แต่มันทำให้สมการง่ายขึ้นจนกว่าจะไม่มีอยู่อีกต่อไป
คดีฟ้องร้องกองทุนโมนิก้า

7

Mathematica ขนาด 24 ไบต์

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

ฟังก์ชั่นที่บริสุทธิ์ใช้Signและรู้ว่าพาราโบลาบางตัวไปไหน


6

C, 103 86 74 73 70 ไบต์

ขอบคุณ @orlp ที่ประหยัด12 15 ไบต์!

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

ลองออนไลน์!


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

@ orlp ขอบคุณ! แม้ว่าสตริงจะเป็นจริง"biM1*#?["เพราะใน"\16\17\13\7\6\5\9\15"ค่าเป็นตัวเลขฐานแปดดังนั้น 16 == 14 ในทศนิยม 17 == 15 และอื่น ๆ
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 ไบต์

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

ใช้ตารางการค้นหาแบบง่ายสองตารางซึ่งเข้ารหัส 8 รายการในฐาน 4 หลังจากเพิ่มหนึ่งรายการใน "หลัก" แต่ละรายการ รุ่นอื่นโดยใช้ตารางการค้นหาที่ง่ายขึ้น:

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

รุ่นเก่า (สั้นลง 4 ไบต์ด้วย @Neil):

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

วิธีการไร้เดียงสาโดยใช้การคำนวณอย่างง่ายเพื่อค้นหาพิกัด X และ Y แยกกัน ...


1
รุ่นปัจจุบันของคุณให้คำตอบที่ไม่ถูกต้องสำหรับ 4 และ 5 แต่ฉันคิดว่าอย่างใดอย่างหนึ่งr&&(r<4)-(r>4)หรือr%4&&1-(r&4)/2บันทึกไบต์ในรุ่นเก่าของคุณ
Neil

@ Neil อืมฉันไม่คิดว่ามันเป็นเรื่องง่ายดังนั้นฉันจะเปลี่ยนไปใช้เวอร์ชั่นอื่น ขอบคุณสำหรับเคล็ดลับอื่น ๆ ที่ :-) มันดูกอล์ฟ แต่ฉันไม่เห็นว่า ...
ETHproductions

ฉันคิดว่าฉันโกนหนวดออกไปอีกเล็กน้อย แต่ก็ยังไม่สั้นพอ แต่:r=>[r>2&r<6?-1:r<2|r>6,r>4?-1:r%4&&1]
นีล

n=>[(s='22100012')[n]-1,s[n+6&7]-1]คุณสามารถบันทึกไบต์ด้วย
Arnauld

3

TI-Basic, 23 ไบต์

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

สมมติว่าเครื่องคิดเลขของคุณอยู่ในโหมดเรเดียน หากจำเป็นต้องอยู่ในโปรแกรมแสดงว่าเป็น 25 ไบต์


ฉันคิดว่าโหมดเรเดียนเปิดโดยค่าเริ่มต้นดังนั้นคุณควรจะดี
Conor O'Brien

1

เยลลี่ , 13 12 ไบต์

ฉันยังมั่นใจค่อนข้างสั้น แต่ฉันยังไม่พบอะไรเลยดังนั้นคิดว่าฉันจะโพสต์สิ่งนี้

+2,ị6400b3¤’

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

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

วิธีทางเลือกยัง12 ไบต์ :

_/,+/Ṡ  - 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 ไบต์

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

รหัสทดสอบ

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

ผล

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

0

C, 56 ไบต์

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

ค้นหาไบนารีง่าย ๆ ทำได้สองครั้ง การค้นหาแรกเสร็จสิ้นเมื่อ n เลื่อนจาก 2

เอาต์พุตออนไลน์บน Ideone

C, 53 ไบต์

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

เอาท์พุทโดยไม่ต้องใช้เครื่องหมายจุลภาคก็สามารถที่จะกระชับมากยิ่งขึ้นโดยใช้การโทรซ้ำ

เอาต์พุตออนไลน์บน Ideone

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.