4 ms·
Pretty sure the answer is no as a math problem where f is pure. If f returns the same answer each time, the square ending at N,N contains [1, N * N]. Then the r
by arnioxux 6y ago
Pretty sure the answer is no as a math problem where f is pure. If f returns the same answer each time, the square ending at N,N contains [1, N * N]. Then the rectangle ending at N,N+1 must contain (N * N, N * (N+1)] in the nonoverlapping strip. Ditto for N+1,N. But then for N+1,N+1 all other locations must contain low numbers and there's only a single corner cell left which can contain the rest of the missing numbers between (N(N+1), (N+1)(N+1)]. Unless I made a mistake I don't think any function would work here for N > 1. What were the examples you found?
OTOH as a programming problem you can just cheat and store state somewhere to count the row width. This satisfies your interface requirements (python):
lastJ = None
def f(i, j):
global lastJ
if i != 0:
return i * (lastJ + 1) + j
else:
lastJ = j
return j
N = 3
M = 5
seen = set()
for i in range(N):
for j in range(M):
q = f(i, j)
seen.add(q)
assert sorted(seen) == list(range(N * M))
- pinopinopino 6y agoI am on work, so can't access my home laptop. But this problem is related to pairing functions (but those work for the whole domain of the naturals). It means you need to find a function that walks the numbers in a nice way, like seen here: http://szudzik.com/ElegantPairing.pdf http://szudzik.com/ElegantPairing.pdf I think it isn't possible to find a function that works for arbitrary sequences. I know there is a function that works if the sets have the same size (n is size), it is trivial why those work. They have the form n^0 a + n^1 b, where a,b are in [1..n]: f :: Integer -> (Integer,Integer) -> Integer f n (i,j) = i + (j - 1)*n -- For example: f 3 <$> ((,) <$> [1..3] <*> [1..3]) [1,4,7,2,5,8,3,6,9] Now I want to find functions like (n,m is size, n /= m): f n m (i,j) = .. And functions where n maybe chosen but m is between certain bounds. I have found a couple of those by mutilating pairing functions. I know I can use a counter, but I don't like cheating :p I need to draw your reasoning on a paper to see it or take some time for it. Little bit busy, working from home, having the kids and stuff :p
- pinopinopino 6y agoMade a small error: f n (i,j) = (i - 1)*n + j These also work for when i > n as long as j is between 1 and n.