Construire un traceur numérique

11

Problème adapté du livre Fortran 77 de Donald M. Monro

introduction

Les machines de traçage numériques sont largement utilisées pour produire diverses formes de dessins, de graphiques et d'autres résultats illustrés. La plupart de ces machines ne peuvent déplacer leurs stylos que dans certaines directions, généralement sous forme de pas simples dans les directions X et Y ou les deux. Une machine typique se déplacerait dans l'une des huit directions illustrées sur la figure 1:

Figure 1 Fig. 1

Défi

Écrivez un programme sans fonctions trigonométriques qui prend un nombre de 0 à 7 (inclus) en entrée et génère les coordonnées correspondantes des points d'extrémité sur la figure 1.

La sortie doit être un tableau ou une liste avec deux éléments (c'est (1, 0)-à- dire ou [0,-1])

Tableau des 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)

Gagnant

Le code le plus court en octets gagne

Beta Decay
la source
Une rotate(x)fonction compte- t-elle comme une fonction trigonométrique? (il fait simplement pivoter le "canevas" de xradians)
user41805
@Kritixi Non, la restriction concerne uniquement cos, sin, tan, secetc.
Beta Decay
Je suis presque sûr qu'il y a une question connexe qui implique de suivre le périmètre d'un carré de taille spécifiée, mais je ne le trouve pas.
Neil
1
<s> Peut </s> pouvons-nous 1 index au lieu de 0 index?
Jonathan Allan
3
@Jonathan Non, il doit commencer à 0
Beta Decay

Réponses:

5

Gelée , 8 octets

Hı*µḞ,ĊṠ

L'utilisation d'une arithmétique complexe semble autorisée.

Essayez-le en ligne!

Comment ça fonctionne

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
la source
15

Python 2, 29 octets

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

Renvoie les coordonnées sous la forme d'un nombre complexe.

orlp
la source
Oh sympa. Je n'ai même pas pensé à utiliser des nombres complexes!
HyperNeutrino
Bien sûr, cela utilise les fonctions trigonométriques dans un sens.
cessé de tourner dans le sens inverse des aiguilles d'une montre le
@ceasedtoturncounterclockwis Bien sûr, mais cela simplifie l'équation jusqu'à ce qu'ils ne soient plus présents.
Fund Monica's Lawsuit
7

Mathematica, 24 octets

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

Fonction pure, en utilisant Signet en sachant où vont certains paraboles.

Greg Martin
la source
6

C, 103 86 74 73 70 octets

Merci à @orlp pour avoir économisé 12 15 octets!

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

Essayez-le en ligne!

Steadybox
la source
1
"\16\17\13\7\6\5\9\15"[n] == "pw[1*#?i"[n]/7
orlp
@orlp Merci! Bien que la chaîne soit en fait "biM1*#?[", parce que "\16\17\13\7\6\5\9\15"les valeurs sont des nombres octaux, donc 16 == 14 en décimal, 17 == 15 et ainsi de suite.
Steadybox
1
!!(n&4) == n/4&1
orlp
1
n&2?n&1:-(n&1) == n%2*~-(n&2)
orlp
68 octets
plafond
4

JavaScript (ES6), 41 36 octets

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

Utilise deux tables de recherche simples qui codent les 8 entrées de la base 4 après en avoir ajouté une à chaque "chiffre". Version alternative, utilisant des tables de recherche plus simples:

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

Ancienne version (4 octets plus court grâce à @Neil):

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

Approche naïve utilisant quelques calculs simples pour trouver séparément les coordonnées X et Y ...

ETHproductions
la source
1
Votre version actuelle donne des réponses incorrectes pour 4 et 5 mais je pense que ce soit r&&(r<4)-(r>4)ou r%4&&1-(r&4)/2enregistrer un octet sur votre ancienne version.
Neil
@Neil Hmm, je ne pense pas que ce soit une solution facile, je vais donc passer à une autre version. Merci pour l'autre conseil cependant :-) Il a l'air golfable, mais je ne vois pas comment ...
ETHproductions
Je pense que je me suis rasé un peu plus, mais pas encore assez court cependant:r=>[r>2&r<6?-1:r<2|r>6,r>4?-1:r%4&&1]
Neil
Vous pouvez enregistrer un octet avec n=>[(s='22100012')[n]-1,s[n+6&7]-1].
Arnauld
3

TI-Basic, 23 octets

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

Suppose que votre calculatrice est en mode radian; si cela doit être dans le programme, alors c'est 25 octets.

pizzapants184
la source
Je pense que le mode radian est activé par défaut, donc ça devrait aller.
Conor O'Brien
1

Gelée , 13 12 octets

Je suis toujours assez confiant qu'il y a plus court, mais je n'ai encore rien trouvé, alors j'ai pensé publier ce

+2,ị6400b3¤’

Essayez-le en ligne! ou voir une suite de tests

Comment?

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

Une méthode alternative , également 12 octets :

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

C, 66 octets

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

code de test

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

résultats

1 0
1 1
0 1
-1 1
-1 0
-1 -1
0 -1
1 -1
RosLuP
la source
0

C, 56 octets

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

Recherche binaire simple effectuée deux fois. La première recherche se fait sur n décalé de 2.

Sortie en ligne sur Ideone.

C, 53 octets

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

La sortie sans virgule a pu être encore plus compactée à l'aide d'un appel récursif.

Sortie en ligne sur Ideone.

2501
la source