## Triperfect Numbers

### April 23, 2019

We have another exercise today based on a Numberphile video:

A perfect number is a number

nthat is equal to the sum of its divisors, excluding itself; in other words, a perfect numbernsatisfies the equation σn= 2n, where σ is the divisor-sum function. A triperfect number is a numbernsuch that σn= 3n. It is believed that there are six, and only six, triperfect numbers.

Your task is to compute the six triperfect numbers. 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.

## Almost Primes

### April 19, 2019

Today’s exercise was inspired by a task at Rosetta Code:

An integer

n> 1 is ak-almost-prime if it is the product ofkprimes. Further, ak-almost prime is squarefree if allkprimes are distinct.

You can learn more about *k*-almost-primes and their uses in number theory at Wikipedia or MathWorld.

Your task is to write programs that calculate the first ten *k*-almost-primes and squarefree *k*-almost-primes for 1 ≤ *k* ≤ 5. 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.

## The Last Prime Digit

### April 16, 2019

Over at *NumberPhile*, Dr Grimes (can you look at him and not smile?) discusses the pattern in the last digits of successive prime numbers. It’s not what you think.

Your task is to write a program that mimics the calculations made by Dr Grimes. 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.

## Three Simple Math Problems

### April 12, 2019

Here are three simple math problems. They are intended to be solved analytically, with number theory, without using a computer or a calculator. But I cheated. All three problems come from the YouTube channel *Mind Your Decisions*, where you will find lots of similar problems.

- Solve for
*x*and*y*where both are integers: 615 +*x*^{2}= 2^{y} - Find a three-digit number
*abc*= 100*a*+ 10*b*+*c*with none of the digits 0 such that*abc*=*a*! +*b*! +*c*! - Find a three-digit number
*pie*= 100*p*+ 10*i*+*e*with none of the digits 0 such that √pi + e = √ pie

Your task is to solve the three problems; you can write programs to solve them, if you wish, but it is fun to solve them by hand. When you are finished, you are welcome to or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.

## Grep-CSV

### April 9, 2019

Regular readers of this blog know that. in my day job, I frequently process input files from vendors; almost always, they were created in Excel and arrive in CSV format. Sometimes I have to peek inside the files, looking for invalid data, and I have commonly used `grep`

for that task. Sometimes `grep`

gives me unwanted records, because there is a match in some field that is not the field of interested, and I just ignore the extra records. But the other day I had a mess, with *lots* of unwanted records, so I used `awk`

to parse out the fields and find the records of interest.

I realized as I was performing that task that it would be useful to have a version of `grep`

that understood the CSV file format. So I wrote `grep-csv`

that takes a field number (counting from 1, like `awk`

) and a regular expression and returns the matching rows of a CSV file.

Your task is to write a `grep-csv`

program. 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.

## Destructuring-Bind

### April 5, 2019

We implemented Chris Okasaki’s physicist’s queues in the previous exercise. As I implemented them in Scheme, I struggled to maintain Okasaki’s clear, consise coding style, which relies heavily on pattern matching. There are several pattern-matching libraries available for Scheme, but they are rather heavy (the one I use, by Friedman, Hilsdale and Dybvig, is over six hundred lines of code). Our Standard Prelude has a simple pattern matcher, but it doesn’t fit properly with a simple binding. I finally came up with a strange method using `let-values ... apply values`

that makes the code concise at the cost of forcing readers to think through an uncommon idiom. What I wanted was something similar to the destructuring-bind macro of Common Lisp.

So I wrote one.

Your task is to write a macro similar to the destructuring-bind macro of Common Lisp and add it to your favorite programming language. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution in the comments below.

## Okasaki’s Physicists Queues

### April 2, 2019

One of my favorite programming textbooks is Chris Okasaki’s *Purely Functional Data Structures*, which I pick up and re-read every year or so. Today’s exercise asks you to

implement Okasaki’s physicist’s queues, which you can read about in either his book (Figure 6.3 on page 73) or his thesis (Figure 3.4 on page 31). Queues provide two constructors `empty`

and `snoc`

, two accessors `head`

and `tail`

, and a single predicate `isEmpty`

; it is an error if either `head`

or `tail`

are applied to an empty queue. This version comes from the book:

structure PhysicistsQueue : QUEUE struct type alpha Queue = α list × int × α list susp × int × α list val empty = ([], 0, $[], 0, []) fun isEmpty (_, lenf, _, _, _) = (lenf = 0) fun checkw ([], lenf, f, lenr, r) = (force f, lenf, f, lenr, r) | checkw q = q fun check (q as (w, lenf, f, lenr, r)) = if lenr < lenf then checkw q else let val f' = force f in checkw (f', lenf + lenr, $(f' @ rev r), 0, []) end fun snoc ((w, lenf, f, lenr, r), x) = check (w, lenf, f, lenr + 1, x :: r) fun head ([], lenf, f, lenr, r) = raise EMPTY | head (x :: w, lenf, f, lenr, r) = x fun tail ([], lenf, f, lenr, r) = raise EMPTY | tail (x :: w, lenf, f, lenr, r) = check (w, lenf - 1, $tl (force f), lenr, r) end

Your task is to implement Okasaki’s physicists queues. 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.

## Project Euler 12

### March 29, 2019

When a question about Project Euler 12 came up today at Reddit, I came here to link my solution to the problem, only to find out that we have never done that problem. So today we will.

The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be:

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, …

Let us list the factors of the first seven triangle numbers:

1: 1

3: 1,3

6: 1,2,3,6

10: 1,2,5,10

15: 1,3,5,15

21: 1,3,7,21

28: 1,2,4,7,14,28We can see that 28 is the first triangle number to have over five divisors.

What is the value of the first triangle number to have over five hundred divisors?

Your task is to write a program to solve Project Euler 12. 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.

## Multiplicative Persistance

### March 26, 2019

Over at NumberPhile, Matt and Brady are talking about multiplicative persistance:

Take a number. Multiply all its digits together. Repeat with the new number until it reaches a single digit. For instance, starting from 327, the product of the digits 3, 2 and 7 is 42, then recurring with 42 the product of the digits 4 and 2 is 8, which is the final answer; we say the sequence 327 → 42 → 8 finishes in 2 steps. What number leads to a sequence with the maximal number of steps?

The video includes some live-coding in Python by Matt.

Your task is to implement a function to compute the multiplicative persistance sequence starting from a given number, then “play with it” as Matt suggests. 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.

## Data Laundry, Revisited

### March 22, 2019

Data laundry is the act of cleaning data, as when it arrives in one format and must be translated to another, or when external data must be checked for validity. Some weeks, as this week, data laundry occupies a significant portion of my time at work, so it’s an exercise worth examining. We looked at data laundry in two previous exercises. Today’s exercise in data laundry comes to us from Stack Overflow:

I have a file like this:

AAKRKA HIST1H1B AAGAGAAKRKATGPP AAKRKA HIST1H1E RKSAGAAKRKASGPP AAKRLN ACAT1 LMTADAAKRLNVTPL AAKRLN SUCLG2 NEALEAAKRLNAKEI AAKRLR GTF2F1 VSEMPAAKRLRLDTG AAKRMA VCL NDIIAAAKRMALLMA AAKRPL WIZ YLGSVAAKRPLQEDR AAKRQK MTA2 SSSQPAAKRQKLNPAI would like to kind of merge 2 lines if they are exactly the same in the 1st column. The desired output is:

AAKRKA HIST1H1B,HIST1H1E AAGAGAAKRKATGPP,RKSAGAAKRKASGPP AAKRLN ACAT1,SUCLG2 LMTADAAKRLNVTPL,NEALEAAKRLNAKEI AAKRLR GTF2F1 VSEMPAAKRLRLDTG AAKRMA VCL NDIIAAAKRMALLMA AAKRPL WIZ YLGSVAAKRPLQEDR AAKRQK MTA2 SSSQPAAKRQKLNPASometimes there could be more than two lines starting with the same word. How could I reach the desired output with bash/awk?

Your task is to write a program to solve this simple task of data laundry. 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.