Построить цифровой плоттер

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радианами)
user41805
@ Kritixi Нет, ограничение касается только cos, sin, tan, secи т. Д.
бета-распад
Я почти уверен, что есть связанный вопрос, который включает следование периметру квадрата указанного размера, но я не могу его найти.
Нил
1
<s> Можем ли </ s> индексировать 1 вместо 0?
Джонатан Аллан
3
@ Джонатан Нет, он должен начинаться с 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)

Возвращает координаты в виде комплексного числа.

orlp
источник
О, классно. Я даже не думал об использовании комплексных чисел!
HyperNeutrino
Конечно, это в некотором смысле использует тригонометрические функции.
перестал включаться против часовой стрелки
@ceasedtoturncounterclockwis Конечно, но это упрощает уравнение, пока они больше не присутствуют.
Фонд Моника иск
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));}

Попробуйте онлайн!

Steadybox
источник
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
68 байтов
floorcat
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 отдельно ...

ETHproductions
источник
1
Ваша текущая версия дает неправильные ответы на 4 и 5 , но я думаю , что либо r&&(r<4)-(r>4)или r%4&&1-(r&4)/2сохранить байты на старую версию.
Нил
@ Нил Хмм, я не думаю, что это легко исправить, поэтому я просто переключусь на альтернативную версию. Спасибо за другой совет, хотя :-) Это выглядит для игры в гольф, но я не вижу, как ...
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 байтов.

pizzapants184
источник
Я думаю, что режим радиан включен по умолчанию, так что все должно быть в порядке.
Конор О'Брайен
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
RosLuP
источник
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.

2501
источник