Zbuduj ploter cyfrowy

11

Problem zaadaptowany z książki Fortran 77 autorstwa Donalda M. Monro

Wprowadzenie

Cyfrowe maszyny drukujące są szeroko stosowane do tworzenia różnych form rysunków, wykresów i innych obrazów. Większość takich maszyn może poruszać piórami tylko w określonych kierunkach, zwykle jako pojedyncze kroki w kierunku X i Y lub oba. Typowa maszyna poruszałaby się w jednym z ośmiu kierunków pokazanych na ryc. 1:

Rycina 1 Fig. 1

Wyzwanie

Napisz program bez funkcji trygonometrycznych, który przyjmuje liczbę od 0 do 7 (włącznie) jako dane wejściowe i wyprowadza odpowiednie współrzędne punktów końcowych na ryc. 1.

Dane wyjściowe powinny być w postaci tablicy lub listy z dwoma elementami (tj. (1, 0)Lub [0,-1])

Tabela we / wy

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

Zwycięski

Najkrótszy kod w bajtach wygrywa

Rozpad beta
źródło
Czy rotate(x)funkcja liczy się jako funkcja trygonometryczna? (po prostu obraca „płótno” przez xradianów)
user41805
@Kritixi Nie, ograniczenie dotyczy wyłącznie cos, sin, tan, secitd.
Rozpad
Jestem prawie pewien, że istnieje podobne pytanie, które polega na śledzeniu obwodu kwadratu o określonym rozmiarze, ale nie mogę go znaleźć.
Neil,
1
<s> Czy </s> czy możemy indeksować 1 zamiast 0?
Jonathan Allan
3
@Jonathan Nie, musi zaczynać się od 0
Beta Decay

Odpowiedzi:

5

Galaretka , 8 bajtów

Hı*µḞ,ĊṠ

Stosowanie złożonej arytmetyki wydaje się być dozwolone.

Wypróbuj online!

Jak to działa

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
źródło
15

Python 2, 29 bajtów

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

Zwraca współrzędne jako liczbę zespoloną.

orlp
źródło
Och, miło. Nawet nie pomyślałem o użyciu liczb zespolonych!
HyperNeutrino
Oczywiście w pewnym sensie wykorzystuje to funkcje trygonometryczne.
przestał obracać przeciwnie do zegara
@ceasedtoturncounterclockwis Pewnie, ale upraszcza to równanie, dopóki nie będą już obecne.
Pozew funduszu Moniki z
7

Mathematica, 24 bajty

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

Czysta funkcja, używanie Signi wiedza, dokąd idą określone parabole.

Greg Martin
źródło
6

C, 103 86 74 73 70 bajtów

Dzięki @orlp za zapisanie 12 15 bajtów!

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

Wypróbuj online!

Steadybox
źródło
1
"\16\17\13\7\6\5\9\15"[n] == "pw[1*#?i"[n]/7
orlp
@orlp Thanks! Chociaż ciąg jest w rzeczywistości "biM1*#?[", ponieważ w "\16\17\13\7\6\5\9\15"wartościach są liczby ósemkowe, więc 16 == 14 po przecinku, 17 == 15 i tak dalej.
Steadybox
1
!!(n&4) == n/4&1
orlp 15.04.17
1
n&2?n&1:-(n&1) == n%2*~-(n&2)
orlp
68 bajtów
ceilingcat
4

JavaScript (ES6), 41 36 bajtów

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

Wykorzystuje dwie proste tabele wyszukiwania, które kodują 8 wpisów w bazie 4 po dodaniu jednego do każdej „cyfry”. Alternatywna wersja, wykorzystująca prostsze tabele wyszukiwania:

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

Stara wersja (4 bajty krótsze dzięki @Neil):

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

Naiwne podejście przy użyciu prostych obliczeń, aby znaleźć współrzędne X i Y osobno ...

ETHprodukcje
źródło
1
Twoja aktualna wersja daje niepoprawne odpowiedzi na 4 i 5, ale myślę, albo r&&(r<4)-(r>4)czy r%4&&1-(r&4)/2zapisać bajt na starej wersji.
Neil,
@Neil Hmm, nie sądzę, że to łatwa poprawka, więc po prostu przełączę się na alternatywną wersję. Dzięki za drugą wskazówkę :-) Wygląda na golfa, ale nie rozumiem, jak ...
ETHproductions
Myślę, że jeszcze trochę się ogoliłem, ale jeszcze nie dość krótko:r=>[r>2&r<6?-1:r<2|r>6,r>4?-1:r%4&&1]
Neil
Możesz zapisać bajt za pomocą n=>[(s='22100012')[n]-1,s[n+6&7]-1].
Arnauld
3

TI-Basic, 23 bajty

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

Zakłada, że ​​kalkulator działa w trybie radian; jeśli to musi być w programie, to ma 25 bajtów.

pizzapanty184
źródło
Myślę, że tryb radian jest domyślnie włączony, więc powinieneś być w porządku.
Conor O'Brien
1

Galaretka , 13 12 bajtów

Nadal jestem dość pewny, że jest krótszy, ale jeszcze niczego nie znalazłem, więc pomyślałem, że to opublikuję

+2,ị6400b3¤’

Wypróbuj online! lub zobacz pakiet testowy

W jaki sposób?

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

Alternatywny sposób , również 12 bajtów :

_/,+/Ṡ  - 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
źródło
1

C, 66 bajtów

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

kod testowy

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

wyniki

1 0
1 1
0 1
-1 1
-1 0
-1 -1
0 -1
1 -1
RosLuP
źródło
0

C, 56 bajtów

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

Proste wyszukiwanie binarne wykonane dwukrotnie. Pierwsze wyszukiwanie odbywa się na n przesuniętym o 2.

Wyniki online w Ideone.

C, 53 bajty

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

Wyjście bez przecinka można było jeszcze bardziej skompaktować za pomocą wywołania rekurencyjnego.

Wyniki online w Ideone.

2501
źródło