Kod: Zaznacz cały
# The following is a second version of the program that lists the actual dissections.
#It produces a list of pairs for each dissection:
b:= proc(n, l, ll) local i, k, s, t;
if max(l[])>n then 0 elif n=0 or l=[] then lprint(ll); 1
elif min(l[])>0 then t:=min(l[]); b(n-t, map(h->h-t, l), ll)
else for k do if l[k]=0 then break fi od; s:=0;
for i from k to nops(l) while l[i]=0 do s:=s+
b(n, [l[j]$j=1..k-1, 1+i-k$j=k..i, l[j]$j=i+1..nops(l)],
[ll[], [k, 1+i-k]])
od; s
fi
end:
A:= (n, k)-> b(k, [0$n], []):
A(5, 5);
# In each list [a, b] means put a square with side length b at
leftmost possible position with upper corner in row a. For example
[[1, 3], [4, 2], [4, 2], [1, 2], [3, 1], [3, 1], [4, 1], [5, 1]], gives:
._____.___.
| | |
| |___|
|_____|_|_|
| | |_|
|___|___|_|
Być może ktoś tutaj ma więcej kontaktu z tym językiem, i mógłby wytłumaczyć niektóre polecenia.
- co tak właściwie robi
map(h->h-t, l)
- czym zastąpić
nops
oraz dolarki $
- czy można gdzieś uruchomić ten kod? Sage odmawia współpracy, a nie zamierzam kupować licencji żeby sprawdzić jedną rzecz i zapomnieć o programie.