Risultati da 1 a 24 di 24

Discussione: Giochiamo coi fiammiferi



  1. #1
    L'avatar di Marius44
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Catania
    Età
    73
    Messaggi
    3223
    Versione Office
    Excel2010
    Likes ricevuti
    628
    Likes dati
    155

    Giochiamo coi fiammiferi

    Salve a tutti
    Dopo aver … ricaricato le batterie (spero abbiate fatto tutti buone vacanze) rimettiamoci al lavoro.

    Ho creato un piccolo … giochino e, aggiungo, ho ovviamente anche la soluzione per il seguito (che mi premurerò di pubblicare dopo aver visionato i vostri spunti e non prima del 27/08/16).

    Nell’allegato vedrete che, inserendo base e altezza, viene creata un’area e questa area viene riempita di barre e ne viene dato il totale.

    Fate finta che questa area dovete costruirla con dei fiammiferi (ecco il titolo) ponendoli uno dopo l’altro. Ovvio che un’area di 36 quadratini potrà essere formata da 3 x 12, 4 x 9 oppure 6 x 6. A seconda dei dati che inserite viene mostrata la relativa area.

    Ma qual è l’area che utilizza meno fiammiferi e come calcolarla?

    Sotto con le vostre soluzioni!
    Guru ed Esperti sono pregati di inserire le loro soluzioni non prima delle 16.00 di domani . Grazie.

    Ciao a tutti e buon divertimento,
    Mario

    PS. Se c’è qualche imperfezione (e c’è di sicuro) segnalatemela. Grazie ancora.
    Ho preferito inserire il 3D in questa sezione per la maggiore visibilità e perchè non è un gioco completo. Alla fine pregherò Gerardo o Max di trasferirla nell'apposita sezione.
    File Allegati File Allegati

  2. #2
    L'avatar di Gerardo Zuccalà
    Clicca e Apri
    Data Registrazione
    May 2015
    Località
    Milano, Italy
    Età
    49
    Messaggi
    4916
    Versione Office
    2013
    Likes ricevuti
    1117
    Likes dati
    1126

    Re: Giochiamo coi fiammiferi

    Ciao Mario
    Non ho avuto modo di studiarmi il tuo gioco, ma conoscendoti sono sicuro che sarà ottimo e funzionale, tuttavia ti volevo chiedere se vuoi che sposto questo 3D nella sezioni "Giochi di Excel"?
    Un saluto

  3. #3

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1024
    Versione Office
    .
    Likes ricevuti
    367
    Likes dati
    0

    Re: Giochiamo coi fiammiferi

    Citazione Originariamente Scritto da Marius44 Visualizza Messaggio

    Nell’allegato vedrete che, inserendo base e altezza, viene creata un’area e questa area viene riempita di barre e ne viene dato il totale.

    Fate finta che questa area dovete costruirla con dei fiammiferi (ecco il titolo) ponendoli uno dopo l’altro. Ovvio che un’area di 36 quadratini potrà essere formata da 3 x 12, 4 x 9 oppure 6 x 6. A seconda dei dati che inserite viene mostrata la relativa area.

    Ma qual è l’area che utilizza meno fiammiferi e come calcolarla?
    Ciao Mario,

    sinceramente non ho capito qual'è il problema da risolvere: se devo indicare base e altezza, il numero di fiammiferi sarà sempre e solo uno:
    base*(altezza+1) + altezza*(base+1)
    Diverso sarebbe se il dato da inserire fosse l'area e si dovesse trovare qual'è il numero di fiammiferi necessari.

    Bho?! forse ho bisogno di ferie
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  4. I seguenti utenti hanno dato un "Like"


  5. #4
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1119
    Versione Office
    2010
    Likes ricevuti
    146
    Likes dati
    1

    Re: Giochiamo coi fiammiferi

    secondo me l'area che utilizza meno fiammiferi è quella in cui la differenza tra base e altezza è la minima possibile, ma non bisogna essere esperti di excel per capirlo. Se ho ragione non mi sembra un gioco interessante che valga la pena sviluppare.
    Scusami Marius ma è così che la penso.

  6. #5

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1024
    Versione Office
    .
    Likes ricevuti
    367
    Likes dati
    0

    Re: Giochiamo coi fiammiferi

    Citazione Originariamente Scritto da patel Visualizza Messaggio
    secondo me l'area che utilizza meno fiammiferi è quella in cui la differenza tra base e altezza è la minima possibile
    Secondo me è quella con base 1 e altezza 1
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  7. #6

    L'avatar di ges
    Clicca e Apri
    Data Registrazione
    Jun 2015
    Località
    Como
    Età
    53
    Messaggi
    7166
    Versione Office
    2011MAC 2016WIN
    Likes ricevuti
    2065
    Likes dati
    1305

    Re: Giochiamo coi fiammiferi

    Ciao a tutti,
    Mario ... non ci ho capito molto veramente... effettivamente come dice Scossa base 1 e altezza 1 dovrebbe essere la minima possibile .... o mi sfugge qualcosa?
    Quando si scartano tutte le ipotesi possibili, quella che resta, anche se può sembrare improbabile, non può che essere quella giusta!

  8. #7
    L'avatar di Marius44
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Catania
    Età
    73
    Messaggi
    3223
    Versione Office
    Excel2010
    Likes ricevuti
    628
    Likes dati
    155

    Re: Giochiamo coi fiammiferi

    Buonasera a tutti
    Forse sono stato infelice nell'indicare il mio obiettivo
    Fate finta che questa area dovete costruirla con dei fiammiferi (ecco il titolo) ponendoli uno dopo l’altro. Ovvio che un’area di 36 quadratini potrà essere formata da 3 x 12, 4 x 9 oppure 6 x 6. A seconda dei dati che inserite viene mostrata la relativa area.

    Ma qual è l’area che utilizza meno fiammiferi e come calcolarla?
    Scossa (che saluto) ha individuato (e che dubbi c'erano?) la formula: base*(altezza+1) + altezza*(base+1) ma non mi pare che sia esatto il seguito: il numero di fiammiferi sarà sempre e solo uno.
    Infatti io ho chiesto qual'è l'area che utilizza meno fiammiferi, quindi la medesima area ma con differenti base e altezza. Ritenevo fosse chiaro che se indico come base 3 e come altezza 12 ottengo un'area di 36 e, applicando la formula di scossa (che è la stessa che ho utilizzato nella macro) ottengo un totale di 87 fiammiferi ma ... per la medesima area se utilizzo base 4 e altezza 9 ottengo un totale di 85 fiammiferi e se, invece, utilizzo base 6 e altezza 6 utilizzo 84 fiammiferi.

    Ecco cosa intendevo.

    In altre parole, dopo aver indicato una base e un'altezza (a mio piacere) chiedo: per quella determinata area vi sono risultati migliori in termini di risparmio di cerini?
    Come faccio il calcolo? E se la risposta è si, come individuo e visualizzo?

    Spero di aver chiarito.
    So che non è un granchè come passatempo ma, dopo le vacanze, mi pare un modo per reinserirsi.

    Ciao a tutti,
    Mario

    PS @Gerardo
    Come ho scritto non mi pare il caso di metterlo fra i giochi.

  9. #8
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: Giochiamo coi fiammiferi

    c'è un problema di fondo.

    per ricoprire di fiammiferi un area bisogna conoscere l area occupata da un fiammifero.
    per sapere quanti fiammiferi servono a delimitare un area si calcola il suo perimetro.

    questi due valri sono univoci. (il perimetro è un unico valore e l atea è un unico valore.

    quello che può essere interessante è:
    dati un certo numero di quadratini, qual è la loro disposizione affinche si utilizzi il minor numero di lati (fiammiferi) o, detta in un altro modo: dato un dato numero di lati(fiammiferi) qual è la disposizione per aver il massimo numero di quadratini.
    o ancora ... il massimo numero di quadrati.
    questi valori, invece, non sono univoci ma multipli e dipendono dalla disposizione dei singoli quadratini rispetto agli altri.

    una figura di base ed altezza identici darà luogo ad un numero di quadrati identico (ovviamente) ad una un altezza pari ad uno ed una larghezza pari al numero che ne definisce l area. il numero di fiammiferi utilizzato invece, sarà differente.

    o forse ho proprio capito pane per focaccia :D :D

  10. #9
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: Giochiamo coi fiammiferi

    aggiungo:
    da come vengon costruite le figure nel file, il numero minimo di fiammiferi lo si ha quando la base è uguale all altezza o dovendo scegliere due valori tra varie coppie di valori non identici fra loro, quelli che son più "vicini" tra loro.
    (questa la tiro ad undovinare dal cellulare considerando che una figura di 2x2 utilizza meno fiammiferi di una figura costruita con 4x1)

  11. #10
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: Giochiamo coi fiammiferi

    mu le muble... mi sa che è veri il contrario :D :D
    è meglio che vado a letto :D :D

  12. #11
    L'avatar di Raffaele_53
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Binasco
    Età
    64
    Messaggi
    506
    Versione Office
    2007
    Likes ricevuti
    85
    Likes dati
    7

    Re: Giochiamo coi fiammiferi

    Ciao a tutti, sempre che abbia capito
    In ogni caso il quadrato vince, per contarli una formula balsana.
    A1=RIF.RIGA()+RIF.RIGA()+RIF.RIGA()+RIF.RIGA()+((RIF.RIGA()-1)*(RIF.RIGA()*1))+((RIF.RIGA()-1)*(RIF.RIGA()*1))
    e trascinate giù

    Formula per rettangoli A1 = B, B1 = A, C1=(A1*(B1+1))+(B1*(A1+1))

  13. #12
    L'avatar di Marius44
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Catania
    Età
    73
    Messaggi
    3223
    Versione Office
    Excel2010
    Likes ricevuti
    628
    Likes dati
    155

    Re: Giochiamo coi fiammiferi

    Ciao a tutti

    Ulteriore chiarimento. Ho detto al post #1
    Nell’allegato vedrete che, inserendo base e altezza, viene creata un’area e questa area viene riempita di barre e ne viene dato il totale.
    Ecco, il verbo riempire non è corretto. Avrei dovuto dire "mettere un fiammifero su ogni lato del quadratino".

    Pertanto (@dracoscrigno) non è necessario conoscere "l'area di un fiammifero":

    Scusate per le imprecisioni. Ciao,
    Mario

  14. #13
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: Giochiamo coi fiammiferi

    Adesso ho capito cosa cerchi
    E vabbè. Mica mi sento tonto per niente

    Prendendo tutto quello detto sopra e filtrando solo quello che è necessario:

    DATI

    b = Base del rettangolo
    h = Altezza del rettangolo
    A = Area del rettangolo dove A(b,h)=b*h
    F= numero dei fiammiferi per costruire la figura di base b ed altezza h dove F(b,h)=(b+1)*h + b*(h+1)

    considerando che l' area A(b,h) non è univoca si chiede di determinare la coppia che, applicando la F(b,h), restituisca il valore minore.

    Perdonatemi ma non sono riuscito a trovare un modo migliore per spiegarlo. se qualcuno capisce gli chiedo la cortesia di tradurre per gli altri


    Il problema si risolve in questo modo:

    - Dati base "b" ed altezza "h" determinare l' arrea "A"
    - determinare i divisori di A
    - la coppia di divisori (presi in modo che moltiplicati fra loro diano come risultato "A") che applicata a F(b,h) da il risultato inferiore, è la coppia più vicina ad A/2, di fatto è il rettangolo "più quadrato possibile"


    Per esempio:

    dando un paio di numeri a caso (si fa per dire)
    b=10
    h=150
    troveremo
    A(10,150)=1500

    i divisori di 1500 sono:
    2 ; 3 ; 4 ; 5 ; 6 ; 10 ; 12 ; 15 ; 20 ; 25 ; 30 ; 50 ; 60 ; 75 ; 100 ; 125 ; 150 ; 250 ; 300 ; 375 ; 500 ; 750


    che presi a coppie di modo che tali coppie moltiplicate fra loro diano 1500 danno luogo a:

    2 * 750 = 1500
    3 * 500 = 1500
    4 * 375 = 1500
    5 * 300 = 1500
    6 * 250 = 1500
    10 * 150 = 1500
    12 * 125 = 1500
    15 * 100 = 1500
    20 * 75 = 1500
    25 * 60 = 1500
    30 * 50 = 1500

    Se a questo listato si aggiunge anche il risultato della funzione F(b,h)

    2 * 750 = 1500 -> 3752
    3 * 500 = 1500 -> 3503
    4 * 375 = 1500 -> 3379
    5 * 300 = 1500 -> 3305
    6 * 250 = 1500 -> 3256
    10 * 150 = 1500 -> 3160
    12 * 125 = 1500 -> 3137
    15 * 100 = 1500 -> 3115
    20 * 75 = 1500 -> 3095
    25 * 60 = 1500 -> 3085
    30 * 50 = 1500 -> 3080

    Sarà facile notare come il valore di "Fiammiferi" maggiore lo si ha quando il rapporto tra base ed altezza è maggiore e, viceversa, quando il rapporto tra base ed altezza è minore, praticamente più ci si avvicina alla forma di un quadrato e minore è il dispendi di fiammiferi.


    Per i vari calcoli ho creato una funzione che restituisce una collection di divisori e questi li ho stampati secondo il bisogno nella finestra di debug.

    Ecco il piccolo listato:

    Codice: 
    Option Explicit
    Sub prova()
        Dim Risultati As Collection
        Dim Risultato As Long
        
        Set Risultati = New Collection
        Set Risultati = DivisoriDiN(1500)
        
        For Risultato = 1 To Risultati.Count / 2
            Dim Enne1 As Long, Enne2 As Long
            
            Enne1 = Risultati.Item(Risultato)
            Enne2 = Risultati.Item(Risultati.Count - (Risultato - 1))
            
            Debug.Print Enne1; " * "; Enne2;
            Debug.Print " = "; Enne1 * Enne2;
            Debug.Print " -> "; Enne1 * (Enne2 + 1) + (Enne1 + 1) * Enne2
        Next
    End Sub
    Function DivisoriDiN(Dividendo As Long) As Collection
        Set DivisoriDiN = New Collection
        Dim Divisore As Long
        Divisore = 2
        
        Do While Divisore <= Dividendo / 2
            If Dividendo Mod Divisore = 0 Then
                DivisoriDiN.Add Divisore
            End If
            Divisore = Divisore + 1
        Loop
    End Function

  15. I seguenti utenti hanno dato un "Like"


  16. #14

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1024
    Versione Office
    .
    Likes ricevuti
    367
    Likes dati
    0

    Re: Giochiamo coi fiammiferi

    Ciao,

    in attesa di passare al setaccio la soluzione (parziale) di Draco (ormai si fuma le collection con la pipa), ringrazio Mario per l'interessante spunto fornito col suo giochino. Infatti lo userò per proporre un quiz simile, ma solo lato Cellle (no VBA).
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  17. #15
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: Giochiamo coi fiammiferi

    Eh eh eh eh
    Dai parziale mi pare riduttivo

    Mi gioco anche la carta della classe creato ad oc.

    Codice: 
    Option Explicit
    
    
    Private pDatiImmessi(1) As Long
    Private pBase As Long
    Private pAltezza As Long
    Private pArea As Long
    Private pFiammiferi As Long
    
    
    Public Property Get Base()
        Base = pBase
    End Property
    
    
    Public Property Get Altezza()
        Altezza = pAltezza
    End Property
    
    
    Public Property Get Area()
        Area = pArea
    End Property
    
    
    Public Property Get Fiammiferi()
        Fiammiferi = pFiammiferi
    End Property
    
    
    Public Sub Costruttore(ByVal Base As Long, ByVal Altezza As Long)
        Dim collezione As Collection
        Set collezione = New Collection
        Set collezione = Divisori(Base * Altezza)
        With collezione
            Dim Valore1 As Long
            Dim valore2 As Long
            Valore1 = .Item(.Count / 2)
            valore2 = .Item(.Count / 2 + 1)
        End With
        
        pDatiImmessi(0) = Base
        pDatiImmessi(1) = Altezza
        pBase = Valore1
        pAltezza = valore2
        pArea = Valore1 * valore2
        pFiammiferi = (Valore1 + 1) * valore2 + Valore1 * (valore2 + 1)
        
    End Sub
    
    
    Public Function Divisori(Dividendo As Long) As Collection
        Set Divisori = New Collection
        Dim Divisore As Long
        Divisore = 2
        
        Do While Divisore <= Dividendo / 2
            If Dividendo Mod Divisore = 0 Then
                Divisori.Add Divisore
            End If
            Divisore = Divisore + 1
        Loop
    End Function
    Attraverso l' immissione di qualsiasi coppia di numero si ha accesso alla coppia migliore tra quelle disponibili:

    Codice: 
    Option Explicit
    Sub prova2()
        Dim mioQuadrilatero As Quadrilatero
        Set mioQuadrilatero = New Quadrilatero
        With mioQuadrilatero
            .Costruttore Base:=2, Altezza:=750
            
            Debug.Print "immettendo 2 e 750, avremo:"
            Debug.Print "altezza: "; .Altezza
            Debug.Print "base: "; .Base
            Debug.Print "pari ad un area equivalente: "; .Area
            Debug.Print "Con il minimo consumo di fiammiferi pari a: "; .Fiammiferi
        End With
    End Sub


    vabbè... è ora che mi prepari per la pizzata... ci si legge al cello :)

  18. I seguenti utenti hanno dato un "Like"


  19. #16

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1024
    Versione Office
    .
    Likes ricevuti
    367
    Likes dati
    0

    Re: Giochiamo coi fiammiferi

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    Eh eh eh eh
    Dai parziale mi pare riduttivo
    E' parziale perché non svolge il compito richiesto da Mario (guarda il suo file).

    P.S.: io ho affrontato il problema in modo leggermente diverso, ma posterò solo a conclusione del quiz lato celle
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  20. #17
    L'avatar di Marius44
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Catania
    Età
    73
    Messaggi
    3223
    Versione Office
    Excel2010
    Likes ricevuti
    628
    Likes dati
    155

    Re: Giochiamo coi fiammiferi

    Buon giorno a tutti

    Viste le numerose soluzioni al 3D posto da scossa (un saluto) nella sezione "formule", anticipo un po' i tempi e allego la mia soluzione.

    Premetto che, per mia ignoranza circa i Moduli di Classe, non sono riuscito a far funzionare quanto proposto da Dracoscrigno (un saluto) nel post #15 mentre il post #14 dà i risultati (parziali) nella finestra di Debug (complimenti per il sistema utilizzato per i calcoli).

    Molto puerilmente, ecco cosa ho fatto:

    - in ThisWorkbook
    Codice: 
    Option Explicit
    
    Private Sub Workbook_Open()
    Dim s As Integer, i As Integer
        Range("Y2:AC3,T21:X23").ClearContents
        s = ActiveSheet.Shapes.Count
        For i = 1 To s
            If ActiveSheet.Shapes(i).Name = "Ovale 13" Then
                ActiveSheet.Shapes(i).Visible = False
            End If
        Next i
    End Sub
    - nel Modulo di Foglio1
    Codice: 
    Option Explicit
    
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("J3:K3,L3:M3")) Is Nothing Then
        Application.ScreenUpdating = False
        Range("R3:S3,W2:X3,R4:AG4,R4:R19,Y2:AC3,T21:X23").ClearContents
        ActiveSheet.Shapes("Ovale 13").Visible = False
        Range("B5:AG19").Select
        Selection.Borders(xlEdgeLeft).LineStyle = xlNone
        Selection.Borders(xlEdgeTop).LineStyle = xlNone
        Selection.Borders(xlEdgeBottom).LineStyle = xlNone
        Selection.Borders(xlEdgeRight).LineStyle = xlNone
        Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
        Selection.Borders(xlInsideVertical).LineStyle = xlNone
        Selection.Interior.ColorIndex = 8:
        Target.Select
        Application.ScreenUpdating = True
    End If
    End Sub
    - in un Modulo Standard
    Codice: 
    Option Explicit
    
    
    Sub Mostra()
    Dim oz As Integer, vt As Integer, i As Long, mg As Integer
        Application.ScreenUpdating = False
        Range("B5:P19").Interior.ColorIndex = 5
        oz = Range("J3").Value
        vt = Range("L3").Value
        Cells(3, 18) = oz * vt
        For i = 2 To oz + 2 - 1          'orizzontale sopra
            Cells(5, i).Select
            Call sopra
        Next i
        For i = 5 To vt + 5 - 1           'verticale sinistra
            Cells(i, 2).Select
            Call sinistra
        Next i
        For i = 2 To oz + 2 - 1          'orizzontale sotto
            Cells(5 + vt - 1, i).Select
            Call sotto
        Next i
        For i = 5 To vt + 3 + 1             'verticale destra
            Cells(i, oz + 2 - 1).Select
            Call destra
        Next i
        Range(Cells(5, 2), Cells(vt + 3 + 1, oz + 2 - 1)).Select
        Selection.Borders(xlInsideHorizontal).LineStyle = xlContinuous
        Selection.Borders(xlInsideVertical).LineStyle = xlContinuous
        Selection.Interior.ColorIndex = 6
        Cells(2, 23) = oz * (vt + 1) + vt * (oz + 1)
        Cells(2, 25) = "Si può fare di meglio?"
        mg = Cells(1, 75).Value  'cerca se può far meglio
        If mg < Cells(2, 23).Value Then
            Cells(2, 28) = "SI"   'se si, scrive SI e mostra pulsante
            ActiveSheet.Shapes("Ovale 13").Visible = True
        Else
            Cells(2, 28) = "NO" 'se no, scrive NO
        End If
        Cells(4, 17).Select
        Application.ScreenUpdating = True
    End Sub
    
    
    Sub Clicca()
    Dim mn As Integer, rg As Integer, oz As Integer, vt As Integer, p As Integer, i As Long
        Application.ScreenUpdating = False
        mn = Application.WorksheetFunction.Min(Range("BW3:BW15"))    ''cerca valore minimo
        rg = Application.WorksheetFunction.Match(mn, Range("BW3:BW15"), 0)
        oz = Cells(rg + 2, 73).Value: vt = Cells(rg + 2, 74).Value              'assume oz e vt
        'crea nuovo quadro   'scrive numeri oriz e vert  'colora interno verde brillante
            p = 19
            For i = 1 To 15
                Cells(4, p) = i: Cells(i + 4, 18) = i: p = p + 1
            Next i
            Range("S5:AG19").Interior.ColorIndex = 5
            'mostra quadro
            For i = 19 To oz + 19 - 1          'orizzontale sopra
                Cells(5, i).Select
                Call sopra
            Next i
            For i = 5 To vt + 4 - 1                    'verticale sinistra
                Cells(i, 19).Select
                Call sinistra
            Next i
            For i = 19 To oz + 19 - 1                 'orizzontale sotto
                Cells(5 + vt - 1, i).Select
                Call sotto
            Next i
            For i = 5 To vt + 3 + 1                   'verticale destra
                Cells(i, oz + 19 - 1).Select
                Call destra
            Next i
            Range(Cells(5, 19), Cells(vt + 3 + 1, oz + 19 - 1)).Select
            Selection.Borders(xlInsideHorizontal).LineStyle = xlContinuous
            Selection.Borders(xlInsideVertical).LineStyle = xlContinuous
            Selection.Interior.ColorIndex = 6
            Cells(21, 20) = "Fiammiferi utilizzati"
            Cells(21, 23) = oz * (vt + 1) + vt * (oz + 1)
            Cells(4, 18).Select
            Application.ScreenUpdating = True
    End Sub
    
    
    Function sotto()
        With Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
    End Function
    Function sinistra()
        With Selection.Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
    End Function
    Function sopra()
        With Selection.Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
    End Function
    Function destra()
        With Selection.Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
    End Function
    Si può obiettare (oltre al poco professionale codice usato) che le due macro Mostra e Clicca possono essere "quasi unificate" (accorpare la parte comune con opportuni riferimenti).

    Allego il file.
    Ciao,
    Mario
    File Allegati File Allegati

  21. #18
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: Giochiamo coi fiammiferi

    Citazione Originariamente Scritto da Marius44 Visualizza Messaggio
    ...n on sono riuscito a far funzionare quanto proposto da Dracoscrigno (un saluto) nel post #15 mentre il post #14 dà i risultati (parziali) nella finestra di Debug (complimenti per il sistema utilizzato per i calcoli).
    Marius. la classe è veramente una bazzecola da utilizzare.

    Ovvimaente devi inserire un modulo di classe e ci copi dentro quanto proposto nell' intervento quì sopra (non si vede dal listato ma io amo cambiare il suo nome da classica Class1 a qualcosa che poi riuscirò ad immaginarmi.
    Il nome che gli ho dato questa volta è Quadrilatero ma tu puoi chiamarla come meglio credi ed anche lasciargli il suo nome di default

    una volta inserita la classe la puoi utilizzare come fosse un qualsiasi oggetto di Excel.

    Lo devi prima istanziare:

    Dim MioQuadrilatero as Quadrilatero

    Poi devi crearla realmente

    Set MioQuadrilatero as new quadrilatero

    a questo punto devi settarla secondo i tuoi dati. Un rettangolo, prima di tutto, è formato da dei lati e questi lati hanno un valore numerico.
    Per fare questo utilizzi il membro creato apposta per fare questo:

    MioQuadrilatero Base:=TuaBase, Altezza:=TuaAltezza


    Sono solo tre istruzioni:
    Codice: 
    Sub prova2()
        Dim mioQuadrilatero As Quadrilatero
        Set mioQuadrilatero = New Quadrilatero
        
        mioQuadrilatero.Costruttore Base:=Range("A1").value, Altezza:=Range("A2).value
    
    End Sub

    FAtto questo, avrai un oggetto dal quale potrai richiamare tutti i dati essenziali di quel dato rettangolo.


    se, dopo aver immesso un paio di valori nelle celle A1 e B1 del foglio, provi questo listato, per esempio:

    Codice: 
    Sub prova2()
        Dim mioQuadrilatero As Quadrilatero
        Set mioQuadrilatero = New Quadrilatero
            mioQuadrilatero.Costruttore Base:=Range("A1").Value, Altezza:=Range("B1").Value
            
        With mioQuadrilatero
            Debug.Print "Hai creato un rettangolo con un lato di: "; .DatiImmessi(0)
            Debug.Print "e l' altro lato pari a: "; .DatiImmessi(1)
            Debug.Print "L' area occupata dal tuo rettangolo è: "; .Area
            Debug.Print "I fiammiferi che adoperersti sarebbero: "; .Fiammiferi
            Debug.Print "Se invece sgli come base: "; .Base
            Debug.Print "e come altezza: "; .Altezza
            Debug.Print "avrai un consumo di fiammiferi e cioè: "; .FiammiferiIdeali
        End With
    End Sub
    Dove, oltre alle tre istruzioni ci sono solo le istruzioni di visulaizzazione in debug le quali ti mostreranno:

    Codice: 
    
    Hai creato un rettangolo con un lato di:  26 
    e l' altro lato pari a:  5 
    L' area occupata dal tuo rettangolo è:  130 
    I fiammiferi che adoperersti sarebbero:  291 
    Se invece sgli come base:  10 
    e come altezza:  13 
    avrai un consumo di fiammiferi e cioè:  283

    Noterai che aiuto immenso ti dà incapsulare tutto quello che ti serve dentro un oggetto.

    La classe proposta, contiene oltre ad un metodo per popolarla dei tuoi dati, anche un utile funzione che potrai utilizzare in qualsiasi altro progetto. istanziando la classe e creando l' oggetto

    Codice: 
    Sub prova3()
        Dim mioquadrilatero As Quadrilatero
        Set mioquadrilatero = New Quadrilatero
        
        Dim CollezioneDiDivisori As Collection
        Set CollezioneDiDivisori = New Collection
        Set CollezioneDiDivisori = mioquadrilatero.Divisori(18)
        
        Dim ciclo As Long
        For ciclo = 1 To CollezioneDiDivisori.Count
            Debug.Print CollezioneDiDivisori.Item(ciclo)
        Next
        
    End Sub
    nel debug vedrai apparire:

    Codice: 
     2
     3
     6
     9

    ....
    Augurandomi che sta sequela di parole possa esser stata d' aiuto e non aver peggiorato le cose vi auguro buon proseguimento :)




    Riguardo al listato proposto, Marius, ho notato tra le varie, una cosa banale che, però, mi da da pensare che non sei ancora avezzo al concetto di argomenti opzionali

    L' ho pensato quando ho visto questo tuo pezzo di listato:

    Codice: 
    ...
        Selection.Borders(xlEdgeLeft).LineStyle = xlNone
        Selection.Borders(xlEdgeTop).LineStyle = xlNone
        Selection.Borders(xlEdgeBottom).LineStyle = xlNone
        Selection.Borders(xlEdgeRight).LineStyle = xlNone
        Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
        Selection.Borders(xlInsideVertical).LineStyle = xlNone
    ...

    Quando capitano situazioni come queste; dove la proprietà, Selection.Borders(), e l' assegnazione xlNone, sono identici, prova ad omettere l' argomento dentro le parentesi perchè spesso è, appunto, opzionale e si specifica solo in caso di bisogno.

    In questo caso, volendo tu TUTTI i borders() settati a xlNone ti basta scrivere:

    Selection.Borders = xlNone

    Un istruzione è decisamente meglio di sei non credi?

    E se cerchi di non usare il select diminuisci ancora di più le istruzioni da dover digitare perchè, al posto di:

    Range("A1").Select
    selection.Borders=xlNone


    Puoi scrivere direttamente

    Range("A1").Borders=xlNone

    Togli .select
    togli Selection
    e appiccichi assieme le due istruzioni

    ... in bocca al lupo :)

    P.s.
    L' algoritmo dei divisori non è mio. l' ho fregato da un video su youtube. lo trovi a questo link:

    Esercizi risolti - Algoritmi - Divisori di un numero - Informatica generale - 29elode
    Ultima modifica fatta da:dracoscrigno; 25/08/16 alle 22:55 Motivo: manca qualche colore qui e li :)

  22. I seguenti utenti hanno dato un "Like"


  23. #19

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1024
    Versione Office
    .
    Likes ricevuti
    367
    Likes dati
    0

    Re: Giochiamo coi fiammiferi

    Ciao,

    allego il file con la mia soluzione (ho lasciato anche delle sub di studio)

    Qui sotto i codici.

    In un modulo standard:
    Codice: 
    Sub Mostra()    Dim nB As Long
        Dim nH As Long
        Dim nFiamm As Long
        Dim oz As Long
        Dim vt As Long
        Dim vCalc As Variant
        Application.ScreenUpdating = False
        Range("B5:P19").Interior.ColorIndex = 5
        oz = Range("J3").Value
        vt = Range("L3").Value
        Cells(3, 18) = oz * vt
        With Range(Cells(5, 2), Cells(4 + vt, 1 + oz))
          .Borders.LineStyle = xlContinuous
          .Interior.ColorIndex = 6
        End With
    
    
        Cells(2, 23) = oz * (vt + 1) + vt * (oz + 1)
        Range("Y2").Value = "Si può fare di meglio?"
        Application.ScreenUpdating = True
        vCalc = MinorNumero(oz, vt)
        nB = vCalc(1)
        nH = vCalc(2)
        nFiamm = vCalc(3)
        If nFiamm < Range("W2").Value Then
          Range("AB2").Value = "SI"
          ActiveSheet.Shapes("Oval 13").Visible = True
        Else
          Range("AB2").Value = "NO"
          Range("AI2").Value = ""
        End If
        
    End Sub
    Codice: 
    Sub RiMostra()
      Dim vt As Long, oz As Long, nFiamm As Long
      Dim vCalc As Variant
        
      Application.ScreenUpdating = False
      Range("R5:AG19").Interior.ColorIndex = 5
      oz = Range("J3").Value
      vt = Range("L3").Value
      vCalc = MinorNumero(oz, vt)
      oz = vCalc(1)
      vt = vCalc(2)
      nFiamm = vCalc(3)
      With Range(Cells(5, 18), Cells(4 + oz, 17 + vt))
         .Borders.LineStyle = xlContinuous
        .Interior.ColorIndex = 6
      End With
      Range("AI2").Value = nFiamm
      Cells(4, 17).Select
      Range("W2:X3").Copy
      Range("AI2:AJ3").PasteSpecial xlPasteFormats
      Application.CutCopyMode = False
      Application.ScreenUpdating = True
        
    End Sub
    Codice: 
    Function MinorNumero(ByVal nB As Long, ByVal nH As Long) As Variant
      ' by scossa
      ' udf che riceve come parametri i valori di base e altezza
      ' e restituisce una matrice di tre elementi contenente:
      ' (1) la base
      ' (2) l'altezza
      ' (3) il numero di fiammiferi
      ' relativi alla migliore combinazione ottenibile per quell'area
      ' usabile lato celle come matriciale:
      ' Selezionare tre celle adiacenti (p.e. A1:C1), digitare
      ' =MinorNumero(base, altezza)
      ' e confermare con ctrl+maiusc+invio
      ' in A1 avremo la base
      ' in B1 l'altezza
      ' e in C1 il numero di fiammiferi
      ' 2016-08-23
      
      Dim nArea As Long
      Dim nFiamm As Long
      Dim j As Double
      Dim vRet(1 To 3) As Long
      
      nArea = nB * nH
      If nArea > 0 Then
        j = Sqr(nArea)
        nB = Int(j)
        If j <> nB Then
          With Application.WorksheetFunction
            Do While .Gcd(nArea, nB) <> nB
              nB = nB + 1
            Loop
          End With
        End If
        nH = nArea / nB
        nFiamm = (nB + 1) * nH + (nH + 1) * nB
        vRet(1) = nB
        vRet(2) = nH
        vRet(3) = nFiamm
      End If
      MinorNumero = vRet
    End Function
    Nel modulo di classe del Foglio1:
    Codice: 
    Private Sub Worksheet_Change(ByVal Target As Range)  Dim rng As Range
      
      If Not Intersect(Target, Range("J3:K3,L3:M3")) Is Nothing Then
          Range("AB2:AC3").Copy
          Range("AI2:AJ3").PasteSpecial xlPasteFormats
          ActiveSheet.Shapes("Oval 13").Visible = False
          Me.Range("Y2").Value = ""
          Me.Range("AB2").Value = ""
          Me.Range("AI2").Value = ""
          Application.ScreenUpdating = False
          Range("R3:S3,W2:X3,R4:AG4,R4:R19").ClearContents
          Set rng = Range("B5:AG19")
          With rng
            .Borders.LineStyle = xlContinuous
            .Interior.ColorIndex = 8
          End With
          Target.Select
          Application.ScreenUpdating = True
          Set rng = Nothing
      End If
    End Sub
    File Allegati File Allegati
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  24. I seguenti utenti hanno dato un "Like"


  25. #20

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1024
    Versione Office
    .
    Likes ricevuti
    367
    Likes dati
    0

    Re: Giochiamo coi fiammiferi

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    E se cerchi di non usare il select diminuisci ancora di più le istruzioni da dover digitare perchè, al posto di:

    Range("A1").Select
    selection.Borders=xlNone


    Puoi scrivere direttamente

    Range("A1").Borders=xlNone

    Hai dimenticato .LineStyle

    Range("A1").Borders.LineStyle=xlNone
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  26. #21
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: Giochiamo coi fiammiferi

    eh si. mannaggia :(
    tanto scrivere e poi... :(

    l ho scritto al volo... scrivo sempre al volo ***** pupazza :(

    speriam che il concetto si capisca comunque. uffa.

  27. #22
    L'avatar di Marius44
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Catania
    Età
    73
    Messaggi
    3223
    Versione Office
    Excel2010
    Likes ricevuti
    628
    Likes dati
    155

    Re: Giochiamo coi fiammiferi

    Occhio di lince (scossa) ha colpito di nuovo!
    Marco, ma così facendo la sera non ti dolgono le mani per i troppi scappellotti dati?

    Comunque le vostre soluzioni me le guardo (e studio) domani a mente fresca.
    Buona notteeeee!
    Mario

  28. #23

    L'avatar di Rubik72
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Cosenza
    Età
    45
    Messaggi
    2820
    Versione Office
    Excel 2013
    Likes ricevuti
    1024
    Likes dati
    983

    Re: Giochiamo coi fiammiferi

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    [...]
    Function DivisoriDiN(Dividendo As Long) As Collection
    Set DivisoriDiN = New Collection
    Dim Divisore As Long
    Divisore = 2

    Do While Divisore <= Dividendo / 2
    If Dividendo Mod Divisore = 0 Then
    DivisoriDiN.Add Divisore
    End If
    Divisore = Divisore + 1
    Loop
    End Function
    Ciao a tutti, complimenti a @Marius44 per il gioco e a @dracoscrigno e @scossa per le soluzioni.

    draco credo che la funzione DivisoriDiN debba includere 1 e dividendo altrimenti sul quadrato di numeri primi darà errore (provare 3x3).

    Codice: 
    Function DivisoriDiN(Dividendo As Long) As Collection
        Set DivisoriDiN = New Collection
        Dim Divisore As Long
        Divisore = 1 '2
        
        Do While Divisore <= Dividendo '/ 2
            If Dividendo Mod Divisore = 0 Then
                DivisoriDiN.Add Divisore
            End If
            Divisore = Divisore + 1
        Loop
    End Function

  29. #24

    L'avatar di Rubik72
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Cosenza
    Età
    45
    Messaggi
    2820
    Versione Office
    Excel 2013
    Likes ricevuti
    1024
    Likes dati
    983

    Re: Giochiamo coi fiammiferi

    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    [...]
    Nel modulo di classe del Foglio1:
    Codice: 
    Private Sub Worksheet_Change(ByVal Target As Range)  Dim rng As Range
      
      If Not Intersect(Target, Range("J3:K3,L3:M3")) Is Nothing Then
          Range("AB2:AC3").Copy
          Range("AI2:AJ3").PasteSpecial xlPasteFormats
          ActiveSheet.Shapes("Oval 13").Visible = False
          Me.Range("Y2").Value = ""
          Me.Range("AB2").Value = ""
          Me.Range("AI2").Value = ""
          Application.ScreenUpdating = False
          Range("R3:S3,W2:X3,R4:AG4,R4:R19").ClearContents
          Set rng = Range("B5:AG19")
          With rng
            .Borders.LineStyle = xlContinuous
            .Interior.ColorIndex = 8
          End With
          Target.Select
          Application.ScreenUpdating = True
          Set rng = Nothing
      End If
    End Sub
    Ahi, ahi, ahi, ahi.
    @Scossa che dimentica di disabilitare gli eventi?
    Ci vuole proprio una vacanza

    (questa @Scossa me la farà pagare cara! )

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •