디지털 플로터 구축


11

Donald M. Monro의 Fortran 77 책에서 수정 된 문제

소개

디지털 플로팅 머신은 다양한 형태의 도면, 그래프 및 기타 그림 결과를 생성하는 데 널리 사용됩니다. 대부분의 이러한 기계는 특정 방향으로 만 펜을 움직일 수 있습니다. 일반적으로 X 및 Y 방향의 단일 단계 또는 둘 다입니다. 일반적인 기계는 그림 1에 표시된 8 가지 방향 중 하나로 움직입니다.

그림 1 그림 1

도전

0에서 7 (포함)의 숫자를 입력으로 받아 그림 1의 끝점에 해당하는 좌표를 출력하는 삼각 함수없는 프로그램 작성하십시오 .

출력은 두 요소 (예 : (1, 0)또는 [0,-1])가 있는 배열 또는 목록이어야합니다.

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)

승리

바이트 단위의 최단 코드 승리


rotate(x)함수가 삼각 함수로 계산 됩니까 ? (방금 x라디안으로 "캔버스"를 회전시킵니다 )
user41805

@Kritixi 아니오, 제한은 전적으로 적용됩니다 cos, sin, tan, sec.
Beta Decay

지정된 크기의 사각형 둘레를 따르는 관련 질문이 있다고 확신하지만 찾을 수 없습니다.
Neil

1
<s> 할 수 있습니까? </ s> 0 인덱스 대신 1 인덱스를 할 수 있습니까?
Jonathan Allan

3
@Jonathan 아니요, 0에서 시작해야합니다
Beta Decay

답변:


5

젤리 , 8 바이트

Hı*µḞ,ĊṠ

복잡한 산술을 사용할 수 있습니다.

온라인으로 사용해보십시오!

작동 원리

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.

15

파이썬 2, 29 바이트

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

좌표를 복소수로 리턴합니다.


오 좋아요 나는 복잡한 숫자를 사용하는 것을 생각조차하지 못했습니다!
HyperNeutrino

물론 이것은 삼각 함수를 의미에서 사용합니다.
반 시계 회전을 중지

@ceasedtoturncounterclockwis 물론이지만 더 이상 존재하지 않을 때까지 방정식을 단순화합니다.
기금 모니카의 소송

7

Mathematica, 24 바이트

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

Sign특정 기능을 사용 하고 알고있는 순수한 기능 .


6

C, 103 86 74 73 70 바이트

12 15 바이트 를 절약 한 @orlp에게 감사 합니다!

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

온라인으로 사용해보십시오!


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

@orlp 감사합니다! 문자열 사실이지만 "biM1*#?["로 인해, "\16\17\13\7\6\5\9\15"값에 소수점 == 16 14 17 15 == 그래서, 그래서 8 진수이다.
Steadybox

1
!!(n&4) == n/4&1
orlp

1
n&2?n&1:-(n&1) == n%2*~-(n&2)
orlp


4

자바 스크립트 (ES6), 41 36 바이트

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

각 "숫자"에 하나를 추가 한 후 기본 4의 8 개 항목을 인코딩하는 두 개의 간단한 찾아보기 테이블을 사용합니다. 더 간단한 조회 테이블을 사용하는 대체 버전 :

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

이전 버전 (@Neil 덕분에 4 바이트 더 짧음) :

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

간단한 계산을 사용하여 X 및 Y 좌표를 개별적으로 찾는 순진한 접근 방식 ...


1
현재 버전은 4와 5에 대한 잘못된 답변을 제공하지만 이전 버전에서는 바이트를 저장 r&&(r<4)-(r>4)하거나 r%4&&1-(r&4)/2저장 한다고 생각합니다 .
Neil

@ Neil Hmm, 나는 그것이 쉬운 수정이라고 생각하지 않으므로 대체 버전으로 전환 할 것입니다. 비록 다른 팁을 주셔서 감사합니다 :-) 그것은 골프처럼 보이지만 어떻게 보지 못합니다 ...
ETHproductions

나는 아직도 조금 더 짧게 면도했지만 아직 충분히 짧지는 않다고 생각합니다.r=>[r>2&r<6?-1:r<2|r>6,r>4?-1:r%4&&1]
Neil

로 바이트를 저장할 수 있습니다 n=>[(s='22100012')[n]-1,s[n+6&7]-1].
Arnauld

3

TI 기본, 23 바이트

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

계산기가 라디안 모드라고 가정합니다. 프로그램에 있어야하는 경우 25 바이트입니다.


라디안 모드는 기본적으로 켜져 있다고 생각하므로 괜찮을 것입니다.
코너 O'Brien

1

젤리 , 13 12 바이트

나는 여전히 더 짧은 것이 있다고 확신하지만 아직 아무것도 찾지 못했기 때문에 이것을 게시 할 것이라고 생각했습니다.

+2,ị6400b3¤’

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오

어떻게?

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

다른 방법 , 또한 12 바이트 :

_/,+/Ṡ  - 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 바이트

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

테스트 코드

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

결과

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

0

C, 56 바이트

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

간단한 이진 검색이 두 번 수행되었습니다. 첫 번째 검색은 n만큼 2만큼 시프트 된 경우에 수행됩니다.

Ideone의 온라인 출력.

C, 53 바이트

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

쉼표가없는 출력은 재귀 호출을 사용하여 훨씬 더 압축 할 수있었습니다.

Ideone의 온라인 출력.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.