デジタルプロッターを構築する


11

ドナルド・M・モンロ著の 『Fortran 77』から適応した問題

前書き

デジタルプロットマシンは、さまざまな形式の図面、グラフ、その他の画像結果を生成するために広く使用されています。このようなマシンのほとんどは、特定の方向にのみペンを移動できます。通常は、X方向とY方向、またはその両方の単一ステップとしてのみ移動できます。典型的な機械は、図1に示す8つの方向のいずれかに移動します。

図1 図 1

チャレンジ

入力として0から7までの数値を取り、図1のエンドポイントの対応する座標を出力する三角関数なしのプログラムを作成します。

出力は、2つの要素(つまり(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などにのみ適用されます
— ベータ崩壊

指定されたサイズの正方形の境界線を追跡することを含む関連する質問があると確信していますが、見つかりません。
— ニール

1
<s>できます</ s> 0インデックスの代わりに1インデックスできますか?
— ジョナサンアラン

3
@ジョナサンいいえ、0から開始する必要があります
— ベータ崩壊

回答:


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もちろんです。ただし、方程式が存在しなくなるまで方程式を単純化します。
— 基金モニカの訴訟


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"はですが、値は8進数であるため、16 == 14(10進数)、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]

各「数字」に1つずつ追加した後、ベース4の8つのエントリをエンコードする2つの単純なルックアップテーブルを使用します。より簡単なルックアップテーブルを使用した代替バージョン:

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の答えが間違っていますが、古いバージョンで1バイトを節約するか、r&&(r<4)-(r>4)またはr%4&&1-(r&4)/21バイト節約します。
— ニール

@Neil Hmm、これは簡単な解決策ではないと思うので、別のバージョンに切り替えます。しかし、他のヒントをありがとう:-)ゴルフができるように見えますが、どのように見えるかはわかりません
— ...-ETHproductions

私はもう少し髪を剃ったと思うが、それでもまだ十分に短いわけではない:r=>[r>2&r<6?-1:r<2|r>6,r>4?-1:r%4&&1]
— ニール

でバイトを保存できますn=>[(s='22100012')[n]-1,s[n+6&7]-1]。
— アーナルド

3

TI-Basic、23バイト

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

電卓がラジアンモードであると仮定します。プログラムに含める必要がある場合、25バイトです。


ラジアンモードはデフォルトでオンになっていると思うので、問題ないはずです。
— コナーオブライエン

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);}

2回行われる単純なバイナリ検索。最初の検索は、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.