สร้างสัญญาณรูปสามเหลี่ยม


9

งาน:

ดัชนีตัวอย่างที่กำหนด, x, คำนวณค่าตัวอย่าง f (x) ของคลื่นสามเหลี่ยมที่มีระยะเวลา 4 ตัวอย่างและแอมพลิจูด 1 ค่าออฟเซ็ตอาจเป็นค่าลบและค่าตัวอย่างอาจเป็น {0, 1, -1}

กรณีทดสอบ:

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

โดยส่วนตัวฉันรู้สองแนวทางใน C - อย่างแรกคือการใช้ตารางการค้นหาที่สองคือการใช้คำแนะนำตามเงื่อนไข สำหรับคะแนนบราวนี่คุณช่วยสร้างความประทับใจให้ฉันด้วยวิธีการทางคณิตศาสตร์ที่บริสุทธิ์หรือไม่? (ฉันหมายถึงวิธีการทำงานที่บริสุทธิ์เช่นไม่ใช้คำแนะนำแบบมีเงื่อนไขหรือใช้หน่วยความจำสำหรับ LUT) แต่นี่ไม่ใช่ข้อ จำกัด หากคุณทำไม่ได้หรือภาษาของคุณไม่รองรับ - เพียงโพสต์โซลูชันใด ๆ


3
คุณหมายถึงอะไรโดย "offset สามารถเป็นลบ" ได้? นอกจากนี้นี่เป็นเพียงฟังก์ชันตรีโกณมิติดังนั้นฉันจะแปลกใจถ้ามันไม่ได้เป็นสิ่งล่อลวงของบางสิ่งบางอย่าง
FryAmTheEggman

@JungHwanMin นี่มีกฎที่ผ่อนคลายมากกว่านี้มากดังนั้นมันจึงไม่ได้เป็นคนล่อลวง (แม้ว่ามันจะถามในสิ่งเดียวกัน)
Mego

@ ไม่เป็นไร ถอนการโหวตของฉัน
JungHwan Min

ที่เกี่ยวข้อง: codegolf.stackexchange.com/q/5522/60043
Min

คลื่นสามารถอยู่นอกเฟสเทียบกับตัวอย่างได้หรือไม่
มาเรีย

คำตอบ:


12

Mathematica ขนาด 8 ไบต์

Im[I^#]&

คำอธิบาย

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

3
วิธีการที่สวยงาม ฉันไม่เห็นสิ่งนี้ได้อย่างไร : D
HyperNeutrino

ไม่สามารถดูวิธีสร้างหน่วยจินตภาพใน C .. = (ผู้ประกอบ IM ได้ ^^ การใช้ builtins ในภาษาแปลกใหม่ไม่ได้อยู่ในความโปรดปรานของฉัน) แต่ก็เป็นคำตอบ ..

7

TI-Basic, 7 5 4 ไบต์

sin(90Ans

(โหมดองศา) -1 ไบต์จาก @immibis จากคำตอบเดิมของฉัน


คำตอบเก่า

imag(i^Ans

วิธีการทางคณิตศาสตร์บริสุทธิ์บนเครื่องคิดเลข :)

เพียงเพื่อความสนุกนี่คืออีกหนึ่งโซลูชั่น pure-math (ish) สำหรับ 9 ไบต์ (ในโหมดเรเดียน) หรือ 8 ไบต์ (โหมดองศา)

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

ใช่ แต่คุณเพิ่งลืมการนำไปใช้ () การนำไปใช้ .. แต่ใช้รหัสอื่น ๆ ได้ดี แต่ .. คำตอบที่ดี :)

2
@ xakepp35 ฉันไม่เข้าใจ imag()เป็นฟังก์ชันที่ถูกต้องใน TI-BASIC
JungHwan Min

มีอะไรผิดปกติกับsin(90Ans? ทำไมคุณต้องมีส่วนเสริม90-1sin-1?
user253751

@immibis 90 ^ -1sin ^ -1 ทำให้มันเป็นรูปสามเหลี่ยมคลื่นสำหรับค่าทั้งหมด แต่บาป (90Ans ทำงานได้กับสิ่งที่คำถามถาม
pizzapants184

6

Python 2 , 20 ไบต์

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

ลองออนไลน์!

ฉันกำลังค้นหาแรงทางคณิตศาสตร์สำหรับนิพจน์ทางคณิตศาสตร์หรือนิพจน์ระดับบิตที่สั้นกว่าฉันจะดูว่ามีอะไรเกิดขึ้นบ้าง ฉันพบมือนี้


2
กำลังค้นหาการแสดงออกที่ดุร้าย? ดี!
Graviton

5

Julia 0.5 , 12 ไบต์

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

ฉันชอบวิธีนี้เพราะไม่น่าจะเป็นภาษาที่สั้นที่สุดในภาษาอื่น

ลองออนไลน์!

มันทำงานอย่างไร

ตัวดำเนินการของ Julia นั้นผิดปกติเล็กน้อย: ซึ่งแตกต่างจากภาษาอื่น ๆ ส่วนใหญ่ตัวดำเนินการระดับบิตมีความสำคัญเช่นเดียวกันกับเลขคณิตของพวกเขาดังนั้น&(การคูณ bitwise) จึงมีความสำคัญเช่น*เดียวกัน

ขั้นแรกn&3ให้นำโมดูโลอินพุต4พร้อมเครื่องหมายบวก

ผลลัพธ์ - 0 , 1 , 2หรือ3 - จะถูกลบออกจาก2แล้วให้ผลลัพธ์2 , 1 , 0หรือ-1

ในที่สุดเราใช้เวลาที่เหลือของการหารด้วย2โดยคืนค่า0 , 1 , 0หรือ -1



4

dc, 13

ไม่แน่ใจว่าคุณนับ%โอเปอเรเตอร์โมดูโล่เป็น "pure math" หรือไม่:

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

ลองมันออนไลน์ โปรดทราบว่าdcใช้_แทน-การระบุจำนวนลบ

คำอธิบาย

?              # 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

โปรดทราบว่าโอเปอเรเตอร์dcของ%mod เป็นรุ่น "CPU" มาตรฐานที่จับคู่ค่าลบกับค่าลบ


คุณสามารถทำabs((x+1)%4)-1แทน
Magic Octopus Urn

2

brainfuck , 136 ไบต์

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

ลองออนไลน์!

อาจมีคำตอบที่น่าสนใจมากกว่านี้ แต่สิ่งนี้ใช้ตารางค่า แม้ว่า brainfuck รับอินพุตเป็นอักขระ ASCII ที่มีค่าบวกตั้งแต่ 0 ถึง 127 แต่ก็ยังใช้งานได้ราวกับว่ามันสามารถยอมรับค่าลบได้ (เพื่อทดสอบแทนที่,ด้วยnจำนวน-อักขระ)

มันทำงานอย่างไร

>,                                   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 ไบต์

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

-2 ไบต์ต้องขอบคุณ ValueInk สำหรับการตระหนักว่าวิธีการทางคณิตศาสตร์นั้นยาวกว่าวิธีการเล็กน้อย: P
-3 ไบต์ขอบคุณเดนนิสที่ชี้ให้เห็นว่าฉันไม่ต้องการint(...)จึงทำให้มันสั้นลง :)


lambda x:[0,1,0,-1][x%4]จริง ๆ แล้วสั้นกว่าคำตอบที่ถูกบังคับให้ใช้ของคุณ lol
Value Ink

@ValueInk โอ้ ... เอ่อนี่น่าอายฮ่า ๆ ๆ
HyperNeutrino

2
ทำไมคุณต้องใช้int()ตั้งแต่แรก
เดนนิส

@Dennis เพราะ.imagให้ค่า floating-point และฉันไม่แน่ใจว่าเป็นไปตามข้อกำหนดหรือไม่ มันไม่สำคัญหรอก :)
HyperNeutrino

หากไม่อนุญาตให้มีการลอยตัว JavaScript จะไม่สามารถแข่งขันได้
เดนนิส


1

Mathematica ขนาด 18 ไบต์

#~JacobiSymbol~46&

5
สิ่งนี้ใช้งานไม่ได้: อินพุต 9 และ 11 ทั้งคู่ให้ 1 เป็นเอาต์พุตตัวอย่างเช่น ระยะเวลาของฟังก์ชันนี้คือ 184 ไม่ใช่ 4
Greg Martin

1
อย่างไรก็ตามสามารถJacobiSymbol[-4,#]&ใช้งานได้และมีค่าใช้จ่ายเพิ่มอีกหนึ่งไบต์ ความคิดดี!
Greg Martin

อีกครั้งไม่สามารถเห็น algrithm (เพิ่งสร้างโดยผู้อื่นและรหัสสั้น ๆ สองสามอา .. , ทั้งหมดตามปกติ. คำตอบที่ดีแม้ว่า



1

Haskell , 19 ไบต์

โซลูชัน Julia ของ Port of Dennis เพียงเพราะเขาบอกว่าจะไม่สั้นที่สุดในภาษาอื่น ๆ (บางคนอาจพิสูจน์ว่าฉันผิดว่าสั้นที่สุดใน Haskell)

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

ลองออนไลน์!

Haskell มีสองฟังก์ชั่นที่เหลือที่แตกต่างกันอย่างใดอย่างหนึ่ง ( rem) ทำงานเช่นจูเลียหนึ่งในขณะที่คนอื่น ๆ ( mod) &3ให้ผลบวกแม้เมื่ออาร์กิวเมนต์แรกเป็นลบและเพื่อให้เป็นที่เหมาะสมสำหรับการแปล ( ตามจริง ของ Haskell &เรียกว่า.&.อนิจจาต้องมีimport Data.Bits)


เท่าที่ฉันสามารถบอกได้พอร์ตของโซลูชัน Julia ของเดนนิสนั้นเหมาะสมที่สุดสำหรับ JavaScript เช่นกัน (14 ไบต์) แสดงให้เห็นว่าแม้แต่เดนนิสก็ผิดพลาดได้!
Neil



0

C99, 27 ไบต์

สมมติว่าคุณต้องการให้คลื่นอยู่กึ่งกลางที่จุดกำเนิด:

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

มิฉะนั้นf(n){return cpow(1i,n);}จะทำ ตอนแรกฉันมีcimagอยู่ในนั้น แต่ดูเหมือนจะพยายามกลับintจากส่วนที่_Complex intให้ผลผลิตจริงดังนั้นฉันจึงใช้มัน มันสมเหตุสมผล แต่ก็ไม่มีอะไรที่ฉันจะคาดเดาได้ พฤติกรรมเหมือนกันในgccและclang


cpow ไม่ได้กำหนด xD

#includes บางส่วนถูกละเว้นไม่ได้คอมไพล์)))))

แต่ +1 เฉพาะสำหรับ C

1
@ xakepp35 ที่จริงแล้วไม่ใช่ความผิดของการรวมเป็นปัญหาตัวเชื่อมโยง รวบรวม-std=c99 -lmและมันควรจะทำงาน มันทำงานได้ดีสำหรับฉันด้วยทั้งgccและclangไม่รวมถึงใด ๆ ฉันหมายความว่าไม่มีข้อผิดพลาด แต่มีคำเตือนจำนวนมาก
algmyr

0

05AB1E , 5 ไบต์

4%<Ä<

ลองออนไลน์!


ผลลัพธ์กลับด้าน แต่จากสิ่งที่ฉันเข้าใจว่าทำได้:

1 ไบต์เพื่อส่งออกคูณด้วย -1 (ใช้

   -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...

สิ่งที่ฉันเข้าใจนี้ได้รับอนุญาต

กรณีทดสอบไม่ผ่าน ;-)

แต่ +1 ดีลอง

0

Pyth - 7 ไบต์ (อาจเป็น 6)

ta2%tQ4

ลองมัน

หากเฟสของคลื่นไม่สำคัญ 6 ไบต์:

ta2%Q4

ลองมัน

คำอธิบาย:

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 ไบต์

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

ประการแรกตรวจสอบว่าอินพุตเป็นเลขคี่หรือคี่และส่งกลับค่า 0 สำหรับค่าเลขคู่ทั้งหมดหรือไม่ สำหรับการป้อนข้อมูลคี่ทั้งหมดเพิ่มและ bitwise ด้วย0b10เพื่อลบบิตใด ๆ ที่ไม่สนใจเราแล้วกลับคำตอบด้วยการชดเชย

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
บันทึกไบต์โดยแทนที่? :0ด้วย&&
Steve Bennett

@SteveBennett ขอบคุณความคิดที่ยอดเยี่ยม!
นิด

0

JavaScript ขนาด 15 ไบต์

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

Bitwise และ 3 เทียบเท่ากับ modulo 4 ยกเว้นไม่มีกฎแปลกสำหรับ modulos ของ JavaScript ของจำนวนลบ ฉันทำการถดถอยพหุนามในสี่จุดแรกในตอนแรก แต่เมื่อรู้แล้วว่าฉันเป็นใบ้เพราะ (1, 1), (2, 0) และ (3, -1) เป็นแค่ 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)])


ดีมาก! +1 สำหรับคำตอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.