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.
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]
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:
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:
Here’s a Haskell version.
-- 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) 3def 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]https://github.com/dennisporterjr/practice-algorithms/blob/master/one-diff-sum.js
def homework(C, N):
if C % N == 0:
answer = [C / N] * N
return answer
else:
remainder = C % N
C -= remainder
answer = [C / N] * N
for i in range(remainder):
answer[i] += 1
return answer
print(solver(26,7))
Racket: https://github.com/xojoc/programming-praxis/blob/master/2020_04_03.rkt
Using Python with + for concatenation of lists and * for repetition ([1] * 3 == [1, 1, 1]).