Show pageOld revisionsBacklinksBack to top This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. {{backlinks>.}} ===== String, RegEx: Drei Chinesen mit dem Kontrabass ===== * Aufgabenstellung: https://www.programmieraufgaben.ch/aufgabe/kontrabass-1/xk5w4mq7 ==== Lösungen ==== === Simon === <code ruby regexaufg.rb> # 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 </code> ===== 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 === <code ruby datensalat.rb> 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 </code> === Luca === <code ruby datensalat.rb> 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 </code> === Noel === <code php> <?php /* Sry, wegen PHP...*/ $m = []; $s = []; $lines = preg_split('/\n/', trim(file_get_contents('schrauben.txt'))); foreach($lines as $line) { $v = explode(" ", $line); if($v[0] == "m") { if(isset($m[$v[1]])) { $m[$v[1]] += 1; } else { $m += [$v[1] => 1]; } } else { if(isset($s[$v[1]])) { $s[$v[1]] += 1; } else { $s += [$v[1] => 1]; } } } ?> </code> ===Patrick=== <code ruby schrauben.rb> 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 a<b else a[1]<=>b[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)) </code> ===== 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 === <code ruby koenig-peterli.rb> # No comment </code> === 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 === <code ruby koenig-peterli.rb> # No comment </code> ===== Algorithmik: Numberriddle ===== Aufgabenstellung: https://soi.ch/contests/2017/round1/numberriddle/ === Käthi === <code ruby numberriddle-A1-kaethi.rb> # No comment </code> ===== Teile und herrsche: Maler Malcom ===== Aufgabenstellung: https://www.programmieraufgaben.ch/aufgabe/malermeister-malcom/durvde6t === Lösungen === <code ruby malcom-brute-force-urs.rb> # No comment </code> efinf/blc2016/loesungen-2016-12-13.txt Last modified: 2016/12/21 21:46by patrick_lehn