建立数字绘图仪


11

问题改编自唐纳德·M·门罗(Donald M.Monro)的书《Fortran 77》

介绍

数字绘图机被广泛用于生成各种形式的绘图,图形和其他图形结果。大多数此类机器只能在某些方向上移动笔,通常是在X和Y方向上单步移动,或在这两个方向上都移动。典型的机器将沿图1所示的八个方向之一移动:

图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 '17

@Kritixi没有,限制仅仅是对cos, sin, tan, sec
β衰变的

我很确定有一个相关的问题,涉及遵循指定大小的正方形的周长,但我找不到它。
尼尔,

1
<s>可以</ s>我们可以从1索引而不是0索引吗?
乔纳森·艾伦

3
@Jonathan不,它必须从0开始
Beta

Answers:


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

Python 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字节

感谢@orlp节省12个 15字节!

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,依此类推。
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字节

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 Hmm,我认为这不是一个简单的解决方法,所以我将切换到其他版本。尽管感谢另一个技巧:-)它看起来可以打高尔夫球,但是我不知道如何...
ETHproductions'Apr

我认为我已经剃了一些,但还不够短: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个字节。


我认为弧度模式默认情况下处于启用状态,因此您应该没问题。
Conor 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上在线输出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.