Üçgen sinyal üret


9

Görev:

Örnek indeksi, x verildiğinde, 4 örnek ve genlik 1 periyodu ile üçgen dalganın örnek f (x) değerini hesaplayın. Ofset negatif olabilir ve örnek değeri {0, 1, -1} olabilir.

Test senaryoları:

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

Şahsen C'de iki yaklaşım biliyorum - birincisi arama tablosunu, ikincisi koşullu talimatları kullanıyor. Brownie puanları için, beni saf bir “matematik” yaklaşımıyla etkileyebilir misiniz? (Demek istediğim saf bir işlevsel yaklaşım, örneğin koşullu talimatlar kullanmamak veya LUT için bellek kullanmak değil.) Ama bu bir kısıtlama değil. Yapamıyorsanız veya diliniz desteklemiyorsa - herhangi bir çözüm gönderin


3
"Ofset negatif olabilir" ile ne demek istiyorsun? Ayrıca bu temelde sadece trigonometrik bir işlevdir, bu yüzden bir şeylerin bir kopyası değilse şaşırırdım.
FryAmTheEggman

@JungHwanMin Bu çok daha rahat kurallara sahip, bu yüzden gerçekten bir dupe değil (aynı şeyi ister).
Mego

@Mego tamam. Oyumu geri çekiyorum.
JungHwan Min


Dalga örneğe göre faz dışı olabilir mi?
Maria

Yanıtlar:


12

Mathematica, 8 bayt

Im[I^#]&

açıklama

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

3
Ohh, güzel yaklaşım. Bunu nasıl görmedim? : D
HyperNeutrino

algo göremiyorum nasıl C .. = im im montajcı adam ^^ egzotik dillerde yerleşik kullanarak benim lehime değildir) ancak bir cevap ..

7

TI-Basic, 7 5 4 bayt

sin(90Ans

(Derece modu) @immibis'ten -1 bayt eski cevabımdan.


Eski cevap

imag(i^Ans

Hesap makinesinde saf matematik yaklaşımı. :)

Sadece eğlence için, 9 bayt (radyan modunda) veya 8 bayt (Derece modu) için başka bir saf matematik (ish) çözümü

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

evet, ama sadece bir imag () uygulamasını unutuyorsun .. ama başkalarının kodunu kullanmak iyi olsa da .. iyi cevap :)

2
@ xakepp35 Anlamıyorum. imag()TI-BASIC üzerinde geçerli bir fonksiyondur.
JungHwan Min

Sorun nedir sin(90Ans? Ekstraya neden ihtiyacınız var 90-1sin-1?
user253751

@immibis 90 ^ -1sin ^ -1, tüm değerler için bir üçgen dalga yapar, ancak günah (90Ans, sorunun sorduğu şey için çalışır.
pizzapants184

6

Python 2 , 20 bayt

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

Çevrimiçi deneyin!

Daha kısa aritmetik veya bitsel ifadeler için kaba kuvvetli bir arama yapıyorum, bir şey olup olmadığını göreceğim. Bunu el ile buldum.


2
Kaba kuvvet ifadesi araması? Güzel!
Graviton

5

Julia 0.5 , 12 bayt

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

Bu yaklaşımı seviyorum çünkü başka bir dilde en kısa olması pek mümkün değil.

Çevrimiçi deneyin!

Nasıl çalışır

Julia'nın operatör önceliği biraz olağandışı: diğer birçok dilden farklı olarak, bitsel operatörler aritmetik karşılıklarıyla &aynı önceliğe sahiptir , bu nedenle (bitsel çarpma) aynı önceliğe sahiptir *.

İlk olarak, n&3giriş işareti 4'ü pozitif işaretle alır.

Sonuç - 0 , 1 , 2 veya 3 - daha sonra 2'den çıkarılır , 2 , 1 , 0 veya -1 elde edilir .

Son olarak, bölümün imzalı kalan kısmını 2 , 0 , 1 , 0 veya -1 döndürerek alıyoruz .


4

Jöle , 3 bayt

ı*Ċ

Çevrimiçi deneyin!

Nasıl çalışır

ı*Ċ  Main link. Argument: n

ı*   Elevate i, the imaginary unit, to the n-th power.
  Ċ  Take the imaginary part of the result.

4

dc, 13

Modulo %operatörünü "saf matematik" olarak saydığınızdan emin değilsiniz :

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

Çevrimiçi deneyin . Negatif sayıları belirtmek yerine dckullandığını unutmayın ._-

açıklama

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

O Not dcbireyin %mod operatör negatif değerlere negatif değerler eşler standart 'CPU' versiyonudur.


abs((x+1)%4)-1Bunun yerine yapabilir misin ?
Sihirli Ahtapot Urn

2

brainfuck , 136 bayt

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

Çevrimiçi deneyin!

Muhtemelen daha önemsiz bir cevap var, ama bu aslında bir değer tablosu kullanıyor. Brainfuck 127 0'dan pozitif değerlerle ASCII karakter olarak girdi alır rağmen, hala (testine yerine negatif değerleri kabul etmek mümkün olsaydı gibi çalışır ,ile nmiktarı -karakterler).

Nasıl çalışır

>,                                   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 bayt

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

Matematiksel yöntemin önemsiz yaklaşımdan daha uzun olduğunu fark ettiği için ValueInk'e -2 bayt teşekkürler: P
-3 bayt Dennis'e ihtiyacım olmadığına işaret ettiği için teşekkür eder int(...), böylece bu kısaltmayı yapar :)


lambda x:[0,1,0,-1][x%4]aslında zorla yanıtlanan lol'den daha kısadır
Value Ink

@ValueInk Oh ... um bu utanç verici bir lol
HyperNeutrino

2
Neden int()ilk etapta kullanasın ki ?
Dennis

@Dennis Çünkü .imagkayan nokta değeri veriyor ve buna izin verilip verilmediğinden emin değilim. Şimdi önemli değil :)
HyperNeutrino

Kayan noktalara izin verilmezse, JavaScript rekabet edemez.
Dennis


1

Mathematica, 18 bayt

#~JacobiSymbol~46&

5
Bu tam olarak işe yaramıyor: 9 ve 11 girişlerinin ikisi de örneğin 1 çıkış olarak veriyor. Bu işlevin süresi 4 değil
Greg Martin

1
Ancak, JacobiSymbol[-4,#]&işe yarıyor ve sadece bir bayt daha pahalı. İyi fikir!
Greg Martin

Yine bir algrithm (sadece başkalarının ve kısa kodun çift tarafından yazılan builtines göremiyorum .. ah bütün zamanki gibi ince cevap bile.



1

Haskell , 19 bayt

Başka bir dilde en kısa olmayacağını söyledi çünkü Dennis Limanı Julia'nın çözümü. (Birisi hala Haskell'deki en kısa şeyin yanlış olduğunu kanıtlayabilir.)

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

Çevrimiçi deneyin!

Haskell'in iki farklı kalan işlevi vardır, biri ( rem) Julia biri gibi çalışır, diğeri ( mod) ilk argüman negatif olsa bile olumlu bir sonuç verir ve çeviri için uygundur &3. (Haskell'in fiili & denir .&., ne yazık ki bir gerektirir import Data.Bits.)


Anlayabildiğim kadarıyla, Dennis'in Julia çözümünün bir limanı JavaScript için de en uygunudur (14 bayt). Dennis'in bile hata yaptığını gösterir!
Neil



0

C99, 27 bayt

Dalganın başlangıç ​​noktasında ortalanmasını istediğinizi varsayarsak:

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

aksi f(n){return cpow(1i,n);}takdirde yapacak. Başlangıçta orada bir cimagvardı, ama görünüşe göre intbir _Complex intverim bir geri dönmek için çalışıyor gerçek kısmı, bu yüzden bunu kullandım. Bu mantıklı, ama tahmin edebileceğim hiçbir şey değil. Davranış gccveclang


cpow undefined xD

bazı #includes atlandı,

ancak yalnızca C için +1

1
@ xakepp35 Aslında bu içerilenlerin hatası değil, bu bir bağlayıcı sorunu. Derleyin -std=c99 -lmve çalışması gerekir. Benim için iyi gccve clangherhangi bir içermeyen iyi çalışıyor . Tamam, demek istediğim hata yok, ama çok sayıda uyarı var.
algmyr

0

05AB1E , 5 bayt

4%<Ä<

Çevrimiçi deneyin!


Çıktı tersine döndü, ancak anladığım kadarıyla buna izin verildi:

+1 bayt kullanarak çıktıyı -1 ile çarpın (.

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

anladım ne izin verilir

test

ama +1 güzel deneme

0

Pyth - 7 bayt (muhtemelen 6)

ta2%tQ4

Dene

Dalganın fazı önemli değilse, 6 bayt:

ta2%Q4

Dene

Açıklama:

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 bayt

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

İlk olarak, girişin çift mi yoksa tek mi olduğunu kontrol edin ve tüm çift değerleri için 0 değerini döndürün. Tüm tek girdiler için, 0b10bizi ilgilendirmeyen bitleri kaldırmak için artırın ve bitsel olarak çevirin , ardından cevabı bir ofset ile döndürün.

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
Değiştirerek byte tasarruf ? :0ile&&
Steve Bennett

@SteveBennett Teşekkürler, harika fikir!
Nit

0

JavaScript, 15 bayt

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

Bitwise ve 3, JavaScript'in negatif sayı modülleri üzerindeki garip kural hariç, modulo 4 ile eşdeğerdir. İlk başta ilk dört noktada polinom regresyonu yaptım ama sonra aptal olduğumu fark ettim çünkü (1, 1), (2, 0) ve (3, -1) sadece 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)])


çok iyi! Cevap için +1

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.