Mi amigo HHT da una transformación.
Yo uso el código en python para comprobar que mi construcción y @Phicar 's de la construcción es bijective. Pero yo todavía no puede proporcionar la prueba ahora
En $h(n,m)$, considere las cajas con $n^{\text{th}}$ pelota. La caja contiene $a_1^{\text{th}},a_2^{\text{th}}\ldots,n^{\text{th}}$. Mover toda la bola de $a_i^{\text{th}}$ a la caja que contiene a$a_{i+1}^{\text{th}}$ hasta que la caja contiene $n^{\text{th}}$ el balón. A continuación, retire la caja así como el $n^{\text{th}}$ pelota.
Pero todavía no puedo probar que es un bijective aún
El ejemplo:
$\{135|2|4\},\{13|25|4\},\{14|25|3\},\{14|2|35\},\{15|24|3\},\{1|24|35\},\{13|24|5\}$
Mover las bolas:
$\{5|12|34\},\{123|5|4\},\{14|5|23\},\{134|2|5\},\{5|124|3\},\{1|234|5\},\{13|24|5\}$
Retire $5$
$\{12|34\},\{123|4\},\{14|23\},\{134|2\},\{124|3\},\{1|234\},\{13|24\}$
# assert n <= 10 for convenience, otherwise the str will be too long
# and my brute force algorithm will be too slow
import copy
def sort(arr):
for elem in arr:
elem = sorted(elem)
arr = sorted(arr, key=lambda x:x[0])
return arr
def is_valid_S(arr):
return all(arr)
def is_valid_H(arr):
if not is_valid_S(arr):
return False
for elem in arr:
for i in range(len(elem)-1):
if elem[i] + 1 == elem[i+1]:
return False
return True
# generate(5, 3, is_valid_H) or generate(4, 2, is_valid_S)
def generate(n, m, is_valid):
res = []
for i in range(m**n):
val = i
tmp = []
for i in range(m):
tmp.append([])
for idx in range(n):
tmp[val % m].append(idx+1)
val //= m
if is_valid(tmp) and sort(tmp) not in res:
res.append(sort(tmp))
return res
def H2S(m_h_arr):
h_arr = copy.deepcopy(m_h_arr)
n = max(map(max, h_arr))
idx = 0
while n not in h_arr[idx]:
idx += 1
h_arr[idx].remove(n)
for elem in h_arr[idx]:
_idx = 0
while elem + 1 not in h_arr[_idx]:
_idx += 1
h_arr[_idx].insert(h_arr[_idx].index(elem+1),elem)
del h_arr[idx]
return h_arr
def remove_adjacent(elem):
idx = len(elem) - 2
removed = []
while idx != -1:
if elem[idx] + 1 == elem[idx + 1]:
removed.append(elem[idx])
del elem[idx]
idx -= 1
return elem, removed
def S2H(m_s_arr):
s_arr = copy.deepcopy(m_s_arr)
n = max(map(max, s_arr))
removed = []
for i in range(len(s_arr)):
e, r = remove_adjacent(s_arr[i])
s_arr[i] = e
for val in r:
removed.append(val)
removed.append(n+1)
s_arr.append(sorted(removed))
return sort(s_arr)
def is_bijective(n, m, H2S, S2H):
if n > 9:
print("please set n < 10")
return
hs = generate(n, m, is_valid_H)
ss = generate(n-1, m-1, is_valid_S)
ss_ = list(map(H2S, hs))
hs_ = list(map(S2H, ss))
return all(map(lambda x:x in hs, hs_)) \
and all(map(lambda x:x in hs_, hs)) \
and all(map(lambda x:x in ss, ss_)) \
and all(map(lambda x:x in ss_, ss))
is_bijective(8,4,H2S,S2H)