Skip to content

Instantly share code, notes, and snippets.

@alksl
Created May 16, 2014 09:29
Show Gist options
  • Save alksl/d1426141db50d8fd40b1 to your computer and use it in GitHub Desktop.
Save alksl/d1426141db50d8fd40b1 to your computer and use it in GitHub Desktop.
---
- :code: TAMS27
:name: Matematisk statistik
:points: 6.0
- :code: TAOP33
:name: Kombinatorisk optimering gk
:points: 4.0
- :code: TATA24
:name: Linjär algebra
:points: 8.0
- :code: TATA41
:name: Envariabelanalys 1
:points: 6.0
- :code: TATA42
:name: Envariabelanalys 2
:points: 6.0
- :code: TATA47
:name: Grundläggande och diskret matematik, del 1
:points: 6.0
- :code: TATA48
:name: Grundläggande och diskret matematik, del 2
:points: 6.0
- :code: TATA50
:name: Transformteori
:points: 4.0
- :code: TATA61
:name: Flervariabel- och vektoranalys
:points: 6.0
- :code: TDDB68
:name: Processprogrammering och operativsystem
:points: 6.0
- :code: TDDB84
:name: Designmönster
:points: 6.0
- :code: TDDC10
:name: Perspektiv på datateknik/datavetenskap
:points: 6.0
- :code: TDDC36
:name: Logik
:points: 6.0
- :code: TDDC66
:name: Datorsystem och programmering
:points: 4.0
- :code: TDDC67
:name: Funktionell programmering och Lisp
:points: 8.0
- :code: TDDC68
:name: Imperativ programmering och Ada
:points: 6.0
- :code: TDDC69
:name: Objektorienterad programmering och Java
:points: 6.0
- :code: TDDC70
:name: Datastrukturer och algoritmer
:points: 6.0
- :code: TDDC90
:name: Software Security
:points: 6.0
- :code: TDDC93
:name: Programutvecklingsmetodik, teori
:points: 4.0
- :code: TDDD09
:name: Programutvecklingsprojekt i ett helhetsperspektiv
:points: 8.0
- :code: TDDD14
:name: Formella språk och automatateori
:points: 6.0
- :code: TDDD17
:name: Informationssäkerhet, fk
:points: 6.0
- :code: TDDD24
:name: Webbprogrammering och interaktivitet
:points: 4.0
- :code: TDDD25
:name: Distribuerade system
:points: 6.0
- :code: TDDD26
:name: Utveckling av interaktiva system
:points: 6.0
- :code: TDDD27
:name: Avancerad webbprogrammering
:points: 6.0
- :code: TDDD37
:name: Databasteknik
:points: 6.0
- :code: TDDD38
:name: Avancerad programmering i C++
:points: 6.0
- :code: TDDD43
:name: Datamodeller och databaser, avancerad kurs
:points: 6.0
- :code: TEIE44
:name: Intellectual Property Rights
:points: 4.0
- :code: TFMT13
:name: Mätteknik
:points: 4.0
- :code: TFYY68
:name: Mekanik
:points: 6.0
- :code: TSEA22
:name: Digitalteknik
:points: 6.0
- :code: TSEA29
:name: Konstruktion med mikrodatorer, projektkurs
:points: 8.0
- :code: TSEA43
:name: Digital konstruktion
:points: 6.0
- :code: TSEA47
:name: Datorteknik, del 1
:points: 4.0
- :code: TSEA49
:name: Datorteknik del 2
:points: 4.0
- :code: TSRT12
:name: Reglerteknik Y
:points: 6.0
- :code: TSTE58
:name: Elektronik
:points: 6.0
- :code: TANA07
:name: ! ' Datautvinning med matrismetoder'
:points: 6.0
- :code: TANA09
:name: ! ' Datatekniska beräkningar'
:points: 4.0
- :code: TDDD16
:name: ! ' Kompilatorer och interpretatorer'
:points: 6.0
- :code: TDTS06
:name: ! ' Datornät'
:points: 6.0
- :code: TSDT18
:name: ! ' Signaler och system'
:points: 6.0
- :code: TSIT03
:name: ! ' Kryptoteknik'
:points: 6.0
---
- :code: TDDD14
:level: G2
:vof:
- v
:points: '2'
- :code: TDTS06
:level: G2
:vof:
- v
:points: '1'
- :code: TSTE86
:level: A
:vof:
- v
:points: '2'
- :code: TDDB44
:level: A
:vof:
- v
:points: '3'
- :code: TDDD07
:level: A
:vof:
- v
:points: '4'
- :code: TDTS08
:level: A
:vof:
- v
:points: '2'
- :code: TDDA69
:level: G2
:vof:
- v
:points: '3'
- :code: TDDD24
:level: G2
:vof:
- v
:points: '3'
- :code: TDDD25
:level: A
:vof:
- v
:points: '2'
- :code: TDDD38
:level: A
:vof:
- v
:points: '2'
- :code: TDTS01
:level: A
:vof:
- v
:points: '3'
- :code: TDTS07
:level: A
:vof:
- v
:points: '1'
- :code: TDDA69
:level: G2
:vof:
- v
:points: '1'
- :code: TDDC78
:level: A
:vof:
- v
:points: '3'
- :code: TDDD04
:level: A
:vof:
- v
:points: '2'
- :code: TDDD27
:level: A
:vof:
- v
:points: '3'
- :code: TDDD38
:level: A
:vof:
- v
:points: '-'
- :code: TDDD43
:level: A
:vof:
- v
:points: '2'
- :code: TSEA26
:level: A
:vof:
- v
:points: '1'
- :code: TSIT03
:level: A
:vof:
- v
:points: '2'
- :code: TSKS01
:level: A
:vof:
- v
:points: '4'
- :code: TDDC90
:level: A
:vof:
- v
:points: '3'
- :code: TDDD37
:level: G2
:vof:
- v
:points: '1'
- :code: TDDD43
:level: A
:vof:
- v
:points: '2'
- :code: TSIN02
:level: A
:vof:
- v
:points: '1'
- :code: TSIT02
:level: G2
:vof:
- v
:points: '2'
- :code: TSKS01
:level: A
:vof:
- v
:points: '4'
---
- :code: TDDD14
:level: G2
:vof:
- v
:points: '2'
- :code: TDTS06
:level: G2
:vof:
- v
:points: '1'
- :code: TSTE86
:level: A
:vof:
- v
:points: '2'
- :code: TDDB44
:level: A
:vof:
- v
:points: '3'
- :code: TDDD07
:level: A
:vof:
- v
:points: '4'
- :code: TDTS08
:level: A
:vof:
- v
:points: '2'
- :code: TDDA69
:level: G2
:vof:
- v
:points: '3'
- :code: TDDD24
:level: G2
:vof:
- v
:points: '3'
- :code: TDDD25
:level: A
:vof:
- v
:points: '2'
- :code: TDDD38
:level: A
:vof:
- v
:points: '2'
- :code: TDTS01
:level: A
:vof:
- v
:points: '3'
- :code: TDTS07
:level: A
:vof:
- v
:points: '1'
- :code: TDDA69
:level: G2
:vof:
- v
:points: '1'
- :code: TDDC78
:level: A
:vof:
- v
:points: '3'
- :code: TDDD04
:level: A
:vof:
- v
:points: '2'
- :code: TDDD27
:level: A
:vof:
- v
:points: '3'
- :code: TDDD38
:level: A
:vof:
- v
:points: '-'
- :code: TDDD43
:level: A
:vof:
- v
:points: '2'
- :code: TSEA26
:level: A
:vof:
- v
:points: '1'
- :code: TSIT03
:level: A
:vof:
- v
:points: '2'
- :code: TSKS01
:level: A
:vof:
- v
:points: '3'
- :code: TDDD37
:level: G2
:vof:
- v
:points: '1'
- :code: TDDD43
:level: A
:vof:
- v
:points: '2'
- :code: TSIN02
:level: A
:vof:
- v
:points: '1'
- :code: TSIT02
:level: G2
:vof:
- v
:points: '2'
- :code: TSKS01
:level: A
:vof:
- v
:points: '4'
#!/usr/bin/env ruby
# encoding: utf-8
require "rubygems"
require "terminal-table"
require "yaml"
COURSES = YAML.load(File.read("./new_courses.yml"))
PROFILES = YAML.load(File.read("./profiles/profiles.yml"))
REQUIREMENTS = PROFILES.each_with_object({}) do |profile, hash|
hash[profile[:code]] =
YAML.load(File.read("./profiles/#{profile[:code]}.yml"))
end
def have_course?(code)
found_course = COURSES.find do |course|
course[:code] == code
end
not found_course.nil?
end
PROFILES.each do |profile|
puts "Profile: #{profile[:name]}"
table = Terminal::Table.new(headings: ["Course", "Points", "Level", "VOF", "Have"])
REQUIREMENTS[profile[:code]].each do |req|
row = []
row << req[:code]
row << req[:points]
row << req[:level]
row << req[:vof].join("/")
row << (have_course?(req[:code]) ? "Yep" : "Nope")
table << row
end
puts table
print "\n\n"
end
puts "Poäng per område"
AREAS = COURSES.map { |c| c[:areas] }.flatten.uniq
table = Terminal::Table.new(headings: ["Area", "Level", "Sum"])
AREAS.each do |area|
%w{ A G1 G2 }.each do |level|
row = []
row << area
row << level
row << COURSES.select { |course|
course[:level] == level and course[:areas].include?(area)
}.inject(0) { |sum,course|
sum + course[:points]
}
table << row
end
end
puts table
print "\n\n"
puts "Courses"
table = Terminal::Table.new(headings: ["Course", "Points", "Level", "Areas"])
COURSES.each do |course|
row = []
row << course[:code]
row << course[:points]
row << course[:level]
row << course[:areas].join(",")
table << row
end
puts table
print "\n\n"
puts "Points"
total = COURSES.inject(0) { |sum, course| sum + course[:points] }
advanced = COURSES.select { |c| c[:level] == "A" }.inject(0) { |sum, c| sum + c[:points] }
g2 = COURSES.select { |c| c[:level] == "G2" }.inject(0) { |sum, c| sum + c[:points] }
g1 = COURSES.select { |c| c[:level] == "G1" }.inject(0) { |sum, c| sum + c[:points] }
puts "total: #{total}"
puts "adv: #{advanced}"
puts "g2: #{g2}"
puts "g1: #{g1}"
#!/usr/bin/env ruby
require 'yaml'
require './profiles'
MATCHER = /^([A-Z0-9]+)\s+(.+)\s+(G1|G2|A)\s+([a-z\/]+)\s+(\d|-)\s+(\d)\*?/
def parse_line(line)
matches = MATCHER.match(line)
raise "No match on #{line}" unless matches
{
code: matches[1].chomp,
level: matches[3].chomp,
vof: matches[4].chomp.split("/"),
points: matches[5].chomp
}
end
PROFILES.each do |profile|
puts "Reading #{profile[:code]}"
lines = File.readlines("./profiles/#{profile[:code]}")
parsed = lines.map { |line| parse_line(line) }
File.open("./profiles/#{profile[:code]}.yml", "w") do |f|
f.write(parsed.to_yaml)
end
end
File.open("./profiles/profiles.yml", "w") do |f|
f.write(PROFILES.to_yaml)
end
---
- :name: Datorsystem
:code: das
- :name: Programmering och algoritmer
:code: pal
- :name: Programvaruproduktion
:code: pvp
- :name: Spelprogrammering
:code: spel
- :name: Systemteknologi
:code: sis
- :name: Säkra system
:code: ss
---
- :code: TDDC34
:level: A
:vof:
- o
:points: '3'
- :code: TDDB84
:level: A
:vof:
- v
:points: '4'
- :code: TDDD31
:level: A
:vof:
- v
:points: '4'
- :code: TDDD43
:level: A
:vof:
- v
:points: '2'
- :code: TDDC90
:level: A
:vof:
- v
:points: '3'
- :code: TDDD31
:level: A
:vof:
- v
:points: '4'
- :code: TDDD43
:level: A
:vof:
- v
:points: '2'
- :code: TDEI19
:level: A
:vof:
- v
:points: '3'
- :code: TEAE01
:level: G1
:vof:
- v
:points: '2'
- :code: TDDD03
:level: G2
:vof:
- o
:points: '3'
- :code: TDDD38
:level: A
:vof:
- v
:points: '2'
- :code: TEIO20
:level: G2
:vof:
- v
:points: '4'
- :code: TDDD04
:level: A
:vof:
- o
:points: '2'
- :code: TDDD05
:level: A
:vof:
- o
:points: '1'
- :code: TDDD29
:level: A
:vof:
- v
:points: '3'
- :code: TDDD38
:level: A
:vof:
- v
:points: '-'
- :code: TDEI35
:level: A
:vof:
- v
:points: '2'
- :code: TEIO20
:level: G2
:vof:
- v
:points: '4'
- :code: TDDD43
:level: A
:vof:
- v
:points: '2'
- :code: TDDC90
:level: A
:vof:
- v
:points: '3'
- :code: TDDD07
:level: A
:vof:
- v
:points: '4'
- :code: TDDD43
:level: A
:vof:
- v
:points: '2'
---
- :code: TDDC17
:level: G2
:vof:
- o
:points: '3'
- :code: TDDD37
:level: G2
:vof:
- o
:points: '1'
- :code: TDDD07
:level: A
:vof:
- o
- v
:points: '4'
- :code: TDDD55
:level: G2
:vof:
- o
- v
:points: '3'
- :code: TDTS07
:level: A
:vof:
- o
:points: '1'
- :code: TDDD25
:level: A
:vof:
- o
- v
:points: '2'
- :code: TSBK08
:level: A
:vof:
- o
- v
:points: '1'
- :code: TSRT07
:level: A
:vof:
- o
- v
:points: '2'
- :code: TDDD05
:level: A
:vof:
- o
- v
:points: '1'
- :code: TSFS06
:level: A
:vof:
- o
- v
:points: '1'
- :code: TSRT62
:level: A
:vof:
- o
- v
:points: '3'
- :code: TDDB84
:level: A
:vof:
- o
- v
:points: '3'
---
- :code: TDDD23
:level: A
:vof:
- o
:points: '2'
- :code: TSBK03
:level: A
:vof:
- o
:points: '3'
- :code: TDDC17
:level: G2
:vof:
- v
:points: '3'
- :code: TDDD53
:level: A
:vof:
- v
:points: '1'
- :code: TNCG15
:level: A
:vof:
- v
:points: '4'
- :code: TDDC73
:level: G2
:vof:
- o
:points: '1'
- :code: TSBK03
:level: A
:vof:
- o
:points: '3'
- :code: TDDD57
:level: A
:vof:
- o
:points: '1'
- :code: TBMI26
:level: A
:vof:
- v
:points: '2'
- :code: TSBK07
:level: A
:vof:
- v
:points: '4'
- :code: TNM079
:level: A
:vof:
- v
:points: '2'
- :code: TSBK07
:level: A
:vof:
- v
:points: '1'
- :code: TSBK03
:level: A
:vof:
- o
:points: '3'
- :code: TSBB11
:level: A
:vof:
- v
:points: '4'
- :code: TSBK03
:level: A
:vof:
- o
:points: '3'
- :code: TSBB11
:level: A
:vof:
- v
:points: '4'
---
- :code: TDDB84
:level: A
:vof:
- o
:points: '4'
- :code: TDDD38
:level: A
:vof:
- v
:points: '2'
- :code: TDTS06
:level: G2
:vof:
- v
:points: '1'
- :code: TDDC90
:level: A
:vof:
- o
:points: '3'
- :code: TSIT02
:level: G2
:vof:
- o
:points: '2'
- :code: TDDD37
:level: G2
:vof:
- v
:points: '1'
- :code: TDDD38
:level: A
:vof:
- v
:points: '-'
- :code: TDDD17
:level: A
:vof:
- o
:points: '4'
- :code: TDDD24
:level: G2
:vof:
- o
:points: '3'
- :code: TDDD38
:level: A
:vof:
- v
:points: '2'
- :code: TDDD17
:level: A
:vof:
- o
:points: '4'
- :code: TDDD27
:level: A
:vof:
- v
:points: '3'
- :code: TDDD38
:level: A
:vof:
- v
:points: '-'
#!/usr/bin/env ruby
#encoding: utf-8
require "rubygems"
require "nokogiri"
require "yaml"
require "open-uri"
courses= YAML.load(File.read("./courses.yml"))
YEARS = (2007..2013).to_a.reverse
YEARS.each do |year|
puts "Year: #{year}"
courses = courses.map do |course|
puts "Course: #{course[:code]}"
uri = URI.parse("http://kdb-5.liu.se/liu/lith/studiehandboken/svkursplan.lasso?&k_budget_year=#{year}&k_kurskod=#{course[:code]}")
content = open(uri) { |f| f.read }
doc = Nokogiri::HTML(content)
text = doc.xpath("//td")[16].text
level_match = text.match(/Nivå \(G1,G2,A\):\s+(?<level>[G12A]+)/)
area_match = text.match(/Huvudomr.de: (?<area>[a-zA-Zåäö, ]+)/)
new_course = course.clone
unless new_course[:level]
if level_match
new_course[:level] = level_match["level"].strip
puts "#{course[:code]}: Level updated"
end
end
unless new_course[:areas]
if area_match
new_course[:areas] =
area_match["area"].strip.split(",").map { |area| area.strip }
puts "#{course[:code]}: Areas updated"
end
end
new_course
end
end
File.write("./new_courses.yml", YAML.dump(courses))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment