Suche eine mathematische Funktion, um "IF - THEN - ELSE" zu vermeiden

Erste Frage Aufrufe: 940     Aktiv: 14.01.2020 um 13:12

0

 

 

 

Hallo Leute,

meine Frage hört sich zwar nach einer Frage aus dem Bereich Informatik an, es geht mir aber um eine mathematische Funktion.

Ein Shell-Skript soll an bestimmten Tagen ausgeführt werden, und zwar in ungeraden Kalenderwochen am Samstag und Sonntag, und in geraden Kalenderwochen von Montag bis Freitag. Bisher läuft diese Steuerrung durch entsprechende Einträge in der contab:

# sa-so in ungeraden wochen:
0 7 * * 6-7 [  $(( $(date +%V) % 2 )) -eq 1  ] && $SKRIPT
#
# mo-fr in geraden wochen:
0 7 * * 1-5 [  $(( $(date +%V) % 2 )) -eq 0  ] && $SKRIPT

Eine ganz kurze Erklärung dazu:

$(date +%V) gibt die Kalenderwoche. Der Ausdruck "% 2" gibt des Rest der Division durch 2 heraus (modulo). Schließlich wird das Ergebnis auf Gleichheit zu 1 oder 0 überprüft, was gerade oder ungerade ergibt. Die eckigen Klammern stellen eine verkürzte "IF" Bedingung da, und durch die "&&" wird der nachfolgende Befehl nur ausgeführt, wenn die Bedingung zutrifft. Vor der eckigen Klammer werden Uhrzeit und Wochentag definiert.

Das funktioniert so weit alles sehr gut und ist auch nicht das Problem.

Das Problem ist diese Stimme in meinem Hinterkopf, die sagt, das müsse auch einfacher gehen. ;)

Ziel ist es daher, eine rein mathematische Funktion zu finden, die es ermöglicht, am Anfang des Skriptes nach ihrer Berechnung mit einer einzigen simplen Abfrage zu entscheiden, ob das Skript weiter ausgeführt werden soll oder nicht. Also ungefähr so:

X berechnen

IF $X = "0" THEN exit;

 

Hier ist das ganze als Entscheidungs-Matrix dargestellt:

 

    Mo Di Mi Do Fr Sa So
kw g/u 1 2 3 4 5 6 7
1 0 n n n n n j j
2 1 j j j j j n n
3 0 n n n n n j j
4 1 j j j j j n n
5 0 n n n n n j j
6 1 j j j j j n n

Usw, usw.

 

Wie gesagt: es gibt da diese Stimme in meinem Kopf, die sagt, es müsse möglich sein, durch geschicktes Multiplizieren, Dividieren mit und ohne Rest, Addieren und vielleicht mir unbekannten Rechenoperationen eine Formel zu finden, die als Eingabe die Kalenderwoche und den Wochentag (1-7) erhält, und als Ergebis gemäß obiger Tabelle entweder "ja" oder "nein", "0" oder "1", oder zwei andere klar unterscheidbare Ergebnisse liefert.

Es ist dabei auch egal, ob die Formal wirklich als Skript umsetzbar ist, mir geht es primär um die Machbarkeit. Denn je länger ich diese Tabelle ansehe, desto lauter wird diese zweite Stimme in meinem Kopf, die wie Nelson bei den Simpsons immer ruf: "Haha! Du kommst nicht drauf!" :D

 

 

 

 

 

Diese Frage melden
gefragt

Sonstiger Berufsstatus, Punkte: 10

 
Kommentar schreiben
1 Antwort
1

Eingabe Wochentag --> x

Eingabe Kalenderwoche --> y

Lösung mit der Signumfunktion (Vorzeichenfunktion):

If: `(-1)^y*sgn(x-5.5)=1` --> Nein

If: `(-1)^y*sgn(x-5.5)=-1` --> Ja

Die Signumfunktion gibt es auch in einigen Sprachen schon fertig.

Ich hoffe ich hab so spät nachts keine Fehler gemacht und konnte Nelsons Stimme besiegen.

Diese Antwort melden
geantwortet

Student, Punkte: 5.08K

 

Danke! Habe dem Nelson gerade einen Kinnhaken verpasst! ;)

Irgend etwas mit Vorzeichenwechsel durch Vorzeichen und Potenzieren und hatte ich wohl schon im Hinterkopf, aber ich bin nicht darauf gekommen, zuerst 5,5 Tage vom aktuellen Wochentag abzuziehen. Jetzt, da ich es sehe, fällt es mir natürlich wie Schuppen von den Augen.

Ich habe die Formel allerdings in zwei Punkten abgewandelt:

1. ich berechne nicht (x - 5,5), sondern (10x - 55). Auf diese Weise muss nur mit ganzen Zahlen gerechnet werden. Es käme zwar auf ein paar Millisekunden nicht an, aber in der Bash gibt es keine Fließkommaberechnung.

2. Da es auch keine Signum-Funktion in der Bash gibt, habe ich die weggelassen. Ich erhalte dann folgende Werte:

ungerade Woche: -45, -35, -25, -15, -5, 5, 15
gerade Woche: 45, 35, 25, 15, 5, -5, -15

Die Abfrage-Bedingung lautet dann einfach nur "X > 0".

Aber deine Idee war jedenfalls der Tritt in die richtige Richtung. Danke nochmal! :)
  ─   unberechenbarer 12.01.2020 um 16:28

Kommentar schreiben