Interactive Diff
July 12, 2019
[ There will be no exercises next week, as my daughter is visiting from out-of-town and I will be spending time with her. ]
One of my favorite books is The Unix Programming Environment by Brian Kernighan and Rob Pike, which I have recently been re-reading; the spine of my copy broke long ago, so I must be careful turning the pages, and I wrap the book in a rubber band every time I put it back on my shelf. It is an excellent introduction to Unix, still relevant today even though it was published in 1984. The recent exercise Remind was inspired by a program in Section 4.4, and today’s exercise is a rewrite of the program in Section 6.8.
NAME
idiff -- interactive diff
USAGE
idiff file1 file2 -- interactively merge file differences
DESCRIPTION
idiff takes two files file1 and file2, diffs them, and presents
the difference to the user interactively. At each difference,
the user may accept the text from file1 by responding <, or accept the text from file2 by responding >, or edit the difference
by responding e (in which case whatever the user saves from the
editor is entered into the output file), or execute a command
by typing !cmd, in which case the user must then respond when
the prompt is repeated. The assembled output with the selected
differences is placed in file idiff.out.
EXAMPLE
$ cat file1
This is
a test
of
your
skill
and comprehension.
$ cat file2
This is
not a test
of
our
ability.
$ diff file1 file2
2c2
< a test --- > not a test
4,6d4,5
< your
< skill
< and comprehension. --- > our
> ability.
$ idiff file1 file2
2c2
< a test --- > not a test
? >
4,6c4,5
< your
< skill
< and comprehension. --- > our
> ability.
? <
$ cat idiff.out
This is
not a test
of
your
skill
and comprehension.
[ WordPress is determined not to render less-than and greater-than signs properly. Look at https://ideone.com/nI9CNB if you can’t make sense of what you see. ]
Your task is to write idiff. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
Doubled Letters
July 9, 2019
We have a fun little exercise on a lazy summer Tuesday:
Given a list of words, remove from the list those words that have two adjacent identical letters. For instance, given “Now is the time for all good men to come to the aid of their country” the program should remove the words “all” and “good”.
Your task is to write a program to remove words with doubled letters from a list of words. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
Remind
July 2, 2019
NAME
remind -- print reminders of upcoming events
USAGE
remind -- show reminders for next seven days
remind [year] month day message -- add reminder to database
DESCRIPTION
Remind maintains a database of reminders in the .reminders file,
in the user's home directory, each a single line of the form
[year] month day message
Year is optional, and must be an integer greater than 99; if no
year is given, the reminder applies to all years (for instance,
birthdays).
If remind is called with no arguments, it writes to standard
output all reminders that occur within the next seven days. If
remind is called with arguments giving a date and message, a
reminder is added to the database. Any time remind is called,
all past reminders are deleted from the database.
EXAMPLE
$ date
Sun Jun 30 19:45:38 CDT 2019
$ remind 4 2 Anne birthday
$ remind 10 13 Kate birthday
$ remind 7 4 Independence Day
$ remind 2019 7 2 lunch with Pat
$ remind 2019 5 13 dentist 2:00pm
$ remind
7 4 Independence Day
2019 7 2 lunch with Pat
$ cat ./reminders
4 2 Anne birthday
10 13 Kate birthday
7 4 Independence Day
2019 7 2 lunch with Pat
Your task is to implement remind. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
Deblank
June 28, 2019
Today’s task is easy. I expect to see lots of imaginative and over-the-top solutions:
Write a program that passes its input to its output, removing any lines that are either empty or contain only “white” characters like space and tab.
Your task is to write a program that removes blank lines from files. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
Dividing Without Divide
June 25, 2019
Today’s task comes from a student programmer:
Given a numerator and divisor of unsigned integers, compute the quotient and remainder. You cannot use divide, cannot use mod, and you want to optimize for speed.
After a while, the student programmer looked up the official solution:
def divide_problem(num, div):
quotient = 1
while num - (quotient * div) >= div:
print(num - (quotient * div), "loop")
quotient += 1
remainder = num - (quotient * div)
return quotient, remainder
Your task is to comment on the official solution and write a better one. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
String Comparison
June 21, 2019
A string is a sequence of characters, perhaps including a backspace character that renders both itself and the previous character as if they were not part of the string. For instance, if we make the backspace character visible using the # symbol, the two strings abcx#de and abcde are identical. Multiple successive backspaces remove multiple successive characters.
Your task is to write a program that compares two strings that may contain backspaces and reports if they are equal. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
Latin Squares
June 18, 2019
A latin square of order n is a square matrix with n rows and n columns, with each entry in the matrix containing an integer from 0 to n − 1, arranged so that no row or column contains duplicate integers. Here is a sample latin square of order 10:
8 3 7 1 5 6 4 2 0 9 4 5 6 2 0 9 3 7 8 1 9 2 3 8 7 5 1 4 6 0 2 6 0 3 9 8 7 5 1 4 0 4 2 9 3 7 8 1 5 6 6 1 4 0 2 3 9 8 7 5 1 7 5 4 6 0 2 3 9 8 3 0 9 7 8 1 5 6 4 2 5 8 1 6 4 2 0 9 3 7 7 9 8 5 1 4 6 0 2 3
Your task is to write a program that generates latin squares of order n. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
Van Eck Sequence
June 14, 2019
Neil Sloane is on Numberphile again, discussing the Van Eck sequence (A181391):
The first item in the sequence is 0. Compute the next item as follows: If the previous item has not previously appeared in the sequence, add 0 to the sequence, otherwise add to the sequence the number of steps back in the sequence the previous item previously appeared. For instance, the first item is 0. Since 0 has not previously appeared in the sequence, the next item is 0. Now 0 has previously appeared, and the previous 0 was one back in the sequence, so add 1 to the sequence. Since 1 has not previously appeared, add 0. But 0 appeared previously, two back in the sequence, so add 2. Since 2 has not previously appeared, add 0. But 0 appeared previously, two items back, so add 2 to the sequence. Since 2 previously appeared in the sequence, two terms back, add another 2 to the sequence. The next item in the sequence is 1, because 2 also appeared as the previous number. Since 1 appeared in the sequence, count back to the previous 1, and add 6 to the sequence. And so on. The sequence begins 0, 0, 1, 0, 2, 0, 2, 2, 1, 6, 0, 5, 0, 2, 6, 5, 4, 0, ….
Your task is to write a program that generates the Van Eck sequence and investigate the properties of the sequence. When you are finished, you are welcome to ,a href=”https://programmingpraxis.com/2019/06/14/van-eck-sequence/2/”>read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
Maximum Product
June 11, 2019
I think today’s exercise comes from one of those hacker testing sites, but I’m not sure:
Given three arrays of integers, both positive and negative, find the maximum product that can be formed by taking one element from each array. For instance, if A = [10,-10,15,-2], B = [10,-12,13,-2], and C = [-11,-10,9,-12], the maximum product is 2160 using 15, -12 and -12.
Your task is to write a program that finds the maximum product of three integers, taking one each from three arrays. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
Primitive Roots
June 7, 2019
In modular arithmetic, a number g is a primitive root of n if, for every a coprime to n, there exists some k such that gk ≡ a (mod n). The concept of a primitive root was developed by Gauss and pops up from time to time in work on cryptography and number theory.
There is no formula for computing a primitive root, but they are common enough that it is easy to just randomly search for them; more commonly, people just start at 2 and work their way up. Once a primitive root has been found, the remaining primitive roots of n can be found by exponentiating mod n.
Your task is to write a program that computes the primitive roots of prime n. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.