efinf:blc2016:loesungen-2016-12-13

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
efinf:blc2016:loesungen-2016-12-13 [2016/12/14 13:29]
Ivo Blöchliger created
efinf:blc2016:loesungen-2016-12-13 [2016/12/21 21:46] (current)
patrick_lehn [Lösungen]
Line 3: Line 3:
 * Aufgabenstellung: https://www.programmieraufgaben.ch/aufgabe/kontrabass-1/xk5w4mq7 * Aufgabenstellung: https://www.programmieraufgaben.ch/aufgabe/kontrabass-1/xk5w4mq7
 ==== Lösungen ==== ==== Lösungen ====
-=== Vreneli === +=== Simon === 
-<code ruby kontrabass-vreneli.rb> +<code ruby regexaufg.rb> 
-No comment+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> </code>
  
Line 11: Line 40:
 Aufgabenstellung: https://www.programmieraufgaben.ch/aufgabe/schraubensack/uk540btd 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 ==== ==== Lösungen ====
-=== Hansli === +=== Simon === 
-<code ruby schraubensack-hansli.rb> +<code ruby datensalat.rb> 
-No comment+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> </code>
  
Line 27: Line 172:
 # No comment # No comment
 </code> </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" ==== ==== Lösungen "Josephus Problem" ====
  • efinf/blc2016/loesungen-2016-12-13.1481718547.txt.gz
  • Last modified: 2016/12/14 13:29
  • by Ivo Blöchliger