import java.util.StringTokenizer;

public class Esperimento {

    private int[] dati;
    
    public Esperimento(String s){
        StringTokenizer temp = new StringTokenizer(s);
        dati = new int[temp.countTokens()];
        int i = 0;
        while(temp.hasMoreTokens()) {
            String t = temp.nextToken();
            dati[i] = Integer.parseInt(t);
            i++;
        }
    }

    /* Alternativa: iterazione basata sull'indice dell'array 
                    invece che su i token
    public Esperimento(String s){
        StringTokenizer temp = new StringTokenizer(s);
        dati = new int[temp.countTokens()];
        for (int i = 0; i < dati.length; i++) 
            dati[i] = Integer.parseInt(temp.nextToken());
     }
    */

    public int numeroDati(){
        return dati.length;
    }
    
    public int sommaDati(){
        int somma =0;
        for(int i = 0; i < dati.length; i++)
            somma = somma + dati[i];
        return somma;
    }
    
    public double media(){
        return ((double)sommaDati()) / numeroDati();
    }
    
    public int minimo(){
        int min = dati[0];
        for (int i = 1; i < dati.length; i++)
            if (dati[i] < min) min = dati[i];
        return min;
    }
    
    public int massimo(){
        int max = dati[0];
        for (int i = 1; i < dati.length; i++)
            if (dati[i] > max) max = dati[i];
        return max;
    }
    
    //metodi addizionali
    public boolean uguale(Esperimento e) {
        if (dati.length != e.dati.length) return false;
        for (int i = 0; i < dati.length; i++)
            if (dati[i] != e.dati[i]) return false;
        return true;
    }

    /* versione che non usa return su risultati parziali
    public boolean uguale(Esperimento e) {
        if (dati.length != e.dati.length) return false;
        else {
            boolean ris = true;
            for (int i = 0; i < dati.length; i++)
                ris = ris && dati[i] == e.dati[i];
            return ris;
        }
    }
    */ 

    public boolean simile(Esperimento e) {
        for (int i = 0; i < dati.length; i++)
            if (!appare(dati[i], e.dati)) return false;
        for (int i = 0; i < e.dati.length; i++)
            if (!appare(e.dati[i], dati)) return false;
        return true;
    }

    private static boolean appare(int d, int[] a) {
        for (int i = 0; i < a.length; i++)
            if (d == a[i]) return true;
        return false;
    }

    /* versione con cicli annidati 
    public boolean simile(Esperimento e) {
        boolean ris = true;
        for (int i = 0; i < dati.length; i++) {
            boolean presente = false;
            for (int j = 0; j < e.dati.length; j++)
            presente = presente || dati[i] == e.dati[j];
            ris = ris && presente;
        }
        for (int i = 0; i < e.dati.length; i++) {
            boolean presente = false;
            for (int j = 0; j < dati.length; j++)
                presente = presente || e.dati[i] == dati[j];
                ris = ris && presente;
        }
        return ris;
    }
    */
          
    public Esperimento concatena(Esperimento e) {
        int[] ris = new int[dati.length + e.dati.length];
        for(int i = 0; i < dati.length; i++)
            ris[i] = dati[i];
        for(int i = 0; i < e.dati.length; i++)
            ris[dati.length+i] = e.dati[i];
        return new Esperimento(ris);
    }

    private Esperimento(int[] a) {
    dati = a;
    }
    
    public boolean occorre(int d) {
        return appare(d, dati);
    }
    
    /* oppure direttamente 
    public boolean occorre(int d) {
        for (int i = 0; i < dati.length; i++)
            if (d == dati[i]) return true;
        return false;
    } 
    */
   
    public int conta(int d) {
        int cont = 0;
        for (int i = 0; i < dati.length; i++)
            if (dati[i] == d) cont++;
        return cont;
    }
  
    public boolean doppioni() {
        for (int i = 0; i < dati.length; i++)
            for (int j = i+1; j < dati.length; j++)
                if (dati[i] == dati[j]) return true;
        return false;
    }

    public void istogramma() {
        double scala = 80.0/massimo();
        for (int i = 0; i < dati.length; i++) {
            for (int j = 0; j < Math.round(dati[i]*scala); j++)
                System.out.print("*");
            System.out.println();
        }
    }
    
    public String toString() {
        String ris = "";
        for (int i = 0; i < dati.length; i++)
            ris = ris + dati[i] + " ";
        return ris;
    }
}
