Побудуйте цифровий плоттер


11

Проблема, адаптована з книги « Фортран 77 » Дональда М. Монро

Вступ

Цифрові графічні машини широко використовуються для отримання різних форм малюнків, графіків та інших зображувальних результатів. Більшість таких машин можуть рухати свої ручки лише в певних напрямках, як правило, як одиничні кроки в напрямку X і Y або в обох. Типова машина рухається в одному з восьми напрямків, показаних на рис. 1:

Фігура 1 Рис. 1

Виклик

Напишіть програму без тригонометричних функцій, яка приймає в якості введення число від 0 до 7 (включно) і виводить відповідні координати кінцевих точок на рис. 1.

Виводити слід як масив або список з двома елементами (тобто (1, 0)або [0,-1])

Таблиця вводу / виводу

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
радіанами

@Kritixi Ні, обмеження виключно на cos, sin, tan, secпр.
Бета-розпад

Я впевнений, що пов'язане питання, яке стосується дотримання периметра квадрата вказаного розміру, але я не можу його знайти.
Ніл

1
<s> Може </s> Чи можемо ми індексувати 1 замість 0 індексу?
Джонатан Аллан

3
@Jonathan Ні, це повинно розпочатися о 0
бета-версія занепаду

Відповіді:


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

Звичайно, в цьому сенсі використовують тригонометричні функції.
перестала повертати проти годинника

Впевнений, але це спрощує рівняння, поки їх більше немає.
Фонд позову Моніки

7

Математика, 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 Хм, я не думаю, що це легко виправити, тому я просто перейду на альтернативну версію. Дякую за іншу пораду, хоча :-) Це виглядає по-грішному, але я не бачу, як ...
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].
Арнольд

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.