[Risolto]Primissimi passi con OO, Basic, ecc.

Non sapete dove scrivere? Scrivete qui!
Regole del forum
Solo richieste di aiuto. Per saluti e presentazioni utilizzate il forum Discussioni Generali e Presentazioni.
Rispondi
Teorema55
Messaggi: 7
Iscritto il: lunedì 24 luglio 2017, 20:44
Località: Lecco (LC) - Italia

[Risolto]Primissimi passi con OO, Basic, ecc.

Messaggio da Teorema55 »

Ciao a tutti.

Premetto di essermi iscritto oggi al forum dopo avere installato il magnifico OpenOffice da pochi giorni.

Vorrei creare tutti i riquadri 3 x 3 possibili che contengano gli interi da 1 a 9 senza ripetizioni, e che rispettino determinate condizioni (somma dei valori in riga, in colonna e in diagonale compresa tra i valori 10, 11, 12, 14, 15, 16, 17, 18 senza ripetizioni)

Ho pensato di creare una Macro per programmare in Basic una matrice modificabile che rispetti tali condizioni e che mi mostri a video tutte le combinazioni diciamo....................."vincenti".

Come potete immaginare, da neofita di OO e del suo Basic, mi trovo alle prese con una montagna di problemi, per cominciare:

- è la strada giusta per risolvere il mio problema o posso fare di meglio?
- come memorizzare i risultati trovati per poi, alla fine, visualizzarli?
- oppure è meglio visualizzarli man mano che si trovano?
- tutto l'output che riesco ad ottenere è la visualizzazione in un pop up dei valori della prima matrice, uno alla volta.........

E così via. Ciò che chiedo sono solo dritte, consigli, osservazioni, e non un codice di cui fare copia e incolla, anche se qualche frammento esplicativo potrebbe essere utile. Desidero imparare il linguaggio e l'uso di OO in generale. E poi risolvere il quesito che da giorni stiamo dibattendo nel forum di matematicamente.it, sezione "Giochi matematici"

Credo di avere già messo molta carne al fuoco (spero non troppa) e sono ansioso di conoscere qualche parere. Grazie quindi in anticipo a chiunque voglia darmi una mano.

Cordialmente.

Marco
Ultima modifica di Teorema55 il martedì 1 agosto 2017, 18:53, modificato 1 volta in totale.
Le persone credono di essere libere, ma sono solo libere di crederlo.
Jim Morrison
hubert lambert
Volontario
Volontario
Messaggi: 164
Iscritto il: venerdì 9 giugno 2017, 13:48

Re: Primissimi passi con OO, Basic per Macro, matrici e visu

Messaggio da hubert lambert »

Con il basic quello esercizio sarebbe molto difficile. Con python invece, un linguaggio abbastanza bene integrato con OpenOffice/LibreOffice, diventa molto più facile!

Ecco un esempio per ottenere le combinazioni che desideri:

Codice: Seleziona tutto

from itertools import permutations
def getseries():
    def isvalid(serie):
        lines = (serie[0:3], serie[3:6], serie[6:9],  # rows
                 serie[0::3], serie[1::3], serie[2::3],  # columns
                 serie[0::4], serie[2:-1:2])  # diagonals
        return all(sum(line) in limits for line in lines)
    limits = range(10, 18+1)
    P = permutations(range(1,10))
    return (serie for serie in P if isvalid(serie))
e per trasformarle in una matrice inseribile in Calc:

Codice: Seleziona tutto

from itertools import chain, zip_longest
def series2calcarray(series):
    def grouper(iterable):
        return zip_longest(*[iter(iterable)]*n, fillvalue=fillvalue)
    n = 3
    fillvalue=''
    # <serie+('',)> permette di interporre una riga vuota
    res = [grouper(serie+('',)) for serie in series] 
    return list(chain(*res)) 
Se sei neofita, imparare python o basic sarà uguale penso...
Allego un file con l'intero codice:

Codice: Seleziona tutto

from itertools import permutations, chain
try:
    from itertools import izip_longest as zip_longest
except ImportError:
    from itertools import zip_longest
from com.sun.star.sheet.CellFlags import VALUE, STRING

DOWN, UP = 10, 18
MAXCOL = 15
STARTCOL, STARTROW = 1, 1
DEST_SHEET = "riquadri"

def crea_riquadri(event=None):
    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.Sheets.getByName(DEST_SHEET)
    sheet.clearContents(VALUE|STRING)
    series = getseries()
    data = getseries()
    data = series2calcarray(series)
    # dividerer in colonne
    maxrows = getmaxrows(data)
    startcol = STARTCOL
    while data:
        column = data[:maxrows]
        dest = sheet.getCellRangeByPosition(startcol, STARTROW, startcol+len(column[0])-1, len(column)-1+STARTROW)
        startcol += len(column[0])+1
        dest.setDataArray(tuple(column))
        dest.Columns.OptimalWidth = True
        del data[:maxrows]

def getseries():
    def isvalid(serie):
        lines = (serie[0:3], serie[3:6], serie[6:9],  # rows
                 serie[0::3], serie[1::3], serie[2::3],  # columns
                 serie[0::4], serie[2:-1:2])  # diagonals
        return all(sum(line) in limits for line in lines)
    limits = range(DOWN, UP+1)
    P = permutations(range(1,10))
    return (serie for serie in P if isvalid(serie))

def series2calcarray(series):
    def grouper(iterable):
        return zip_longest(*[iter(iterable)]*n, fillvalue=fillvalue)
    n = 3
    fillvalue=''
    # <serie+('',)> permette di interporre una riga vuota
    res = [grouper(serie+('',)) for serie in series] 
    return list(chain(*res))

def getmaxrows(data):
    x = len(data) // MAXCOL
    return x+(4-x%4)
Teoreme55.ods
(53.72 KiB) Scaricato 144 volte
 Editato: Versione corretta
Teoreme55-v2.ods
(62.63 KiB) Scaricato 148 volte
 
Ultima modifica di hubert lambert il mercoledì 26 luglio 2017, 21:48, modificato 3 volte in totale.
OpenOffice 4.1.2/4.1.4 | LibreOffice 5.4.4/6.0
Win7 + LinuxMint
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8807
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Primissimi passi con OO, Basic per Macro, matrici e visu

Messaggio da charlie »

Ciao e benvenuto sul forum @Teorema55.
Se ti vuoi presentare puoi farlo qui: viewforum.php?f=16
Buon proseguimento.
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
Teorema55
Messaggi: 7
Iscritto il: lunedì 24 luglio 2017, 20:44
Località: Lecco (LC) - Italia

Re: Primissimi passi con OO, Basic per Macro, matrici e visu

Messaggio da Teorema55 »

Grazie a entrambi, ragazzi, davvero.

Rimando le presentazioni alla sezione ad hoc.

Ciao, per ora.

Marco
Le persone credono di essere libere, ma sono solo libere di crederlo.
Jim Morrison
hubert lambert
Volontario
Volontario
Messaggi: 164
Iscritto il: venerdì 9 giugno 2017, 13:48

Re: Primissimi passi con OO, Basic per Macro, matrici e visu

Messaggio da hubert lambert »

Ciao,
Teorema55 ha scritto:somma dei valori in riga, in colonna e in diagonale compresa tra i valori 10, 11, 12, 14, 15, 16, 17, 18 senza ripetizioni
Mi dispiace, non avevo capito bene il "senza ripetizioni"! :roll: .
Ecco une terza versione.
Allegati
Teoreme55-v3.ods
(18.83 KiB) Scaricato 135 volte
OpenOffice 4.1.2/4.1.4 | LibreOffice 5.4.4/6.0
Win7 + LinuxMint
Teorema55
Messaggi: 7
Iscritto il: lunedì 24 luglio 2017, 20:44
Località: Lecco (LC) - Italia

Re: Primissimi passi con OO, Basic per Macro, matrici e visu

Messaggio da Teorema55 »

Grazie infinite, amico mio.

Sto provando il nuovo codice, ma sembra che non dia output (so che esistono matrici con quelle caratteristiche, ne conosco almeno due). Vedrò di risolvere confrontandolo con il precedente.......

Quanto a Python, appena fuori da questa "sfida" (anzi anche durante), è un linguaggio che non conosco assolutamente, mentre di Basic ho una certa infarinatura. Ma, amando le sfide, vedrò di capirne qualcosa, è molto diverso dal Basic..........in che senso intendevi "Con il basic quell' esercizio sarebbe molto difficile" ?

E, infine: come faccio a vedere il codice sorgente della macro?

Notturnamente.

Marco

:D
Le persone credono di essere libere, ma sono solo libere di crederlo.
Jim Morrison
hubert lambert
Volontario
Volontario
Messaggi: 164
Iscritto il: venerdì 9 giugno 2017, 13:48

Re: Primissimi passi con OO, Basic per Macro, matrici e visu

Messaggio da hubert lambert »

Teorema55 ha scritto:Grazie infinite, amico mio.
Con piacere: è un po' come una sfida anche per me ;) .
Teorema55 ha scritto:Sto provando il nuovo codice, ma sembra che non dia output
Quali sono i tuoi sistema e programma?
Da me, l'output è quello, sia con OpenOffice che con Libreoffice:
Teoreme55.png
Teorema55 ha scritto:in che senso intendevi "Con il basic quell' esercizio sarebbe molto difficile" ?
Funzioni di permutazione, di raggrupamento o taglio di matrici... sono già scritte ed ottime, quando si deve crearle "a mano" con basic. Lo stesso codice sarà molto più lungo e, forse, meno efficace.
Teorema55 ha scritto:E, infine: come faccio a vedere il codice sorgente della macro?
Il più semplice:
- carica ed installa l'estensione APSO, che permette di vedere e di recuperare il codice inserito nel file;
- copialo nella cartella del user: per esempio in Windows, C:\Users\<username>\AppData\Roaming\OpenOffice\4\user\Scripts\python, dove sarà più facile da modificare.
Lo troverai anche allegato qui.

Saluti,

HL
Allegati
Teorema55.zip
(1.06 KiB) Scaricato 127 volte
OpenOffice 4.1.2/4.1.4 | LibreOffice 5.4.4/6.0
Win7 + LinuxMint
Teorema55
Messaggi: 7
Iscritto il: lunedì 24 luglio 2017, 20:44
Località: Lecco (LC) - Italia

Re: Primissimi passi con OO, Basic per Macro, matrici e visu

Messaggio da Teorema55 »

Ho Windows 10 upgradato da Windows 7 ed uso OpenOffice 4, Math..........forse dovrei usare il foglio di calcolo?

Sono al lavoro e scaricherò il codice questa sera.

Ti faccio sapere.

Cordialmente. :P

Marco
Le persone credono di essere libere, ma sono solo libere di crederlo.
Jim Morrison
Teorema55
Messaggi: 7
Iscritto il: lunedì 24 luglio 2017, 20:44
Località: Lecco (LC) - Italia

Re: Primissimi passi con OO, Basic per Macro, matrici e visu

Messaggio da Teorema55 »

Finalmente sono riuscito a vedere il codice, anche se non a inserirlo nella Macro :crazy:

Non ti chiedo di darti ulteriormente da fare per risolvere il mio problema: Python deve avere grandi qualità ma è arabo per me. Penso che continuerò a tentare di combinare qualcosina con il Basic, all'occorrenza.

Grazie ancora per il tuo magnifico contributo.

Cordialmente.

Marco
Le persone credono di essere libere, ma sono solo libere di crederlo.
Jim Morrison
Rispondi