8. Coding Exercises
(Note: Solutions to most exercises are available in https://github.com/chrplr/PCBS/tree/master/coding-exercises )
8.1. Flow control
You can read about loops in Python, and more generally about flow control.
8.1.1. Shining
Write a python script that prints 1000 times the line All work and no play makes Jack a dull boy.
Check a solution at shining.py
8.1.2. Multiplication tables
Write a script that displays the tables of multiplication from 1 to 10 as a table:
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
Check out multiplication_table.py
for a solution.
8.1.3. Taxis
Two taxi companies propose differents pricing schemes:
Company A charges 4.80€ plus 1.00€/km
Company B charges 3.20€ plus 1.20€/km
Write code to find which company is the cheapest as a function of the distance to travel.
Check out taxis.py
8.1.4. Estimation of PI by a Monte-Carlo method
One way to estimate the value of the π is to generate a large number of random points in the unit square and see how many fall within the unit circle; their proportion is an estimate of the area of the circle. See https://academo.org/demos/estimating-pi-monte-carlo/
Implement the proposed algorithm to estimate the value of π.
Check out pi_monte_carlo.py
8.1.5. Computer-guess-a-number
Read chapter 3 of Invent your own games with Python where the author presents a game where the computer chooses a random number that the user must guess. Study the code.
Now, your task is to write another program, where the roles are inverted: the computer tries to guess a number that the user has in mind. The computer proposes a number and the user answers with ‘+’ (the number he has is mind is larger), ‘-’ (if it is smaller), ‘y’ (if the guess is correct)
Check a solution at computer-guess-a-number.py
8.2. Lists
These exercises require list manipulations. If you do not know Lists in Python, you can read:
Try to solve the following exercices:
Given a list of numbers, print their sum
Given a list of numbers, print their product
Given a list of numbers, print the sum of their squares
Given a list of numbers, print the largest one.
Given a list of numbers, print the second largest one.
After you have tried to solve these problems, you can check lists.py
8.2.1. Prime numbers
Write a script that lists all prime numbers between 1 and 10000 (A prime number is a integer that has no divisors except 1 and itself). You can use the following function:
def is_factor(d, n):
""" True if `d` is a divisor of `n` """
return n % d == 0
Check a solution at prime-numbers.py
8.2.2. Pascal triangle
Write a program that prints the first N rows of Pascal’s triangle (see https://www.youtube.com/watch?v=XMriWTvPXHI). For example:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
To solve this problem, one solution is to store the values of the current line in a Python list, and write a function that given a list as an argument, calculates and returns the following line in a new list.
Proposed solutions:
8.3. Functions
Read about functions in Python: - https://www.w3schools.com/python/python_functions.asp - https://automatetheboringstuff.com/2e/chapter3/).
8.3.1. Convert temperatures from Fahrenheit to Celcius and vice-versa.
Read https://en.wikipedia.org/wiki/Fahrenheit and write a function that converts a temperature from Fahrenheit to Celsius, and another one that converts from Celsius to Fahrenheit
Add code that reads temperatures from the standard input and print the converted numbers.
A solution is available here: Fahrenheit_celsius.py
.
8.3.2. Permutations
Generate all the permutations of a set, e.g. (1..n).
Note: This is an advanced exercise, which requires mastery of recursive functions (functions that call themselves)
A solution is proposed at generate_all_permutations.py
.
To run it:
python generate_all_permutations.py 4
8.3.3. Eight queens puzzle
The eight queens puzzle is the problem of placing eight chess queens on an 8×8 chessboard so that no two queens threaten each other; thus, a solution requires that no two queens share the same row, column, or diagonal. See https://en.wikipedia.org/wiki/Eight_queens_puzzle
As there can be only one queen per column and per row, a winning solution can be represented by a set of 8 numbers, one per line, which represent the column in which there is a queen. Because the columns must be different, the solutions are a subset of the permutations of 8 numbers. We just have to check that no two queens are in the same diagonal.
In Python, you can get all the permutations of a set, with the permutations
function from the itertools
module
from itertools import permutations
list(permutations(range(3))
For a solution to the eight queens problem, check out https://code.activestate.com/recipes/576647-eight-queens-six-lines/
The code is available at eight_queens.py
.
8.4. Strings
8.4.1. Pseudowords
Search the internet to find out how to generate a random integer number in a interval in Python
Read about strings in Python at https://realpython.com/python-strings/
Write functions that generate pseudowords from words. The first function will delete a character in a random position from a string passed as argument. The second will insert a random character at a random position. The third will swap two characters at random location.
If you know about file input/output (see https://automatetheboringstuff.com/2e/chapter9/), you can read a dictionary (e.g. http://www.pallier.org/extra/liste.de.mots.francais.frgut.txt) and use it to filter out any actual words.
8.5. Dictionaries
8.5.1. unique
Given a list of words, print how many different words are in that list (hint: use a dictionary or a set)
liste = ['bonjour', 'chat', 'chien', 'bonjour']
n = 0
d = dict()
for e in liste:
if not e in d.keys():
d[e] = 1
n = n + 1
print(n)
print(len(set(liste))) # shortest solution using a set
8.5.2. word count
Given a list of words, count the number of times each word appears in
the list. Eg. [Jim, Alan, Jim, Joe]
-> Jim:2, Alan:1, Joe:1
(hint: use a dictionary)
liste = ['Jim', 'Alan', 'Jim', 'Joe']
counts = dict()
for word in liste:
if word in counts.keys():
counts[word] += 1
else:
counts[word] = 1
print(counts)
8.5.3. Anagrams
Two words are anagrams if they contain the same letters in different orders, e.g., binary and brainy.
write a function that take two strings as arguments and returns True if they are anagrams.
Given a list of words, print all subsets that form anagrams.
Check my solution at anagrams.py
. Running:
python anagrams.py < liste.de.mots.francais.frgut.txt
will list all anagrams in French! (liste.de.mots.francais.frgut.txt
contains a list of French words)
8.6. File reading and writing
Read the chapter about files reading and writing at https://automatetheboringstuff.com/2e/chapter9/
8.6.1. head
Write a script that prints the first 10 lines of a file (or the whole file is it is less than 10 lines long).
with open('aga.txt', 'r', encoding='utf-8') as f:
for l in f.readlines()[:10]:
print(l, end='')
8.6.2. tail
Write a script that prints the last 10 lines of a file (or the whole file is it is less than 10 lines long).
with open('aga.txt', 'r', encoding='utf-8') as f:
all_lines = f.readlines()
for l in all_lines[-10:]:
print(l, end='')
8.6.3. string-detector
Read Chap. 8 of Automate the boring stuff.
Write a script that opens and read a text file, and print all the lines that contain a given target word, say, cogmaster
.
Check out search-file.py
8.6.4. Kaprekar numbers
A Kaprekar number is a number whose decimal representation of the square can be cut into a left and a right part (no nil) such that the sum of these two parts gives the number initial. For example:
- 703 is a number of Kaprekar in base 10 because 703² = 494 209 and that
494 + 209 = 703.
- 4879 is a number of Kaprekar in base 10 because 4879² = 23 804 641 and
04641 + 238 = 4879
Write a program that returns all Kaprekar numbers between 1 and N.
Solution: Kaprekar-numbers.py
8.6.5. RPN Calculator
Write a reverse Polish arithmetic expression evaluator (See https://en.wikipedia.org/wiki/Reverse_Polish_notation).
E.g. 3 4 * 5 -
evaluate to 7
.
Solution: rpn-calculator.py
8.6.6. Rodrego-simulator
Write a Python script that simulates a RodRego machine with 10 registers. The program is stored in a string or in file that is read and then executed. Your program must contain a function which, given the 10 initial values of the registers, and the program, returns the new register values when the END command is reached.
Check two possible solutions:
- rodrego_maxime_caute.py
- rodrego_christophe_pallier.py
8.6.7. Cellular automata
Implement a 1-dimension elementay cellular automata. (Further reading: https://en.wikipedia.org/wiki/A_New_Kind_of_Science)
Solution: 1d-ca.py
8.6.8. Analysis of a Signal Detection Experiment
In a signal detection experiment, a faint stimulus (e.g. a faint sound or a faint visual target) is presented or not at each trial and the participant must indicate whether he has perceived it or not. There are four possible outcomes for each trial:
A hit occurs when the participant correctly detects the target.
A miss occurs when the target was there but the participant did not detect it.
A false alarm occurs when the participant reports the presence of the target when it was not actually there.
A correct rejection occurs when the participant correctly reports that the target was not present.
One defines;
The hit rate, equal to #hits / (#hits + #misses)
The false alarm rate, equal to #false alarms / (#false alarms + # correct rejections)
Let us first suppose that the data from a participant is represented as a string. This string represents a series of trials, each trial being represented by two characters indicating the trial type (1=target present, 0=target absent) and the participant’s response (Y=target perceived, N=No target perceived). For example:
data = "0Y,0N,1Y,1Y,0N,0N,0Y,1Y,1Y"
Exercise:
Write a function which, given such a string, returns the Hit rate and the False rate.
Now, the results from different participants are stored in different files
subj*.dat
(download the files from https://github.com/chrplr/PCBS/tree/master/coding-exercises/subjdat.zip`) Write a script that computes the hit rates and false alarms for each subject, and displays the group averages and standard deviations.
Solution sdt.py