Aufgabe:
Berechnen Sie bei gegebenem Abtastindex x den Abtastwert f (x) der Dreieckwelle mit einer Periode von 4 Abtastwerten und der Amplitude 1. Der Versatz kann negativ sein und der Abtastwert kann entweder {0, 1, -1} sein.
Testfälle:
-5 -> -1
-4 -> 0
-3 -> 1
-2 -> 0
-1 -> -1
0 -> 0
1 -> 1
2 -> 0
3 -> -1
4 -> 0
5 -> 1
Persönlich kenne ich zwei Ansätze in C - der erste verwendet die Nachschlagetabelle, der zweite verwendet bedingte Anweisungen. Könnten Sie mich für Brownie-Punkte mit einem reinen "Mathe" -Ansatz beeindrucken? (Ich meine einen rein funktionalen Ansatz, z. B. keine bedingten Anweisungen oder Speicher für die LUT zu verwenden.) Dies ist jedoch keine Einschränkung. Wenn Sie dies nicht können oder Ihre Sprache dies nicht unterstützt, veröffentlichen Sie einfach eine Lösung
Antworten:
Mathematica, 8 Bytes
Erläuterung
quelle
TI-Basic,
754 Bytes(Gradmodus) -1 Byte von @immibis aus meiner alten Antwort.
Alte Antwort
Reinmathematischer Ansatz auf einem Taschenrechner. :) :)
Nur zum Spaß, hier ist eine andere rein mathematische (ish) Lösung für 9 Bytes (im Bogenmaßmodus) oder 8 Bytes (Gradmodus)
quelle
imag()
ist eine gültige Funktion in TI-BASIC.sin(90Ans
? Warum brauchst du das extra90-1sin-1
?Python 2 , 20 Bytes
Probieren Sie es online aus!
Ich führe eine Brute-Force-Suche nach kürzeren arithmetischen oder bitweisen Ausdrücken durch. Ich werde sehen, ob etwas auftaucht. Diesen habe ich von Hand gefunden.
quelle
Julia 0,5 , 12 Bytes
Ich mag diesen Ansatz, weil es unwahrscheinlich ist, dass er in einer anderen Sprache der kürzeste ist.
Probieren Sie es online aus!
Wie es funktioniert
Julias Operatorpriorität ist etwas ungewöhnlich: Im Gegensatz zu den meisten anderen Sprachen haben bitweise Operatoren dieselbe Priorität wie ihre arithmetischen Gegenstücke, daher hat
&
(bitweise Multiplikation) dieselbe Priorität wie*
.Erstens
n&3
nimmt die Eingabe Modulo 4 , mit positivem Vorzeichen.Das Ergebnis - 0 , 1 , 2 oder 3 - wird dann von 2 subtrahiert , was 2 , 1 , 0 oder -1 ergibt .
Schließlich nehmen wir den vorzeichenbehafteten Rest der Division durch 2 und geben 0 , 1 , 0 oder -1 zurück .
quelle
Gelee , 3 Bytes
Probieren Sie es online aus!
Wie es funktioniert
quelle
dc, 13
Ich bin mir nicht sicher, ob Sie den Modulo-
%
Operator als "reine Mathematik" zählen:Probieren Sie es online aus . Beachten Sie, dass
dc
Anwendungen_
anstelle von-
negativen Zahlen anzuzeigen.Erläuterung
Beachten Sie, dass
dc
der%
Mod-Operator die Standardversion "CPU" ist, die negative Werte negativen Werten zuordnet.quelle
abs((x+1)%4)-1
stattdessen einfach tun ?Brainfuck , 136 Bytes
Probieren Sie es online aus!
Es gibt wahrscheinlich eine trivialere Antwort, aber diese verwendet im Wesentlichen eine Wertetabelle. Obwohl Brainfuck Eingaben als ASCII-Zeichen mit positiven Werten von 0 bis 127 akzeptiert, funktioniert es immer noch so, als ob es negative Werte akzeptieren könnte (zum Testen ersetzen Sie die
,
durch dien
Anzahl der-
Zeichen).Wie es funktioniert
quelle
Python,
262421 Bytes-2 Bytes danke an ValueInk für die Erkenntnis, dass die mathematische Methode tatsächlich länger ist als der triviale Ansatz: P
-3 Bytes danke an Dennis für den Hinweis, dass ich das nicht brauche
int(...)
, wodurch dies kürzer wird :)quelle
lambda x:[0,1,0,-1][x%4]
ist tatsächlich kürzer als Ihre erzwungene Antwort lolint()
?.imag
gibt einen Gleitkommawert an und ich bin mir nicht sicher, ob dies nach den Spezifikationen zulässig ist. Es ist jetzt egal :)Python , 20 Bytes
Eine unbenannte Funktion, die das Ergebnis zurückgibt.
Probieren Sie es online aus!
quelle
Mathematica, 18 Bytes
quelle
JacobiSymbol[-4,#]&
und kostet nur noch ein Byte. Gute Idee!Pari / GP , 12 Bytes
Probieren Sie es online aus!
quelle
PHP, 20 Bytes
quelle
Haskell , 19 Bytes
Port of Dennis 'Julia-Lösung, nur weil er sagte, dass sie in keiner anderen Sprache am kürzesten wäre. (Jemand könnte mir immer noch das Gegenteil beweisen, dass es in Haskell am kürzesten ist.)
Probieren Sie es online aus!
Haskell hat zwei verschiedene Restfunktionen, eine (
rem
) funktioniert wie die Julia, während die andere (mod
) ein positives Ergebnis liefert, selbst wenn das erste Argument negativ ist, und daher für die Übersetzung geeignet ist&3
. (Haskells tatsächliche&
, genannt.&.
, erfordert leider eineimport Data.Bits
.)quelle
Oktave , 22 Bytes
Probieren Sie es online aus!
quelle
Ruby, 20 Bytes
Einfach und sauber.
quelle
C99, 27 Bytes
Angenommen, Sie möchten, dass die Welle am Ursprung zentriert wird:
sonst reicht
f(n){return cpow(1i,n);}
es. Ich hatte ursprünglich einencimag
drin, aber anscheinend habe ich versucht, einenint
von einem_Complex int
Ertrag den realen Teil zurückzugeben, also habe ich das benutzt. Es macht Sinn, aber es ist nichts, was ich vorhergesagt hätte. Verhalten ist das gleiche ingcc
undclang
quelle
-std=c99 -lm
und es sollte funktionieren. Es funktioniert gut für mich mit beidengcc
undclang
ohne Includes. Nun, mit gut meine ich, es gibt keine Fehler, aber eine große Anzahl von Warnungen.05AB1E , 5 Bytes
Probieren Sie es online aus!
Die Ausgabe ist umgekehrt, aber nach meinem Verständnis ist dies zulässig:
+1 Byte, um die Ausgabe mit -1 zu multiplizieren
(
.quelle
Pyth - 7 Bytes (möglicherweise 6)
Versuch es
Wenn die Phase der Welle nicht wichtig ist, 6 Bytes:
Versuch es
Erläuterung:
quelle
AWK , 26 Bytes
Probieren Sie es online aus!
Dies ist ein alternativer Ansatz, bei dem Triggerfunktionen ohne den Moduloperator verwendet werden.
Probieren Sie es online aus!
quelle
Javascript ES6,
1817 BytesÜberprüfen Sie zunächst, ob die Eingabe gerade oder ungerade ist, und geben Sie für alle geraden Werte 0 zurück. Inkrementieren und bitweise mit für alle ungeraden Eingaben,
0b10
um alle Bits zu entfernen, die uns nicht interessieren, und geben Sie die Antwort mit einem Offset zurück.quelle
? :0
durch&&
JavaScript, 15 Bytes
Bitweise und 3 entspricht Modulo 4, außer ohne die seltsame Regel für JavaScript-Modulos negativer Zahlen. Ich habe zuerst an den ersten vier Punkten eine polynomielle Regression durchgeführt, dann aber festgestellt, dass ich dumm bin, weil (1, 1), (2, 0) und (3, -1) nur 2-n sind.
quelle
R , 19 Bytes
Probieren Sie es online aus!
Eine Portierung der Mathematica-Antwort von JungHwan Min .
quelle