Do you like programming, problem solving and free pizza? Join a programming contest!
Every semester, we host at least a few different competitions that are open for everyone. We aim for the contests we host at UiB to be accessible to every level of programmers, though we advice that you have enjoyed at least half an introductory course in programming prior to competing.
Contest | Time | Registration |
---|---|---|
Warm-up contests before NCPC Location: Programmerbar |
Sept. 17, 16-18 Sept. 23, 16-18 Sept. 30, 16-18 |
just show up |
NCPC 2024 |
Oct. 5, 11:00-16:00 |
register here by Oct. 2 23:59 |
Contest | Date |
---|---|
IDI Open 2024 🥇 Congratulations to the student teams IIs and Team Unexpected Rationalussy Paradox that solved all the problems. standings |
Mar 16, 2024 |
NCPC 2023 🥇 Congratulations to the student team Florida Men that won the Norwegian championship and placed 4th overall. local site • official site • standings |
Oct 7, 2023 |
CBDC Hackathon official site |
Oct 21, 2022 |
NCPC 2022 🥇 Congratulations to the student team \u1f0c\u03bb\u03b3\u03bf\u03c2 that won the Norwegian championship and placed 4th overall. official site • standings |
Oct 8, 2022 |
Bergen Open 2021 official site |
Nov 6, 2021 |
NCPC 2021 🥇 Congratulations to the team algouib that won the Norwegian championship, and forvirra førsteklassinger that won the student class (ICPC eligible) in Norway. official site • standings |
Oct 9, 2021 |
NCPC 2020 official site • standings |
Nov 7, 2020 |
Hash Code 2020 🥇 Congratulations to team 🦐🦐🦐🦐 who placed 12th in the international final (scoreboard) |
Feb 20, 2020 |
Bergen Open 2019 official site |
Nov 2, 2019 |
NCPC 2019 official site • local site • standings • news report (bt.no) |
Oct 5, 2019 |
IDI Open 2019 standings |
Mar 30, 2019 |
Google Hash Code 2019 local site • official site • standings (Norway) |
Feb 28, 2019 |
NWERC 2018 official site • standings • pictures |
Nov 23, 2018 |
Bergen Open 2018 official site • standings • report (in Norwegian) • pictures |
Nov 10, 2018 |
NCPC 2018 official site • standings • report (no/en) |
Oct 6, 2018 |
ACM ICPC World Finals 2018 official site • standings • report (in Norwegian) NWERC gold medalists Garbage Collectors represented UiB. Meet the teams interview • Awkward team dance • When did you learn to code? |
Apr 19, 2018 |
IDI Open 2018 standings |
Apr 14, 2018 |
Google Hash Code 2018 local site • official site • standings (Norway) • report (in Norwegian) • pictures |
Mar 1, 2018 |
NWERC 2017 🥇 UiB placed 4th and was gold medalist! Congratulations to participants Olav Røthe Bakken, Jan Soukup and Davide Pallotti of the team Garbage Collectors. official site • cheat sheet • standings • report (no/en) • pictures |
Nov 26, 2017 |
NCPC 2017 local site • official site • standings • report (in Norwegian) • pictures |
Oct 7, 2017 |
IDI Open 2017 standings • pictures |
April 22, 2017 |
Google Hash Code 2017 report (in Norwegian) • pictures |
Feb 23, 2017 |
NWERC 2016 official site • cheat sheet • standings • pictures |
Nov 20, 2016 |
NCPC 2016 local site • official site • standings |
Oct 8, 2016 |
IDI Open 2016 standings |
Apr 16, 2016 |
NCPC 2015 official site • standings |
Oct 10, 2015 |
* Contests without original problems, such as local recreational contests, warmups and practice sessions, are not listed. Also, contests prior to Fall 2015 are not listed.
UiB has been participating regularly in NCPC/Norwegian Championship since 1999, NWERC since 2006, and IDI Open since we can't remember when. We are also the host of the Norwegian Informatics Olympiad for high school students.
Never tried a programming contests before? It can appear like scary stuff, but it can actually be really fun regardless of what level you are. Let's get the basics going.
This tutorial is targeted for users familiar with the bash shell. If you prefer to use a different environment to run your programs (such as an IDE), you might need to adapt the instructions to fit your environment.
Let us solve the problem Oddities (read it before continuing). For this problem, devising an algorithm is not hard (a number x is even if x % 2 == 0
, and odd otherwise). Yet, it poses some challenges to a newcomer: How do I find the input? How do I provide the output? The general answer is that input is provided on standard input and output should be provided on standard output. What this looks like is different from language to language (see examples). We explain the example in C++ below* **:
#include <bits/stdc++.h> using namespace std; int main() { int testcases; cin >> testcases; for (int i = 0; i < testcases; i++) { int x; cin >> x; if (x % 2 == 0) { cout << x << " is even" << endl; } else { cout << x << " is odd" << endl; } } return 0; }
import java.util.Scanner; class Oddity { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for (int i = 0; i < n; i++) { int x = sc.nextInt(); System.out.print(x); if (x % 2 == 0) { System.out.println(" is even"); } else { System.out.println(" is odd"); } } } }
def oddity(): n = int(raw_input()) for i in range(n): x = int(raw_input()) if x % 2 == 0: print "{} is even".format(x) else: print "{} is odd".format(x) oddity()
def oddity(): n = int(input()) for i in range(n): x = int(input()) if x % 2 == 0: print("{} is even".format(x)) else: print("{} is odd".format(x)) oddity()
We save the above as a file oddity.cpp, and we compile it with GNU C++ Compiler ($ g++ oddity.cpp
). If this crashes for you, you are probably using clang as your compiler. See * below.
Once the program is compiled, we can test-run the program locally ($ ./a.out
). The program will stare blankly at us, doing nothing but waiting for input; this is the correct behaviour. We can now enter input manually, e.g. by typing in the sample testcase.
Manual testing is a good first step, but to be sure that we have solved the sample cases correctly, we suggest downloading the sample testcases directly from Kattis via the link on the right side of the problem page, beneath the "Submit" button. Using this method, rather than copying the sample testcase by hand, ensures that you don't run into file encoding issues and different representations of newline symbols. Extract the samples.zip -file, and you will find two files sample.in and sample.ans. To check that your code works, we can pipe sample.in into our program ($ ./a.out < sample.in
), and compare the output to sample.ans ($ cat sample.ans
). The output of those two commands must (at least in this problem) be identical for us to get our solution accepted.
Rather than doing the comparison manually, though, it is better if we leave this to a program designed to check for differences: diff. It can look something like this:
$ ./a.out < sample.in > myanswer.ans
$ diff sample.ans myanswer.ans -s
Files sample.ans and myanswer.ans are identical
$
If the above command indeed confirmes that the two files are indentical, we have confirmed that our program works correctly for the sample testcase.
We are now convinced that our program works, so let us submit! Now that is was accepted, here are some more problems to get you thinking:
* If you are using C++: Note that there are some differences between the various compilers. Online judges usually use GNU Compiler Collection (gcc), but if you are working on a Mac, you probably are using clang. The differences are not usually significant; however, clang does not understand the line #include <bits/stdc++.h>
in the example above. To be able to compile our program locally you will need to either do the required includes from bits/stdc++.h directly yourself (in the sample solution you only need
#include <iostream>
) or make your own bits/stdc++.h as explained here (this is a one time operation per computer).
** If you are using Java: Note that the Scanner class can be quite slow if you need to read lots of input, and the normal System.out.println() can be quite slow if you're printing lots of output. Consider using faster I/O methods, such as Kattio, which is available here.
If you enjoy competitive programming, UiB offers several courses which will help you do even better. Most prominently, INF237 Algorithms Engineering is a course which is tailored specifically towards competitive programming, and it runs every spring semester (check out previous years). Other useful courses are INF102 Algorithms, Data Structures and Programming, INF234 Algorithms, and the killer course INF334 Advanced Algorithms.
There are some excellent course materials available at Bjarki Ágúst Guðmundsson's web page, and the Stanford course CS 97SI: Introduction to Programming Contests is also a nice resource.
Hordes of practice problems are available at online judges such as Kattis, Codeforces and many others.
There are many techniques to master for the ultimate programming champion. You can learn about most of them in one of the courses mentioned above. By popular request, we have collected some example problems from different categories. Be warned, we can not give any guarantees on the difficulty. Also note that the problems are only guaranteed to be solvable in C++ and Java (most are also solvable in Python, but not all).
There is also a searchable archive of problems annotaded with keywords at Torstein Strømme's webpage.
What techniques you will need in the next competition is hard to know beforehand, as the problem setters try their best to make the problems such that one can not simply apply an algorithm out of the box. A perfect problem is easy and intuitive to state, is tricky to solve conceptually, yet has a beautiful and easy-to-code solution once you see it. Of course, it should also have some novelty to it. Still, knowing which techniques are most common may be interesting. A rough categorization of the NWERC problems from 2010 to 2016 revealed that the following techniques were the most common:
Currently responsible for the competitive programming efforts at UiB are Pål Grønås Drange and Torstein Strømme. Please feel free to contact them at {pal.drange, torstein.stromme}@uib.no if you have any questions or remarks.