## Homework

### April 3, 2020

Here’s my solution:

```(define (rept n x)
(map (lambda (_) x) (range n)))```
```(define (f n c)
(let ((q (quotient c n))
(r (remainder c n)))
(append (rept r (+ q 1))
(rept (- n r) q))))```
```> (f 7 26)
[4 4 4 4 4 3 3)```

The student’s solution involved a `for` loop followed by a `for` loop embedded in a `while` loop. He mixed the `rept` logic with the rest of the program logic and ended up with a mess; separating `rept` into its own function clearly simplifies the program.

You can run the program at https://ideone.com/TTfLvP.

Pages: 1 2

### 9 Responses to “Homework”

1. James Curtis-Smith said

A perl “1-liner”:

[sourceode lang=”perl”]
print “@{[ hw(@ARGV) ]}\n”;

sub hw {
my(\$C,\$N) = @_;
return map { int(\$C/\$N) + (\$_<\$C%\$N) } 0..(\$N-1);
}
[/sourcecode]

2. chaw said

A simple solution in standard R7RS Scheme and a couple of popular
helpers.

``` (import (scheme base) (scheme write) (only (srfi 8) receive) (only (srfi 1) list-tabulate)) (define (homework c n) (receive (q r) (floor/ c n) (list-tabulate n (lambda (i) (if (< i r) (+ q 1) q))))) (display (homework 26 7)) (newline) ```

Output:

``` (4 4 4 4 4 3 3) ```

3. Daniel said

Here’s a solution in Python.

```def homework(C, N):
q, r = divmod(C, N)
return [q + (x < r) for x in range(N)]

print(homework(26, 7))
```

Output:

```[4, 4, 4, 4, 4, 3, 3]
```
4. Globules said

```-- A list of n numbers whose sum is c, each of which differs by at most 1 from
-- all the others.  We assume n >= 1.
sumTo :: Int -> Int -> [Int]
sumTo c n = let (q, r) = c `divMod` n in replicate r (q+1) ++ replicate (n-r) q

test :: Int -> Int -> IO ()
test c n = do
let xs = sumTo c n
putStrLn \$ show c ++ " " ++ show n ++ ": " ++
show xs ++ " sum to " ++ show (sum xs)

main :: IO ()
main = do
test 26  7
test 18  3
test  5 10
test  0  2
-- Negative numbers work, too.
test (-8) 3
```
```\$ ./homework
26 7: [4,4,4,4,4,3,3] sum to 26
18 3: [6,6,6] sum to 18
5 10: [1,1,1,1,1,0,0,0,0,0] sum to 5
0 2: [0,0] sum to 0
-8 3: [-2,-3,-3] sum to -8
```
5. ```def homework(N, C):
for k in range(1, N+1):
a = (k-N+C)/N
if a==int(a):
return [int(a)]*k + [int(a)+1]*(N-k)

homework(7, 26) #=> [3, 3, 4, 4, 4, 4, 4]
homework(2, 25) #=> [12, 13]
homework(3, -8)  #=> [-3, -3, -2]
```
6. Dave said

def homework(C, N):
if C % N == 0:
answer = [C / N] * N
else:
remainder = C % N
C -= remainder
answer = [C / N] * N
for i in range(remainder):
```[C//N+1]*(C%N) + [C//N]*(N-C%N)