Erstellen Sie einen digitalen Plotter

11

Problem aus dem Buch Fortran 77 von Donald M. Monro angepasst

Einführung

Digitale Plotmaschinen werden häufig verwendet, um verschiedene Formen von Zeichnungen, Grafiken und anderen Bildergebnissen zu erstellen. Die meisten dieser Maschinen können ihre Stifte nur in bestimmte Richtungen bewegen, normalerweise als einzelne Schritte in X- und Y-Richtung oder in beide Richtungen. Eine typische Maschine würde sich in eine der acht in Abb. 1 gezeigten Richtungen bewegen:

Abbildung 1 Abb. 1

Herausforderung

Schreiben Sie ein Programm ohne trigonometrische Funktionen, das eine Zahl von 0 bis einschließlich 7 als Eingabe verwendet und die entsprechenden Koordinaten der Endpunkte in Abb. 1 ausgibt.

Die Ausgabe sollte als Array oder Liste mit zwei Elementen (dh (1, 0)oder [0,-1]) erfolgen.

Tabelle der E / A.

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

Gewinnen

Der kürzeste Code in Bytes gewinnt

Beta-Zerfall
quelle
Zählt eine rotate(x)Funktion als trigonometrische Funktion? (es dreht nur die "Leinwand" im xBogenmaß)
user41805
@Kritixi Nein, die Einschränkung gilt ausschließlich für cos, sin, tan, secetc.
Beta Decay
Ich bin mir ziemlich sicher, dass es eine verwandte Frage gibt, bei der es darum geht, dem Umfang eines Quadrats mit der angegebenen Größe zu folgen, aber ich kann sie nicht finden.
Neil
1
<s> Können </ s> Dürfen wir 1 Index anstelle von 0 Index?
Jonathan Allan
3
@ Jonathan Nein, es muss um 0 beginnen
Beta Decay

Antworten:

5

Gelee , 8 Bytes

Hı*µḞ,ĊṠ

Die Verwendung komplexer Arithmetik scheint zulässig zu sein.

Probieren Sie es online aus!

Wie es funktioniert

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

Python 2, 29 Bytes

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

Gibt die Koordinaten als komplexe Zahl zurück.

orlp
quelle
Oh schön. Ich habe nicht einmal daran gedacht, komplexe Zahlen zu verwenden!
HyperNeutrino
Natürlich werden dabei in gewissem Sinne trigonometrische Funktionen verwendet.
hörte auf, gegen den Uhrzeigersinn zu drehen
@ceasedtoturncounterclockwis Sicher, aber es vereinfacht die Gleichung, bis sie nicht mehr vorhanden sind.
Fund Monica Klage
7

Mathematica, 24 Bytes

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

Reine Funktion, Verwendung Signund Wissen, wohin bestimmte Parabeln gehen.

Greg Martin
quelle
6

C 103 86 74 73 70 Bytes

Vielen Dank an @orlp für das Speichern von 12 15 Bytes!

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

Probieren Sie es online aus!

Steadybox
quelle
1
"\16\17\13\7\6\5\9\15"[n] == "pw[1*#?i"[n]/7
Orlp
@orlp Danke! Obwohl die Zeichenfolge tatsächlich ist "biM1*#?[", weil in "\16\17\13\7\6\5\9\15"den Werten Oktalzahlen sind, also 16 == 14 in Dezimalzahl, 17 == 15 und so weiter.
Steadybox
1
!!(n&4) == n/4&1
Orlp
1
n&2?n&1:-(n&1) == n%2*~-(n&2)
Orlp
68 Bytes
Ceilingcat
4

JavaScript (ES6), 41 36 Byte

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

Verwendet zwei einfache Nachschlagetabellen, die die 8 Einträge in Basis 4 codieren, nachdem jeder "Ziffer" eine hinzugefügt wurde. Alternative Version mit einfacheren Nachschlagetabellen:

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

Alte Version (4 Bytes kürzer dank @Neil):

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

Naiver Ansatz mit einigen einfachen Berechnungen, um die X- und Y-Koordinaten getrennt zu finden ...

ETH-Produktionen
quelle
1
Ihre aktuelle Version gibt falsche Antworten für 4 und 5, aber ich denke entweder r&&(r<4)-(r>4)oder r%4&&1-(r&4)/2speichern Sie ein Byte auf Ihrer alten Version.
Neil
@Neil Hmm, ich denke nicht, dass das eine einfache Lösung ist, also werde ich einfach zu einer alternativen Version wechseln. Danke für den anderen Tipp :-) Es sieht golffähig aus, aber ich sehe nicht wie ...
ETHproductions
Ich glaube, ich habe mich ein bisschen mehr rasiert, aber noch nicht kurz genug:r=>[r>2&r<6?-1:r<2|r>6,r>4?-1:r%4&&1]
Neil
Sie können ein Byte mit speichern 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

Angenommen, Ihr Rechner befindet sich im Bogenmaßmodus. Wenn das im Programm sein muss, dann sind es 25 Bytes.

pizzapants184
quelle
Ich denke, der Bogenmaßmodus ist standardmäßig aktiviert, daher sollte es Ihnen gut gehen.
Conor O'Brien
1

Gelee , 13 12 Bytes

Ich bin immer noch ziemlich zuversichtlich, dass es kürzer ist, aber ich habe noch nichts gefunden, also dachte ich, ich würde dies posten

+2,ị6400b3¤’

Probieren Sie es online aus! oder sehen Sie sich eine Testsuite an

Wie?

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

Eine alternative Methode , auch 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
quelle
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);}

Testcode

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

Ergebnisse

1 0
1 1
0 1
-1 1
-1 0
-1 -1
0 -1
1 -1
RosLuP
quelle
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);}

Einfache binäre Suche zweimal durchgeführt. Die erste Suche erfolgt auf n um 2 verschoben.

Online-Ausgabe auf Ideone.

C 53 Bytes

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

Die Ausgabe ohne Komma konnte durch einen rekursiven Aufruf noch weiter komprimiert werden.

Online-Ausgabe auf Ideone.

2501
quelle