Construye un trazador digital

11

Problema adaptado del libro Fortran 77 de Donald M. Monro

Introducción

Las máquinas de trazado digital se utilizan ampliamente para producir diversas formas de dibujos, gráficos y otros resultados pictóricos. La mayoría de estas máquinas pueden mover sus bolígrafos solo en ciertas direcciones, generalmente como pasos individuales en la dirección X e Y o en ambas. Una máquina típica se movería en una de las ocho direcciones que se muestran en la Fig. 1:

Figura 1 Fig. 1

Desafío

Escriba un programa sin funciones trigonométricas que tome un número del 0 al 7 (inclusive) como entrada y envíe las coordenadas correspondientes de los puntos finales en la figura 1.

La salida debe ser una matriz o lista con dos elementos (es decir, (1, 0)o [0,-1])

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

Victorioso

El código más corto en bytes gana

Decaimiento Beta
fuente
¿Una rotate(x)función cuenta como una función trigonométrica? (solo gira el "lienzo" por xradianes)
user41805
@ Kritixi No, la restricción es únicamente para cos, sin, tan, secetc.
Beta Decay
Estoy bastante seguro de que hay una pregunta relacionada que implica seguir el perímetro de un cuadrado de tamaño específico, pero no puedo encontrarlo.
Neil
1
<s> Can </s> ¿Podemos 1 índice en lugar de 0 índice?
Jonathan Allan
3
@ Jonathan No, debe comenzar en 0
Decaimiento Beta

Respuestas:

5

Jalea , 8 bytes

Hı*µḞ,ĊṠ

El uso de aritmética compleja parece estar permitido.

Pruébalo en línea!

Cómo 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
fuente
15

Python 2, 29 bytes

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

Devuelve las coordenadas como un número complejo.

orlp
fuente
Oh bien. ¡Ni siquiera pensé en usar números complejos!
HyperNeutrino
Por supuesto, esto usa funciones trigonométricas en cierto sentido.
dejó de girar en sentido contrario a las agujas del reloj el
@ceasedtoturncounterclockwis Claro, pero simplifica la ecuación hasta que ya no están presentes.
Financia la demanda de Mónica
7

Mathematica, 24 bytes

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

Función pura, usar Signy saber a dónde van ciertas parábolas.

Greg Martin
fuente
6

C, 103 86 74 73 70 bytes

¡Gracias a @orlp por guardar 12 15 bytes!

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

Pruébalo en línea!

Steadybox
fuente
1
"\16\17\13\7\6\5\9\15"[n] == "pw[1*#?i"[n]/7
orlp
@orlp ¡Gracias! Aunque la cadena es en realidad "biM1*#?[", porque en "\16\17\13\7\6\5\9\15"los valores hay números octales, entonces 16 == 14 en decimal, 17 == 15 y así sucesivamente.
Steadybox
1
!!(n&4) == n/4&1
orlp
1
n&2?n&1:-(n&1) == n%2*~-(n&2)
orlp
68 bytes
ceilingcat el
4

JavaScript (ES6), 41 36 bytes

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

Utiliza dos tablas de búsqueda simples que codifican las 8 entradas en la base 4 después de agregar una a cada "dígito". Versión alternativa, usando tablas de búsqueda más simples:

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

Versión anterior (4 bytes más cortos gracias a @Neil):

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

Enfoque ingenuo usando algunos cálculos simples para encontrar las coordenadas X e Y por separado ...

ETHproductions
fuente
1
Su versión actual da respuestas incorrectas para 4 y 5, pero creo que r&&(r<4)-(r>4)o r%4&&1-(r&4)/2guarda un byte en su versión anterior.
Neil
@Neil Hmm, no creo que sea una solución fácil, así que simplemente cambiaré a una versión alternativa. Gracias por el otro consejo :-) Parece golfable, pero no veo cómo ...
ETHproductions
Creo que me he afeitado un poco más, aunque todavía no lo suficientemente corto:r=>[r>2&r<6?-1:r<2|r>6,r>4?-1:r%4&&1]
Neil
Puede guardar un byte con 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

Asume que su calculadora está en modo radianes; si eso necesita estar en el programa, entonces son 25 bytes.

pizzapants184
fuente
Creo que el modo Radian está activado por defecto, así que deberías estar bien.
Conor O'Brien
1

Jalea , 13 12 bytes

Todavía estoy bastante seguro de que hay más corto, pero todavía no he encontrado nada, así que pensé en publicar esto

+2,ị6400b3¤’

Pruébalo en línea! o ver un conjunto de pruebas

¿Cómo?

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

Un método alternativo , también de 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
fuente
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 prueba

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
fuente
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);}

Búsqueda binaria simple realizada dos veces. La primera búsqueda se realiza en n desplazada por 2.

Salida en línea en Ideone.

C, 53 bytes

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

La salida sin una coma se pudo compactar aún más usando una llamada recursiva.

Salida en línea en Ideone.

2501
fuente