Tạo tín hiệu tam giác


9

Bài tập:

Cho chỉ số mẫu, x, tính giá trị mẫu f (x) của sóng tam giác, với chu kỳ 4 mẫu và biên độ 1. Độ lệch có thể âm và giá trị mẫu có thể là {0, 1, -1}.

Các trường hợp thử nghiệm:

   -5 -> -1
   -4 -> 0
   -3 -> 1
   -2 -> 0
   -1 -> -1
    0 -> 0
    1 -> 1
    2 -> 0
    3 -> -1
    4 -> 0
    5 -> 1

Cá nhân tôi biết hai cách tiếp cận trong C - cách thứ nhất là sử dụng bảng tra cứu, cách thứ hai là sử dụng các hướng dẫn có điều kiện. Đối với các điểm brownie, bạn có thể gây ấn tượng với tôi bằng cách tiếp cận "toán học" thuần túy không? (Ý tôi là một cách tiếp cận chức năng thuần túy, ví dụ như không sử dụng các hướng dẫn có điều kiện hoặc sử dụng bộ nhớ cho LUT.) Nhưng đây không phải là một hạn chế. Nếu bạn không thể, hoặc ngôn ngữ của bạn không hỗ trợ nó - chỉ cần đăng bất kỳ giải pháp nào


3
Bạn có ý nghĩa gì bởi "offset có thể âm"? Ngoài ra, đây về cơ bản chỉ là một hàm lượng giác, vì vậy tôi sẽ ngạc nhiên nếu nó không phải là một bản sao của một cái gì đó.
FryAmTheEggman

@JungHwanMin Điều này có các quy tắc thoải mái hơn nhiều, vì vậy nó không thực sự là một bản sao (mặc dù nó yêu cầu điều tương tự).
Mego

@Mego được rồi. Rút lại phiếu bầu của tôi.
JungHwan Min


Sóng có thể lệch pha so với ví dụ không?
Maria

Câu trả lời:


12

Toán học, 8 byte

Im[I^#]&

Giải trình

Im[I^#]&
   I^#    (* Raise the imaginary unit to the input power *)
Im[   ]   (* Take the imaginary part *)

3
Ohh, cách tiếp cận đẹp. Làm thế nào tôi không nhìn thấy điều này? : D
HyperNeutrino

Không thể thấy được cách tạo đơn vị tưởng tượng trong C .. = (tôi là người lắp ráp ^^ sử dụng nội dung trong các ngôn ngữ kỳ lạ không có lợi cho tôi) tuy nhiên đó là một câu trả lời ..

7

TI-Basic, 7 5 4 byte

sin(90Ans

(Chế độ độ) -1 byte từ @immibis từ câu trả lời cũ của tôi.


Câu trả lời cũ

imag(i^Ans

Phương pháp toán học thuần túy trên một máy tính. :)

Để giải trí, đây là một giải pháp toán học thuần túy (ish) khác cho 9 byte (Ở chế độ radian) hoặc 8 byte (Chế độ độ)

2/πsin-1sin(πAns/2 # Radians
90-1sin-1sin(90Ans # Degrees

vâng, nhưng bạn chỉ cần quên một triển khai hình ảnh () .. nhưng sử dụng mã người khác là tốt, mặc dù .. câu trả lời tốt :)

2
@ xakepp35 Tôi không hiểu. imag()là một chức năng hợp lệ trên TI-BASIC.
JungHwan Min

Có chuyện gì với bạn sin(90Ansvậy? Tại sao bạn cần thêm 90-1sin-1?
dùng253751

@immibis 90 ^ -1sin ^ -1 biến nó thành sóng tam giác cho tất cả các giá trị, nhưng sin (90Ans hoạt động cho những gì câu hỏi yêu cầu.
pizzapants184

6

Python 2 , 20 byte

lambda n:n%2-n%4/3*2

Hãy thử trực tuyến!

Tôi đang thực hiện một tìm kiếm mạnh mẽ cho các biểu thức số học hoặc bitwise ngắn hơn, tôi sẽ xem liệu có gì bật lên không. Cái này tôi tự tay tìm.


2
Tìm kiếm biểu hiện lực lượng vũ phu? Đẹp!
Graviton

5

Julia 0,5 , 12 byte

!n=(2-n&3)%2

Tôi thích cách tiếp cận này vì nó không chắc là ngắn nhất trong bất kỳ ngôn ngữ nào khác.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ưu tiên toán tử của Julia là một chút khác thường: không giống như hầu hết các ngôn ngữ khác, các toán tử bitwise có cùng mức độ ưu tiên như các đối tác số học của chúng, vì vậy &(phép nhân bitwise) có cùng mức độ ưu tiên như* .

Đầu tiên, n&3lấy modulo đầu vào 4 , với dấu dương.

Kết quả - 0 , 1 , 2 hoặc 3 - sau đó được trừ đi 2 , thu được 2 , 1 , 0 hoặc -1 .

Cuối cùng, chúng tôi lấy phần còn lại đã ký của phép chia cho 2 , trả về 0 , 1 , 0 hoặc -1 .



4

đc, 13

Không chắc chắn nếu bạn tính %toán tử modulo là "toán học thuần túy":

?1+d*v4%1-2%p

Hãy thử trực tuyến . Lưu ý rằng dcsử dụng _thay vì- chỉ ra số âm.

Giải trình

?              # read input
 1+            # add 1
   d*v         # duplicate, multiply, square root (poor-mans abs())
      4%       # mod 4
        1-     # subtract 1
          2%   # mod 2
            p  # print

Lưu ý rằng dc's %điều hành mod là 'CPU' phiên bản tiêu chuẩn mà các bản đồ giá trị tiêu cực đến giá trị âm.


Bạn chỉ có thể làm abs((x+1)%4)-1thay thế?
Bạch tuộc ma thuật Urn

2

Brainfuck , 136 byte

>,>++++<[>->+<[>]>[<+>-]<<[<]>-]>>>>-[>+<-----]>--[-<+>>>+>>>+>>>+<<<<<<<<]<->>>>>>->--[>+<++++++]>++<<<<<<<<<<[[->>>+<<<]>>>-]>[.[-]]>.

Hãy thử trực tuyến!

Có lẽ có một câu trả lời tầm thường hơn, nhưng về cơ bản, nó sử dụng một bảng các giá trị. Mặc dù brainfuck lấy đầu vào là các ký tự ASCII có giá trị dương từ 0 đến 127, nhưng nó vẫn hoạt động như thể nó có thể chấp nhận các giá trị âm (để kiểm tra, thay thế ,bằng nsố lượng- ký tự).

Làm thế nào nó hoạt động

>,                                   take input (X)
>++++<                               take second input for modulo (4)
[>->+<[>]>[<+>-]<<[<]>-]             calculate X mod 4
>>>>-[>+<-----]>--                   create initial '1' character
[-<+>>>+>>>+>>>+<<<<<<<<]            duplicate '1' four times as 1,1,1,1
<->>>>>>->--[>+<++++++]>++<<<<<<<<<< change 1,1,1,1 to 0,1,0,-1 
[[->>>+<<<]>>>-]>[.[-]]>.            move to the right X%4 * 3 times, then print the following two characters ( 0, 1, 0,-1)

1

Python, 26 24 21 byte

lambda x:(1j**x).imag

-2 byte nhờ ValueInk đã nhận ra rằng phương pháp toán học thực sự dài hơn phương pháp tầm thường: P
-3 byte nhờ Dennis đã chỉ ra rằng tôi không cần int(...), do đó làm cho nó ngắn hơn :)


lambda x:[0,1,0,-1][x%4]thực sự ngắn hơn câu trả lời cưỡng chế của bạn lol
Value Ink

@ValueInk Oh ... ừm, đây là
trò đùa

2
Tại sao bạn sẽ sử dụng int()ở nơi đầu tiên mặc dù?
Dennis

@Dennis Bởi vì .imagđưa ra một giá trị dấu phẩy động và tôi không chắc liệu đó có phải là thông số kỹ thuật không. Bây giờ không thành vấn đề :)
HyperNeutrino

Nếu số float không được phép, JavaScript sẽ không thể cạnh tranh.
Dennis


1

Toán học, 18 byte

#~JacobiSymbol~46&

5
Điều này không hoạt động tốt: ví dụ, đầu vào 9 và 11 đều cho 1 làm đầu ra. Thời gian của chức năng này là 184, không phải 4.
Greg Martin

1
Tuy nhiên, JacobiSymbol[-4,#]&không hoạt động, và chỉ tốn thêm một byte. Ý kiến ​​hay!
Greg Martin

một lần nữa không thể nhìn thấy một đại số (chỉ là các bản dựng được viết bởi người khác và một vài mã ngắn .. à, tất cả như bình thường. Mặc dù vậy, câu trả lời tốt



1

Haskell , 19 byte

Giải pháp Julia của cảng Dennis, chỉ vì ông nói rằng nó sẽ không ngắn nhất trong bất kỳ ngôn ngữ nào khác. (Ai đó vẫn có thể chứng minh tôi sai rằng nó ngắn nhất ở Haskell.)

f n=rem(2-n`mod`4)2

Hãy thử trực tuyến!

Haskell có hai hàm còn lại khác nhau, một ( rem) hoạt động giống như Julia, trong khi hàm kia ( mod) cho kết quả dương ngay cả khi đối số đầu tiên là âm và do đó phù hợp để dịch &3. (Thực tế của Haskell &, được gọi là .&., than ôi yêu cầu một import Data.Bits.)


Theo như tôi có thể nói, một cổng giải pháp Julia của Dennis cũng tối ưu cho JavaScript (14 byte). Cho thấy ngay cả Dennis là dễ đọc!
Neil



0

C99, 27 byte

Giả sử bạn muốn sóng được căn giữa ở gốc:

f(n){return cpow(1i,n)/1i;}

nếu không f(n){return cpow(1i,n);}sẽ làm. Ban đầu tôi có một cái cimagở đó, nhưng dường như cố gắng trả lại inttừ một _Complex intsản lượng thực sự, vì vậy tôi đã sử dụng nó. Nó có ý nghĩa, nhưng thật dễ chịu tôi đã dự đoán. Hành vi là như nhau trong gccclang


cpow không xác định xD

một số #incolees bị bỏ qua, không biên dịch)))))

nhưng +1 chỉ cho C

1
@ xakepp35 Đó thực sự không phải là lỗi của bao gồm, đó là sự cố liên kết. Biên dịch với -std=c99 -lmvà nó sẽ làm việc. Nó hoạt động tốt cho tôi với cả hai gccclangkhông có bất kỳ bao gồm. Vâng, tốt thôi, ý tôi là không có lỗi, nhưng một số lượng lớn các cảnh báo.
algmyr

0

05AB1E , 5 byte

4%<Ä<

Hãy thử trực tuyến!


Đầu ra bị đảo ngược, nhưng từ những gì tôi hiểu thì điều này được cho phép:

+1 byte để nhân đầu ra với -1 bằng cách sử dụng (.

   -5 -> 1
   -4 -> 0
   -3 -> -1
   -2 -> 0
   -1 -> 1
    0 -> 0
    1 -> -1
    2 -> 0
    3 -> 1
    4 -> 0
    5 -> -1

4%    # Amplitude of 4...
  <   # Period of 1...
   Ä  # Absolute value...
    < # Period of 1 centered at 0...

những gì tôi hiểu điều này được cho phép

trường hợp kiểm tra không được thông qua ;-)

nhưng +1 thử tốt

0

Pyth - 7 byte (có thể là 6)

ta2%tQ4

Thử nó

Nếu pha của sóng không quan trọng, 6 byte:

ta2%Q4

Thử nó

Giải trình:

ta2%tQ4
     Q    # The input
    t     # Subtract 1 to get the phase right (might not be necessary)
   %  4   # Take mod 4
 a2       # Absolute value of the result - 2
t         # Subtract 1 so the result is in [-1,0,1]


0

Javascript ES6, 18 17 byte

n=>n&1&&(++n&2)-1

Đầu tiên, kiểm tra xem đầu vào là chẵn hay lẻ và trả về 0 cho tất cả các giá trị chẵn. Đối với tất cả các đầu vào lẻ, tăng và bit bit 0b10để loại bỏ bất kỳ bit nào không quan tâm đến chúng tôi, sau đó trả về câu trả lời với phần bù.

const f = n=>n&1&&(++n&2)-1;

for (let i = -5; i < 6; i++) {
  document.body.appendChild(document.createElement('pre')).innerHTML = `f(${i}) => ${f(i)}`;
}


1
Lưu một byte bằng cách thay thế ? :0bằng&&
Steve Bennett

@SteveBennett Cảm ơn, ý tưởng tuyệt vời!
Nit

0

JavaScript, 15 byte

n=>n&3&&2-(n&3)

Bitwise và 3 tương đương với modulo 4 trừ khi không có quy tắc kỳ lạ đối với mô đun số âm của JavaScript. Tôi đã thực hiện hồi quy đa thức trên bốn điểm đầu tiên nhưng sau đó nhận ra rằng tôi đang bị câm bởi vì (1, 1), (2, 0) và (3, -1) chỉ là 2-n.

a=n=>n&1&&2-(n&3);
console.log([a(-5), a(-4), a(-3), a(-2), a(-1), a(0), a(1), a(2), a(3), a(4), a(5)])


rất tốt! +1 cho câu trả lời

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.