Dijital Plotter Oluşturun


11

Donald M. Monro'nun Fortran 77 kitabından uyarlanan problem

Giriş

Dijital çizim makineleri çeşitli şekillerde, grafiklerde ve diğer resimsel sonuçların üretilmesinde yaygın olarak kullanılmaktadır. Bu tür makinelerin çoğu kalemlerini sadece belirli yönlerde, genellikle X ve Y yönünde veya her ikisinde de tek adım olarak hareket ettirebilir. Tipik bir makine, Şekil 1'de gösterilen sekiz yönden birinde hareket eder:

Şekil 1 Şekil 1

Meydan okuma

Trigonometrik fonksiyonlar içermeyen , girdi olarak 0 ila 7 (dahil) arasında bir sayı alan ve Şekil 1'deki uç noktaların ilgili koordinatlarını veren bir program yazın .

Çıktı, iki öğeli (yani (1, 0)veya [0,-1]) bir dizi veya liste olarak olmalıdır

G / Ç Tablosu

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

Kazanan

Bayt cinsinden en kısa kod kazanır


Bir rotate(x)fonksiyon trigonometrik fonksiyon olarak sayılır mı ? (sadece "tuval" xradyan tarafından döndürür)
user41805

@Kritixi Hayır, kısıtlama sadece geçerlidir cos, sin, tan, sec.
Beta

Eminim, belirtilen boyuttaki bir karenin çevresini takip etmeyi içeren ilgili bir soru var, ancak bulamıyorum.
Neil

1
<s> Olabilir </s> 0 endeks yerine 1 endeks alabilir miyiz?
Jonathan Allan

3
@Jonathan No, 0'dan başlamalı
Beta Çürüme

Yanıtlar:


5

Jöle , 8 bayt

Hı*µḞ,ĊṠ

Karmaşık aritmetik kullanımına izin verilmektedir.

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

Koordinatları karmaşık bir sayı olarak döndürür.


Oh iyi. Karmaşık sayılar kullanmayı bile düşünmedim!
HyperNeutrino

Tabii ki bu bir anlamda trigonometrik fonksiyonları kullanıyor.
Buna durdurdu counterclockwis

@ceasedtoturncounterclockwis Elbette, ancak artık mevcut olmayana kadar denklemi basitleştirir.
Monica'nın Davası

7

Mathematica, 24 bayt

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

Saf fonksiyon, Signbelirli parabollerin nereye gittiğini bilmek ve kullanmak .


6

C, 103 86 74 73 70 bayt

@Orlp'ye 12 15 bayt tasarruf için teşekkürler !

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

Çevrimiçi deneyin!


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

@orlp Teşekkürler! Dize aslında olsa "biM1*#?["nedeniyle, "\16\17\13\7\6\5\9\15"değerlere ondalık 16 == 14, 17 == 15 ve öylesine, sekizli sayılardır.
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 bayt

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

Her "basamağa" bir tane ekledikten sonra temel 4'teki 8 girişi kodlayan iki basit arama tablosu kullanır. Daha basit arama tabloları kullanan alternatif sürüm:

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

Eski sürüm (@Neil sayesinde 4 bayt daha kısa):

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

X ve Y koordinatlarını ayrı ayrı bulmak için basit hesaplamalar kullanarak saf yaklaşım ...


1
Geçerli sürümünüz 4 ve 5 için yanlış yanıtlar veriyor, ancak eski sürümünüzde bir bayt olduğunu düşünüyorum r&&(r<4)-(r>4)veya r%4&&1-(r&4)/2kaydediyorum.
Neil

@Neil Hmm, bunun kolay bir düzeltme olduğunu düşünmüyorum, bu yüzden sadece alternatif bir sürüme geçeceğim. Yine de diğer ipucu için teşekkürler :-) Golfçü görünüyor, ama nasıl görmüyorum ...
ETHproductions

Sanırım biraz daha tıraş oldum, yine de yeterince kısa değilim:r=>[r>2&r<6?-1:r<2|r>6,r>4?-1:r%4&&1]
Neil

İle bir bayt kaydedebilirsiniz n=>[(s='22100012')[n]-1,s[n+6&7]-1].
Arnauld

3

TI-Basic, 23 bayt

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

Hesap makinenizin radyan modunda olduğunu varsayar; programda olması gerekiyorsa, 25 bayttır.


Radyan modunun varsayılan olarak açık olduğunu düşünüyorum, bu yüzden iyi olmalısın.
Conor O'Brien

1

Jöle , 13 12 bayt

Hala daha kısa olduğuna eminim, ama henüz bir şey bulamadım, bu yüzden bunu göndereceğimi düşündüm

+2,ị6400b3¤’

Çevrimiçi deneyin! veya bir test takımına bakın

Nasıl?

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

Bir alternatif yöntem , aynı zamanda 12 bayt :

_/,+/Ṡ  - 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 bayt

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

test kodu

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

Sonuçlar

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

0

C, 56 bayt

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

Basit ikili arama iki kez yapılır. İlk arama 2'de n ile kaydırılır.

Ideone'da çevrimiçi çıktı.

C, 53 bayt

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

Virgülsüz çıktılar, yinelemeli çağrı kullanılarak daha da sıkıştırılabilir.

Ideone'da çevrimiçi çıktı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.