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
Odpowiedzi:
Mathematica, 8 bajtów
Wyjaśnienie
źródło
TI-Basic,
754 bajtów(Tryb stopni) -1 bajt z @immibis ze starej odpowiedzi.
Stara odpowiedź
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)
źródło
imag()
jest poprawną funkcją w TI-BASIC.sin(90Ans
? Dlaczego potrzebujesz dodatkowych90-1sin-1
?Python 2 , 20 bajtów
Wypróbuj online!
Prowadzę poszukiwania brute-force dla krótszych wyrażeń arytmetycznych lub bitowych, zobaczę, czy coś się pojawi. Ten ręcznie znaleziony.
źródło
Julia 0,5 , 12 bajtów
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&3
pobiera 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 .
źródło
Galaretka , 3 bajty
Wypróbuj online!
Jak to działa
źródło
dc, 13
Nie jestem pewien, czy liczycie
%
operatora modulo jako „czystą matematykę”:Wypróbuj online . Zauważ, że
dc
używa_
zamiast zamiast-
liczb ujemnych.Wyjaśnienie
Zauważ, że
dc
„s%
operator mod jest średnia«CPU»wersja, która odwzorowuje wartości ujemnych do wartości ujemnych.źródło
abs((x+1)%4)-1
zamiast tego?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ć
,
zn
ilością-
znaków).Jak to działa
źródło
Python,
262421 bajtów-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 :)źródło
lambda x:[0,1,0,-1][x%4]
jest w rzeczywistości krótszy niż twoja wymuszona odpowiedź lolint()
?.imag
daje wartość zmiennoprzecinkową i nie jestem pewien, czy jest to dozwolone przez specyfikację. Teraz to nie ma znaczenia :)Python , 20 bajtów
Nienazwana funkcja, która zwraca wynik.
Wypróbuj online!
źródło
Mathematica, 18 bajtów
źródło
JacobiSymbol[-4,#]&
i kosztuje tylko jeden bajt. Dobry pomysł!Pari / GP , 12 bajtów
Wypróbuj online!
źródło
PHP, 20 bajtów
źródło
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.)
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 wymagaimport Data.Bits
.)źródło
Oktawa , 22 bajty
Wypróbuj online!
źródło
Ruby, 20 bajtów
Prosty i czysty.
źródło
C99, 27 bajtów
Zakładając, że chcesz, aby fala była wyśrodkowana na początku:
inaczej
f(n){return cpow(1i,n);}
zrobi. Pierwotnie miałemcimag
tam, ale najwyraźniej próbuję zwrócićint
z_Complex int
rentowności, daje prawdziwą część, więc wykorzystałem to. To ma sens, ale nie przewidziałbym niczego. Zachowanie jest takie samo wgcc
iclang
źródło
-std=c99 -lm
i powinno działać. Działa dla mnie dobrze z obugcc
iclang
bez żadnych obejmuje. Cóż, w porządku mam na myśli, że nie ma błędów, ale duża liczba ostrzeżeń.05AB1E , 5 bajtów
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ą
(
.źródło
Pyth - 7 bajtów (ewentualnie 6)
Spróbuj
Jeśli faza fali nie jest ważna, 6 bajtów:
Spróbuj
Wyjaśnienie:
źródło
AWK , 26 bajtów
Wypróbuj online!
Jest to alternatywne podejście wykorzystujące funkcje triggera bez operatora modułu.
Wypróbuj online!
źródło
JavaScript ES6,
1817 bajtówNajpierw 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ą,
0b10
aby usunąć bity, które nas nie interesują, a następnie zwróć odpowiedź z przesunięciem.źródło
? :0
z&&
JavaScript, 15 bajtów
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.
źródło
R , 19 bajtów
Wypróbuj online!
Port odpowiedzi Matematyki JungHwana Min .
źródło