Generuj trójkątny sygnał

9

Zadanie:

Biorąc pod uwagę indeks próbki, x, oblicz wartość próbki f (x) fali trójkątnej, z okresem 4 próbek i amplitudą 1. Przesunięcie może być ujemne, a wartość próbki może wynosić {0, 1, -1}.

Przypadki testowe:

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

Osobiście znam dwa podejścia w C - pierwsze wykorzystuje tabelę odnośników, drugie korzysta z instrukcji warunkowych. Jeśli chodzi o punkty brownie, czy możesz zrobić na mnie wrażenie czystym podejściem „matematycznym”? (Mam na myśli podejście czysto funkcjonalne, np. Nieużywanie instrukcji warunkowych lub pamięć dla LUT.) Ale to nie jest ograniczenie. Jeśli nie możesz lub Twój język go nie obsługuje - po prostu opublikuj dowolne rozwiązanie

0 '
źródło
3
Co rozumiesz przez „przesunięcie może być ujemne”? Jest to w zasadzie tylko funkcja trygonometryczna, więc byłbym zaskoczony, jeśli nie jest to duplikat czegoś.
FryAmTheEggman
@JungHwanMin To ma znacznie bardziej swobodne zasady, więc nie jest to tak naprawdę dupe (choć prosi o to samo).
Mego
@Mego w porządku. Cofam mój głos.
JungHwan Min
Powiązane: codegolf.stackexchange.com/q/5522/60043
JungHwan Min
Czy fala może być poza fazą w stosunku do przykładu?
Maria

Odpowiedzi:

12

Mathematica, 8 bajtów

Im[I^#]&

Wyjaśnienie

Im[I^#]&
   I^#    (* Raise the imaginary unit to the input power *)
Im[   ]   (* Take the imaginary part *)
JungHwan Min
źródło
3
Och, piękne podejście. Jak tego nie widziałem? : D
HyperNeutrino
nie mogę zobaczyć algo, jak wygenerować wyimaginowaną jednostkę w C .. = (im asembler man ^^ używając wbudowanych w egzotycznych językach nie jest na moją korzyść) jednak jest odpowiedź ..
7

TI-Basic, 7 5 4 bajtów

sin(90Ans

(Tryb stopni) -1 bajt z @immibis ze starej odpowiedzi.


Stara odpowiedź

imag(i^Ans

Podejście czystej matematyki na kalkulatorze. :)

Dla zabawy, oto inne rozwiązanie czystej matematyki (ish) dla 9 bajtów (w trybie radianów) lub 8 bajtów (tryb stopni)

2/πsin-1sin(πAns/2 # Radians
90-1sin-1sin(90Ans # Degrees
pizzapanty184
źródło
tak, ale po prostu zapominasz o implementacji imag () .. ale używanie kodu innych jest w porządku, chociaż .. dobra odpowiedź :)
2
@ xakepp35 Nie rozumiem. imag()jest poprawną funkcją w TI-BASIC.
JungHwan Min
Co jest nie tak z sin(90Ans? Dlaczego potrzebujesz dodatkowych 90-1sin-1?
user253751
@immibis 90 ^ -1sin ^ -1 sprawia, że ​​jest falą trójkątną dla wszystkich wartości, ale sin (90Ans działa zgodnie z tym, o co pyta pytanie.
pizzapants184
6

Python 2 , 20 bajtów

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

Wypróbuj online!

Prowadzę poszukiwania brute-force dla krótszych wyrażeń arytmetycznych lub bitowych, zobaczę, czy coś się pojawi. Ten ręcznie znaleziony.

xnor
źródło
2
Wyszukiwanie wyrażenia brutalnej siły? Miły!
Graviton
5

Julia 0,5 , 12 bajtów

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

Podoba mi się to podejście, ponieważ prawdopodobnie nie będzie najkrótsze w żadnym innym języku.

Wypróbuj online!

Jak to działa

Pierwszeństwo operatorów Julii jest nieco niezwykłe: w przeciwieństwie do większości innych języków operatory bitowe mają taki sam priorytet jak ich odpowiedniki arytmetyczne, więc &(mnożenie bitowe) ma taki sam priorytet jak *.

Najpierw n&3pobiera moduł wejściowy 4 ze znakiem dodatnim.

Wynik - 0 , 1 , 2 lub 3 - jest następnie odejmowany od 2 , dając 2 , 1 , 0 lub -1 .

Na koniec bierzemy podpisaną pozostałą część podziału przez 2 , zwracając 0 , 1 , 0 lub -1 .

Dennis
źródło
4

Galaretka , 3 bajty

ı*Ċ

Wypróbuj online!

Jak to działa

ı*Ċ  Main link. Argument: n

ı*   Elevate i, the imaginary unit, to the n-th power.
  Ċ  Take the imaginary part of the result.
Dennis
źródło
4

dc, 13

Nie jestem pewien, czy liczycie %operatora modulo jako „czystą matematykę”:

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

Wypróbuj online . Zauważ, że dcużywa _zamiast zamiast -liczb ujemnych.

Wyjaśnienie

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

Zauważ, że dc„s %operator mod jest średnia«CPU»wersja, która odwzorowuje wartości ujemnych do wartości ujemnych.

Cyfrowa trauma
źródło
Czy możesz po prostu zrobić abs((x+1)%4)-1zamiast tego?
Magic Octopus Urn
2

pieprzenie mózgu , 136 bajtów

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

Wypróbuj online!

Prawdopodobnie istnieje bardziej trywialna odpowiedź, ale w zasadzie wykorzystuje ona tabelę wartości. Chociaż brainfuck trwa wejścia jako znaki ASCII z wartościami dodatnimi od 0 do 127, to nadal działa, jak gdyby był w stanie przyjmować wartości ujemne (do testu, wymienić ,z nilością -znaków).

Jak to działa

>,                                   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)
Grawiton
źródło
1

Python, 26 24 21 bajtów

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

-2 bajty dzięki ValueInk za uświadomienie sobie, że metoda matematyczna jest w rzeczywistości dłuższa niż trywialne podejście: P
-3 bajty dzięki Dennisowi za wskazanie, że nie potrzebuję int(...), dzięki czemu jest to krótsze :)

HyperNeutrino
źródło
lambda x:[0,1,0,-1][x%4]jest w rzeczywistości krótszy niż twoja wymuszona odpowiedź lol
Value Ink
@ValueInk Oh ... um to kłopotliwe lol
HyperNeutrino
2
Dlaczego miałbyś w ogóle używać int()?
Dennis
@Dennis Ponieważ .imagdaje wartość zmiennoprzecinkową i nie jestem pewien, czy jest to dozwolone przez specyfikację. Teraz to nie ma znaczenia :)
HyperNeutrino
Jeśli zmiennoprzecinkowe nie są dozwolone, JavaScript nie będzie mógł konkurować.
Dennis
1

Mathematica, 18 bajtów

#~JacobiSymbol~46&
J42161217
źródło
5
To nie do końca działa: na przykład wejścia 9 i 11 dają 1 jako wynik. Okres tej funkcji to 184, a nie 4.
Greg Martin
1
Działa jednak JacobiSymbol[-4,#]&i kosztuje tylko jeden bajt. Dobry pomysł!
Greg Martin
znowu nie widzę algrithm (właśnie buildiny napisane przez innych i kilka krótkiego kodu ... ach, wszystko jak zwykle. dobra odpowiedź
1

PHP, 20 bajtów

<?=2<=>($argn&3?:2);
użytkownik63956
źródło
1

Haskell , 19 bajtów

Rozwiązanie Julii z Port Dennis, tylko dlatego, że powiedział, że nie będzie najkrótsze w żadnym innym języku. (Ktoś może wciąż udowodnić, że się mylę, że w Haskell jest najkrótszy.)

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

Wypróbuj online!

Haskell ma dwie różne pozostałe funkcje, jedna ( rem) działa jak Julia, a druga ( mod) daje wynik dodatni, nawet jeśli pierwszy argument jest ujemny, a więc nadaje się do tłumaczenia &3. ( Rzeczywisty & , nazywany .&., niestety Haskell wymaga import Data.Bits.)

Ørjan Johansen
źródło
O ile wiem, port rozwiązania Dennis Julia jest również optymalny dla JavaScript (14 bajtów). Pokazuje, że nawet Dennis jest omylny!
Neil
0

Ruby, 20 bajtów

Prosty i czysty.

->x{[0,1,0,-1][x%4]}
Wartość tuszu
źródło
0

C99, 27 bajtów

Zakładając, że chcesz, aby fala była wyśrodkowana na początku:

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

inaczej f(n){return cpow(1i,n);}zrobi. Pierwotnie miałem cimagtam, ale najwyraźniej próbuję zwrócić intz _Complex intrentowności, daje prawdziwą część, więc wykorzystałem to. To ma sens, ale nie przewidziałbym niczego. Zachowanie jest takie samo w gcciclang

algmyr
źródło
cpow jest niezdefiniowany xD
część #zawiera pominięte, nie kompiluje się)))))
ale +1 tylko dla C
1
@ xakepp35 To nie jest tak naprawdę wina załączników, to problem z linkerem. Skompiluj -std=c99 -lmi powinno działać. Działa dla mnie dobrze z obu gcci clangbez żadnych obejmuje. Cóż, w porządku mam na myśli, że nie ma błędów, ale duża liczba ostrzeżeń.
algmyr
0

05AB1E , 5 bajtów

4%<Ä<

Wypróbuj online!


Dane wyjściowe są odwrócone, ale z tego, co zrozumiałem, jest to dozwolone:

+1 bajt, aby pomnożyć wyjście przez -1 za pomocą (.

   -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...
Urna Magicznej Ośmiornicy
źródło
zrozumiałem, że jest to dozwolone
przypadki testowe nie są
ale +1 niezła próba
0

Pyth - 7 bajtów (ewentualnie 6)

ta2%tQ4

Spróbuj

Jeśli faza fali nie jest ważna, 6 bajtów:

ta2%Q4

Spróbuj

Wyjaśnienie:

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]
Maria
źródło
0

JavaScript ES6, 18 17 bajtów

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

Najpierw sprawdź, czy dane wejściowe są parzyste czy nieparzyste i zwróć 0 dla wszystkich wartości parzystych. W przypadku wszystkich nieparzystych danych wejściowych zwiększaj i bituj za pomocą, 0b10aby usunąć bity, które nas nie interesują, a następnie zwróć odpowiedź z przesunięciem.

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

Gnida
źródło
1
Zapisać bajt zastępując ? :0z&&
Steve Bennett
@SteveBennett Dzięki, świetny pomysł!
Nit
0

JavaScript, 15 bajtów

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

Bitowe i 3 jest równoważne modulo 4, z wyjątkiem tej dziwnej reguły w modułach liczb ujemnych JavaScript. Najpierw zrobiłem regresję wielomianową na pierwszych czterech punktach, ale potem zdałem sobie sprawę, że jestem głupi, ponieważ (1, 1), (2, 0) i (3, -1) to tylko 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)])

Kuilin Li
źródło
bardzo dobrze! +1 za odpowiedź