Costruisci un plotter digitale


11

Problema adattato dal libro Fortran 77 di Donald M. Monro

introduzione

Le macchine per la stampa digitale sono ampiamente utilizzate per produrre varie forme di disegni, grafici e altri risultati pittorici. La maggior parte di queste macchine può muovere le penne solo in determinate direzioni, di solito come singoli passi nelle direzioni X e Y o entrambe. Una macchina tipica si sposterebbe in una delle otto direzioni mostrate in Fig. 1:

Figura 1 Fig. 1

Sfida

Scrivi un programma senza funzioni trigonometriche che prende un numero da 0 a 7 (incluso) come input e genera le coordinate corrispondenti degli endpoint in Fig. 1.

L'output dovrebbe essere un array o un elenco con due elementi (ovvero (1, 0)o [0,-1])

Tabella di I / O

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

vincente

Vince il codice più breve in byte


Una rotate(x)funzione conta come una funzione trigonometrica? (ruota semplicemente la "tela" di xradianti)
user41805

@Kritixi No, la limitazione è esclusivamente su cos, sin, tan, sececc.
Decadimento beta

Sono abbastanza sicuro che ci sia una domanda correlata che comporta seguire il perimetro di un quadrato di dimensioni specificate ma non riesco a trovarlo.
Neil,

1
<s> Can </s> Possiamo 1 indice anziché 0 indice?
Jonathan Allan,

3
@Jonathan No, deve iniziare alle 0
Decadimento beta del

Risposte:


5

Gelatina , 8 byte

Hı*µḞ,ĊṠ

L'uso dell'aritmetica complessa sembra essere permesso.

Provalo online!

Come funziona

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 byte

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

Pura funzione, usando Signe sapendo dove vanno certi parabole.


6

C, 103 86 74 73 70 byte

Grazie a @orlp per aver salvato 12 15 byte!

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

Provalo online!


1
"\16\17\13\7\6\5\9\15"[n] == "pw[1*#?i"[n]/7
orlp,

@orlp Grazie! Sebbene la stringa sia effettivamente "biM1*#?[", perché nei "\16\17\13\7\6\5\9\15"valori ci sono numeri ottali, quindi 16 == 14 in decimale, 17 == 15 e così via.
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 byte

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

Utilizza due semplici tabelle di ricerca che codificano le 8 voci nella base 4 dopo averle aggiunte a ciascuna "cifra". Versione alternativa, utilizzando tabelle di ricerca più semplici:

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

Vecchia versione (4 byte più brevi grazie a @Neil):

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

Approccio ingenuo usando alcuni semplici calcoli per trovare le coordinate X e Y separatamente ...


1
La tua versione attuale fornisce risposte errate per 4 e 5, ma penso r&&(r<4)-(r>4)o r%4&&1-(r&4)/2salvare un byte sulla tua vecchia versione.
Neil,

@Neil Hmm, non credo sia una soluzione semplice, quindi passerò a una versione alternativa. Grazie per l'altro consiglio però :-) Sembra golfable, ma non vedo come ...
ETHproductions

Penso di essermi rasato un po 'di più, ancora non abbastanza breve:r=>[r>2&r<6?-1:r<2|r>6,r>4?-1:r%4&&1]
Neil,

È possibile salvare un byte con n=>[(s='22100012')[n]-1,s[n+6&7]-1].
Arnauld,

3

TI-Basic, 23 byte

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

Suppone che la tua calcolatrice sia in modalità radiante; se questo deve essere nel programma, allora è di 25 byte.


Penso che la modalità radiante sia attiva di default, quindi dovresti stare bene.
Conor O'Brien,

1

Gelatina , 13 12 byte

Sono ancora abbastanza sicuro che ci sia più breve, ma non ho ancora trovato nulla, quindi ho pensato di pubblicare questo

+2,ị6400b3¤’

Provalo online! o vedere una suite di test

Come?

+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 metodo alternativo , anche 12 byte :

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

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

codice di prova

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

risultati

1 0
1 1
0 1
-1 1
-1 0
-1 -1
0 -1
1 -1

0

C, 56 byte

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

Ricerca binaria semplice eseguita due volte. La prima ricerca viene eseguita su n spostato di 2.

Uscita online su Ideone.

C, 53 byte

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

L'output senza virgola è stato ulteriormente compattato utilizzando una chiamata ricorsiva.

Uscita online su Ideone.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.