From e59823477d41df4c6adde455ac02ef98b7c969a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20L=C3=BCtge?= Date: Mon, 5 Aug 2024 14:23:28 +0200 Subject: [PATCH 01/11] init autogenerate vorlage --- common/generate_vorlage.sh | 5 +++++ exercises-toolbox/1-python/1-greetings/aufgabe.txt | 4 ++-- .../1-python/1-greetings/{greetings.py => vorlage.py} | 0 exercises-toolbox/1-python/2-average/aufgabe.txt | 2 +- .../1-python/2-average/{average.py => vorlage.py} | 0 exercises-toolbox/1-python/3-fizzbuzz/aufgabe.txt | 2 +- .../1-python/3-fizzbuzz/{fizzbuzz.py => vorlage.py} | 0 .../1-python/7-fstrings/{fstrings.py => vorlage.py} | 2 +- 8 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 common/generate_vorlage.sh rename exercises-toolbox/1-python/1-greetings/{greetings.py => vorlage.py} (100%) rename exercises-toolbox/1-python/2-average/{average.py => vorlage.py} (100%) rename exercises-toolbox/1-python/3-fizzbuzz/{fizzbuzz.py => vorlage.py} (100%) rename exercises-toolbox/1-python/7-fstrings/{fstrings.py => vorlage.py} (97%) diff --git a/common/generate_vorlage.sh b/common/generate_vorlage.sh new file mode 100644 index 00000000..286ddce4 --- /dev/null +++ b/common/generate_vorlage.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +find . -name 'vorlage.py' -exec "cp loesung.py vorlage.py \ + & sed -i -e '/# begin solution/,/# end solution' {} \;" + diff --git a/exercises-toolbox/1-python/1-greetings/aufgabe.txt b/exercises-toolbox/1-python/1-greetings/aufgabe.txt index 33a4e13c..2a58cbcf 100644 --- a/exercises-toolbox/1-python/1-greetings/aufgabe.txt +++ b/exercises-toolbox/1-python/1-greetings/aufgabe.txt @@ -2,9 +2,9 @@ 1. Aufgabe: -Öffne die Datei "greetings.py". Eine Liste von Strings wurde bereits +Öffne die Datei "vorlage.py". Eine Liste von Strings wurde bereits vorbereitet. Füge deinen Namen an einer beliebigen Stelle der Liste ein. Prüfe, -ob du alles richtig gemacht hast, indem du das Programm mit "python greetings.py" +ob du alles richtig gemacht hast, indem du das Programm mit "python vorlage.py" laufen lässt. Es sollten keinerlei Fehlermeldungen erscheinen. 2. Aufgabe: diff --git a/exercises-toolbox/1-python/1-greetings/greetings.py b/exercises-toolbox/1-python/1-greetings/vorlage.py similarity index 100% rename from exercises-toolbox/1-python/1-greetings/greetings.py rename to exercises-toolbox/1-python/1-greetings/vorlage.py diff --git a/exercises-toolbox/1-python/2-average/aufgabe.txt b/exercises-toolbox/1-python/2-average/aufgabe.txt index f4e7d435..cf54d099 100644 --- a/exercises-toolbox/1-python/2-average/aufgabe.txt +++ b/exercises-toolbox/1-python/2-average/aufgabe.txt @@ -2,5 +2,5 @@ Aufgabe: -In der beiliegenden Python-Datei `average.py` ist eine Liste mit Zahlen +In der beiliegenden Python-Datei `vorlage.py` ist eine Liste mit Zahlen vorbereitet. Berechne ihren arithmetischen Mittelwert und gib ihn aus. diff --git a/exercises-toolbox/1-python/2-average/average.py b/exercises-toolbox/1-python/2-average/vorlage.py similarity index 100% rename from exercises-toolbox/1-python/2-average/average.py rename to exercises-toolbox/1-python/2-average/vorlage.py diff --git a/exercises-toolbox/1-python/3-fizzbuzz/aufgabe.txt b/exercises-toolbox/1-python/3-fizzbuzz/aufgabe.txt index 203297d0..7041075a 100644 --- a/exercises-toolbox/1-python/3-fizzbuzz/aufgabe.txt +++ b/exercises-toolbox/1-python/3-fizzbuzz/aufgabe.txt @@ -4,7 +4,7 @@ Angeblich eine beliebte Aufgabe in Bewerbungsgesprächen für Programmierer. Aufgabe: -Öffne die Datei "fizzbuzz.py" und ergänze sie wie folgt: Gib die Zahlen von 1 +Öffne die Datei "vorlage.py" und ergänze sie wie folgt: Gib die Zahlen von 1 bis 100 aus, wobei du aber Zahlen, die durch 3 teilbar sind, durch "Fizz" und Zahlen, die durch 5 teilbar sind, durch "Buzz" ersetzt. Ist eine Zahl sowohl durch 3 als auch durch 5 teilbar, so gib stattdessen "Fizzbuzz" aus. diff --git a/exercises-toolbox/1-python/3-fizzbuzz/fizzbuzz.py b/exercises-toolbox/1-python/3-fizzbuzz/vorlage.py similarity index 100% rename from exercises-toolbox/1-python/3-fizzbuzz/fizzbuzz.py rename to exercises-toolbox/1-python/3-fizzbuzz/vorlage.py diff --git a/exercises-toolbox/1-python/7-fstrings/fstrings.py b/exercises-toolbox/1-python/7-fstrings/vorlage.py similarity index 97% rename from exercises-toolbox/1-python/7-fstrings/fstrings.py rename to exercises-toolbox/1-python/7-fstrings/vorlage.py index a3c0b9b2..5d58727c 100644 --- a/exercises-toolbox/1-python/7-fstrings/fstrings.py +++ b/exercises-toolbox/1-python/7-fstrings/vorlage.py @@ -16,7 +16,7 @@ # Versuch 'Wiegen von Metallen' durchgeführt am 24.09.2018 # Für die 2.Aufgabe -print(f"") +# print(f"") # Für die 3. Aufgabe From c6557e31d09237ba7119410650883084363cdc4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20L=C3=BCtge?= Date: Mon, 5 Aug 2024 14:52:07 +0200 Subject: [PATCH 02/11] test for 1-1 --- common/generate_vorlage.sh | 5 +++-- exercises-toolbox/1-python/1-greetings/loesung.py | 10 ++++++++++ exercises-toolbox/1-python/1-greetings/vorlage.py | 11 ----------- 3 files changed, 13 insertions(+), 13 deletions(-) mode change 100644 => 100755 common/generate_vorlage.sh delete mode 100644 exercises-toolbox/1-python/1-greetings/vorlage.py diff --git a/common/generate_vorlage.sh b/common/generate_vorlage.sh old mode 100644 new mode 100755 index 286ddce4..b8fa82e8 --- a/common/generate_vorlage.sh +++ b/common/generate_vorlage.sh @@ -1,5 +1,6 @@ #!/bin/bash -find . -name 'vorlage.py' -exec "cp loesung.py vorlage.py \ - & sed -i -e '/# begin solution/,/# end solution' {} \;" +[ ! -f 'vorlage.py.dummy' ] || cp loesung.py vorlage.py +[ ! -f 'vorlage.py.dummy' ] || find . -name 'vorlage.py' \ + -exec sed -i -e '/# begin solution/,/# end solution/d' {} \; diff --git a/exercises-toolbox/1-python/1-greetings/loesung.py b/exercises-toolbox/1-python/1-greetings/loesung.py index 8d174ac4..79672867 100644 --- a/exercises-toolbox/1-python/1-greetings/loesung.py +++ b/exercises-toolbox/1-python/1-greetings/loesung.py @@ -1,4 +1,14 @@ names = ["World", "Toolbox Workshop", "Kevin"] + +# hier ergänzen +# begin solution for name in names: print("Hello " + name) +# end solution + +# Gewünschte Ausgabe: +# Hello World +# Hello Toolbox Workshop +# Hello Kevin +# Hello diff --git a/exercises-toolbox/1-python/1-greetings/vorlage.py b/exercises-toolbox/1-python/1-greetings/vorlage.py deleted file mode 100644 index ff440c38..00000000 --- a/exercises-toolbox/1-python/1-greetings/vorlage.py +++ /dev/null @@ -1,11 +0,0 @@ -names = ["World", "Toolbox Workshop", "Kevin"] - - -# hier ergänzen - - -# Gewünschte Ausgabe: -# Hello World -# Hello Toolbox Workshop -# Hello Kevin -# Hello From c8e4a106df90322b1b693a2a90137c5f3b8b3c73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20L=C3=BCtge?= Date: Mon, 5 Aug 2024 16:08:37 +0200 Subject: [PATCH 03/11] test for 1-1 works --- common/generate_vorlage.mk | 14 ++++++++++++++ common/generate_vorlage.sh | 6 ------ exercises-toolbox/1-python/Makefile | 1 + 3 files changed, 15 insertions(+), 6 deletions(-) create mode 100755 common/generate_vorlage.mk delete mode 100755 common/generate_vorlage.sh diff --git a/common/generate_vorlage.mk b/common/generate_vorlage.mk new file mode 100755 index 00000000..34d7f777 --- /dev/null +++ b/common/generate_vorlage.mk @@ -0,0 +1,14 @@ +# [ ! -f 'vorlage.py.dummy' ] || cp loesung.py vorlage.py +# [ ! -f 'vorlage.py.dummy' ] || find . -name 'vorlage.py' \ +# -exec sed -i -e '/# begin solution/,/# end solution/d' {} \; + +FILES := $(sort $(wildcard */loesung*.py)) + +define gen_vorlage = + grep -q '# begin solution' $(1) && : > $(dir $1)vorlage.py + [ ! -f $(dir $1)vorlage.py ] || cp $(1) $(dir $1)vorlage.py + [ ! -f $(dir $1)vorlage.py ] || sed -i -e '/# begin solution/,/# end solution/d' $(dir $1)vorlage.py +endef + +all: $(FILES) + $(foreach loesung, $(FILES), $(call gen_vorlage,$(loesung));) diff --git a/common/generate_vorlage.sh b/common/generate_vorlage.sh deleted file mode 100755 index b8fa82e8..00000000 --- a/common/generate_vorlage.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -[ ! -f 'vorlage.py.dummy' ] || cp loesung.py vorlage.py -[ ! -f 'vorlage.py.dummy' ] || find . -name 'vorlage.py' \ - -exec sed -i -e '/# begin solution/,/# end solution/d' {} \; - diff --git a/exercises-toolbox/1-python/Makefile b/exercises-toolbox/1-python/Makefile index 060d9e1a..661a5fc7 100644 --- a/exercises-toolbox/1-python/Makefile +++ b/exercises-toolbox/1-python/Makefile @@ -1,5 +1,6 @@ include ../../common/common.mk include ../../common/loesung.py.mk +include ../../common/generate_vorlage.mk all: 5-readwrite/test.txt From c8cfb725fd5a5124259a4b715e7ba8ad547b1055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20L=C3=BCtge?= Date: Mon, 5 Aug 2024 16:10:00 +0200 Subject: [PATCH 04/11] edit gitignore for vorlage.py --- exercises-toolbox/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises-toolbox/.gitignore b/exercises-toolbox/.gitignore index 6fae7254..2fe2934d 100644 --- a/exercises-toolbox/.gitignore +++ b/exercises-toolbox/.gitignore @@ -1,3 +1,4 @@ *.pdf *.dummy +vorlage.py FB53-Coronafallzahlen.csv From 457bf44031e61b5c1414442512b7fe275a549473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20L=C3=BCtge?= Date: Mon, 5 Aug 2024 17:12:40 +0200 Subject: [PATCH 05/11] generate vorlagen for 1-python --- common/generate_vorlage.mk | 6 ++-- .../1-python/2-average/loesung.py | 3 ++ .../1-python/2-average/vorlage.py | 3 -- .../1-python/3-fizzbuzz/loesung.py | 3 ++ .../1-python/3-fizzbuzz/vorlage.py | 3 -- .../1-python/4-histogram/loesung.py | 2 ++ .../1-python/5-readwrite/loesung1.py | 2 ++ .../1-python/5-readwrite/loesung2.py | 2 ++ .../1-python/6-wordcount/loesung1.py | 2 ++ .../1-python/6-wordcount/loesung2.py | 2 ++ .../1-python/6-wordcount/loesung3.py | 2 ++ .../1-python/7-fstrings/loesung.py | 24 +++++++++++++++ .../1-python/7-fstrings/vorlage.py | 30 ------------------- 13 files changed, 45 insertions(+), 39 deletions(-) delete mode 100644 exercises-toolbox/1-python/2-average/vorlage.py delete mode 100644 exercises-toolbox/1-python/3-fizzbuzz/vorlage.py delete mode 100644 exercises-toolbox/1-python/7-fstrings/vorlage.py diff --git a/common/generate_vorlage.mk b/common/generate_vorlage.mk index 34d7f777..60b74b65 100755 --- a/common/generate_vorlage.mk +++ b/common/generate_vorlage.mk @@ -5,9 +5,9 @@ FILES := $(sort $(wildcard */loesung*.py)) define gen_vorlage = - grep -q '# begin solution' $(1) && : > $(dir $1)vorlage.py - [ ! -f $(dir $1)vorlage.py ] || cp $(1) $(dir $1)vorlage.py - [ ! -f $(dir $1)vorlage.py ] || sed -i -e '/# begin solution/,/# end solution/d' $(dir $1)vorlage.py + grep -q '# begin solution' $(1) && : >$(dir $1)vorlage.py + @[ ! -f "$(dir $1)vorlage.py" ] || cp $(1) $(dir $1)vorlage.py + @[ ! -f "$(dir $1)vorlage.py" ] || sed -i -e '/# begin solution/,/# end solution/d' $(dir $1)vorlage.py endef all: $(FILES) diff --git a/exercises-toolbox/1-python/2-average/loesung.py b/exercises-toolbox/1-python/2-average/loesung.py index 929f462c..79b984c0 100644 --- a/exercises-toolbox/1-python/2-average/loesung.py +++ b/exercises-toolbox/1-python/2-average/loesung.py @@ -1,5 +1,7 @@ data = [42, 3.1415, 2.7182, 1, 2] +# Hier den Mittelwert berechnen und ausgeben +# begin solution avg = 0 for x in data: avg += x @@ -11,3 +13,4 @@ avg = sum(data) / len(data) print("Der Mittelwert ist ", avg) +# end solution diff --git a/exercises-toolbox/1-python/2-average/vorlage.py b/exercises-toolbox/1-python/2-average/vorlage.py deleted file mode 100644 index 95f455ee..00000000 --- a/exercises-toolbox/1-python/2-average/vorlage.py +++ /dev/null @@ -1,3 +0,0 @@ -data = [42, 3.1415, 2.7182, 1, 2] - -# Hier den Mittelwert berechnen und ausgeben diff --git a/exercises-toolbox/1-python/3-fizzbuzz/loesung.py b/exercises-toolbox/1-python/3-fizzbuzz/loesung.py index 96d8fc80..2366ed3d 100644 --- a/exercises-toolbox/1-python/3-fizzbuzz/loesung.py +++ b/exercises-toolbox/1-python/3-fizzbuzz/loesung.py @@ -1,4 +1,6 @@ for n in range(1, 101): + # Programm ergänzen / ändern + # begin solution if n % 3 == 0 and n % 5 == 0: print("Fizzbuzz") elif n % 3 == 0: @@ -6,4 +8,5 @@ elif n % 5 == 0: print("Buzz") else: + # end solution print(n) diff --git a/exercises-toolbox/1-python/3-fizzbuzz/vorlage.py b/exercises-toolbox/1-python/3-fizzbuzz/vorlage.py deleted file mode 100644 index 1c488028..00000000 --- a/exercises-toolbox/1-python/3-fizzbuzz/vorlage.py +++ /dev/null @@ -1,3 +0,0 @@ -for n in range(1, 101): - # Programm ergänzen / ändern - print(n) diff --git a/exercises-toolbox/1-python/4-histogram/loesung.py b/exercises-toolbox/1-python/4-histogram/loesung.py index 59c79b76..8b7565b4 100644 --- a/exercises-toolbox/1-python/4-histogram/loesung.py +++ b/exercises-toolbox/1-python/4-histogram/loesung.py @@ -1,3 +1,4 @@ +# begin solution def histogram(nums): for num in nums: if num < 0: @@ -6,4 +7,5 @@ def histogram(nums): print(num * "*") +# end solution histogram([6, 2, -1, 10, 1, 8]) diff --git a/exercises-toolbox/1-python/5-readwrite/loesung1.py b/exercises-toolbox/1-python/5-readwrite/loesung1.py index ce1cb261..ea056618 100644 --- a/exercises-toolbox/1-python/5-readwrite/loesung1.py +++ b/exercises-toolbox/1-python/5-readwrite/loesung1.py @@ -1,3 +1,4 @@ +# begin solution import sys if len(sys.argv) > 1: @@ -7,3 +8,4 @@ with open(filename, "r") as f: print(f.read()) +# end solution diff --git a/exercises-toolbox/1-python/5-readwrite/loesung2.py b/exercises-toolbox/1-python/5-readwrite/loesung2.py index 94e40f80..cfb019c8 100644 --- a/exercises-toolbox/1-python/5-readwrite/loesung2.py +++ b/exercises-toolbox/1-python/5-readwrite/loesung2.py @@ -1,2 +1,4 @@ +# begin solution with open("test.txt", "w") as f: f.write(str(42)) +# end solution diff --git a/exercises-toolbox/1-python/6-wordcount/loesung1.py b/exercises-toolbox/1-python/6-wordcount/loesung1.py index da2c896b..95fde16b 100644 --- a/exercises-toolbox/1-python/6-wordcount/loesung1.py +++ b/exercises-toolbox/1-python/6-wordcount/loesung1.py @@ -1,3 +1,4 @@ +# begin solution with open("text.txt") as f: words = f.read().split() @@ -18,3 +19,4 @@ def get_count(x): for key, count in result[:20]: print(f"{key}: {count}") +# end solution diff --git a/exercises-toolbox/1-python/6-wordcount/loesung2.py b/exercises-toolbox/1-python/6-wordcount/loesung2.py index 0c91e6e7..4e03df13 100644 --- a/exercises-toolbox/1-python/6-wordcount/loesung2.py +++ b/exercises-toolbox/1-python/6-wordcount/loesung2.py @@ -1,3 +1,4 @@ +# begin solution with open("text.txt") as f: words = f.read().split() @@ -19,3 +20,4 @@ def get_count(x): for key, count in result[:20]: print(f"{key}: {count}") +# end solution diff --git a/exercises-toolbox/1-python/6-wordcount/loesung3.py b/exercises-toolbox/1-python/6-wordcount/loesung3.py index 1095d6b4..ed681ea7 100644 --- a/exercises-toolbox/1-python/6-wordcount/loesung3.py +++ b/exercises-toolbox/1-python/6-wordcount/loesung3.py @@ -1,3 +1,4 @@ +# begin solution from collections import Counter with open("text.txt") as f: @@ -7,3 +8,4 @@ for key, count in counts.most_common(20): print("{}: {}".format(key, count)) +# end solution diff --git a/exercises-toolbox/1-python/7-fstrings/loesung.py b/exercises-toolbox/1-python/7-fstrings/loesung.py index aef33e2c..8f06169b 100644 --- a/exercises-toolbox/1-python/7-fstrings/loesung.py +++ b/exercises-toolbox/1-python/7-fstrings/loesung.py @@ -1,3 +1,4 @@ +# Für die 1. und 2. Aufgabe: title = "Wiegen von Metallen" date = "24.09.2018" @@ -6,26 +7,48 @@ masses = [9.1, 10.29, 12.485, 130.01] # Für die 1. Aufgabe: +# Gewünschte Ausgabe: # Versuch: Wiegen von Metallen durchgeführt am 24.09.2018 +print() +# begin solution print("Versuch:", title, "durchgeführt am", date) +# end solution +# Ausgabe mit Anführungszeichen: # Versuch 'Wiegen von Metallen' durchgeführt am 24.09.2018 +print() +# begin solution print("Versuch:", "'" + title + "'", "durchgeführt am", date) +# end solution # Für die 2. Aufgabe: +# print(f"") +# begin solution print() # Für den Abstand zur letzten Lösung # Versuch: Wiegen von Metallen durchgeführt am 24.09.2018 print(f"Versuch: {title} durchgeführt am {date}") # Versuch 'Wiegen von Metallen' durchgeführt am 24.09.2018 print(f"Versuch: '{title}' durchgeführt am {date}") +# end solution # Für die 3.Aufgabe: +# begin solution print() # Für den Abstand zur letzten Lösung +# end solution for metal, mass in zip(metals, masses): + print() + # begin solution print(f"{metal}: {mass}") + # end solution +# Gewünschte Ausgabe: +# Eisen: 9.1 +# Kupfer: 10.29 +# Zink: 12.485 +# Blei: 130.01 +# begin solution # Für die 4.Aufgabe: print() # Für den Abstand zur letzten Lösung for metal, mass in zip(metals, masses): @@ -38,3 +61,4 @@ for metal, mass in zip(metals, masses): offset = 11 - len(metal) print(f"{metal}:", f"{mass:>{offset}.2f}") +# end solution diff --git a/exercises-toolbox/1-python/7-fstrings/vorlage.py b/exercises-toolbox/1-python/7-fstrings/vorlage.py deleted file mode 100644 index 5d58727c..00000000 --- a/exercises-toolbox/1-python/7-fstrings/vorlage.py +++ /dev/null @@ -1,30 +0,0 @@ -# Für die 1. und 2. Aufgabe: -title = "Wiegen von Metallen" -date = "24.09.2018" - -# Für die 3. Aufgabe: -metals = ["Eisen", "Kupfer", "Zink", "Blei"] -masses = [9.1, 10.29, 12.485, 130.01] - -# Für die 1. Aufgabe: -print() -# Gewünschte Ausgabe: -# Versuch: Wiegen von Metallen durchgeführt am 24.09.2018 - -# print() -# Ausgabe mit Anführungszeichen: -# Versuch 'Wiegen von Metallen' durchgeführt am 24.09.2018 - -# Für die 2.Aufgabe -# print(f"") - -# Für die 3. Aufgabe - -for metal, mass in zip(metals, masses): - print() - -# Gewünschte Aufgabe: -# Eisen: 9.1 -# Kupfer: 10.29 -# Zink: 12.485 -# Blei: 130.01 From 6145fa0a1484f253424f0cf46006121e8c25bc32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20L=C3=BCtge?= Date: Mon, 5 Aug 2024 17:34:16 +0200 Subject: [PATCH 06/11] generate vorlagen for 2-numpy also making all comments `flake-8` compatible to prevent commits from aborting due to pre-hook warnings. --- exercises-toolbox/2-numpy/1-arrays/loesung.py | 27 ++++++++---- .../2-numpy/2-indexing/loesung.py | 19 +++++++- .../2-numpy/2-indexing/vorlage.py | 43 ------------------- exercises-toolbox/2-numpy/3-filter/loesung.py | 2 + exercises-toolbox/2-numpy/4-gauss/loesung.py | 2 + .../2-numpy/5-functions/loesung.py | 28 +++++++----- .../2-numpy/5-functions/vorlage.py | 17 -------- exercises-toolbox/2-numpy/Makefile | 1 + 8 files changed, 59 insertions(+), 80 deletions(-) delete mode 100644 exercises-toolbox/2-numpy/2-indexing/vorlage.py delete mode 100644 exercises-toolbox/2-numpy/5-functions/vorlage.py diff --git a/exercises-toolbox/2-numpy/1-arrays/loesung.py b/exercises-toolbox/2-numpy/1-arrays/loesung.py index 2c959c42..d6821b37 100644 --- a/exercises-toolbox/2-numpy/1-arrays/loesung.py +++ b/exercises-toolbox/2-numpy/1-arrays/loesung.py @@ -1,5 +1,6 @@ import numpy as np +# begin solution # Aufgabe 1) a = np.zeros(shape=3) @@ -29,33 +30,40 @@ print(f"\t {name}.shape: {array.shape}") # Aufgabe 3) -# Nur Array e) und f) lassen sich addieren, bei allen anderen passen die Größen nicht zusammen. +# Nur Array e) und f) lassen sich addieren, bei allen +# anderen passen die Größen nicht zusammen. print("\nAufgabe 3)") print(f"Array d + f: {e + f}") # Aufgabe 4) print("\nAufgabe 4)") -# Anzahl der Zeilen ist die Anzahl der Elemente in f (ein Element pro Zeile), Anzahl der Spalten ist damit 1 -# Das Produkt aus den Argumenten von reshape muss immer der Anzahl an Elementen entsprechen. +# Anzahl der Zeilen ist die Anzahl der Elemente in f (ein Element +# pro Zeile), Anzahl der Spalten ist damit 1 +# Das Produkt aus den Argumenten von reshape muss immer der Anzahl +# an Elementen entsprechen. e_2d = e.reshape(1, len(e)) print(f"Array e.reshape(1, len(e)):\n{e_2d}") -# Man kann eine Dimension mit einer -1 versehen, diese wird dann automatisch ausgerechnet. +# Man kann eine Dimension mit einer -1 versehen, diese wird dann +# automatisch ausgerechnet. e_2d = e.reshape(1, -1) print(f"Array e.reshape(1, -1):\n{e_2d}") f_2d = f.reshape(len(f), 1) print(f"Array f.reshape(len(f), 1):\n{f_2d}") -# Man kann eine Dimension mit einer -1 versehen, diese wird dann automatisch ausgerechnet. +# Man kann eine Dimension mit einer -1 versehen, diese wird dann +# automatisch ausgerechnet. f_2d = f.reshape(-1, 1) print(f"Array f.reshape(-1, 1):\n{f_2d}") # Aufgabe 5) -# Das, was hier passiert nennt sich 'numpy-broadcasting' und ist eine sehr 'mächtiges' feature von numpy arrays. -# Es ist nicht notwendig dieses Feature von Anfang an zu verstehen, es erweist sich nur irgendwann als -# sehr nützlich. -# Details findest du in der Dokumentation: https://numpy.org/doc/stable/user/basics.broadcasting.html +# Das, was hier passiert nennt sich 'numpy-broadcasting' und ist eine +# sehr 'mächtiges' feature von numpy arrays. +# Es ist nicht notwendig dieses Feature von Anfang an zu verstehen, es +# erweist sich nur irgendwann als sehr nützlich. +# Details findest du in der Dokumentation: +# https://numpy.org/doc/stable/user/basics.broadcasting.html print("\nAufgabe 5*)") print("Zum Vergleich noch mal die beiden Summanden:") @@ -64,3 +72,4 @@ print(f"Array f_2d:\n{f_2d}") print(f"f_2d.shape: {f_2d.shape}") print(f"Array e_2d + f_2d:\n{e_2d + f_2d}") +# end solution diff --git a/exercises-toolbox/2-numpy/2-indexing/loesung.py b/exercises-toolbox/2-numpy/2-indexing/loesung.py index 764168ee..c0e1bc0f 100644 --- a/exercises-toolbox/2-numpy/2-indexing/loesung.py +++ b/exercises-toolbox/2-numpy/2-indexing/loesung.py @@ -22,14 +22,24 @@ print("Spielfeld zu Beginn des Spiels:") print(field) +# begin solution +# comment for vorlage.py +# end solution +# Was das hier ist lernen wir noch, kann getrost ignoriert werden. +# In der Zwischenzeit die Kurzfassung: Das 'macht' die Bilder. fig, ax = plt.subplots(1, 1, layout="constrained") mat = ax.matshow(field, cmap="Set1", vmax=5, vmin=-1) fig.savefig("Spielfeld_Loesung_Beginn.pdf") +# Hier die Lösung für Aufgabe 1 und 2 eintragen (ein Beispiel ist angegeben): +# Durch Ausführen dieser Datei kann Schritt für Schritt der Fortschritt +# überprüft werden. +field[0, 6:8] = -1 +# begin solution # Lösung für Aufgabe 1: # 2er Schiffe: -field[0, 6:8] = -1 +# field[0, 6:8] = -1 field[1:3, 2] = -1 field[4, 3:5] = -1 field[7:9, 0] = -1 @@ -53,8 +63,15 @@ # Mit Masken geht alles noch einfacher! +# end solution + print("Spielfeld zum Ende des Spiels:") print(field) +# begin solution +# comment for vorlage.py +# end solution +# Was das hier ist lernen wir noch, kann getrost ignoriert werden. +# In der Zwischenzeit die Kurzfassung: Das 'macht' die Bilder. mat.set_array(field) fig.savefig("Spielfeld_Loesung_Ende.pdf") diff --git a/exercises-toolbox/2-numpy/2-indexing/vorlage.py b/exercises-toolbox/2-numpy/2-indexing/vorlage.py deleted file mode 100644 index e83df2f7..00000000 --- a/exercises-toolbox/2-numpy/2-indexing/vorlage.py +++ /dev/null @@ -1,43 +0,0 @@ -#! /usr/bin/env python -# encoding: utf-8 - -import numpy as np -import matplotlib.pyplot as plt - -field = np.array( - [ - [4, 0, 1, 0, 0, 1, 2, 2, 0, 0], - [4, 0, 2, 0, 0, 0, 0, 0, 0, 0], - [4, 0, 2, 0, 0, 0, 0, 3, 3, 3], - [4, 0, 1, 0, 0, 1, 0, 0, 0, 0], - [0, 3, 0, 2, 2, 0, 3, 0, 4, 0], - [0, 3, 0, 0, 0, 0, 3, 0, 4, 0], - [0, 3, 1, 0, 0, 1, 3, 0, 4, 0], - [2, 0, 0, 0, 0, 0, 0, 0, 4, 0], - [2, 0, 0, 5, 5, 5, 5, 5, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - ] -) - -print("Spielfeld zu Beginn des Spiels:") -print(field) - -# Was das hier ist lernen wir noch, kann getrost ignoriert werden. -# In der Zwischenzeit die Kurzfassung: Das 'macht' die Bilder. -fig, ax = plt.subplots(1, 1, layout="constrained") -mat = ax.matshow(field, cmap="Set1", vmax=5, vmin=-1) -fig.savefig("Spielfeld_Beginn.pdf") - -# Hier die Lösung für Aufgabe 1 und 2 eintragen (ein Beispiel ist angegeben): -# Durch Ausführen dieser Datei kann Schritt für Schritt der Fortschritt -# überprüft werden. -field[0, 6:8] = -1 - - -print("Spielfeld zum Ende des Spiels:") -print(field) - -# Was das hier ist lernen wir noch, kann getrost ignoriert werden. -# In der Zwischenzeit die Kurzfassung: Das 'macht' die Bilder. -mat.set_array(field) -fig.savefig("Spielfeld_Ende.pdf") diff --git a/exercises-toolbox/2-numpy/3-filter/loesung.py b/exercises-toolbox/2-numpy/3-filter/loesung.py index 8ee29a8d..ca38b6d3 100644 --- a/exercises-toolbox/2-numpy/3-filter/loesung.py +++ b/exercises-toolbox/2-numpy/3-filter/loesung.py @@ -1,3 +1,4 @@ +# begin solution import numpy as np x, y = np.genfromtxt("data.txt", unpack=True) @@ -8,3 +9,4 @@ print("Mittelwert: ", np.mean(selected)) print("Standardabweichung: ", np.std(selected)) +# end solution diff --git a/exercises-toolbox/2-numpy/4-gauss/loesung.py b/exercises-toolbox/2-numpy/4-gauss/loesung.py index 5112fdf8..8339e981 100644 --- a/exercises-toolbox/2-numpy/4-gauss/loesung.py +++ b/exercises-toolbox/2-numpy/4-gauss/loesung.py @@ -1,3 +1,4 @@ +# begin solution import numpy as np rng = np.random.default_rng() @@ -7,3 +8,4 @@ print("Summe, neu: ", np.sum(x_new)) print("Summe, alt: ", np.sum(x_old)) +# end solution diff --git a/exercises-toolbox/2-numpy/5-functions/loesung.py b/exercises-toolbox/2-numpy/5-functions/loesung.py index b3bec5f6..7b164d62 100644 --- a/exercises-toolbox/2-numpy/5-functions/loesung.py +++ b/exercises-toolbox/2-numpy/5-functions/loesung.py @@ -1,20 +1,23 @@ #! /usr/bin/env python # encoding: utf-8 -# Ganz wichtig: KEINE PANIK! -# Diese Lösung ist etwas lang, das sollte dich aber nicht abschrecken, die meisten Zeilen -# sind print-Funktionen. Es geht hier nicht darum, die Lösung 1 zu 1 nachzuarbeiten, -# sondern darum, ein Gefühl dafür zu bekommen, wie die numpy Funktionen in unterschiedlichen -# Dimensionen funktionieren. - import numpy as np A = np.arange(5) +# begin solution +# Ganz wichtig: KEINE PANIK! +# Diese Lösung ist etwas lang, das sollte dich aber nicht abschrecken, die +# meisten Zeilen sind print-Funktionen. Es geht hier nicht darum, die +# Lösung 1 zu 1 nachzuarbeiten,sondern darum, ein Gefühl dafür zu bekommen, +# wie die numpy Funktionen in unterschiedlichen Dimensionen funktionieren. + print("Aufgabe 1)") print(f"Array A: {A}") +# end solution -# Lösung zu 1) +# Lösung zu 1) hier: +# begin solution print("\tnp.sum(A):", np.sum(A)) print("\tnp.diff(A):", np.diff(A)) print("\tnp.prod(A):", np.prod(A)) @@ -22,14 +25,17 @@ print("\tnp.std(A):", np.std(A)) print("\tnp.min(A):", np.min(A)) print("\tnp.max(A):", np.max(A)) +# end solution B = np.array([[2, 1, 2, 1, 2], [1, 2, 1, 2, 1], [3, 1, 3, 1, 3]]) +# Lösung zu 2) hier: + +# begin solution print("Aufgabe 2)") print(f"Array B:\n{B}") -# Lösung zu 2) print("\tnp.sum(B):", np.sum(B)) print("\tnp.sum(B, axis=0):", np.sum(B, axis=0)) print("\tnp.sum(B, axis=1):", np.sum(B, axis=1)) @@ -63,9 +69,10 @@ print("\tnp.max(B, axis=0):", np.max(B, axis=0)) print("\tnp.max(B, axis=1):", np.max(B, axis=1)) print("\tnp.max(B, axis=(0,1)):", np.max(B, axis=(0, 1))) +# end solution - -# Lösung zu 3) +# Lösung zu 3) hier: +# begin solution data = np.genfromtxt("einkauf.txt") print("Aufgabe 3)") @@ -127,3 +134,4 @@ max_per_day = np.max(data, axis=1, keepdims=True) print("\nMaximalausgabe pro Tag", max_per_day) +# end solution diff --git a/exercises-toolbox/2-numpy/5-functions/vorlage.py b/exercises-toolbox/2-numpy/5-functions/vorlage.py deleted file mode 100644 index 738f848a..00000000 --- a/exercises-toolbox/2-numpy/5-functions/vorlage.py +++ /dev/null @@ -1,17 +0,0 @@ -#! /usr/bin/env python -# encoding: utf-8 - - -import numpy as np - -A = np.arange(5) - -# Lösung zu 1) hier: - - -B = np.array([[2, 1, 2, 1, 2], [1, 2, 1, 2, 1], [3, 1, 3, 1, 3]]) - -# Lösung zu 2) hier: - - -# Lösung zu 3) hier: diff --git a/exercises-toolbox/2-numpy/Makefile b/exercises-toolbox/2-numpy/Makefile index 1fe79229..dbc81c1a 100644 --- a/exercises-toolbox/2-numpy/Makefile +++ b/exercises-toolbox/2-numpy/Makefile @@ -1,2 +1,3 @@ include ../../common/common.mk include ../../common/loesung.py.mk +include ../../common/generate_vorlage.mk From ef4c4b31c03c2a1d2870bb070b6175a1ba2ce461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20L=C3=BCtge?= Date: Tue, 6 Aug 2024 10:38:38 +0200 Subject: [PATCH 07/11] include 3-matplotlib although not strictly necessary, include dir to make build process consistent to other dirs as well --- common/generate_vorlage.mk | 5 +---- exercises-toolbox/3-matplotlib/1/loesung.py | 2 ++ exercises-toolbox/3-matplotlib/2/loesung.py | 2 ++ exercises-toolbox/3-matplotlib/3/loesung.py | 2 ++ exercises-toolbox/3-matplotlib/4/loesung.py | 2 ++ exercises-toolbox/3-matplotlib/5/loesung.py | 2 ++ exercises-toolbox/3-matplotlib/6/loesung.py | 2 ++ exercises-toolbox/3-matplotlib/7/loesung.py | 2 ++ exercises-toolbox/3-matplotlib/Makefile | 1 + 9 files changed, 16 insertions(+), 4 deletions(-) diff --git a/common/generate_vorlage.mk b/common/generate_vorlage.mk index 60b74b65..3f7ea9e2 100755 --- a/common/generate_vorlage.mk +++ b/common/generate_vorlage.mk @@ -1,13 +1,10 @@ -# [ ! -f 'vorlage.py.dummy' ] || cp loesung.py vorlage.py -# [ ! -f 'vorlage.py.dummy' ] || find . -name 'vorlage.py' \ -# -exec sed -i -e '/# begin solution/,/# end solution/d' {} \; - FILES := $(sort $(wildcard */loesung*.py)) define gen_vorlage = grep -q '# begin solution' $(1) && : >$(dir $1)vorlage.py @[ ! -f "$(dir $1)vorlage.py" ] || cp $(1) $(dir $1)vorlage.py @[ ! -f "$(dir $1)vorlage.py" ] || sed -i -e '/# begin solution/,/# end solution/d' $(dir $1)vorlage.py + @[ -s "$(dir $1)vorlage.py" ] || rm "$(dir $1)vorlage.py" endef all: $(FILES) diff --git a/exercises-toolbox/3-matplotlib/1/loesung.py b/exercises-toolbox/3-matplotlib/1/loesung.py index 50c05fc0..d21ff43b 100644 --- a/exercises-toolbox/3-matplotlib/1/loesung.py +++ b/exercises-toolbox/3-matplotlib/1/loesung.py @@ -1,3 +1,4 @@ +# begin solution import matplotlib.pyplot as plt import numpy as np @@ -11,3 +12,4 @@ ax.set_ylabel(r"$x^2$") fig.savefig("loesung.pdf") +# end solution diff --git a/exercises-toolbox/3-matplotlib/2/loesung.py b/exercises-toolbox/3-matplotlib/2/loesung.py index a94c9936..e4ad3975 100644 --- a/exercises-toolbox/3-matplotlib/2/loesung.py +++ b/exercises-toolbox/3-matplotlib/2/loesung.py @@ -1,3 +1,4 @@ +# begin solution import matplotlib.pyplot as plt import numpy as np @@ -12,3 +13,4 @@ ax.set_xlabel(r"$x$") fig.savefig("loesung.pdf") +# end solution diff --git a/exercises-toolbox/3-matplotlib/3/loesung.py b/exercises-toolbox/3-matplotlib/3/loesung.py index 6d82de0f..489af052 100644 --- a/exercises-toolbox/3-matplotlib/3/loesung.py +++ b/exercises-toolbox/3-matplotlib/3/loesung.py @@ -1,3 +1,4 @@ +# begin solution import matplotlib.pyplot as plt import numpy as np @@ -20,3 +21,4 @@ ax2.set_yscale("log") fig.savefig("loesung.pdf") +# end solution diff --git a/exercises-toolbox/3-matplotlib/4/loesung.py b/exercises-toolbox/3-matplotlib/4/loesung.py index 749fb293..8004c0c0 100644 --- a/exercises-toolbox/3-matplotlib/4/loesung.py +++ b/exercises-toolbox/3-matplotlib/4/loesung.py @@ -1,3 +1,4 @@ +# begin solution import matplotlib.pyplot as plt import numpy as np @@ -29,3 +30,4 @@ ax.legend() fig.savefig("loesung.pdf") +# end solution diff --git a/exercises-toolbox/3-matplotlib/5/loesung.py b/exercises-toolbox/3-matplotlib/5/loesung.py index 3952b846..55adaa36 100644 --- a/exercises-toolbox/3-matplotlib/5/loesung.py +++ b/exercises-toolbox/3-matplotlib/5/loesung.py @@ -1,3 +1,4 @@ +# begin solution import matplotlib.pyplot as plt import numpy as np @@ -25,3 +26,4 @@ ax.legend() fig.savefig("loesung.pdf") +# end solution diff --git a/exercises-toolbox/3-matplotlib/6/loesung.py b/exercises-toolbox/3-matplotlib/6/loesung.py index deb1efa5..ca564e36 100644 --- a/exercises-toolbox/3-matplotlib/6/loesung.py +++ b/exercises-toolbox/3-matplotlib/6/loesung.py @@ -1,3 +1,4 @@ +# begin solution import numpy as np import matplotlib.pyplot as plt @@ -11,3 +12,4 @@ ax.legend(loc="upper left") ax.set_xlabel("$x$") fig.savefig("loesung.pdf") +# end solution diff --git a/exercises-toolbox/3-matplotlib/7/loesung.py b/exercises-toolbox/3-matplotlib/7/loesung.py index a770fc00..07d744d6 100644 --- a/exercises-toolbox/3-matplotlib/7/loesung.py +++ b/exercises-toolbox/3-matplotlib/7/loesung.py @@ -1,3 +1,4 @@ +# begin solution import numpy as np import matplotlib.pyplot as plt @@ -13,3 +14,4 @@ ax.set_xlabel("$x$") ax.set_ylabel(r"$A \cos(x)$") fig.savefig("loesung.pdf") +# end solution diff --git a/exercises-toolbox/3-matplotlib/Makefile b/exercises-toolbox/3-matplotlib/Makefile index 1fe79229..dbc81c1a 100644 --- a/exercises-toolbox/3-matplotlib/Makefile +++ b/exercises-toolbox/3-matplotlib/Makefile @@ -1,2 +1,3 @@ include ../../common/common.mk include ../../common/loesung.py.mk +include ../../common/generate_vorlage.mk From 59a2817f284767c193b6e986aeb311e3c85fbb18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20L=C3=BCtge?= Date: Tue, 6 Aug 2024 12:15:57 +0200 Subject: [PATCH 08/11] more generalised targets trying to make the build process more general and robust --- common/gen_vorlage.sh | 6 ++++++ common/generate_vorlage.mk | 15 +++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 common/gen_vorlage.sh diff --git a/common/gen_vorlage.sh b/common/gen_vorlage.sh new file mode 100644 index 00000000..0fa5e5d8 --- /dev/null +++ b/common/gen_vorlage.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +grep -q '# begin solution' ${1//vorlage/loesung} && : >$1 +[ ! -f $1 ] || cp ${1//vorlage/loesung} $1 +[ ! -f $1 ] || sed -i -e '/# begin solution/,/# end solution/d' $1 +[ -s $1 ] || rm $1 diff --git a/common/generate_vorlage.mk b/common/generate_vorlage.mk index 3f7ea9e2..0af3d3b6 100755 --- a/common/generate_vorlage.mk +++ b/common/generate_vorlage.mk @@ -1,11 +1,10 @@ FILES := $(sort $(wildcard */loesung*.py)) +targets := $(subst loesung,vorlage,$(FILES)) -define gen_vorlage = - grep -q '# begin solution' $(1) && : >$(dir $1)vorlage.py - @[ ! -f "$(dir $1)vorlage.py" ] || cp $(1) $(dir $1)vorlage.py - @[ ! -f "$(dir $1)vorlage.py" ] || sed -i -e '/# begin solution/,/# end solution/d' $(dir $1)vorlage.py - @[ -s "$(dir $1)vorlage.py" ] || rm "$(dir $1)vorlage.py" -endef -all: $(FILES) - $(foreach loesung, $(FILES), $(call gen_vorlage,$(loesung));) +all: $(FILES) $(targets) + # $(foreach (loesung,vorlage), ($(FILES), $(targets)), $(call gen_vorlage,$(loesung),$(vorlage));) + +$(targets): %: ../../common/gen_vorlage.sh + @echo $@ + bash $< $@ From 40ae9cd357cf32e6b0444ced1eb48321dd9f5f2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20L=C3=BCtge?= Date: Tue, 6 Aug 2024 13:05:45 +0200 Subject: [PATCH 09/11] add 4-scipy also make own code more flake8 complient changed ambigous variable name I --- .../4-scipy/1-constants/loesung.py | 5 +++- .../4-scipy/2-linregress/aufgabe.txt | 8 +----- .../4-scipy/2-linregress/loesung.py | 6 +++++ .../4-scipy/3-polyfit/loesung.py | 8 +++--- .../4-scipy/4-curve_fit/loesung.py | 19 +++++++++++--- .../4-scipy/4-curve_fit/vorlage.py | 23 ----------------- .../4-scipy/5-peakdetect/loesung.py | 11 ++++++-- .../4-scipy/5-peakdetect/vorlage.py | 25 ------------------- .../4-scipy/6-beugung/loesung.py | 21 +++++++++++----- .../4-scipy/6-beugung/vorlage.py | 25 ------------------- exercises-toolbox/4-scipy/Makefile | 3 +++ 11 files changed, 58 insertions(+), 96 deletions(-) delete mode 100644 exercises-toolbox/4-scipy/4-curve_fit/vorlage.py delete mode 100644 exercises-toolbox/4-scipy/5-peakdetect/vorlage.py delete mode 100644 exercises-toolbox/4-scipy/6-beugung/vorlage.py create mode 100644 exercises-toolbox/4-scipy/Makefile diff --git a/exercises-toolbox/4-scipy/1-constants/loesung.py b/exercises-toolbox/4-scipy/1-constants/loesung.py index f2ca2e2c..20c14317 100644 --- a/exercises-toolbox/4-scipy/1-constants/loesung.py +++ b/exercises-toolbox/4-scipy/1-constants/loesung.py @@ -1,6 +1,8 @@ -from scipy.constants import find, physical_constants +# begin solution +from scipy.constants import physical_constants # Found using find() in IPython: +# from scipy.constants import find for name in [ "Planck constant", @@ -10,3 +12,4 @@ "electron g factor", ]: print(name, physical_constants[name]) +# end solution diff --git a/exercises-toolbox/4-scipy/2-linregress/aufgabe.txt b/exercises-toolbox/4-scipy/2-linregress/aufgabe.txt index 3a321257..63af9831 100644 --- a/exercises-toolbox/4-scipy/2-linregress/aufgabe.txt +++ b/exercises-toolbox/4-scipy/2-linregress/aufgabe.txt @@ -15,10 +15,4 @@ B = (Σ(x²) * (Σy) - (Σx) * (Σx * y)) / Δ A_error = σ_y * sqrt(N / Δ) B_error = σ_y * sqrt((Σx²) / Δ) -Nutze folgendes Gerüst: - -import numpy as np - -def linregress(x, y): - … - return A, A_error, B, B_error +Nutze das Gerüst in der Datei vorlage.py. diff --git a/exercises-toolbox/4-scipy/2-linregress/loesung.py b/exercises-toolbox/4-scipy/2-linregress/loesung.py index cf730723..f22aec4d 100644 --- a/exercises-toolbox/4-scipy/2-linregress/loesung.py +++ b/exercises-toolbox/4-scipy/2-linregress/loesung.py @@ -2,6 +2,8 @@ def linregress(x, y): + # … + # begin solution assert len(x) == len(y) x, y = np.array(x), np.array(y) @@ -17,9 +19,13 @@ def linregress(x, y): A_error = sigma_y * np.sqrt(N / Delta) B_error = sigma_y * np.sqrt(np.sum(x**2) / Delta) + # end solution return A, A_error, B, B_error +# begin solution + if __name__ == "__main__": x, y = np.genfromtxt("data.txt", unpack=True) print(linregress(x, y)) +# end solution diff --git a/exercises-toolbox/4-scipy/3-polyfit/loesung.py b/exercises-toolbox/4-scipy/3-polyfit/loesung.py index b94721a7..abc04df2 100644 --- a/exercises-toolbox/4-scipy/3-polyfit/loesung.py +++ b/exercises-toolbox/4-scipy/3-polyfit/loesung.py @@ -1,3 +1,4 @@ +# begin solution import numpy as np import matplotlib.pyplot as plt @@ -14,14 +15,14 @@ def f(x, a, b, c): - return a * (x + b)**2 + c + return a * (x + b) ** 2 + c parameters, covariance_matrix = np.polyfit(x, y, deg=2, cov=True) uncertainties = np.sqrt(np.diag(covariance_matrix)) -for name, value, unc in zip('abc', parameters, uncertainties): - print(f'{name} = {value:.3f} ± {unc:.3f}') +for name, value, unc in zip("abc", parameters, uncertainties): + print(f"{name} = {value:.3f} ± {unc:.3f}") fig = plt.figure(layout="constrained") ax = fig.add_subplot() @@ -38,3 +39,4 @@ def f(x, a, b, c): ax.legend() plt.savefig("loesung.pdf") +# end solution diff --git a/exercises-toolbox/4-scipy/4-curve_fit/loesung.py b/exercises-toolbox/4-scipy/4-curve_fit/loesung.py index 17dfe34d..22aa49a6 100644 --- a/exercises-toolbox/4-scipy/4-curve_fit/loesung.py +++ b/exercises-toolbox/4-scipy/4-curve_fit/loesung.py @@ -1,7 +1,8 @@ -import matplotlib.pyplot as plt import numpy as np +import matplotlib.pyplot as plt from scipy.optimize import curve_fit +# begin solution # Datenfile erzeugen rng = np.random.default_rng(42) N = 50 @@ -13,21 +14,31 @@ # Ab hier beginnt die Lösung x, y, e_y = np.genfromtxt("daten.txt", unpack=True) +# end solution + def f(x, a, b, c, d): + # hier Funktion ergänzen + # begin solution return a * np.sin(b * x + c) + d + # end solution +# hier Fit ergänzen +# parameters = ? +# begin solution parameters, pcov = curve_fit(f, x, y, sigma=e_y) print(parameters, np.sqrt(np.diag(pcov)), sep="\n") +# end solution +# Dieser Code erstellt einen Plot mithilfe von f und parameters fig, ax = plt.subplots(1, 1, layout="constrained") - ax.errorbar(x, y, yerr=e_y, fmt="k.", label="Daten") t = np.linspace(-0.5, 2 * np.pi + 0.5, 500) -ax.plot(t, f(t, *parameters), label="Fit") -ax.plot(t, np.sin(t), "--", label="Original") + +ax.plot(t, f(t, *parameters), "b-", label="Fit") +ax.plot(t, np.sin(t), "g--", label="Original") ax.set_xlim(t[0], t[-1]) ax.set_xlabel(r"$t$") diff --git a/exercises-toolbox/4-scipy/4-curve_fit/vorlage.py b/exercises-toolbox/4-scipy/4-curve_fit/vorlage.py deleted file mode 100644 index 5d41c4f4..00000000 --- a/exercises-toolbox/4-scipy/4-curve_fit/vorlage.py +++ /dev/null @@ -1,23 +0,0 @@ -import numpy as np -from scipy.optimize import curve_fit -import matplotlib.pyplot as plt - -def f(x, a, b, c, d): - # hier Funktion ergänzen - -# hier Fit ergänzen -parameters = ? - -# Dieser Code erstellt einen Plot mithilfe von f und parameters -fig, ax = plt.subplots(1, 1, layout="constrained") -ax.errorbar(x, y, yerr=e_y, fmt="rx", label="Daten") - -t = np.linspace(-0.5, 2 * np.pi + 0.5) - -ax.plot(t, f(t, *parameters), "b-", label="Fit") -ax.plot(t, np.sin(t), "g--", label="Original") -ax.set_xlim(t[0], t[-1]) -ax.set_xlabel(r"$t$") -ax.set_ylabel(r"$f(t)$") -ax.legend() -fig.savefig("loesung.pdf") diff --git a/exercises-toolbox/4-scipy/5-peakdetect/loesung.py b/exercises-toolbox/4-scipy/5-peakdetect/loesung.py index d217d864..68710aac 100644 --- a/exercises-toolbox/4-scipy/5-peakdetect/loesung.py +++ b/exercises-toolbox/4-scipy/5-peakdetect/loesung.py @@ -3,6 +3,8 @@ from scipy.signal import find_peaks import matplotlib.pyplot as plt +# begin solution + def e(x, a, b, c): return a * np.exp(b * x) + c @@ -19,17 +21,22 @@ def e(x, a, b, c): parameters_min, pcov_min = curve_fit(e, t[mins], U[mins]) print(parameters_min, np.sqrt(np.diag(pcov_min)), sep="\n") +# end solution + +# parameters_max = # +# parameters_min = # +# Dieser Code erzeugt den Plot fig, ax = plt.subplots(1, 1, layout="constrained") x = np.linspace(0, ax.get_xlim()[1], 500) ax.plot(t, U, "k-", label="Gedämpfte Schwingung") -ax.plot(x, e(x, *parameters_max), label="Obere Einhüllende") +ax.plot(x, e(x, *parameters_max), "g-", label="Obere Einhüllende") ax.plot(t[maxs], U[maxs], "o", color="C0", label="Maxima") -ax.plot(x, e(x, *parameters_min), label="Untere Einhüllende") +ax.plot(x, e(x, *parameters_min), "y-", label="Untere Einhüllende") ax.plot(t[mins], U[mins], "o", color="C1", label="Minima") ax.set_xlabel(r"$t \ / \ \mathrm{ms}$") diff --git a/exercises-toolbox/4-scipy/5-peakdetect/vorlage.py b/exercises-toolbox/4-scipy/5-peakdetect/vorlage.py deleted file mode 100644 index cc30d343..00000000 --- a/exercises-toolbox/4-scipy/5-peakdetect/vorlage.py +++ /dev/null @@ -1,25 +0,0 @@ -import numpy as np -from scipy.optimize import curve_fit -from scipy.signal import find_peaks_cwt -import matplotlib.pyplot as plt - -parameters_max = # - -parameters_min = # - -# Dieser Code erzeugt den Plot -fig, ax = plt.subplots(1, 1, layout="constrained") - -ax.plot(t, U, "b-", label="Gedämpfte Schwingung") - -ax.plot(t[maxs], U[maxs], "rx", label="Extrema") -ax.plot(x, e(x, *parameters_max), "g-", label="Obere Einhüllende") - -ax.plot(t[mins], U[mins], "rx") -ax.plot(x, e(x, *parameters_min), "y-", label="Untere Einhüllende") - -ax.set_xlabel(r"$t \ / \ \mathrm{ms}$") -ax.set_ylabel(r"$U \ / \ \mathrm{V}$") -ax.set_xlim(0, 0.3) -ax.legend() -fig.savefig("loesung.pdf") diff --git a/exercises-toolbox/4-scipy/6-beugung/loesung.py b/exercises-toolbox/4-scipy/6-beugung/loesung.py index 2d211fcb..9d50d2db 100644 --- a/exercises-toolbox/4-scipy/6-beugung/loesung.py +++ b/exercises-toolbox/4-scipy/6-beugung/loesung.py @@ -4,6 +4,8 @@ def theory(phi, A0, b): + """Hier Funktion ergänzen""" + # begin solution return (A0 * b * np.sinc(b * np.sin(phi) / lambda_)) ** 2 @@ -11,25 +13,32 @@ def theory(phi, A0, b): L *= 1e-2 lambda_ = np.genfromtxt("lambda.txt") lambda_ *= 1e-9 -zeta, I = np.genfromtxt("I.txt", unpack=True) +zeta, current = np.genfromtxt("I.txt", unpack=True) zeta *= 1e-3 -I *= 1e-9 +current *= 1e-9 -zeta_0 = zeta[np.argmax(I)] +zeta_0 = zeta[np.argmax(current)] phi = (zeta - zeta_0) / L -parameters, pcov = curve_fit(theory, phi, I, p0=[np.sqrt(np.max(I)) / 1e-4, 1e-4]) +parameters, pcov = curve_fit( + theory, phi, current, p0=[np.sqrt(np.max(current)) / 1e-4, 1e-4] +) print(parameters, np.sqrt(np.diag(pcov)), sep="\n") print( - f"Die Spaltbreite b beträgt ({parameters[1]:.6f} ± {np.sqrt(np.diag(pcov))[1]:.6f}) m." + f"Die Spaltbreite b beträgt ({parameters[1]:.6f} ±\ + {np.sqrt(np.diag(pcov))[1]:.6f}) m." ) +# end solution +# Hier Fit ergänzen +# parameters, cov = # +# Hier wird der Plot erstellt x = np.linspace(-0.03, 0.03, 100) fig, ax = plt.subplots(1, 1, layout="constrained") ax.plot(x, theory(x, *parameters), "-", label="Fit") -ax.plot(phi, I, "k.", label="Daten") +ax.plot(phi, current, "k.", label="Daten") ax.set_xlabel(r"$\varphi \ / \ \mathrm{rad}$") ax.set_ylabel(r"$I \ / \ \mathrm{A}$") diff --git a/exercises-toolbox/4-scipy/6-beugung/vorlage.py b/exercises-toolbox/4-scipy/6-beugung/vorlage.py deleted file mode 100644 index ac9a984a..00000000 --- a/exercises-toolbox/4-scipy/6-beugung/vorlage.py +++ /dev/null @@ -1,25 +0,0 @@ -import numpy as np -from scipy.optimize import curve_fit -import matplotlib.pyplot as plt - - -def theory(phi, A0, b): - """Hier Funktion ergänzen""" - - -# Hier Fit ergänzen -parameters, cov = # - -# Hier wird der Plot erstellt -x = np.linspace(-0.03, 0.03, 100) - -fig, ax = plt.subplots(1, 1, layout="constrained") - -ax.plot(x, theory(x, *parameters), "-", label="Fit") -ax.plot(phi, I, "k.", label="Daten") - -ax.set_xlabel(r"$\varphi \ / \ \mathrm{rad}$") -ax.set_ylabel(r"$I \ / \ \mathrm{A}$") -ax.legend(loc="best") - -fig.savefig("loesung.pdf") diff --git a/exercises-toolbox/4-scipy/Makefile b/exercises-toolbox/4-scipy/Makefile new file mode 100644 index 00000000..dbc81c1a --- /dev/null +++ b/exercises-toolbox/4-scipy/Makefile @@ -0,0 +1,3 @@ +include ../../common/common.mk +include ../../common/loesung.py.mk +include ../../common/generate_vorlage.mk From f094e38c67a8f0b4beecb0ecc818a0b728870f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20L=C3=BCtge?= Date: Tue, 6 Aug 2024 13:29:25 +0200 Subject: [PATCH 10/11] add 5-uncertainties flake8 adjustments: - import at top of file - renamed unumpy.sin to usin with second sin import later - shorter comment line --- exercises-toolbox/5-uncertainties/1-formel/loesung.py | 9 +++++---- .../5-uncertainties/2-linregress/aufgabe.txt | 7 +------ .../5-uncertainties/2-linregress/loesung.py | 8 ++++++++ .../5-uncertainties/3-curve_fit/aufgabe.txt | 7 +------ exercises-toolbox/5-uncertainties/3-curve_fit/loesung.py | 6 ++++++ .../5-uncertainties/4-linleastsquares/loesung.py | 9 +++++---- exercises-toolbox/5-uncertainties/Makefile | 1 + 7 files changed, 27 insertions(+), 20 deletions(-) diff --git a/exercises-toolbox/5-uncertainties/1-formel/loesung.py b/exercises-toolbox/5-uncertainties/1-formel/loesung.py index 3197d3e2..4db63001 100644 --- a/exercises-toolbox/5-uncertainties/1-formel/loesung.py +++ b/exercises-toolbox/5-uncertainties/1-formel/loesung.py @@ -1,17 +1,17 @@ +# begin solution from uncertainties import ufloat -from uncertainties.unumpy import sin +from uncertainties.unumpy import sin as usin +from sympy import var, sin x = ufloat(4.56, 0.2) y = ufloat(2.11, 0.3) z = ufloat(10, 1) -Q = x**2 * sin(y) + z +Q = x**2 * usin(y) + z print(f"Q = {Q}") print(Q.n, Q.s) -from sympy import var, sin - x, y, z = var("x y z") Q = x**2 * sin(y) + z @@ -19,3 +19,4 @@ print(f"d/dx {Q} = {Q.diff(x)}") print(f"d/dy {Q} = {Q.diff(y)}") print(f"d/dz {Q} = {Q.diff(z)}") +# end solution diff --git a/exercises-toolbox/5-uncertainties/2-linregress/aufgabe.txt b/exercises-toolbox/5-uncertainties/2-linregress/aufgabe.txt index 095030a4..142ad97c 100644 --- a/exercises-toolbox/5-uncertainties/2-linregress/aufgabe.txt +++ b/exercises-toolbox/5-uncertainties/2-linregress/aufgabe.txt @@ -8,9 +8,4 @@ Ausgabe durch Verwendung von uncertainties vereinfacht. Dabei sollte ein Array aus A und B zurückgegeben werden, wobei A und B ufloats sind. -Nutze folgendes Gerüst: - -def ulinregress(x, y): - … - … = linregress(x, y) - … +Nutze das gegebene Gerüst aus der Datei vorlage.py: diff --git a/exercises-toolbox/5-uncertainties/2-linregress/loesung.py b/exercises-toolbox/5-uncertainties/2-linregress/loesung.py index d1fb7400..425699cd 100644 --- a/exercises-toolbox/5-uncertainties/2-linregress/loesung.py +++ b/exercises-toolbox/5-uncertainties/2-linregress/loesung.py @@ -1,3 +1,4 @@ +# begin solution import numpy as np import uncertainties.unumpy as unp @@ -24,3 +25,10 @@ def linregress(x, y): def ulinregress(x, y): A, A_error, B, B_error = linregress(x, y) return unp.uarray([A, B], [A_error, B_error]) + + +# end solution +# def ulinregress(x, y): +# … +# … = linregress(x, y) +# … diff --git a/exercises-toolbox/5-uncertainties/3-curve_fit/aufgabe.txt b/exercises-toolbox/5-uncertainties/3-curve_fit/aufgabe.txt index d549c551..7641b8c4 100644 --- a/exercises-toolbox/5-uncertainties/3-curve_fit/aufgabe.txt +++ b/exercises-toolbox/5-uncertainties/3-curve_fit/aufgabe.txt @@ -17,12 +17,7 @@ Die Rückgabe sollte als Array von ufloats erfolgen. Die Dokumentation von curve_fit könnte nützlich sein: http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html -Nutze dazu folgendes Gerüst: - -def ucurve_fit(f, x, y, **kwargs): - … - … = scipy.optimize.curve_fit(…, **kwargs) - … +Nutze dazu das gegebene Gerüst in der Datei vorlage.py. Überprüfe deine Wrapper-Implementation an den Daten in daten.txt und fitte diese an diff --git a/exercises-toolbox/5-uncertainties/3-curve_fit/loesung.py b/exercises-toolbox/5-uncertainties/3-curve_fit/loesung.py index e1dcb227..d4420104 100644 --- a/exercises-toolbox/5-uncertainties/3-curve_fit/loesung.py +++ b/exercises-toolbox/5-uncertainties/3-curve_fit/loesung.py @@ -1,3 +1,4 @@ +# begin solution import matplotlib.pyplot as plt import numpy as np import scipy.optimize @@ -48,3 +49,8 @@ def f(x, a, b, c): ax.set_xticks([0, np.pi, 2 * np.pi, 3 * np.pi], [0, "π", "2π", "3π"]) ax.legend() plt.savefig("loesung.pdf") +# end solution +# def ucurve_fit(f, x, y, **kwargs): +# … +# … = scipy.optimize.curve_fit(…, **kwargs) +# … diff --git a/exercises-toolbox/5-uncertainties/4-linleastsquares/loesung.py b/exercises-toolbox/5-uncertainties/4-linleastsquares/loesung.py index d5db0041..d09ec701 100644 --- a/exercises-toolbox/5-uncertainties/4-linleastsquares/loesung.py +++ b/exercises-toolbox/5-uncertainties/4-linleastsquares/loesung.py @@ -1,3 +1,4 @@ +# begin solution import matplotlib.pyplot as plt import numpy as np import uncertainties as unc @@ -44,16 +45,15 @@ def linear_combination(x, functions, params): print(params) for i, param in enumerate(params): - # for ufloat formatting see https://pythonhosted.org/uncertainties/user_guide.html + # for ufloat formatting see + # https://pythonhosted.org/uncertainties/user_guide.html print(f"p_{i} = {param:P}") x_plot = np.linspace(-0.1, 2 * np.pi + 0.1, 100) fig, ax = plt.subplots(1, 1, layout="constrained") - ax.errorbar( - x, unp.nominal_values(y), yerr=unp.std_devs(y), fmt="k+", label="Daten" - ) + ax.errorbar(x, unp.nominal_values(y), yerr=unp.std_devs(y), fmt="k+", label="Daten") ax.plot( x_plot, unp.nominal_values(linear_combination(x_plot, functions, params)), @@ -64,3 +64,4 @@ def linear_combination(x, functions, params): ax.set_xlim(-0.1, 2 * np.pi + 0.1) ax.legend() fig.savefig("loesung.pdf") +# end solution diff --git a/exercises-toolbox/5-uncertainties/Makefile b/exercises-toolbox/5-uncertainties/Makefile index 3558de3f..e809ec11 100644 --- a/exercises-toolbox/5-uncertainties/Makefile +++ b/exercises-toolbox/5-uncertainties/Makefile @@ -1,5 +1,6 @@ include ../../common/common.mk include ../../common/loesung.py.mk +include ../../common/generate_vorlage.mk all: 4-linleastsquares/FORCE From 6d722dfa41069ff6433397c0a3a203cf3e516b17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20L=C3=BCtge?= Date: Tue, 6 Aug 2024 14:16:21 +0200 Subject: [PATCH 11/11] adding 8-all --- .../8-all/303_Der_Lock-In-Verstaerker/loesung.py | 2 ++ .../loesung.py | 2 ++ .../8-all/702_Aktivierung_mit_Neutronen/aufgabe.txt | 4 +--- .../8-all/702_Aktivierung_mit_Neutronen/loesung.py | 6 ++++-- exercises-toolbox/8-all/Makefile | 1 + exercises-toolbox/8-all/corona/aufgabe.txt | 2 +- exercises-toolbox/8-all/corona/geruest.py | 12 ------------ exercises-toolbox/8-all/corona/loesung.py | 2 ++ 8 files changed, 13 insertions(+), 18 deletions(-) delete mode 100644 exercises-toolbox/8-all/corona/geruest.py diff --git a/exercises-toolbox/8-all/303_Der_Lock-In-Verstaerker/loesung.py b/exercises-toolbox/8-all/303_Der_Lock-In-Verstaerker/loesung.py index c4ab0569..bd56a79a 100644 --- a/exercises-toolbox/8-all/303_Der_Lock-In-Verstaerker/loesung.py +++ b/exercises-toolbox/8-all/303_Der_Lock-In-Verstaerker/loesung.py @@ -1,3 +1,4 @@ +# begin solution import numpy as np from uncertainties.unumpy import nominal_values as noms import matplotlib.pyplot as plt @@ -27,3 +28,4 @@ def Ur(r, A, B, C): ax.set_ylabel(r"$U \,/\, \mathrm{V}$") ax.legend(loc="upper right") fig.savefig("loesung.pdf") +# end solution diff --git a/exercises-toolbox/8-all/354_Gedaempfte_und_erzwungene_Schwingungen/loesung.py b/exercises-toolbox/8-all/354_Gedaempfte_und_erzwungene_Schwingungen/loesung.py index 2cfaa3d5..a6f3be21 100644 --- a/exercises-toolbox/8-all/354_Gedaempfte_und_erzwungene_Schwingungen/loesung.py +++ b/exercises-toolbox/8-all/354_Gedaempfte_und_erzwungene_Schwingungen/loesung.py @@ -1,3 +1,4 @@ +# begin solution import numpy as np import matplotlib.pyplot as plt @@ -52,3 +53,4 @@ ax.grid(True) ax.legend(bbox_to_anchor=(0.45, 0.8, 0, 0)) fig.savefig("loesung-polar.pdf") +# end solution diff --git a/exercises-toolbox/8-all/702_Aktivierung_mit_Neutronen/aufgabe.txt b/exercises-toolbox/8-all/702_Aktivierung_mit_Neutronen/aufgabe.txt index a7e0807b..c843cf09 100644 --- a/exercises-toolbox/8-all/702_Aktivierung_mit_Neutronen/aufgabe.txt +++ b/exercises-toolbox/8-all/702_Aktivierung_mit_Neutronen/aufgabe.txt @@ -14,6 +14,4 @@ log(N) = A * t + B Erstelle einen halblogarithmischen Plot von N gegen t, der die Messpunkte mit Fehlerbalken und die Regressionsgerade beinhaltet. Benutze für die lineare Regression die Funktion ulinregress aus der mitgelieferten Datei linregress.py. -Sie kann folgendermaßen eingebunden werden: - -from linregress import ulinregess +Diese kann in eine python Datei eingebunden werden, wie in der Datei vorlage.py gezeigt. diff --git a/exercises-toolbox/8-all/702_Aktivierung_mit_Neutronen/loesung.py b/exercises-toolbox/8-all/702_Aktivierung_mit_Neutronen/loesung.py index 852088df..f52f3519 100644 --- a/exercises-toolbox/8-all/702_Aktivierung_mit_Neutronen/loesung.py +++ b/exercises-toolbox/8-all/702_Aktivierung_mit_Neutronen/loesung.py @@ -1,11 +1,12 @@ +from linregress import ulinregress + +# begin solution import numpy as np import uncertainties as unc import uncertainties.unumpy as unp from uncertainties.unumpy import nominal_values as noms, std_devs as stds import matplotlib.pyplot as plt -from linregress import ulinregress - Delta_t_0 = np.genfromtxt("Delta_t_0.txt") N_0 = np.genfromtxt("N_0.txt") N_0 = unc.ufloat(N_0, np.sqrt(N_0)) @@ -34,3 +35,4 @@ ax.set_yticks([8e2, 1e3, 3e3], [r"$8 \cdot 10^2$", r"$10^3$", r"$3 \cdot 10^3$"]) ax.legend(loc="upper right") fig.savefig("loesung.pdf") +# end solution diff --git a/exercises-toolbox/8-all/Makefile b/exercises-toolbox/8-all/Makefile index d370e03d..3a052676 100644 --- a/exercises-toolbox/8-all/Makefile +++ b/exercises-toolbox/8-all/Makefile @@ -1,4 +1,5 @@ include ../../common/common.mk +include ../../common/generate_vorlage.mk DIRS := $(sort $(wildcard *)) BUILDS := $(addsuffix _build, $(DIRS)) diff --git a/exercises-toolbox/8-all/corona/aufgabe.txt b/exercises-toolbox/8-all/corona/aufgabe.txt index 7d8a33ab..5e6ca763 100644 --- a/exercises-toolbox/8-all/corona/aufgabe.txt +++ b/exercises-toolbox/8-all/corona/aufgabe.txt @@ -5,7 +5,7 @@ https://open-data.dortmund.de/api/explore/v2.1/catalog/datasets/fb53-coronafallz können die Verlaufszahlen der Coronafälle der Stadt Dortmund als csv-Datei heruntergeladen werden. -In `geruest.py` ist ein Vorschlag wie die Daten eingelesen werden können. +In der Datei `vorlage.py` ist ein Vorschlag wie die Daten eingelesen werden können. Schaut in der Dokumentation nach, was die einzelnen Punkte bedeuten. Erstellt mit den Werten 3 Balkendiagramme mit den folgenden Inhalten: diff --git a/exercises-toolbox/8-all/corona/geruest.py b/exercises-toolbox/8-all/corona/geruest.py deleted file mode 100644 index 1dc3baaf..00000000 --- a/exercises-toolbox/8-all/corona/geruest.py +++ /dev/null @@ -1,12 +0,0 @@ -import numpy as np - -data = np.genfromtxt( - "./FB53-Coronafallzahlen.csv", - delimiter=";", - names=True, # column names from first row, - encoding="utf-8-sig", # the file has a BOM, - dtype=None, # guess dtypes (keeps Datum a str and the rest integer), - missing_values="-", # missing value indicator -) - -### print(data.dtype.names) diff --git a/exercises-toolbox/8-all/corona/loesung.py b/exercises-toolbox/8-all/corona/loesung.py index 4570610c..2100e53b 100644 --- a/exercises-toolbox/8-all/corona/loesung.py +++ b/exercises-toolbox/8-all/corona/loesung.py @@ -10,6 +10,7 @@ missing_values="-", # missing value indicator ) +# begin solution spalten = data.dtype.names dortmund = 6.03609 @@ -124,3 +125,4 @@ ax.set_ylim(0, np.max(data["aktuell_erkrankte_personen"]) * 1.05) fig.savefig("build/loesung-aktuell.pdf") fig.clf() +# end solution