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


¿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.


7

Mathematica, 24 bytes

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

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


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!


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


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 ...


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.


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

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.