{{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