{{backlinks>.}} ===== String, RegEx: Drei Chinesen mit dem Kontrabass ===== * Aufgabenstellung: https://www.programmieraufgaben.ch/aufgabe/kontrabass-1/xk5w4mq7 ==== Lösungen ==== === Simon === # coding: utf-8 # Diese Funktion muss ergänzt werden def ersetzen(text, vokal) text = String.new(text) # Kopie vom String text.gsub!(/ä|ei|[aeiou]/,vokal) text.gsub!(/#{vokal}{2}/,vokal) return text end text = "Drei Chinesen mit dem Kontrabass saßen auf der Strasse und erzählten sich was. Da kam die Polizei, fragt: \"Was ist denn das?\" Drei Chinesen mit dem Kontrabass. " a=1 v = ["a","e","i","o","u","ä","ü","ö"] while (true) puts "Original\n\n#{text}\n\n" print "Vokal oder Diphthong: " vokal = gets.chomp if v.include?(vokal) then puts "\n#{ersetzen(text,vokal)}\n\n" else break end end ===== Datensalat: Schraubensack ===== Aufgabenstellung: https://www.programmieraufgaben.ch/aufgabe/schraubensack/uk540btd [[efinf:blc2016:loesungen-2016-12-13:schraubensack|Überlegungen zur Komplexität der verschiedenen Lösungsalgorithmen]] ==== Lösungen ==== === Simon === file = File.read("schrauben.txt") for i in 1..60 s = file.scan(/s\s(#{i})$/).size m = file.scan(/m\s(#{i})$/).size if (s!=0 and m!=0) then a = [s,m] n = a.min puts "#{i}mm: #{n} passende Paare" end end === Luca === def min(*values) values.min end def max(*values) values.max end liste = File.open("schrauben.txt", "r"){ |file| file.read.split(" ").each_slice(2).to_a.each{|e| e[1] = e[1].to_i}} muttern = Array.new(150, 0) schrauben = Array.new(150, 0) liste.each{|e| if e[0]=="m" then muttern[e[1]]+=1 elsif e[0]=="s" then schrauben[e[1]]+=1 end} for e in 0..149 do minimum = min(muttern[e],schrauben[e]) puts "#{e}mm: #{minimum} passende Paare" if minimum != 0 end === Noel === 1]; } } else { if(isset($s[$v[1]])) { $s[$v[1]] += 1; } else { $s += [$v[1] => 1]; } } } ?> ===Patrick=== liste = File.readlines("schrauben.txt").map{|l| l.split(" ")}.map{|l| [l[0],l[1].to_i]} liste.sort!{|a,b| # a und b stehen für die Arrays # sortiergeschwindigkeit ist O(nlog(n)) if a[1]==b[1] # wenn die Zahlen gleich sind, dann werden die Buchstaben verglichen. PC kennt Reihenfolge der Buchstaben a[0]<=>b[0] # liefert auch wieder -1 wenn a>b, 0 wenn a=b, 1 wenn ab[1] # vergleicht die Zahlen, sortiert sie end } a=0 # a & g stehen für die Indizes der Unterarrays g=1 schrauben = 0 muttern = 0 last_size=liste[a][1] puts #leicht hübschere Ausgabe while a!=liste.size if liste[a][1]==last_size # solange die grösse der Muttern/Schrauben gleich sind... while liste[a]==liste[g] # solange die Unterarrays gleich sind... g+=1 # ...wächst g end differenz= g-a # die Buchstaben, die für die Indizes der Unterarrays stehen, werden verglichen if liste[a][0]=="s" schrauben = differenz elsif liste[a][0]=="m" muttern = differenz end a=g # a wird aktualisiert else if muttern == 0 or schrauben == 0 # damit kein Auswurf entsteht wenn es keine Paare gibt nil elsif muttern > schrauben puts "#{last_size}mm = #{schrauben} Paare" elsif muttern < schrauben puts "#{last_size}mm = #{muttern} Paare" elsif puts "#{last_size}mm = #{muttern} Paare" end last_size=liste[a][1] # last_size wird aktualisiert, auf eine neue Grösse eingstellt schrauben = 0 # bevor die nächsten Unterarrays verglichen werden, sollen diese wieder auf 0 stehen muttern = 0 end end puts # leicht hübschere Ausgabe # gesamt Aufwand ist O(nlog(n)) ===== Arrays: Es lebe der König, Josephus-Problem ===== Es lebe der König: https://www.programmieraufgaben.ch/aufgabe/es-lebe-der-koenig/i33bcg32 Josephus-Problem: https://www.programmieraufgaben.ch/aufgabe/josephus-problem/zqcht09b ==== Lösungen "Es lebe der König" ==== === Peterli === # No comment === Mathematiker === Es lohnt sich in diesem Fall, gar nichts zu programmieren. Beim ersten Teil der Aufgabe ist es schnell einleuchtend, dass jede zweite Türe offen sein wird. Der zweite Teil ist interessanter, es läuft auf die Frage hinaus, wieviel mal eine Türe geöffnet und geschlossen wird. Nur wenn diese Anzahl ungerade ist, ist die Türe am Schluss offen. Der Zustand der Türe $n$ wird genau so viel mal geändert, wie die Zahl $n$ Teiler hat (sich selbst ingebegriffen). Wird $m$ in seine Primfaktoren zerlegt geschrieben gilt $$n=p_1^{n_1}\cdot p_2^{n_2} \cdot \ldots \cdot p_m^{n_m}$$ Ein Teiler von $n$ erhält man, indem man von jedem Primfaktor $p_i$ eine beliebige Anzahl zwischen $0$ und $n_i$ wählt. D.h. die Anzahl Teiler ist $(n_1+1)\cdot (n_2+1)\cdot \ldots \cdot (n_m+1)$. Dieses Produkt ist genau dann ungerade, wenn **alle** $n_i$ gerade sind. Sind alle Exponenten gerade, ist die Zahl eine Quadratzahl, und damit bleiben 10 Türen offen. ==== Lösungen "Josephus Problem" ==== === Peterli === # No comment ===== Algorithmik: Numberriddle ===== Aufgabenstellung: https://soi.ch/contests/2017/round1/numberriddle/ === Käthi === # No comment ===== Teile und herrsche: Maler Malcom ===== Aufgabenstellung: https://www.programmieraufgaben.ch/aufgabe/malermeister-malcom/durvde6t === Lösungen === # No comment