Construa uma plotadora digital

11

Problema adaptado do livro Fortran 77, de Donald M. Monro

Introdução

Máquinas de plotagem digital são amplamente utilizadas para produzir várias formas de desenhos, gráficos e outros resultados pictóricos. A maioria dessas máquinas pode mover suas canetas apenas em determinadas direções, geralmente como etapas únicas nas direções X e Y ou ambas. Uma máquina típica se moveria em uma das oito direções mostradas na Fig. 1:

figura 1 Fig. 1

Desafio

Escreva um programa sem funções trigonométricas que use um número de 0 a 7 (inclusive) como entrada e emita as coordenadas correspondentes dos pontos finais na Fig. 1.

A saída deve ser uma matriz ou lista com dois elementos (ie (1, 0)ou [0,-1])

Tabela de E / S

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

Ganhando

Menor código em bytes ganha

Beta Decay
fonte
Uma rotate(x)função conta como uma função trigonométrica? (apenas rotaciona a "tela" por xradianos)
user41805 15/04
@ Kritixi Não, a restrição é unicamente cos, sin, tan, secetc.
Decay Beta
Tenho certeza de que há uma pergunta relacionada que envolve seguir o perímetro de um quadrado de tamanho especificado, mas não consigo encontrá-lo.
21717 Neil
1
<s> </s> Podemos indexar 1 em vez de 0?
Jonathan Allan
3
@ Jonathan Não, ele deve começar às 0
Decay Beta

Respostas:

5

Geléia , 8 bytes

Hı*µḞ,ĊṠ

O uso de aritmética complexa parece ser permitido.

Experimente online!

Como funciona

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
fonte
15

Python 2, 29 bytes

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

Retorna as coordenadas como um número complexo.

orlp
fonte
Ah legal. Eu nem pensei em usar números complexos!
precisa saber é o seguinte
Claro que isso usa funções trigonométricas em certo sentido.
deixou de girar contra-relógiowis
@ceasedtoturncounterclocké certo, mas simplifica a equação até que eles não estejam mais presentes.
Fund Monica's Lawsuit
7

Mathematica, 24 bytes

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

Função pura, usando Signe sabendo para onde vão determinadas parábolas.

Greg Martin
fonte
6

C, 103 86 74 73 70 bytes

Obrigado a @orlp por salvar 12 15 bytes!

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

Experimente online!

Steadybox
fonte
1
"\16\17\13\7\6\5\9\15"[n] == "pw[1*#?i"[n]/7
orlp
@orlp Obrigado! Embora a string seja realmente "biM1*#?[", porque nos "\16\17\13\7\6\5\9\15"valores são números octais, então 16 == 14 em decimal, 17 == 15 e assim por diante.
Steadybox
1
!!(n&4) == n/4&1
orlp
1
n&2?n&1:-(n&1) == n%2*~-(n&2)
orlp
68 bytes
roofcat
4

JavaScript (ES6), 41 36 bytes

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

Usa duas tabelas de pesquisa simples que codificam as 8 entradas na base 4 após adicionar uma a cada "dígito". Versão alternativa, usando tabelas de pesquisa mais simples:

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

Versão antiga (4 bytes mais curta graças a @Neil):

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

Abordagem ingênua usando alguns cálculos simples para encontrar as coordenadas X e Y separadamente ...

ETHproductions
fonte
1
Sua versão atual fornece respostas incorretas para 4 e 5, mas acho que r&&(r<4)-(r>4)ou r%4&&1-(r&4)/2salvar um byte na sua versão antiga.
Neil
@ Neil Hmm, eu não acho que seja uma solução fácil, então vou mudar para uma versão alternativa. Obrigado por outro dica embora :-) Parece golfable, mas eu não vejo como ...
ETHproductions
Eu acho que me barbeei um pouco mais, ainda não muito curto o suficiente ainda:r=>[r>2&r<6?-1:r<2|r>6,r>4?-1:r%4&&1]
Neil
Você pode salvar um byte com n=>[(s='22100012')[n]-1,s[n+6&7]-1].
Arnauld
3

TI-Basic, 23 bytes

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

Assume que sua calculadora está no modo radiano; se isso precisa estar no programa, são 25 bytes.

pizzapants184
fonte
Eu acho que o modo radiano está ativado por padrão, então você deve ficar bem.
Conor O'Brien
1

Geléia , 13 12 bytes

Ainda estou bastante confiante de que há menos, mas ainda não encontrei nada, então pensei em publicar isso

+2,ị6400b3¤’

Experimente online! ou veja uma suíte de testes

Quão?

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

Um método alternativo , também com 12 bytes :

_/,+/Ṡ  - 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
fonte
1

C, 66 bytes

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

código de teste

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

resultados

1 0
1 1
0 1
-1 1
-1 0
-1 -1
0 -1
1 -1
RosLuP
fonte
0

C, 56 bytes

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

Pesquisa binária simples feita duas vezes. A primeira pesquisa é feita em n deslocado por 2.

Saída online no Ideone.

C, 53 bytes

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

A saída sem vírgula pôde ser compactada ainda mais usando uma chamada recursiva.

Saída online no Ideone.

2501
fonte