[Maple] Wyszukiwanie kafelkowań

Awatar użytkownika
Martingale
Użytkownik
Użytkownik
Posty: 76
Rejestracja: 9 lip 2013, o 10:49
Płeć: Mężczyzna
Lokalizacja: Stuttgart
Podziękował: 3 razy
Pomógł: 10 razy

[Maple] Wyszukiwanie kafelkowań

Post autor: Martingale »

Witam, to mój pierwszy post na tym forum! Potrzebuję pomocy z kodem programu napisanego w Maple.

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:
._____.___.
|     |   |
|     |___|
|_____|_|_|
|   |   |_|
|___|___|_|  
Prawdę mówiąc nigdy nie programowałem w tym języku, więc próbuję przepisać to do czegoś bardziej przyziemnego, np. C++, ale znam też Javę czy Pythona.

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.
Kamaz
Użytkownik
Użytkownik
Posty: 127
Rejestracja: 13 kwie 2013, o 13:44
Płeć: Kobieta
Pomógł: 21 razy

[Maple] Wyszukiwanie kafelkowań

Post autor: Kamaz »

Też nigdy w tym języku nie programowałam, ale znaczenie funkcji nops nie jest trudne do wygooglania. nops(l) to po prostu liczba elementów listy l.

Spodziewam się, że map(h->h-t, l) nic nie robi, tylko jest to lista powstała poprzez zastąpienie każdego elementu h listy l elementem h-t.

Co do dolarów nie jestem pewna, ale wygląda to na (wycinanki listowe).
Awatar użytkownika
Martingale
Użytkownik
Użytkownik
Posty: 76
Rejestracja: 9 lip 2013, o 10:49
Płeć: Mężczyzna
Lokalizacja: Stuttgart
Podziękował: 3 razy
Pomógł: 10 razy

[Maple] Wyszukiwanie kafelkowań

Post autor: Martingale »

Naukowców chyba powinno uczyć się więcej nie tyle programowania, co raczej pewnych konwencji - zmienne o jednoliterowych nazwach i maksymalna kompresja kodu wcale nie sprzyjają zrozumieniu.

Sam język wcale nie jest lepszy, dziwna konstrukcja for-while, nazywanie len (Python) nieintuicyjnym nops i jeszcze ta koszmarna ósma linijka, doprawdy. Coś takiego trzeba unicestwić, po uprzednim przepisaniu najbardziej wartościowego kodu do innych języków. Dokumentacja jest wykonana gorzej niż u konkurencji, chociażby zawierają przykłady, które nie wyjaśniają zbyt wiele. Zadziwia mnie popularność Maple.

Wydaje mi się, że w Maple listy numerowane są od jedynki, nie od zera. Zagadkowa pozostaje dla mnie szósta linijka: else for k do if l[k]=0 then break fi od; s:=0;. Skoro k jest l. całkowitą (bo indeksuje tablicę), to kiedy ta pętla się przerwie?

Postanowiłem spróbować najpierw Pythona, ale jest problem.

Lista l robi się coraz dłuższa, kiedy przerwałem działanie programu zawierała \(\displaystyle{ 83886080}\) elementów i doszło do błędu pamięci (MemoryError)
ODPOWIEDZ