Esercizio raggruppamenti



  • Esercizio raggruppamenti
    di Vecchio Frac data: 16/03/2015 16:44:45

    In un lavoro che sto seguendo si è posto il problema di raggruppare degli elementi a quattro a quattro.
    Ossia, dato un elemento numerato, serve conoscere in quale gruppo si posiziona, sapendo che i gruppi sono numerati da 1 e hanno tutti quattro elementi.
    Esempi:
    - In una classe di 20 alunni, raggruppandoli a quattro a quattro, l'alunno numero 15 si pone nel terzo gruppo.
    - In una cassetta di 23 mele, raggruppandole a quattro a quattro, la mela numero 7 finisce nel gruppo numero 2.

    Voi come fareste? Che soluzione adottereste (in VBA, ma se volete anche con formule) ?

    Come corollario, come si può generalizzare il problema, lasciando discrezionale anche il numero di elementi che costituiscono un raggruppamento? (cioè: in un insieme di tot elementi, a quale gruppo si posiziona l'elemento n, se consideriamo gruppi di x elementi?)

    Vi lascio qualche giorno... la mia soluzione è minimale :o)
    (non c'è premio, ma solo un +1 da parte mia per la soluzione più fantasiosa e innovativa)





  • di ninai (utente non iscritto) data: 16/03/2015 16:52:12

    ciao
    forse avrò capito male ma sembra un semplice =int(n/x)



  • di ninai (utente non iscritto) data: 16/03/2015 16:55:09

    manca il : +1

    =int(n/x)+1



  • di ninai (utente non iscritto) data: 16/03/2015 17:03:40

    sono stato superficiale, meglio:
    =ARROTONDA.ECCESSO(n/x;1)



  • di ninai (utente non iscritto) data: 16/03/2015 17:09:08

    oppure, la prima corretta:
    =INT(n/x)+(RESTO(n;x)>0)



  • di Vecchio Frac data: 16/03/2015 17:11:41

    Ok Ninai!
    Adesso vai di VBA (vietato Worksheetfunction) ^_^

    Forse dovevo escludere dall'esercizio gli utenti navigati o almeno farli partecipare più tardi :)





  • di Mister_x (utente non iscritto) data: 16/03/2015 17:14:13

    ciao VF

    prendiamo in considerazione i tre valori proposti
    in A1 23 mele
    in B1 4 gruppo a 4 a 4
    in C1 7 numero della settima mela
    in questo caso forse per il nostro conto stabilire in che gruppo va la 7 mela non dobbiamo neanche prendere in considerazione le 23 mele ma sostandoci a considerare quanti sono per gruppo e stabilire la 7mela in che gruppo andra' quindi in D1 mettiamo la seguente formula

    D1=SE(RESTO(C1/B1;1)=0;(C1/B1);INT(C1/B1)+1)
    23 mele 4 gruppo a x 7 numero della mela 2 gruppo appartenenza

    ciao






  • di Vecchio Frac data: 16/03/2015 17:21:50

    cit. "non dobbiamo neanche prendere in considerazione le 23 mele"
    ---> ^_^

    Bene Mister_x... anche tu adesso vai di VBA :)

    E ricordate la premessa: "la soluzione più fantasiosa e innovativa"!





  • di Mister_x (utente non iscritto) data: 16/03/2015 17:32:05

    ciao VF (Adesso vai di VBA (vietato Worksheetfunction) ^_^


    la mia in VBA
    utilizzo in D1
    =Gruppomele(B1;C1)
    B1 = quanti per gruppo
    C1 = numero della mela

    riciao

     
    Option Explicit
    Public Function GruppoMele(gruppo As Range, NumeroMela As Range) As Long
     If (NumeroMela / gruppo) - Fix(NumeroMela / gruppo) > 0 Then
        GruppoMele = Fix(NumeroMela / gruppo) + 1
     Else
        GruppoMele = NumeroMela / gruppo
     End If
    End Function
    






  • di ninai (utente non iscritto) data: 16/03/2015 17:39:46

    allora
    di VBA no ne devi parlare, non saprei fare neanche 2+2.

    proposte innovative, vedremo se ne vengono.

    proposte fra il fantasioso e lo schizofrenico, eccone una:

    =CONFRONTA(n-0,000001;INDICE(RIF.RIGA($1:$1000)*x;))+1



  • di ninai (utente non iscritto) data: 16/03/2015 17:43:18

    una corta:
    =INT((n-0,1)/x)+1



  • di ninai (utente non iscritto) data: 16/03/2015 18:15:48

    matriciale:
    =SOMMA(--(RIF.RIGA($1:$1000)*x
    oppure con invio normale
    =MATR.SOMMA.PRODOTTO(--(RIF.RIGA($1:$1000)*x



  • di ninai (utente non iscritto) data: 16/03/2015 18:19:52

    me le "storpia"

    sostituire "minore" con "<"
    =SOMMA(--(RIF.RIGA($1:$1000)*x minore n))+1


    =MATR.SOMMA.PRODOTTO(--(RIF.RIGA($1:$1000)*x minore n))+1



  • di Vecchio Frac data: 16/03/2015 18:44:12

    @Ninai
    La più bella è quella con CONFRONTA!
    Le altre sono un mistero :)
    +1 per Ninai lato formule... :D
    (Per il problema dello storpiamento, ricordati che in questo forum il parser HTML interpreta le parentesi angolari < e > e quindi devi metterci uno spazio prima e uno spazio dopo, altrimenti vengono interpretati come tag HTML)

    @Mister_x
    Bel tentativo! Funziona ma si può fare di meglio... se nessuno si fa avanti questa sfida la vincerai tu :)





  • di scossa data: 16/03/2015 20:17:49

    cit. V.F.: In una classe di 20 alunni, raggruppandoli a quattro a quattro, l'alunno numero 15 si pone nel terzo gruppo.

    direi che il 5 dovrebbe essere nel quarto gruppo:
    gruppo 1: da 1 a 4
    gruppo 2: da 5 a 8
    gruppo 3: da 9 a 12
    gruppo 4: da 13 a 16


    Comunque la mia proposta nella categoria "più semplice" è la sottostantee UDF.

    Per la categoria "più fantasiosa" ci sarebbe l'imbarazzo della scelta


    scossa's web site
    Se tu hai una mela, ed 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)



     
    Function PosInGroups(ByVal nInGroup As Long, ByVal nFnd As Long) As Long
    
        PosInGroups = nFnd  nInGroup + 1
        
    
    End Function
    
    
    Sub prova()
        Debug.Print PosInGroups(4, 15)
        Debug.Print PosInGroups(4, 7)
    
    End Sub



  • di scossa data: 16/03/2015 20:23:18

    Opps.... soluzione imperfetta! sballa per nFnd = nInGroup



    scossa's web site
    Se tu hai una mela, ed 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)



  • di scossa data: 16/03/2015 20:30:26

    Codice UDF corretto



    scossa's web site
    Se tu hai una mela, ed 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)

     
    Function PosInGroups(ByVal nInGroup As Long, ByVal nFnd As Long) As Long
    
        PosInGroups = nFnd  nInGroup + 1 - 0 ^ (nFnd Mod nInGroup)
        
    
    End Function
    



  • di Vecchio Frac data: 16/03/2015 21:19:16

    Sì, un errore per la fretta... l'alunno 15 in gruppi di quattro si pone al quarto gruppo... grazie scossa e bentornato :)

    Comunque guarda... 0 ^ 0 = 1 come correttivo non mi sarebbe mai venuta in mente :)
    Cioè, è fantastico. Ho cercato per vedere se esiste una cosa come zero elevato a zero.
    La più bella spiegazione è questa:
    "Riguardo 0^0 vorrei solo aggiungere che s^n è il numero di modi di mettere n biglie distinguibili in s scatole pure distinguibili. In altri termini è il numero di funzioni da un n-insieme ad un s-insieme. Pertanto, in quanti modi si possono mettere 0 biglie in 0 scatole? (...) in un modo, nel modo vuoto" (matematica-old.unibocconi.it/losapevateche/losapevateche1.htm)

    Dicevo che dal gioco dovevo escludere gli Esperti, ma la soluzione di scossa è molto carina... anche se non è quella che ho usato io (una funzione incorporata di VBA: funziona anche in Publisher, per dire).





  • di scossa data: 16/03/2015 22:00:38

    Versione lato formule della mia UDF:

    in B1 il numero di elementi per gruppo, in C1 il numero di cui trovare la posizione:
    =INT(C1/B1)+1-VAL.ERR(0^RESTO(C1;B1))



    scossa's web site
    Se tu hai una mela, ed 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)



  • di scossa data: 16/03/2015 22:03:27

    cit VF: "anche se non è quella che ho usato io (una funzione incorporata di VBA: funziona anche in Publisher, per dire)."

    Una sola funzione VBA nativa? Sono proprio curioso di vedere la tua soluzione


    scossa's web site
    Se tu hai una mela, ed 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)



  • di Vecchio Frac data: 16/03/2015 23:19:12

    Partition (numero, start, stop, intervallo)!
    E' la prima volta in vita mia che uso Partition. Mai usata questa funzione nella vita reale :)

    debug.print Partition(15, 1, 20, 4) ---> 13:16
    In pratica restituisce l'intervallo in cui si pone il numero cercato separando i valori con :.

    In realtà per il mio problema ho usato anche Split, facendomi restituire il secondo valore dell'intervallo e dividendolo per il numero di elementi nel gruppo.
    Per restare nell'esempio:
    debug.print Split(Partition(15, 1, 20, 4), ":")(1)/4 ---> 4
    E generalizzando:
    debug.print Split(Partition(num, 1, 1000, items_in_group), ":")(1)/items_in_group ---> gruppo di appartenenza








  • di scossa data: 16/03/2015 23:57:37

    @VF: Soluzione interessante, decisamente "particolare". In effetti, all'atto pratico, difficilmente la preferirei.



    scossa's web site
    Se tu hai una mela, ed 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)



  • di ninai (utente non iscritto) data: 17/03/2015 06:27:10

    visto che entrato in gioco Scossa, il mio "stimolatore", metto anche questa che mi era rimasta in "canna":
    =CERCA((n-0,1)/x;RIF.COLONNA($1:$1000))+1

    ed inoltre, visto che ha voluto "girare la frittata", ricambio il favore e la sua la reinterpreto così:
    =TRONCA(n/x)+VAL.NUMERO(RESTO(n;x)^0)



  • di scossa data: 17/03/2015 08:06:31

    cit. X: 'visto che entrato in gioco Scossa, il mio "stimolatore" .......'

    Ecco, adesso dovrò cambiare nick: da scossa a viagra

    scossa's web site
    Se tu hai una mela, ed 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)