Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
paedubucher
Beiträge: 856
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von paedubucher » 09.01.2022 20:28:44

Auf Anregung von meillo (der für die Qualität der Aufgabenstellung nichts dafür kann) starte ich mal eine kleine Scripting-Challenge. Es geht darum, Ergebnisse von Fussballspielen in eine Ligatabelle umzurechnen und diese auf die Konsole auszugeben. Als Eingabedaten gibt es zwei inhaltlich äquivalente Möglichkeiten:
  1. NoPaste-Eintrag41564 (JSON)
  2. NoPaste-Eintrag41565 (CSV)
Das gewünschte Ergebnis soll dann im Klartext vorliegen: NoPaste-Eintrag41566 (TXT)

Ein paar Erläuterungen dazu:
  1. Es gilt das übliche Punktesystem vom Fussball (Sieg: 3, Unentschieden: 1, Niederlage: 0).
  2. Die Tabellenspalten haben die folgende Bedeutung: Name (Name der Mannschaft) # (Rang), w (Anzahl Siege), d (Anzahl Unentschieden), l (Anzahl Niederlagen), + (erzielte Tore), - (kassierte Tore), = (Tordifferenz), P (Punkte)
  3. Die Sortierung (und Rangierung) erfolgt nach den folgenden Kriterien: Punkte, Tordifferenz, Anzahl Siege (jeweils absteigend) und Name (aufsteigend).
  4. Die Ausgabe sollte möglichst identisch sein, damit man sie mittels diff vergleichen kann.
Ich selber habe schon Lösungen in C#, Elixir, Python, Go, Shell/Awk und PHP (u.a. auch von meillo) vorrätig, da ich das als Programmierprojekt in der Schule gebracht habe und verschiedene Ansätze ausprobieren wollte. (Entsprechende Tutorials für C# habe ich auf meinem YouTube-Kanal zur Verfügung gestellt, falls es hier einige Anfänger drin hat, die gerne mitmachen möchten. Die entsprechenden Repositories sind jedoch privat; gerne stelle ich den Beispielcode bei Bedarf zur Verfügung; einfach eine PM senden.)

Lösungen können ab Sonntag, 16.01.2022 um 18 Uhr eingereicht werden, damit auch die Erwerbstätigen am Wochenende Zeit haben.

Gutes Gelingen!

PS: Die Mannschaften sind aus der obersten Schweizer Spielklasse namens "Super League", nicht zu verwechseln mit der türkischen "Süper Lig".
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von Meillo » 15.01.2022 15:20:12

Ich will hier mal pushen: Noch ein guter Tag ist Zeit bis die ersten Loesungen eingereicht werden koennen.

Wer ist denn an der Aufgabe dran? Hat schon jemand was programmiert?

Ich selber habe paedubucher im Vorfeld schon eine Umsetzung mit awk/sh und eine mit PHP geschickt. Jetzt mache ich mich noch an eine mit lex. Mal sehen ob das was wird ... Ich kann das gerade schlecht einschaetzen, darum probiere ich es einfach mal aus. ;-)
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von Meillo » 15.01.2022 15:28:31

paedubucher hat geschrieben: ↑ zum Beitrag ↑
09.01.2022 20:28:44
Das gewünschte Ergebnis soll dann im Klartext vorliegen: NoPaste-Eintrag41566 (TXT)
Da sind leider die fuehrenden Leerzeichen in der ersten Zeile verloren gegangen. Vielleicht ist das ein Problem vom Pastebin. Jedenfalls sollte das Ergebnis so aussehen:

Code: Alles auswählen

                     Name  #  w  d  l  +  -   =  P
--------------------------------------------------
                FC Zürich  1 16 10 10 70 59  11 58
  Grasshopper Club Zürich  2 17  7 12 79 70   9 58
           BSC Young Boys  3 16 10 10 66 58   8 58
        FC Lausanne-Sport  4 16  6 14 58 63  -5 54
       FC St. Gallen 1879  5 14  9 13 59 58   1 51
                  FC Sion  6 14  8 14 55 62  -7 50
              Servette FC  7 13  9 14 76 73   3 48
                FC Luzern  8 14  6 16 75 79  -4 48
            FC Basel 1893  9 11  8 17 66 77 -11 41
                FC Lugano 10 10  5 21 58 63  -5 35
Use ed once in a while!

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von thoerb » 15.01.2022 16:13:02

Meillo hat geschrieben: ↑ zum Beitrag ↑
15.01.2022 15:20:12
Wer ist denn an der Aufgabe dran? Hat schon jemand was programmiert?
Ich bin dran, auch mit PHP.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von Meillo » 15.01.2022 16:37:55

thoerb hat geschrieben: ↑ zum Beitrag ↑
15.01.2022 16:13:02
Meillo hat geschrieben: ↑ zum Beitrag ↑
15.01.2022 15:20:12
Wer ist denn an der Aufgabe dran? Hat schon jemand was programmiert?
Ich bin dran, auch mit PHP.
Top! :THX:



Meine Umsetzung in C ist jetzt auch fertig. Das mit lex war eine doofe Idee, weil fuer ein CSV-Format macht lex wenig Sinn, wie mir dann bewusst geworden ist. Ich habe es dann ganz normal in C gemacht. (Die Umlautproblematik habe ich dabei stillschweigend ignoriert. :roll: )

Ich finde, dass das eine nette, ueberschaubare und doch nicht triviale Aufgabe ist. Jetzt habe ich schon mehrere Umsetzungen in verschiedenen Sprachen und teilweise Varianten implementiert (dafuer hatte ich mehr Zeit da ich mit paedubucher schon zuvor einen Austausch darueber hatte) und das Problem wird nicht langweiliger sondern ist weiterhin interessant. Lustig ist auch zu sehen, dass ich bei meiner neuesten Implementierung den von mir so hochgelobten Vorzuegen der vorigen Implementierung klar widerspreche. :-D In jeder Sprache stellt sich das Problem einfach wieder neu und anders dar. ;-)
Use ed once in a while!

Benutzeravatar
Tintom
Moderator
Beiträge: 3033
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von Tintom » 15.01.2022 16:59:40

Schade, der erste Post ist bei mir durchgerutscht. Bis zur Deadline schaffe ich es nicht mehr :(
Wegen exakt dieses Problems hatte ich damals meinen ersten Kontakt mit Tabellenkalkulation. Warum öffnet man als achtjähriger schon sonst ein Programm mit Kästchen, bei dem auch noch der Mauszeiger anders aussieht? :wink:
Allerdings konnte der damalige 'Excel-Guru' mir auch nicht helfen um die Bundesliga, den Spielplan und die Ergebnisse in eine Excel-Tabelle zu verwandeln.
Ich selber habe schon Lösungen in C#, Elixir, Python, Go, Shell/Awk und PHP (u.a. auch von meillo) vorrätig[...]
Ich bin auf die Lösungen gespannt.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von Meillo » 15.01.2022 17:05:38

Tintom hat geschrieben: ↑ zum Beitrag ↑
15.01.2022 16:59:40
Schade, der erste Post ist bei mir durchgerutscht. Bis zur Deadline schaffe ich es nicht mehr :(
Ich denke, dass wir im Laufe der naechsten Woche noch genug Austausch dazu haben werden. Du kannst deine Variante gerne noch nachreichen. (Oder noch fuenf andere finden, die den Abgabeschluss auch verschieben wollen. ;-) )

Wegen exakt dieses Problems hatte ich damals meinen ersten Kontakt mit Tabellenkalkulation. Warum öffnet man als achtjähriger schon sonst ein Programm mit Kästchen, bei dem auch noch der Mauszeiger anders aussieht? :wink:
Allerdings konnte der damalige 'Excel-Guru' mir auch nicht helfen um die Bundesliga, den Spielplan und die Ergebnisse in eine Excel-Tabelle zu verwandeln.
Eine Umsetzung in einem Tabellenkalkulationsprogramm waere auch toll. Vielleicht kann die noch jemand beisteuern.
Use ed once in a while!

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von tobo » 15.01.2022 17:47:02

paedubucher hat geschrieben: ↑ zum Beitrag ↑
09.01.2022 20:28:44
[*]Die Sortierung (und Rangierung) erfolgt nach den folgenden Kriterien: Punkte, Tordifferenz, Anzahl Siege (jeweils absteigend) und Name (aufsteigend).
Ist das Absicht oder Versehen, dass sich das zum eigentlichen Reglement unterscheidet. Ist mir aufgefallen, da ja eigentlich überall die Anzahl geschossener Tore mehr Relevanz hat, als die Anzahl der Siege.
https://de.wikipedia.org/wiki/Super_League_(Schweiz)#Sieger_bei_Punktegleichheit hat geschrieben: Haben am Schluss der Meisterschaft zwei Vereine die gleiche Punktzahl, so wird der Meister nach folgender Regel ermittelt:

1. die bessere Tordifferenz in allen Spielen
2. die grössere Zahl der erzielten Tore in allen Spielen
3. die Tordifferenz aus den direkten Begegnungen der punktgleichen Mannschaften
4. die grössere Zahl der auswärts erzielten Tore in allen Spielen
5. das Los

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von thoerb » 15.01.2022 18:49:54

Meillo hat geschrieben: ↑ zum Beitrag ↑
15.01.2022 16:37:55
Meine Umsetzung in C ist jetzt auch fertig. Das mit lex war eine doofe Idee, weil fuer ein CSV-Format macht lex wenig Sinn, wie mir dann bewusst geworden ist. Ich habe es dann ganz normal in C gemacht. (Die Umlautproblematik habe ich dabei stillschweigend ignoriert. :roll: )
So einen kleinen Stolperstein, was die Umlaute betrifft, hatte ich auch in PHP mit str_pad(). :wink:

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von JTH » 15.01.2022 20:58:57

Wie gemein, ich wollt doch heute was ganz anderes erledigen … Da musst ich mir wohl gerade auch noch eine Lösung überlegen :) , das Thema hatte ich leider auch letztens übersehen.

thoerb hat geschrieben: ↑ zum Beitrag ↑
15.01.2022 18:49:54
So einen kleinen Stolperstein, was die Umlaute betrifft, hatte ich auch in PHP mit str_pad(). :wink:
Bei mir wurds der Umlaute wegen mal wieder awk-ig, statt (fast) reiner Shell :roll:
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von Meillo » 15.01.2022 21:29:10

JTH hat geschrieben: ↑ zum Beitrag ↑
15.01.2022 20:58:57
Bei mir wurds [...] mal wieder awk-ig
... dann fehlt ja nur noch eggy. ;-)
Use ed once in a while!

Benutzeravatar
paedubucher
Beiträge: 856
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von paedubucher » 16.01.2022 11:28:30

tobo hat geschrieben: ↑ zum Beitrag ↑
15.01.2022 17:47:02
paedubucher hat geschrieben: ↑ zum Beitrag ↑
09.01.2022 20:28:44
[*]Die Sortierung (und Rangierung) erfolgt nach den folgenden Kriterien: Punkte, Tordifferenz, Anzahl Siege (jeweils absteigend) und Name (aufsteigend).
Ist das Absicht oder Versehen, dass sich das zum eigentlichen Reglement unterscheidet. Ist mir aufgefallen, da ja eigentlich überall die Anzahl geschossener Tore mehr Relevanz hat, als die Anzahl der Siege.
https://de.wikipedia.org/wiki/Super_League_(Schweiz)#Sieger_bei_Punktegleichheit hat geschrieben: Haben am Schluss der Meisterschaft zwei Vereine die gleiche Punktzahl, so wird der Meister nach folgender Regel ermittelt:

1. die bessere Tordifferenz in allen Spielen
2. die grössere Zahl der erzielten Tore in allen Spielen
3. die Tordifferenz aus den direkten Begegnungen der punktgleichen Mannschaften
4. die grössere Zahl der auswärts erzielten Tore in allen Spielen
5. das Los
Die Kriterien habe ich mir einfach ausgedacht. Bei den vorliegenden Eingabedaten sind ohnehin nur Punkte und Tordifferenz relevant, von daher können wir das mal als Schnittmenge akzeptieren. Kriterium 3 würde dann doch das ganze Programm stark verkomplizieren.

Aber danke, dass du das offizielle Reglement nachlieferst! :THX:
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
paedubucher
Beiträge: 856
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von paedubucher » 16.01.2022 11:30:24

Meillo hat geschrieben: ↑ zum Beitrag ↑
15.01.2022 15:28:31
paedubucher hat geschrieben: ↑ zum Beitrag ↑
09.01.2022 20:28:44
Das gewünschte Ergebnis soll dann im Klartext vorliegen: NoPaste-Eintrag41566 (TXT)
Da sind leider die fuehrenden Leerzeichen in der ersten Zeile verloren gegangen. Vielleicht ist das ein Problem vom Pastebin. Jedenfalls sollte das Ergebnis so aussehen:

Code: Alles auswählen

                     Name  #  w  d  l  +  -   =  P
--------------------------------------------------
                FC Zürich  1 16 10 10 70 59  11 58
  Grasshopper Club Zürich  2 17  7 12 79 70   9 58
           BSC Young Boys  3 16 10 10 66 58   8 58
        FC Lausanne-Sport  4 16  6 14 58 63  -5 54
       FC St. Gallen 1879  5 14  9 13 59 58   1 51
                  FC Sion  6 14  8 14 55 62  -7 50
              Servette FC  7 13  9 14 76 73   3 48
                FC Luzern  8 14  6 16 75 79  -4 48
            FC Basel 1893  9 11  8 17 66 77 -11 41
                FC Lugano 10 10  5 21 58 63  -5 35
Vielen Dank! Ich kann es bestätigen, dass die Ausgabe so gedacht war wie von meillo gepostet.

Ich habe mich absichtlich zurückgehalten beim Pushen des Threads. Meine Lösungen werde ich auch etwas später posten, da ich heute um 18 Uhr wohl noch unterwegs sein werde.

Ich bin gespannt auf eure Antworten!
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von JTH » 16.01.2022 18:34:52

Dann mach ich doch mal den Anfang. Meine Lösung fing als reines Bash-Skript (abgesehen von sort, das einmal verwendet wurde) an und wurde der Performance wegen schrittweise zu einem reinen awk-Skript (gawk wegen mehrdimensionaler Arrays). Damit war die blöde Ausrichtung in den Zeilen mit Umlauten auch umsonst abgedeckt:

Code: Alles auswählen

#!/usr/bin/gawk -f

BEGIN {
	FS = ","
	delete clubs[0]
}

{
	home = $1
	home_goals = $2
	guest_goals = $3
	guest = $4
	goal_diff = home_goals - guest_goals

	clubs[home]["club"] = home
	clubs[home]["goals"] += home_goals
	clubs[home]["goals_against"] += guest_goals
	clubs[home]["goal_diff"] += goal_diff

	clubs[guest]["club"] = guest
	clubs[guest]["goals"] += guest_goals
	clubs[guest]["goals_against"] += home_goals
	clubs[guest]["goal_diff"] -= goal_diff

	if (home_goals == guest_goals) {
		clubs[home]["draws"] += 1
		clubs[home]["points"] += 1
		clubs[guest]["draws"] += 1
		clubs[guest]["points"] += 1
	} else {
		if (home_goals > guest_goals) {
			clubs[home]["wins"] += 1
			clubs[home]["points"] += 3
			clubs[guest]["losses"] += 1
		} else {
			clubs[home]["losses"] += 1
			clubs[guest]["wins"] += 1
			clubs[guest]["points"] += 3
		}
	}
}

function cmp_clubs(i1, club1, i2, club2) {
	if (club1["points"] > club2["points"]) { return -1 }
	if (club1["points"] < club2["points"]) { return 1 }

	if (club1["goal_diff"] > club2["goal_diff"]) { return -1 }
	if (club1["goal_diff"] < club2["goal_diff"]) { return 1 }

	if (club1["wins"] > club2["wins"]) { return -1 }
	if (club1["wins"] < club2["wins"]) { return 1 }

	if (club1["club"] < club2["club"]) { return -1 }
	return 1
}

END {
	if (!name_len) { name_len = 25 }

	printf "%*s %2s %2s %2s %2s %2s %2s %3s %2s\n", name_len, "Name", "#", "w", "d", "l", "+", "-", "=", "P"
	for (i = 0; i < name_len; ++i) { printf "-" }
	printf "-------------------------\n"

	delete table[0]
	asort(clubs, table, "cmp_clubs")

	for (i in table) {
		printf "%*s %2d %2d %2d %2d %2d %2d %3d %2d\n",
			   name_len,
			   table[i]["club"],
			   i,
			   table[i]["wins"],
			   table[i]["draws"],
			   table[i]["losses"],
			   table[i]["goals"],
			   table[i]["goals_against"],
			   table[i]["goal_diff"],
			   table[i]["points"]
	}
}

Die Bash-Lösung hatte 20–40 mal so lange gebraucht (die Zeit ist natürlich nicht allgemein vergleichbar):

Code: Alles auswählen

$ time ./csv_to_table_awk Challenge\ Fussball\ Spielergebnisse.csv 
                     Name  #  w  d  l  +  -   =  P
--------------------------------------------------
                FC Zürich  1 16 10 10 70 59  11 58
  Grasshopper Club Zürich  2 17  7 12 79 70   9 58
           BSC Young Boys  3 16 10 10 66 58   8 58
        FC Lausanne-Sport  4 16  6 14 58 63  -5 54
       FC St. Gallen 1879  5 14  9 13 59 58   1 51
                  FC Sion  6 14  8 14 55 62  -7 50
              Servette FC  7 13  9 14 76 73   3 48
                FC Luzern  8 14  6 16 75 79  -4 48
            FC Basel 1893  9 11  8 17 66 77 -11 41
                FC Lugano 10 10  5 21 58 63  -5 35

real	0m0,002s
user	0m0,002s
sys	0m0,000s
Manchmal bekannt als Just (another) Terminal Hacker.

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von thoerb » 16.01.2022 18:40:16

Hier meine Lösung:

Code: Alles auswählen

<?php

$json = file_get_contents('./data.json');
$arr = json_decode($json, true);
$teams = [];

foreach ($arr as $value) {

    if (!in_array($value['homeTeam'], $teams)) {
        
        $teams[] = $value['homeTeam'];
    }
}

foreach ($teams as $team) {
    
    $col[$team]['name'] = $team;
    $col[$team]['a'] = 0;
    $col[$team]['b'] = 0;
    $col[$team]['c'] = 0;
    $col[$team]['d'] = 0;
    $col[$team]['e'] = 0;
    $col[$team]['f'] = 0;
    $col[$team]['g'] = 0;

    foreach ($arr as $value) {

        if ($value['homeTeam'] == $team) {
            
            $col[$team]['d'] += $value['homeGoals'];
            $col[$team]['e'] += $value['awayGoals'];

            if ($value['homeGoals'] > $value['awayGoals']) {

                $col[$team]['a'] += 1;
                $col[$team]['g'] += 3;
            }

            if ($value['homeGoals'] < $value['awayGoals']) {

                $col[$team]['c'] += 1;
                $col[$team]['g'] += 0;
            }

            if ($value['homeGoals'] == $value['awayGoals']) {

                $col[$team]['b'] += 1;
                $col[$team]['g'] += 1;
            }
        }

        if ($value['awayTeam'] == $team) {

            $col[$team]['e'] += $value['homeGoals'];
            $col[$team]['d'] += $value['awayGoals'];

            if ($value['homeGoals'] < $value['awayGoals']) {

                $col[$team]['a'] += 1;
                $col[$team]['g'] += 3;
            }

            if ($value['homeGoals'] > $value['awayGoals']) {

                $col[$team]['c'] += 1;
                $col[$team]['g'] += 0;
            }

            if ($value['homeGoals'] == $value['awayGoals']) {

                $col[$team]['b'] += 1;
                $col[$team]['g'] += 1;
            }
        }

        $col[$team]['f'] = $col[$team]['d'] - $col[$team]['e'];
        $col[$team]['g'] = $col[$team]['a'] * 3 + $col[$team]['b'];
    }
}

$name = array_column($col, 'name');
$a = array_column($col, 'a');
$f = array_column($col, 'f');
$g = array_column($col, 'g');

array_multisort($g, SORT_DESC, SORT_NUMERIC, $f, SORT_DESC, SORT_NUMERIC, $a, SORT_DESC, SORT_NUMERIC, $name, SORT_ASC, SORT_STRING, $col);

function sp($str, $len){
    
    return str_repeat(" ", $len - mb_strlen($str)).$str;
}

$table = "                     Name  #  w  d  l  +  -   =  P\n--------------------------------------------------\n";

$pos = 0;
foreach ($col as $value) {

    $pos++;
    $table .= sp($value['name'], 25)." ".sp($pos, 2)." ".sp($value['a'], 2)." ".sp($value['b'], 2)." ".sp($value['c'], 2)." ".sp($value['d'], 2)." ".sp($value['e'], 2)." ".sp($value['f'], 3)." ". sp($value['g'], 2)."\n";
}

echo $table;

Code: Alles auswählen

$ php fussballergebnisse.php 
                     Name  #  w  d  l  +  -   =  P
--------------------------------------------------
                FC Zürich  1 16 10 10 70 59  11 58
  Grasshopper Club Zürich  2 17  7 12 79 70   9 58
           BSC Young Boys  3 16 10 10 66 58   8 58
        FC Lausanne-Sport  4 16  6 14 58 63  -5 54
       FC St. Gallen 1879  5 14  9 13 59 58   1 51
                  FC Sion  6 14  8 14 55 62  -7 50
              Servette FC  7 13  9 14 76 73   3 48
                FC Luzern  8 14  6 16 75 79  -4 48
            FC Basel 1893  9 11  8 17 66 77 -11 41
                FC Lugano 10 10  5 21 58 63  -5 35
Edit: Ausgabe hinzugefügt.
Zuletzt geändert von thoerb am 16.01.2022 19:31:23, insgesamt 1-mal geändert.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von tobo » 16.01.2022 19:08:23

Eine mögliche Lösung in Python:

Code: Alles auswählen

#!/usr/bin/env python3

import sys

if len(sys.argv) != 2:
    sys.exit()
FN=sys.argv[1]
d={}   #values={N:[w,d,l,gp,gm,ge,p]}

with open(FN) as f:
    for game in f:
        team1,goals1,goals2,team2=game.rstrip().split(',')
        for team in team1,team2:
            if team not in d:
                d[team]=[0,0,0,0,0,0,0]
        d[team1][3]+=int(goals1); d[team2][4]+=int(goals1)
        d[team1][4]+=int(goals2); d[team2][3]+=int(goals2)
        d[team1][5]=d[team1][3]-d[team1][4]; d[team2][5]=d[team2][3]-d[team2][4]
        if goals1==goals2:
            d[team1][1]+=1; d[team2][1]+=1
            d[team1][6]+=1; d[team2][6]+=1
        elif goals1>goals2:
            d[team1][0]+=1; d[team2][2]+=1
            d[team1][6]+=3
        else:
            d[team1][2]+=1; d[team2][0]+=1
            d[team2][6]+=3

out=sorted(d.items(), key=lambda t:(-t[1][6],-t[1][5],-t[1][0],t[0]))
print("                     Name  #  w  d  l  +  -   =  P")
print("--------------------------------------------------")
for n,i in enumerate(out,1):
    print("{:>25s} {:2d} {:2d} {:2d} {:2d} {:2d} {:2d} {:3d} {:2d}".format(i[0],n,*i[1]))

Code: Alles auswählen

$ ./t.py scripting_contest-game_results_utf8.csv 
                     Name  #  w  d  l  +  -   =  P
--------------------------------------------------
                FC Zürich  1 16 10 10 70 59  11 58
  Grasshopper Club Zürich  2 17  7 12 79 70   9 58
           BSC Young Boys  3 16 10 10 66 58   8 58
        FC Lausanne-Sport  4 16  6 14 58 63  -5 54
       FC St. Gallen 1879  5 14  9 13 59 58   1 51
                  FC Sion  6 14  8 14 55 62  -7 50
              Servette FC  7 13  9 14 76 73   3 48
                FC Luzern  8 14  6 16 75 79  -4 48
            FC Basel 1893  9 11  8 17 66 77 -11 41
                FC Lugano 10 10  5 21 58 63  -5 35
Edit: time-Ausgabe entfernt.

Benutzeravatar
paedubucher
Beiträge: 856
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von paedubucher » 16.01.2022 19:55:59

Ich werfe mal R in den Ring:

Code: Alles auswählen

#!/usr/bin/env Rscript

library(jsonlite)
library(readr)

column_names <- c("name", "rank", "wins", "ties", "defeats",
                  "goalsScored", "goalsConceded", "goalsDifference",
                  "points")

create_empty_row <- function(teamName) {
    row <- data.frame(teamName, 0, 0, 0, 0, 0, 0, 0, 0)
    colnames(row) <- column_names
    return(row)
}

args <- commandArgs(trailingOnly=TRUE)
data <- read_file(args[1])
matches <- fromJSON(data)

table <- data.frame(matrix(ncol=9, nrow=0))
colnames(table) <- column_names

for (row in 1:nrow(matches)) {
    homeTeam <- matches[row, "homeTeam"]
    awayTeam <- matches[row, "awayTeam"]
    homeGoals <- matches[row, "homeGoals"]
    awayGoals <- matches[row, "awayGoals"]

    homeIndex <- which(table$name == homeTeam)
    awayIndex <- which(table$name == awayTeam)
    if (length(homeIndex) == 0) {
        table <- rbind(table, create_empty_row(homeTeam))
        homeIndex <- which(table$name == homeTeam)
    }
    if (length(awayIndex) == 0) {
        table <- rbind(table, create_empty_row(awayTeam))
        awayIndex <- which(table$name == awayTeam)
    }

    table[homeIndex, "goalsScored"] <- table[homeIndex, "goalsScored"] + homeGoals
    table[awayIndex, "goalsScored"] <- table[awayIndex, "goalsScored"] + awayGoals
    table[homeIndex, "goalsConceded"] <- table[homeIndex, "goalsConceded"] + awayGoals
    table[awayIndex, "goalsConceded"] <- table[awayIndex, "goalsConceded"] + homeGoals

    if (homeGoals > awayGoals) {
        table[homeIndex, "wins"] <- table[homeIndex, "wins"] + 1
        table[awayIndex, "defeats"] <- table[awayIndex, "defeats"] + 1
    } else if (homeGoals < awayGoals) {
        table[awayIndex, "wins"] <- table[awayIndex, "wins"] + 1
        table[homeIndex, "defeats"] <- table[homeIndex, "defeats"] + 1
    } else {
        table[homeIndex, "ties"] <- table[homeIndex, "ties"] + 1
        table[awayIndex, "ties"] <- table[awayIndex, "ties"] + 1
    }
}

for (row in 1:nrow(table)) {
    table[row, "goalsDifference"] <- table[row, "goalsScored"] - table[row, "goalsConceded"]
    table[row, "points"] <- table[row, "wins"] * 3 + table[row, "ties"]
}

table <- table[order(table$points, table$goalsDifference, table$wins, rev(table$name), decreasing=TRUE),]

for (row in 1:nrow(table)) {
    table[row, "rank"] <- row
}

cat("                     Name  #  w  d  l  +  -   =  P\n")
cat("--------------------------------------------------\n")
for (row in 1:nrow(table)) {
    r = table[row,]
    i = r$rank
    n = r$name
    w = r$wins
    d = r$ties
    l = r$defeats
    gs = r$goalsScored
    gc = r$goalsConceded
    gd = r$goalsDifference
    p = r$points
    format(n, width=25, justify="right")
    line = sprintf("%25s %2d %2d %2d %2d %2d %2d %3d %2d\n", n, i, w, d, l, gs, gc, gd, p)
    cat(line)
}
Die Ausgabe mit Multibyte-Zeichen funktioniert leider nicht ideal:

Code: Alles auswählen

$ ./superleague.R data/super-league.json 
                     Name  #  w  d  l  +  -   =  P
--------------------------------------------------
               FC Zürich  1 16 10 10 70 59  11 58
 Grasshopper Club Zürich  2 17  7 12 79 70   9 58
           BSC Young Boys  3 16 10 10 66 58   8 58
        FC Lausanne-Sport  4 16  6 14 58 63  -5 54
       FC St. Gallen 1879  5 14  9 13 59 58   1 51
                  FC Sion  6 14  8 14 55 62  -7 50
              Servette FC  7 13  9 14 76 73   3 48
                FC Luzern  8 14  6 16 75 79  -4 48
            FC Basel 1893  9 11  8 17 66 77 -11 41
                FC Lugano 10 10  5 21 58 63  -5 35
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von thoerb » 16.01.2022 20:10:42

paedubucher hat geschrieben: ↑ zum Beitrag ↑
16.01.2022 19:55:59
Die Ausgabe mit Multibyte-Zeichen funktioniert leider nicht ideal:

Code: Alles auswählen

$ ./superleague.R data/super-league.json 
                     Name  #  w  d  l  +  -   =  P
--------------------------------------------------
               FC Zürich  1 16 10 10 70 59  11 58
 Grasshopper Club Zürich  2 17  7 12 79 70   9 58
           BSC Young Boys  3 16 10 10 66 58   8 58
        FC Lausanne-Sport  4 16  6 14 58 63  -5 54
       FC St. Gallen 1879  5 14  9 13 59 58   1 51
                  FC Sion  6 14  8 14 55 62  -7 50
              Servette FC  7 13  9 14 76 73   3 48
                FC Luzern  8 14  6 16 75 79  -4 48
            FC Basel 1893  9 11  8 17 66 77 -11 41
                FC Lugano 10 10  5 21 58 63  -5 35
Das gleiche Problem hatte ich in PHP, als ich zum Auffüllen die Funktion str_pad nutzen wollte.

Benutzeravatar
paedubucher
Beiträge: 856
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von paedubucher » 16.01.2022 23:47:27

Hat es hier keine Perl-Programmierer? Ich würde das gerne in einem Einzeiler gelöst sehen :D
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
paedubucher
Beiträge: 856
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von paedubucher » 17.01.2022 08:20:33

Dann werfe ich mal Lua nach:

Code: Alles auswählen

#!/usr/bin/env lua

local json = require("dkjson")

function new_league_row(team_name)
    return {team = team_name, wins = 0, ties = 0, defeats = 0, goals_scored = 0, goals_conceded = 0}
end

function sort(a, b)
    if a["points"] > b["points"] then
        return true
    elseif a["points"] < b["points"] then
        return false
    elseif a["goals_difference"] > b["goals_difference"] then
        return true
    elseif a["goals_difference"] < b["goals_difference"] then
        return false
    elseif a["wins"] > b["wins"] then
        return true
    elseif a["wins"] < b["wins"] then
        return false
    elseif a["team"] < b["team"] then
        return true
    elseif a["team"] > b["team"] then
        return false
    end
end

matches_path = arg[1]
local matches_file = io.open(matches_path, "r")
local matches_data = matches_file:read("*a")

local matches = json.decode(matches_data)
local league = {}

for _, match in ipairs(matches) do
    home_team = match["homeTeam"]
    away_team = match["awayTeam"]
    home_goals = match["homeGoals"]
    away_goals = match["awayGoals"]

    if league[home_team] == nil then
        league[home_team] = new_league_row(home_team)
    end
    if league[away_team] == nil then
        league[away_team] = new_league_row(away_team)
    end

    league[home_team]["goals_scored"] = league[home_team]["goals_scored"] + home_goals
    league[home_team]["goals_conceded"] = league[home_team]["goals_conceded"] + away_goals
    league[away_team]["goals_scored"] = league[away_team]["goals_scored"] + away_goals
    league[away_team]["goals_conceded"] = league[away_team]["goals_conceded"] + home_goals 

    if home_goals > away_goals then
        league[home_team]["wins"] = league[home_team]["wins"] + 1
        league[away_team]["defeats"] = league[away_team]["defeats"] + 1
    elseif home_goals < away_goals then
        league[home_team]["defeats"] = league[home_team]["defeats"] + 1
        league[away_team]["wins"] = league[away_team]["wins"] + 1
    else
        league[home_team]["ties"] = league[home_team]["ties"] + 1
        league[away_team]["ties"] = league[away_team]["ties"] + 1
    end
end

for team, row in pairs(league) do
    row["goals_difference"] = row["goals_scored"] - row["goals_conceded"]
    row["points"] = row["wins"] * 3 + row["ties"]
end

ordered = {}
for _, row in pairs(league) do
    table.insert(ordered, row)
end
table.sort(ordered, sort)

title = string.format("%25s %2s %2s %2s %2s %2s %2s %3s %2s",
                      "Name", "#", "w", "d", "l", "+", "-", "=", "P")
print(title)
print(string.rep("-", string.len(title)))
for i, row in pairs(ordered) do
    print(string.format("%25s %2d %2d %2d %2d %2d %2d %3d %2d",
                        row["team"], i+1,
                        row["wins"], row["ties"], row["defeats"],
                        row["goals_scored"], row["goals_conceded"], row["goals_difference"],
                        row["points"]))
end
Auch hier wieder das Multibyte-Problem:

Code: Alles auswählen

$ ./superleague.lua data/super-league.json
                     Name  #  w  d  l  +  -   =  P
--------------------------------------------------
               FC Zürich  2 16 10 10 70 59  11 58
 Grasshopper Club Zürich  3 17  7 12 79 70   9 58
           BSC Young Boys  4 16 10 10 66 58   8 58
        FC Lausanne-Sport  5 16  6 14 58 63  -5 54
       FC St. Gallen 1879  6 14  9 13 59 58   1 51
                  FC Sion  7 14  8 14 55 62  -7 50
              Servette FC  8 13  9 14 76 73   3 48
                FC Luzern  9 14  6 16 75 79  -4 48
            FC Basel 1893 10 11  8 17 66 77 -11 41
                FC Lugano 11 10  5 21 58 63  -5 35
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von Meillo » 17.01.2022 08:42:16

Hier kommt meine awk-Implementierung. Das ist diejenige, die ich als erstes geschrieben habe und die mir weiterhin am liebsten ist:

Code: Alles auswählen

#!/bin/sh

cat "$@" | awk -F, -vOFS=, '
{
        tplus[$1] += $2; tminus[$1] += $3
        tplus[$4] += $3; tminus[$4] += $2
        if ($2 > $3) {
                w[$1]++; l[$4]++
        } else if ($3 > $2) {
                l[$1]++; w[$4]++
        } else {
                d[$1]++; d[$4]++
        }
}
END {
        for (i in w) {
                print i, w[i], d[i], l[i], tplus[i], tminus[i],
                                tplus[i] - tminus[i], w[i] * 3 + d[i]
        }
}
' | sort -t, -k8,8nr -k7,7nr -k2,2nr -k1,1 | awk -F, '
BEGIN {
        print "                     Name  #  w  d  l  +  -   =  P"
        print "--------------------------------------------------"
}
{
        printf("%25s %2d %2d %2d %2d %2d %2d %3d %2d\n",
                        $1, NR, $2, $3, $4, $5, $6, $7, $8)
}
'
Use ed once in a while!

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von reox » 17.01.2022 13:01:33

noch eine py3 lösung

Code: Alles auswählen

import json
import sys
from collections import defaultdict, namedtuple
from functools import reduce


result = namedtuple("Result", ['club', 'win', 'draw', 'lost', 'score', 'suffer', 'diff', 'points'])


def calc(a, b):
    # Returns (w, d, l, +, -, =, P) for a single match
    return (a > b, a == b, a < b, a, b, a - b, 1 if a == b else (0 if a < b else 3))


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print(f"usage: {sys.argv[0]} file.json", file=sys.stderr)
        sys.exit(1)
    fp = open(sys.argv[1], 'rb') if sys.argv[1] != '-' else sys.stdin
    clubs = defaultdict(list)
    for game in json.load(fp):
        a, b = game['homeGoals'], game['awayGoals']
        clubs[game['homeTeam']].append(calc(a, b))
        clubs[game['awayTeam']].append(calc(b, a))
    fp.close()

    res_data = list()
    for club, res in clubs.items():
        res_data.append(result(club, *reduce(lambda a, b: [x + y for x, y in zip(a, b)], res)))

    print(f"{'Name':>25.25}  #  w  d  l  +  -   =  P")
    print("-" * 50)
    for rank, dat in enumerate(sorted(res_data, key=lambda x: (-x.points, -x.diff, -x.win, x.club)), start=1):
        print(f'{dat.club:>25.25} {rank:>2d} '
              f'{dat.win:>2d} {dat.draw:>2d} {dat.lost:>2d} '
              f'{dat.score:>2d} {dat.suffer:>2d} {dat.diff:>3d} {dat.points:>2d}')
wsl kann man die beiden schleifen auch noch vereinen ;)

edit: special filename '-' fix


edit2: Noch eine variante mit klasse und einer schleife weniger

Code: Alles auswählen

import json
import sys
from collections import defaultdict


class Result:
    __slots__ = ['win', 'draw', 'lost', 'score', 'suffer', 'points']

    def __init__(self):
        for var in self.__slots__:
            setattr(self, var, 0)

    def add(self, a, b):
        self.win += a > b
        self.lost += a < b
        self.draw += a == b
        self.score += a
        self.suffer += b
        self.points += 1 if a == b else (0 if a < b else 3)

    @property
    def diff(self):
        return self.score - self.suffer


if __name__ == "__main__":
    if len(sys.argv) == 1 or (len(sys.argv) == 2 and sys.argv[1] == '-'):
        fp = sys.stdin
    elif len(sys.argv) != 2:
        print(f"usage: {sys.argv[0]} [file.json]", file=sys.stderr)
        sys.exit(1)
    else:
        fp = open(sys.argv[1], 'rb')
    clubs = defaultdict(Result)
    for game in json.load(fp):
        a, b = game['homeGoals'], game['awayGoals']
        clubs[game['homeTeam']].add(a, b)
        clubs[game['awayTeam']].add(b, a)
    fp.close()

    print(f"{'Name':>25.25}  #  w  d  l  +  -   =  P")
    print("-" * 50)
    for rank, (club, dat) in enumerate(sorted(clubs.items(), key=lambda x: (-x[1].points, -x[1].diff, -x[1].win, x[0])), start=1):
        print(f'{club:>25.25} {rank:>2d} '
              f'{dat.win:>2d} {dat.draw:>2d} {dat.lost:>2d} '
              f'{dat.score:>2d} {dat.suffer:>2d} {dat.diff:>3d} {dat.points:>2d}')

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von Meillo » 20.01.2022 09:14:09

Hier meine C-Variante:

Code: Alles auswählen

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAXTEAMS 16

struct team {
        char *name;
        int wins, draws, losses;
        int gmade, gtook;
} teams[MAXTEAMS+1];
int nteams;


struct team *
getteam(char *name)
{
        struct team *p;
        int i=0;

        for (p=teams; p->name; p++, i++) {
                if (i == MAXTEAMS) {
                        fprintf(stderr, "too many teams (only %d allowed)\n",
                                        MAXTEAMS);
                        exit(1);
                }
                if (strcmp(name, p->name)==0) {
                        return p;
                }        /* insert */
        }
        nteams++;
        p->name = strdup(name);
        return p;
}

int
teamcmp(const void *a, const void *b)
{
        const struct team *t1 = a;
        const struct team *t2 = b;

        if (t1->wins*3 + t1->draws > t2->wins*3 + t2->draws) {
                return -1;
        } else if (t1->wins*3 + t1->draws < t2->wins*3 + t2->draws) {
                return 1;
        } else if (t1->gmade - t1->gtook > t2->gmade - t2->gtook) {
                return -1;
        } else if (t1->gmade - t1->gtook < t2->gmade - t2->gtook) {
                return 1;
        } else if (t1->wins > t2->wins) {
                return -1;
        } else if (t1->wins < t2->wins) {
                return 1;
        } else {
                return strcmp(t1->name, t2->name);
        }
}

int
main(void)
{
        char buf[BUFSIZ];
        struct team *t1, *t2, *p;
        int t1g, t2g;
        int place=1;

        while (fgets(buf, sizeof buf, stdin)) {
                /* TODO: error handling for parsing */
                t1 = getteam(strtok(buf, ","));
                t1g = atoi(strtok(NULL, ","));
                t2g = atoi(strtok(NULL, ","));
                t2 = getteam(strtok(NULL, "\n"));

                t1->gmade += t1g; t1->gtook += t2g;
                t2->gmade += t2g; t2->gtook += t1g;

                if (t1g > t2g) {
                        t1->wins++; t2->losses++;
                } else if (t1g < t2g) {
                        t1->losses++; t2->wins++;
                } else {
                        t1->draws++; t2->draws++;
                }
        }

        qsort(teams, nteams, sizeof(teams[0]), teamcmp);

        printf("                     Name  #  w  d  l  +  -   =  P\n");
        printf("--------------------------------------------------\n");
        for (p=teams; p->name; p++) {
                printf("%25s %2d %2d %2d %2d %2d %2d %3d %2d\n",
                                p->name, place++,
                                p->wins, p->draws, p->losses,
                                p->gmade, p->gtook, p->gmade - p->gtook,
                                p->wins*3 + p->draws);
        }

}
Die liest aus Bequemlichkeit nur von Stdin.
Use ed once in a while!

Benutzeravatar
paedubucher
Beiträge: 856
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von paedubucher » 05.11.2022 21:45:22

Ich schiebe den Thread wieder einmal nach oben, doch aus gutem Grund, denn: ich habe das ganze auch mal in C implementiert, jedoch nicht wie meillo vorher auf Basis von Plaintext, sondern mit dem JSON-Parser Debianlibjansson4. Den Code habe ich auf GitHub. Ich habe doch einige Abende damit zugebracht. Da ich nicht mit wchar_t arbeite (daran bin ich gescheitert), ist halt die Tabelle leider nicht perfekt angeordnet, wegen der Umlaute. Aber die Übung hat mir doch immerhin etwas Spass, wenn auch Kopfzerbrechen bereitet. Ich habe auch sichergestellt, dass das ganze Memory wieder freigegeben wird, so als Übung und Zusatzschwierigkeit.

In Debianracket habe ich das ganze auch implementiert: siehe ebenfalls GitHub. Hier habe ich wohl zu viel händisch ausprogrammiert, was wohl an meiner Beschäftigung mit SICP liegt. Aber auch das war durchaus interessant und lehrreich.

Damit wäre ich nun bei 11 Implementierungen, wobei ich die in C# nicht dazu zähle (hier nur als Aufgabenstellung vorhanden), und diejenige in AWK/Shell von meillo stammt.

Ich könnte gelegentlich noch JavaScript dazu nehmen, vielleicht mal mit Deno, damit ich Debiannodejs nicht installieren muss. :wink:

Weiter auf der Liste wären noch Erlang und Rust, und vielleicht so etwas, das ich noch gar nicht kenne, wie zig, nim und Julia.
Zuletzt geändert von paedubucher am 06.11.2022 11:28:39, insgesamt 1-mal geändert.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
heisenberg
Beiträge: 3542
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting-Challenge: Fussballergebnisse in Ligatabelle umwandeln

Beitrag von heisenberg » 05.11.2022 22:39:26

Da ich diesen Thread hier gerade zum ersten mal sehe, möchte ich da gerade mal was einwerfen. Es gibt so insgesamt nix, was mich weniger interessiert als Fußball; aber mein einer Chef macht da privat recht viel mit Fußballstatistik. Ziehmlich umfangreiches Webseitenparsing und das auf einem programmiertechnisch jetzt nicht all zu hohen Niveau. Umso mehr bewunderswert, dass das ganze jede Menge verwertbare und tatsächlich verwertete Arbeitsergebnissen erzeugt.

Da frage ich mich, ob da vielleicht von jemandem hier Interesse an der Thematik Fußballstatistik und Programmierung und an Kontakt besteht und wenn dem so ist kann ich meinen Chef da auch mal fragen, ob da auch bei Ihm Interesse an einem Kontakt besteht und den dann herstellen.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Antworten