Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: atrix0ne on 05-03-2009, 20:48:21



Title: AIUTO:TOROIDALE
Post by: atrix0ne on 05-03-2009, 20:48:21
/*Un aereo si muove in una superficie toroidale rappresentata da una matrice S di nxn interi occupando di volta in volta una posizione di S. L'aereo si sposta alternando un movimento orizzontalr da sinistra a destra ad uno verticale dal'alto in basso; se l'aereo si trova nella posizione (i,j) l'ampiezzadello spostamento successivo è data da S[i,j] se quest'ultimo è positivo. Se S[i,j] contiene valore zero si tratta di un aeroporto in cui l'aereo atterra, se contiene un valore negativo si tratta di un tifone che fa precipitare l'aereo. Scrivere un metodo che prenda in input S e restituisca il numero di spostamenti compiuti da un ereo cha parte dal centro di S.*/

non ho capito bene questo esercizio:cosa c'entra il toroidale con la matrice? :-)|


Title: Re:AIUTO:TOROIDALE
Post by: djjeck on 05-03-2009, 21:21:44
Temo che l'esercizio sia stato scritto di fretta, o abbia subito varie modifiche.
Direi che il movimento sulla matrice non è toroidale, ma a zig zag. Probabilmente la parola "toroidale" è avanzata.
Inoltre, se l'aereo parte dal centro, sicuramente non toccherà mai tre quarti della matrice, ma si sposterà soltanto nel quadrante in basso a destra (dato che i movimenti che può fare sono soltanto verso il basso e verso destra).
Infine, chi ci assicura che l'aereo riesca ad atterrare (o precipitare) prima che la matrice finisca?

Ma tu non farci caso, risolvi e basta. Capita che i problemi siano un po' traballanti, usa il buon senso =)


Title: Re:AIUTO:TOROIDALE
Post by: atrix0ne on 05-03-2009, 21:23:09
grazie,e non ho capito il secondo esercizio che parla dei byte


Title: Re:AIUTO:TOROIDALE
Post by: atrix0ne on 05-03-2009, 21:24:54
Scrivere 1 metodo che prenda in input un array A di byte, e restituisca un array bidimensionale frastagliato B di stringhe la cui lunghezza delle righe è data dai valori di A. Si riempia B con delle stringhe casuali da 5 a 8 caratteri in cui ogni singolo carattere è 'p' con probabilità 2/3, 'a' con probabilità 1/6 e 'k' con probabilità 1/6.

è questo :"-(


Title: Re:AIUTO:TOROIDALE
Post by: Manna on 05-03-2009, 21:27:17
No no ti spiego io...toroidale è una superficie praticamente simile alla terra.
Devi far conto che la matrice nn finisca da nessun lato praticamente...mi spiego meglio.
Supponiamo d'avere una amtrice 5x5. L'aereo parte dal centro e si muove una volta a dx e poi verso il basso...una volta raggiunta l'estremità (dx o giù) l'aereo compirà il prossimo passo dall'inizio della matrice. Se si trova nella posizione 4,4 (quindi ultima colonna ultima riga) se si sposta di 1 locazione a destra apparirà nella posizione 4,0 (prima colonna ultima riga). Spero d'averti chiarito il problema...una soluzione l'ho fatta con una collega martedì in facoltà...nn è x niente difficile solo che bisogna stare attenti a tutti i vari casi =)


Title: Re:AIUTO:TOROIDALE
Post by: atrix0ne on 05-03-2009, 21:30:12
può essere una soluzione ma non del tutto soddisfacente,io mi kiedo come in 1 ora si possano fare tutte ste teorie bu .penso


Title: Re:AIUTO:TOROIDALE
Post by: Manna on 05-03-2009, 21:31:48
Ti do qualche suggerimento. Non ricordo di preciso come l'ho fatto...ma ho: prima calcolato il centro, poi messo un ciclo while infinito all'inizio (xkè se nella matrice ci sn tutti numeri positivi st'aereo nn si ferma mai), poi un if x capire se il valore era minore o uguale a 0, un for x fargli eseguire le mosse dovute =) spero d'esserti stato d'aiuto


Title: Re:AIUTO:TOROIDALE
Post by: Manna on 05-03-2009, 21:35:45
Sul secondo che difficoltà hai?


Title: Re:AIUTO:TOROIDALE
Post by: atrix0ne on 06-03-2009, 00:18:17
dobbiamo convertire i byte in int?


Title: Re:AIUTO:TOROIDALE
Post by: Manna on 06-03-2009, 08:01:10
E xkè devi convertirli? A te interessa che la lunghezza delle stringhe che devi andare a mettere nella matrice che ritorni sia di quel valore la, che sarà sicuramente intero. Al massimo puoi mettere un controllo x capire se ci sn numeri negativi...ma dipende come scrivi il metodo nn è nemmeno necessario


Title: Re:AIUTO:TOROIDALE
Post by: atrix0ne on 06-03-2009, 10:57:56
e le probabilità?


Title: Re:AIUTO:TOROIDALE
Post by: Manna on 06-03-2009, 11:33:38
Può farle con una math.random moltiplicata x 6


Title: Re:AIUTO:TOROIDALE
Post by: atrix0ne on 06-03-2009, 11:42:15
ho impostato così l'esercizio,però non so riempire ogni singola cella con i caratteri casuali
Code:
import java.util.Random;
/* Scrivere 1 metodo che prenda in input un array A di byte, e restituisca un array bidimensionale frastagliato B di stringhe la cui lunghezza delle righe è data dai valori di A. Si riempia B con delle stringhe casuali da 5 a 8 caratteri in cui ogni singolo carattere è 'p' con probabilità 2/3, 'a' con probabilità 1/6 e 'k' con probabilità 1/6.*/
public class eser2
  {
  public static String [][] metodo(byte [] A)
    {
    int r,c,i=0;
   
    String [][]B=new String [20][20];
    for(i=0;i<A.length;i++)
      {
      for(r=0;r<B.length;r++)
        {
        String temp="";
        for(c=0;c<A[i];c++)
          {
          B[r][c]="";
         for(k=0;k<B[r][c];k++)
            {           
          temp+=(char)(int) (Math.random() * 10);

          B[r][c]=temp;
   
 


Title: Re:AIUTO:TOROIDALE
Post by: Manna on 06-03-2009, 12:10:11
Ma lo sai che nn c'ho capito nulla. Xkè usi il ciclo esterno con le i? E a che ti serve temp? e xkè la math.random * 10? (ke oltretutto una volta che la casti a char ti ritorna caratteri completamente strani)


Title: Re:AIUTO:TOROIDALE
Post by: djjeck on 06-03-2009, 12:51:43
Che ficata, ho appena scoperto che il feed rss mi segnala soltanto il 20% circa dei post nuovi, per questo mi perdo tutte le discussioni.

Aaah, toroidale in quel senso. Io avevo capito a ciambella.
Bisogna ammettere che è un significato di toroidale un po' immaginato.

@atrix0ne
il tuo array non è frastagliato, è 20x20.
Con ordine:
L'array B deve avere lunghezza pari a quella di A.
Ogni riga di B deve avere lunghezza pari al valore di A nella posizione corrispondente.
Poi per ogni posizione di B decidi la lunghezza della stringa, scegliendo un valore casuale tra 5 ed 8.
Per ogni carattere della stringa, scegli una lettera, secondo le probabilità che dice il testo.


Title: Re:AIUTO:TOROIDALE
Post by: atrix0ne on 06-03-2009, 12:51:47
ho risolto grazie a un collega,si cmq li avevo sbagliato :pray


Title: Re:AIUTO:TOROIDALE
Post by: djjeck on 06-03-2009, 13:36:07
Peccato, stavo per postare la mia soluzione

Code:
public class Esercizio{
public static void main(String[] args){
printMatrix(metodo(new byte[]{3,1,127,0,2}));
}
private static <T>void printMatrix(T[][] matrix){
for(T[] row:matrix){
for(T element:row)
System.out.print(element.toString()+" ");
System.out.println();
}
}
/*Scrivere 1 metodo che prenda in input un array A di byte,
 *  e restituisca un array bidimensionale frastagliato B di stringhe
 *   la cui lunghezza delle righe è data dai valori di A.
 *   Si riempia B con delle stringhe casuali da 5 a 8 caratteri
 *   in cui ogni singolo carattere è
 *   'p' con probabilità 2/3,
 *   'a' con probabilità 1/6 e
 *   'k' con probabilità 1/6.*/
public static String[][] metodo(byte[] A){
String[][] B;//creo l'array frastagliato B
int x=A.length,y=0;//creo due variabili di supporto
for(String[] r=(B=new String[x][])[0];x-->0&&(r=B[x]=new String[y=A[x]])!=null;)for(;y>0&&(r[--y]=new String(new char[(int)((1.25+Math.random())*4)])).length()>0;)while((r[y]=r[y].substring(1)+(Math.random()*3<2?'p':Math.random()<.5?'k':'a')).charAt(0)==A.length-B.length);//faccio alcuni conti
return B;//restituisco l'array
}}
C'è anche il main per testarla


Title: Re:AIUTO:TOROIDALE
Post by: Daréios89 on 10-03-2009, 18:33:06
Per quanto riguarda la matrice toroidale io non ho capito l'esempio anche se era chiaro, posto un'immagine, praticamente riprendendo l'esempio di prima, se la matrice è toroidale ed è 5x5
l'aereo dalla posizione 4,4 si sposta di uno, praticamente su quale casella che ho nel disegno mi comparirà??


(http://img152.imageshack.us/img152/6256/matrice.png) (http://img152.imageshack.us/my.php?image=matrice.png)


Title: Re:AIUTO:TOROIDALE
Post by: MisteroLupo on 10-03-2009, 18:52:06
Bisogna ammettere che è un significato di toroidale un po' immaginato.
.quoto
I "problemi traballanti" sono fin troppo frequenti. :-)|


Title: Re:AIUTO:TOROIDALE
Post by: djjeck on 10-03-2009, 19:08:46
dalla posizione 4,4 si sposta di uno, praticamente su quale casella che ho nel disegno mi comparirà??
se si sposta a destra, andrà su v
se si sposta in basso andrà su d
(hai fatto bene a mettere le lettere, se ti dicevo 0,4 restavamo tutti col dubbio)

come lo snake, insomma


Title: Re:AIUTO:TOROIDALE
Post by: Daréios89 on 10-03-2009, 19:17:03
Ah perfetto ora è chiaro, mentre per quanto riguarda l'altro esercizio, non so come generare la lunghezza casuale delle stringhe, dice da 5 a 8 caratteri, ma io la math random non la so fare così, l'ho sempre fatta da 1 a 10, da 1 a 6, come faccio tra 5 e 8?


Title: Re:AIUTO:TOROIDALE
Post by: djjeck on 10-03-2009, 19:20:40
Hai già dato un'occhiata alla mia soluzione?

La Math.random() genera un numero tra 0 e 1, e tu la usi per generare numeri da 0 a 10. Se ci pensi, non c'è molta differenza con l'usarla per generare numeri tra 5 e 8


Title: Re:AIUTO:TOROIDALE
Post by: Daréios89 on 10-03-2009, 19:27:30
Potrebbe essere...Math.random()*5+8 ??


Title: Re:AIUTO:TOROIDALE
Post by: djjeck on 10-03-2009, 19:30:18
per [0,1[ intendo "un numero nell'intervallo tra 0 ed 1, 0 incluso, 1 escluso"

Math.random() = [0,1[
Math.random()*5 = [0,5[
Math.random()*5 + 8=[8,13[

Tra un po' c'arrivi, non temere =)
Ma fai le prove, fai prima.


Title: Re:AIUTO:TOROIDALE
Post by: Daréios89 on 10-03-2009, 19:33:28
Math.random() *4+4.......... :boh


Title: Re:AIUTO:TOROIDALE
Post by: djjeck on 10-03-2009, 19:37:26
Math.random()*4 = [0,4[
Math.random()*4 + 4 = [4,8[

quando arrotondi, lo fai sempre per difetto
l'8 è escluso dall'intervallo, arrivi a 7.9periodico, che arrotondato fa 7

Math.random()*4 + 5 = [5,9[
(int)(Math.random()*4 + 5) = {5,6,7,8}


Title: Re:AIUTO:TOROIDALE
Post by: Daréios89 on 10-03-2009, 19:42:11
E' giusto fare Math.random()*4+5


Title: Re:AIUTO:TOROIDALE
Post by: djjeck on 10-03-2009, 19:51:04
Ma perché non fai la prova?
E comunque te l'avevo già detto io, *4+5

Se moltiplichi per tre, quando arrotondi ottieni solo tre possibili output. A te ne servono quattro, ovvero i numeri 5,6,7,8

La moltiplicazione allarga il range dei numeri casuali, la somma lo trasla


Title: Re:AIUTO:TOROIDALE
Post by: Daréios89 on 10-03-2009, 19:52:09
Si si si ho provato adesso...grazie mille della pazienza  :pray  :pray  :pray


Title: Re:AIUTO:TOROIDALE
Post by: Daréios89 on 11-03-2009, 09:45:21
Sempre su questo secondo esercizio ho dubbi su come generare le lettere casuali....per dire se la probabilità che esce 'p' è due terzi come faccio a scriverlo....per dire (int)(Math.random()*2/3)???
Mi dareste un aiuto chiaro..perchè sennò...


Title: Re:AIUTO:TOROIDALE
Post by: djjeck on 11-03-2009, 14:11:16
(Math.random()*2/3) ti dà un numero casuale in [0, 2/3[, ovvero in [0, 0.6666...[
quando casti ad int ottieni 0. sempre.

Se vuoi usare Math.random() per le probabilità devi avere più di un possibile valore in output.
Se ad esempio fai
(int)(Math.random()*2)
hai un valore casuale in {0,1}, ognuno col 50% di probabilità.

Parti da questo.
E pensaci da solo =)


Title: Re:AIUTO:TOROIDALE
Post by: Daréios89 on 11-03-2009, 19:49:58
Al limite si potrebbe optare per fare in modo da ottenere tutto con lo stesso denominatore, per dire moltiplico la prima probabilità per 2 al num e den e ottengo 4/6....poi posso fare la Math()*6.


Title: Re:AIUTO:TOROIDALE
Post by: salvin on 11-03-2009, 20:40:06
Aaah, toroidale in quel senso. Io avevo capito a ciambella.
Bisogna ammettere che è un significato di toroidale un po' immaginato.

In questo caso sia gli le righe che le colonne possiamo immaginarli come array circolari(la fine collegata all'inizio).
Graficamente dovrebbe venire una cosa del genere:
http://www.carloelce.it/superficie_toroidale/toro_animato.swf

Non sembra una ciambella? :[Emoticon] PC Asd:


Title: Re:AIUTO:TOROIDALE
Post by: Daréios89 on 11-03-2009, 20:40:36
Poi mi chiedevo ma per questo esercizio, dato che il professore prima di correggere verifica il numero di cicli, quale credete che sia il numero minimo da eseguire?


Title: Re:AIUTO:TOROIDALE
Post by: Daréios89 on 11-03-2009, 20:44:54
Quote
In questo caso sia gli le righe che le colonne possiamo immaginarli come array circolari(la fine collegata all'inizio).
Graficamente dovrebbe venire una cosa del genere:
http://www.carloelce.it/superficie_toroidale/toro_animato.swf

Non sembra una ciambella?



Davvero davvero carino... :-K


Title: Re:AIUTO:TOROIDALE
Post by: zElOtO on 14-03-2009, 19:52:46
Aaah, toroidale in quel senso. Io avevo capito a ciambella.
Bisogna ammettere che è un significato di toroidale un po' immaginato.

In questo caso sia gli le righe che le colonne possiamo immaginarli come array circolari(la fine collegata all'inizio).
Graficamente dovrebbe venire una cosa del genere:
http://www.carloelce.it/superficie_toroidale/toro_animato.swf

Non sembra una ciambella? :[Emoticon] PC Asd:

Figoo  :yoh