Seite 2 von 2

Re: Numerische Variablen aufsteigend sortiern

Verfasst: 05.02.2023, 18:47
von AGmac
KLASSE - Lieben Dank für die exzellente - auch für "Skripting-Beginner" verständliche und nachvollziehbare Erklärung der einzelnen Schritte!

Es ist zwar "bequem", wenn man einfertiges Skript "geliefert" bekommt, lernen kann man aber nur, wenn man entweder tief genug in der Materie steckt und somit nachvollziehen kann, was wie realisiert wurde. Als Anfänger steht man da dann ohne Erklärung ziemlich auf dem Schlauch, weil man eben die die Schritte verbindenden Gedankengänge nicht kennt. Ist etwa so, wie der Lehrer früher an der Tafel, wenn er in Mathe die für ihn logischen Zwischenschritte ausließ und man sich später fragte, wie er denn nun auf die nächste Zeile kam ;-) ...

Also, nochmals herzlichen Dank an ALLE und einen schönen und entspannten Abend!

Re: Numerische Variablen aufsteigend sortiern

Verfasst: 26.02.2024, 19:56
von [sprotte80]
Hi
Das Script funzt nicht wirklich.
Tyfys hat geschrieben:
05.02.2023, 17:32
Nebenbei: .Replace() tauscht dann ja auch andere zufällig gleiche Nachbarn, so dass dann Steps eingespart werden.
Leider tauschts nich nur gleiche sondern auch wo ähnlich sind.
Und dan kommen Zahlen raus wo gar nich vorhanden waren.

Das

Code: Alles auswählen

real s = 2.345;
real t = 1.234;
real x = 2.345;
real y = 42.345;
real z = 1.234;

object arr =  s # ";" # t # ";" #  x # ";" # y # ";" # z;
string av;
string an;
integer len = web.webGetValueListCount(arr).ToInteger();
boolean swapped = true;
boolean revers = true;
WriteLine( "unsortiert:");
WriteLine(arr);
while (swapped)
{
    integer i = 1;
    swapped = false;
    while (i < len)
    {
        if ((web.webGetValueFromList(arr, i).ToFloat()) < (web.webGetValueFromList(arr, i - 1).ToFloat()))
        {
            av = web.webGetValueFromList(arr, i - 1) # ";" # web.webGetValueFromList(arr, i);
            an = web.webGetValueFromList(arr, i) # ";" # web.webGetValueFromList(arr, i - 1);
            arr = arr.Replace(av, an);
            swapped = true;
        }
        i = i + 1;
    }
}
WriteLine( "sortiert:");
WriteLine( "aufsteigend:");
WriteLine(arr);

if (revers)
{
    object arr2="";
    string elem;
    foreach(elem, arr.Split(";"))
    {
        arr2 = elem # ";" # arr2;
    }
}
WriteLine( "absteigend:");
WriteLine(arr2.RTrim(";"));

real a = web.webGetValueFromList(arr, 0);
real b = web.webGetValueFromList(arr, 1);
real c = web.webGetValueFromList(arr, 2);
real d = web.webGetValueFromList(arr, 3);
real e = web.webGetValueFromList(arr, 4);

WriteLine("a = "#a);
WriteLine("b = "#b);
WriteLine("c = "#c);
WriteLine("d = "#d);
WriteLine("e = "#e);  
gibt

Code: Alles auswählen

unsortiert:
2.345000;1.234000;2.345000;42.345000;1.234000
sortiert:
aufsteigend:
1.234000;2.345000;2.345000;2.345000;41.234000
absteigend:
41.234000;2.345000;2.345000;2.345000;1.234000
a = 1.234000
b = 2.345000
c = 2.345000
d = 2.345000
e = 41.234000
Thomas

Re: Numerische Variablen aufsteigend sortiern

Verfasst: 26.02.2024, 20:53
von Henke
Und mal kurz aber kreativ:

Code: Alles auswählen

! Array sortieren - M.Henke
real s = 2.345;
real t = 1.234;
real x = 2.345;
real y = 42.345;
real z = 1.234;

boolean reverse = false;
string trenn = ";";
object arr =  s # trenn # t # trenn #  x # trenn # y # trenn # z;
string js = '
let trenn = process.argv[2];
let arr = process.argv[1].split(trenn);
if ( process.argv[3] == "true" )
	process.stdout.write(arr.sort().reverse().join(trenn) );
else
	process.stdout.write(arr.sort().join(trenn) );
';

string stdout; string stderr;
system.Exec( "node -e '" # js # "' '" # arr # "' '" # trenn  # "' '" # reverse #"'" ,&stdout,&stderr);
if (stderr) { Write(stderr); quit; }
WriteLine( stdout);


Re: Numerische Variablen aufsteigend sortiern

Verfasst: 26.02.2024, 20:59
von Tyfys
[sprotte80] hat geschrieben:
26.02.2024, 19:56
Hi
Das Script funzt nicht wirklich.
Tyfys hat geschrieben:
05.02.2023, 17:32
Nebenbei: .Replace() tauscht dann ja auch andere zufällig gleiche Nachbarn, so dass dann Steps eingespart werden.
Leider tauschts nich nur gleiche sondern auch wo ähnlich sind.
Und dan kommen Zahlen raus wo gar nich vorhanden waren.
Danke fürs Austesten und Melden der Ungereimtheiten.

Diese Version sollte es nun richtig machen:

Code: Alles auswählen

real s = 2.345;
real t = 1.234;
real x = 2.345;
real y = 42.345;
real z = 1.234;
string sep = ";";
object arr =  s # ";" # t # ";" #  x # ";" # y # ";" # z;
arr = sep#arr.Trim(sep)#sep;
string av;
string an;
integer len = web.webGetValueListCount(arr).ToInteger() - 2;
boolean swapped = true;
boolean revers = true;
WriteLine( "unsortiert:");
WriteLine(arr.Trim(sep));
while (swapped)
{
    integer i = 2;
    swapped = false;
    while (i <= len)
    {
        if ((web.webGetValueFromList(arr, i).ToFloat()) < (web.webGetValueFromList(arr, i - 1).ToFloat()))
        {
            av = web.webGetValueFromList(arr, i - 1) # sep # web.webGetValueFromList(arr, i);
            an = web.webGetValueFromList(arr, i) # sep # web.webGetValueFromList(arr, i - 1);
			av = sep # av # sep;
			an = sep # an # sep;
            arr = arr.Replace(av, an);
            swapped = true;
        }
        i = i + 1;
    }
}
arr = arr.Trim(sep);
WriteLine( "sortiert:");
WriteLine( "aufsteigend:");
WriteLine(arr);

if (revers)
{
    object arr2="";
    string elem;
    foreach(elem, arr.Split(";"))
    {
        arr2 = elem # ";" # arr2;
    }
}
WriteLine( "absteigend:");
WriteLine(arr2.RTrim(";"));

real a= web.webGetValueFromList(arr, 0);
real b= web.webGetValueFromList(arr, 1);
real c= web.webGetValueFromList(arr, 2);
WriteLine("a = "#a);
WriteLine("b = "#b);
WriteLine("c = "#c);

Re: Numerische Variablen aufsteigend sortiern

Verfasst: 26.02.2024, 21:05
von Tyfys
Henke hat geschrieben:
26.02.2024, 20:53
Und mal kurz aber kreativ:
Aber nur für Leute die node.red oder etwas haben ? Und auch davon was kennen :D

Auf (m)einer CCU2 fast ohne irgendwelche addons : /bin/sh: node: not found

Re: Numerische Variablen aufsteigend sortiern

Verfasst: 26.02.2024, 21:32
von Henke
Tyfys hat geschrieben:
26.02.2024, 21:05
Auf (m)einer CCU2 fast ohne irgendwelche addons : /bin/sh: node: not found
Auf jeder CCU3 ist zumindest ein node.js installiert.
Auf einer CCU2 geht es wohl auch. Ist ja nur 11 Jahre alt. Daher, geht mir am Arsch vorbei wenn es auf einer CCU2 nicht läuft. 8)
viewtopic.php?t=13275

Re: Numerische Variablen aufsteigend sortiern

Verfasst: 26.02.2024, 21:50
von Tyfys
Henke hat geschrieben:
26.02.2024, 21:32
Auf jeder CCU3 ist zumindest ein node.js installiert.
Ich glaub, ich muss mir nun langsam auch eine zulegen...

Re: Numerische Variablen aufsteigend sortiern

Verfasst: 26.02.2024, 22:05
von jp112sdl
Henke hat geschrieben:
26.02.2024, 21:32
Tyfys hat geschrieben:
26.02.2024, 21:05
Auf (m)einer CCU2 fast ohne irgendwelche addons : /bin/sh: node: not found
Auf jeder CCU3 ist zumindest ein node.js installiert.
Auf meinem Testsystem kommt der selbe Fehler.
RaspberryMatic 3.75.2.20240213 generic-aarch64

Re: Numerische Variablen aufsteigend sortiern

Verfasst: 26.02.2024, 22:23
von Henke
jp112sdl hat geschrieben:
26.02.2024, 22:05
generic-aarch64
Damit ist das wohl keine CCU3, oder?
Ist node.js auf dem System?

Re: Numerische Variablen aufsteigend sortiern

Verfasst: 27.02.2024, 07:29
von jp112sdl
Henke hat geschrieben:
26.02.2024, 22:23
jp112sdl hat geschrieben:
26.02.2024, 22:05
generic-aarch64
Damit ist das wohl keine CCU3, oder?
Ist node.js auf dem System?
Nein, wundert mich auch. Muss ich mal genauer nachschauen