Überprüfen, ob eine Liste aufsteigend sortiert ist

Ich lese gerade das Buch „Programming in Haskell“ und habe verschiedene Wege ausprobiert, um zu überprüfen, ob eine Liste aufsteigend sortiert ist.

Die einfachste und eleganteste Art, das zu überprüfen, ist es, die Liste zu sortieren und diese mit der ursprünglichen Liste zu vergleichen. Sind beide gleich, dann muss die ursprüngliche Liste logischerweise schon sortiert gewesen sein.

Eine andere Methode habe ich aus dem o.g. Buch entnommen. Sie benutzt List Comprehensions und erzeugt eine Liste von Tupeln mit jeweils dem ersten und dem folgenden Element und vergleicht diese miteinander.

Wenn z.B. die Liste [1, 2, 3, 4] mit zip bearbeitet wird, dann entsteht folgende Liste von Tupeln: [(1, 2), (2, 3), (3,4)]. Dann werden einfach die Tupelelemente verglichen und die Ergebnisse der Vergleiche and-verknüpt.

Diese Lösung finde ich sehr interessant und einfallsreich.

Ich habe mich gefragt, ob man das auch anders machen kann, so ähnlich wie man es in anderen Programmiersprachen machen würde. Das ist dabei herausgekommen.

Hier benutze ich Guards (die Zeilen mit dem | (Pipesymbol). Wenn der Rest xs eine leere Liste ist (null xs) dann ist die Liste sortiert. Sonst ist die Liste sortiert, wenn das jeweils erste Element x kleiner oder gleich dem ersten Element der Restliste ist und wenn die Restliste auch sortiert ist (Rekursion).

Zu guter Letzt habe ich mich gefragt, ob man auch foldl benutzen kann, um die Sortiert-Eigenschaft einer Liste zu überprüfen. Man kann, aber es ist mir nur eine hässliche Lösung eingefallen.

Foldl befeuert eine Funktion (hier Lambda) mit 2 Werten: zuerst mit dem Akkumulator und dann mit dem jeweiligen nächsten Listenelement. Die Herausforderung war hier, irgendwie das boolesche Ergebnis des Vergleichs und das vorherige Listenelement in den Akkumulatorwert zu packen. Ich mache das hier mit einem Tupel (Bool, Ord) und hole das Ergebnis mit fst ab.

Was hältst Du davon? Über Kommentare würde ich mich sehr freuen.

Und hier das ganze Programm zum Ausprobieren:

List Comprehension vs. Map/Lambda

Ich lese gerade das Buch „Get Programming with Haskell“ und erstelle kleine Übungsprogramme, um Haskell auszuprobieren.

Die Aufgabe, die ich hier beschreibe, ist es eine einfache Konsolenanwendung zu schreiben, die eine Multiplikationstabelle berechnet und ausgibt.

So etwas in z.B. Java zu implementieren ist sehr einfach, da man einfach zwei Schleifen ineinander schachteln kann. Da Haskell eine rein funktionale Sprache ist, gibt es leider keine einfachen Schleifen, geschweige denn veränderbare (Schleifen-)Variablen.

Ich stelle hier zwei verschiedene Lösungen vor: Eine mit Map/Lambda und eine mit List Comprehensions.

Zuerst die mit Map/Lambda:

Und hier die Version mit List Comprehensions:

Wie man sieht, unterscheiden sich die beiden Programme an den Stellen, an denen Listen erstellt werden. Der Codeabschnitt:

erstellt eine Liste bestehend aus 4 Zeichen breiten Strings, die die Ergebnisse der Multiplikation von r (Row) mit c (Column) als rechtsbündige Strings darstellen. Also [“ 1″, “ 2″,…,“ 10″]. Mit mconcat werden die Strings in dieser Liste dann zu einem einzigen String verkettet.

In der Version mit List Comprehension sieht der Codeabschnitt so aus:

Mir persönlich gefällt die Version mit List Comprehension besser, da sie einfacher zu lesen ist und viel schöner und klarer aussieht.

CSV-Datei mit Tankstatistik in Rust auswerten

Seit wenigen Tagen beschäftige ich mich mit Rust und habe als Übung ein Programm erstellt, mit dem ich meine Tankstatistik auswerten kann. Die Daten habe ich mit meiner Android-App Tankstatistik gesammelt und exportiert.

Die Daten müssen in einer Datei „tanken.txt“ im Hauptverzeichnis des Rust-Programmes gespeichert werden und sehen wie folgt aus:

In der ersten Spalte steht das Tankdatum, in der zweiten der Kilometerstand, in der dritten die getankten Liter und in der vierten der Preis. Die beiden letzten Zahlen benutzen als Dezimalpunkt das Komma, damit man die Daten leichter in das deutschsprachige Excel importieren kann. Die Spalten sind mit dem Tabulatorzeichen (\t) getrennt. Die Daten können hier heruntergeladen werden.

Das Rust-Programm besteht aus zwei Dateien „main.rs“ und „lib.rs“. Dabei benutzt das Hauptprogramm „main.rs“ die Funktionen aus der Bibliothek „lib.rs“.

Das Programm kann bei GitHub ausgecheckt werden.

Das Projekt verwendet einige Features von Rust wie Structs mit Datenfeldern und Implementierungen von Funktionen und Methoden, Collections wie Vec und HashMap, Closures, Iteratoren, Dateizugriffe, Sortieren und Tests.

Die Datei „lib.rs“ sieht wie folgt aus:

Die Datei „main.rs“ sieht so aus:

Wenn Du das mal ausprobieren willst, dann erstelle in einem freien Verzeichnis das Projekt „tanken“ mit:

>cargo new tanken
>cd tanken

Kopiere dann die beiden Dateien „main.rs“ und „lib.rs“ in das „src“-Unterverzeichnis und die Datei „tanken.txt“ in das Hauptverzeichnis „tanken“. Jetzt kannst Du die Tests laufen lassen mit:

>cargo test

Und das Programm kannst Du laufen lassen mit:

>cargo run

Dann solltest Du folgendes sehen:

Viel Spaß!

Übersicht über Dateierweiterungen

Wenn man sich eine Übersicht über Dateierweiterungen in einem Verzeichnis und allen Unterverzeichnissen verschaffen möchte, kann man folgendes PowerShell-Skript verwenden: types.ps1.

Aufgerufen wird das Skript mit einer Pfadangabe z.B

powershell types.ps1 Dev

oder ohne einer Pfadangabe z.B.

powershell types.ps1

Wenn keine Pfadangabe angegeben wird, dann beginnt die Suche im aktuellen Verzeichnis. Das Ergebnis sieht dann z.B. so aus:

Mehr zu Powershell kannst Du hier finden:

Textzeilen mit PowerShell sortieren

PowerShell ist zwar eine objektorientierte Kommandozeile, aber man kann auch einfachen Text mit der PowerShell bearbeiten. Hier zeige ich, wie man eine einfache Mitgliederliste mit der PowerShell sortieren kann.

Als Ausgangsdatei in den Beispielen verwende ich die Datei „mitglieder.txt“ mit dem folgenden Inhalt:

Um diese Datei nach Vornamen zu sortieren und das Ergebnis in der Datei „mitglieder-sortiert.txt“ zu speichern, genügt folgender Befehl:

Die Ergebnisdatei „mitglieder-sortiert.txt“ sieht danach so aus:

Das war einfach. Was ist aber, wenn wir nach den Nachnamen sortieren wollen?

Das müssen wir irgendwie dem Commandlet „Sort-Object“ sagen. Das tun wir, indem wir jede Zeile ($_) am Leerzeichen („\s+“) aufsplitten und das zweite Wort an „Sort-Object“ übergeben. (Die 1 steht für das zweite Wort, weil 0 für das erste Wort steht):

Die Ergebnisdatei „mitglieder-sortiert.txt“ sieht jetzt so aus:

Die beiden Sortierungen sind aufsteigend. Möchte man absteigend sortieren, dann muss man den Parameter „-Descending“ hinzufügen.

Die Ergebnisdatei sieht dann so aus:

Soviel zum Sortieren von Textdateien mit der PowerShell. Wenn man PowerShell mit den Möglichkeiten von UNIX vergleicht, dann ist PowerShell sehr wortreich. Unter UNIX würde man folgendermaßen nach Nachnamen sortieren:

Daraus darf man aber nicht schlussfolgern, dass PowerShell irgendwie schlechter ist als die UNIX-Tools. UNIX ist nun mal alt und textorientiert und PowerShell zeigt ihre wahren Stärken beim Verarbeiten von objektorientierten Commandlets.

Lösungen der Übungen zu Kapitel 5

Ich lese gerade das Buch „ANSI Common Lisp“ von Paul Graham und veröffentliche hier meine Lösungen zu den Übungen am Ende der Kapitel. Hier sind meine Lösungen zu Kapitel 5.

Übung 1:

Übung 2:

Übung 3:

Übung 4:

Übung 5:

Übung 6:

Übung 7:

Übung 8:

Lösungen der Übungen zu Kapitel 4

Ich lese gerade das Buch „ANSI Common Lisp“ von Paul Graham und veröffentliche hier meine Lösungen zu den Übungen am Ende der Kapitel. Hier sind meine Lösungen zu Kapitel 4.

Übung 1:

Übung 2:

Übung 6:

Lösungen der Übungen zu Kapitel 3

Ich lese gerade das Buch „ANSI Common Lisp“ von Paul Graham und veröffentliche hier meine Lösungen zu den Übungen am Ende der Kapitel. Hier sind meine Lösungen zu Kapitel 3.

Übung 2:

Übung 3:

Übung 4:

Übung 5:

Übung 6:

Übung 7:

Übung 8:

Lösungen der Übungen zu Kapitel 2

Ich lese gerade das Buch „ANSI Common Lisp“ von Paul Graham und veröffentliche hier meine Lösungen zu den Übungen am Ende der Kapitel. Hier sind meine Lösungen zu Kapitel 2.

Übung 1:

Übung 2:

Übung 3:

Übung 4:

Übung 5a:

Übung 5b:

Übung 6:

Übung 7:

Übung 8a:

Übung 8b:

Übung 9:

Einen String mit n-mal Zeichen erstellen

Wenn man z.B. in C++ Konsolenprogrammen eine lange Trennzeile ausgeben will dann kann man einen String erstellen mit einer definierten Anzahl eines Zeichens:

Damit erzeugt man einen String bestehend aus 40 mal das Zeichen – (Minus).