efinf:blc2016:loesungen-2016-12-13

Simon

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

Simon

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

Luca

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

Noel

<?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];
        }
    }
}
?>

Patrick

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

Peterli

koenig-peterli.rb
# 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.

Peterli

koenig-peterli.rb
# No comment

Käthi

Lösungen

  • efinf/blc2016/loesungen-2016-12-13.txt
  • Last modified: 2016/12/21 21:46
  • by patrick_lehn