Einloggen
[c] [test] [fefe]

/c/ – Pufferüberlauf


Antwort erstellen

(≤ 4)



[Zurück]

  • [l] KOPFNUSZ Tue, 03 Sep 2019 10:47:23 GMT Nr. 14468
    PNG 185×118 448
    Meine Damen und Herren,

    da hier zweifelsohne technische bewandertes Publikum zugegen ist, wie wäre es mit einer Knobelaufgabe?

    Gegeben ist die Ausgabe von `seq 8` (bzw. `jot 8`). Mit welcher Funktion f(i, n) kommen Sie zu den Spalten 2 bis 4 im Bild?

    Die Antwort können Sie frei oder in einer Programmiersprache Ihrer Wahl formulieren. Der Gebrauch von Schleifen und Variablen ist nicht erlaubt. Eine Teillösung mit AWK ist unten verdeckt gegeben.

    Viel Erfolg!

    Hintergrund: Bildverwandt ist ein typisches Muster, wie es beim Planen von Experimenten entsteht. Man besitzt eine Reihe Prüfkörper (hier von eins bis acht) und alterniert systematisch Parameter, um im Nachgang den Einfluss auf das Ergebnis einzuschätzen.

    Teillösung: Folgendes gibt die Spalten 1 und 2 aus:
    `seq 8 | awk '{$2 = $1/4>1};print'`

  • [l] Felix Fri, 04 Oct 2019 12:08:48 GMT Nr. 15567
    >Der Gebrauch von Schleifen und Variablen ist nicht erlaubt.
    Schon beim AWK-Beispiel hat man eine implizite Eingabe-Schleife und -Variable. Wenn man diese erlaubt, ist das Beispiel für Perl auch recht einfach:
    seq 8 | perl -ne 'BEGIN{$,="\t";$\="\n";print "Index","Param1","Param2","Param3"}chomp;print $_,sprintf("%03b",($_-1)^1)=~/./sg'

    Das schöne ist, dass dieses Beispiel leicht generalisiert werden kann.
    x=4
    seq $((2**x)) | ORDER=$x perl -ne 'BEGIN{$,="\t";$\="\n";print "Index",map("Param$_", 1..$ENV{"ORDER"})}chomp;print $_,sprintf("%0".$ENV{"ORDER"}."b",($_-1)^1)=~/./sg'

    Natürlich verfehlt dies das Ziel, jede einzelne Spalte von Hand zu berechnen. Das geht dann nicht so einfach, da
    $_
    sowohl für den Eingabewert als auch jedes Listenelement in
    map
    stünde und man eine lokale Variable zur Unterscheidung benötigt:
    map(($EINGABE&1<<$_)>>$_,reverse 0..$ENV{"ORDER"}-1)


[Zurück]
[c] [test] [fefe]