Newsgroup: it.lavoro.informatica
Titolo: [PROBLEMA DI LAVORO] Tagliare un tronco

Questo è un vero problema che devo risolvere a breve per una fabbrica di 
lana di legno.
Devo fare un programma che taglia tronchi da 1 a 5 metri in pezzi da 480 
a 540 mm, è ammesso un solo pezzo di scarto che DEVE essere più lungo di 
200mm.
Trovare i punti di taglio per minimizzare lo scarto, la lunghezza dei 
pezzi se stanno nella tolleranza è ininfluente, possono pure essere 
tutti diversi ma devono essere da 480 a 540mm, la macchina che sminuzza 
questi ceppi non accetta altre misure.
Il pezzo di scarto ha una misura minima perchè altrimenti la macchina 
che li trasporta potrebbe farli cadere.
Esempio:
4428 mm = 9 tagli da 492 mm senza scarto
2168 mm = un pezzo da 248 mm di scarto e 4 pezzi da 480 mm
1646 mm = un pezzo dd 200 mm di scarto e 3 pezzi da 482 mm
A mano sembra facile, ma trovare un algoritmo... ho un idea ma non mi 
sembra molto efficente. Idee per risolvere questo lavoro in modo elegante?
Bacini ringraziosi
Anna
P.S. Questo messaggio è rivolto alle numerose persone che mi hanno 
chiesto cosa si fa in automazione, ecco la risposta se volete cambiare 
lavoro questo è un tipico problema.

 1646 mm = un pezzo dd 200 mm di scarto e 3 pezzi da 482 mm
Giusto per capire: il fatto che i pezzi 'standard' siano di lunghezza
identica è una facilitazione che hai introdotto tu o è uno standard?
Che poi, quale è il criterio per la scelta della misura dei pezzi
standard? ovvero, nel secondo caso, perché i pezzi standard sono 480 e
non, chessò, 490mm di lunghezza?
-- 
Ciao!
Luca

 lana di legno.
Ma tu sei Annie o la Susy?
Io comunque partirei da:
- Dato 60 la tolleranza
- divido la lunghezza in 480 quindi il modulo è lo scarto
- Se lo scarto è minore di (nTagli * 60) allora ridistribuisco lo scarto 
sui pezzi e fine
- Se lo scarto è minore di (200 + (nTagli * 60)) allora ridistribuisco 
la differenza a 200 sui pezzi e fine
- Se lo scarto è maggiore di (nTagli * 60) ma minore di 200, allora lo 
nascondo in tasca :-)

 A mano sembra facile, 
Mmmm... invece non mi pare ci sia sempre una soluzione.
Un tronco di 1085 mm come lo tagli?

 
I pezzi standard sono quelli con 480 <= L <= 540.

 Un tronco di 1085 mm come lo tagli?
Un pezzo utile da 540 e un pezzo di scarto di 545.
Un bello spreco, indubbiamente... ma dai parametri del problema, la 
soluzione è quella :-/
Piuttosto, una considerazione: ci sono 4001 valori di input possibili (da 
1000 a 5000, compresi); di questi, gran parte hanno una soluzione univoca e 
relativamente banale.
Non sarebbe meglio calcolarsi le soluzioni una volta per tutte e piazzarle 
in una tabella di lookup, invece di scervellarsi a trovare un algoritmo 
universale che calcoli sempre una soluzione ottimale (che non è nemmeno 
detto sia univoca)?
Massimo

Vincent Vega ha scritto:

Uno scarto di 545 e uno pezzo da 540?

Vincent Vega ha scritto:

Nell'ultimo caso però posso diminuire di 1 i tagli e creare uno 
scartone, hai avuto praticamente la mia idea, a questo punto non penso 
ci siano molti modi per farlo e questo non mi sembra particolarmente 
elegante, sgrunt.
Bacini pensierosi
Anna
P.S. Comunque lo scopo del messaggio era quello di fare un esempio di 
cosa si fa in automazione. Che poi collateralmente aiuti anche una 
poverina... :)

 
Purtroppo no, primo perchè il PLC in questione ha una quantità di ram 
pari a quella del VIC-20 (siamo sui 28K circa comprendendo tutto), e 
secondo purtroppo le lunghezze minime e massime dei ceppi possono cambiare.
Sono comunque lusingata da questo brainstorming.
Bacini ringraziosi
Anna

detto sia univoca)?
Tanto per fare i puntigliosi, i possibili valori tra un intervallo mi
ricordavo fossero inifiniti... :)
Poi per il problema in questione, i tronc
Saluti.
-- 
Rimetta  a posto  la  candela...

detto sia univoca)?
M'e' scappato il post prima che finissi... dicevo:
Tanto per fare i puntigliosi, i possibili valori tra un intervallo mi
ricordavo fossero inifiniti... :)
Poi per il problema in questione, i tronchi come si misurano? A mano?
In automatico?
Che difetti di misurazione ci si debbono aspettare?


 
manca qualcosa?

 ricordavo fossero inifiniti... :)
Vabbé, dai, immagino si possa assumere una precisione nell'ordine di un 
millimetro :-)
Massimo

 Uno scarto di 545 e uno pezzo da 540?
Fantastica risposta da informatico! :-)
Ma il falegname è daccordo che di avere uno scarto da cui ci potresti 
ricavare ampiamente un'altro pezzo?
(a meno che non ho capito bene il concetto di "scarto" in questo contesto)

 è nemmeno detto sia univoca)?
Sono due formulette, eh...

 elegante, sgrunt.
Sono due formulette.
E comunque il caso particolare in questione ha due possibili soluzioni, 
creare lo scartone oppure fare un pezzo in più con uno scarto piccolo 
quindi da buttare. Io fossi in te chiederei al committente cosa 
preferisce e non darei *affatto* per scontato che preferisca la prima :-)

 elegante?
Chiedere ad un Prof. di Matematica?

manca qualcosa?
Solo la volonta' da parte tua di leggere il post completo mandato un
paio di minuti dopo.


paio di minuti dopo.
Aggiungerei che manca anche lo spessore della lama che effettua il
taglio che va tenuta in considerazione sia per il taglio dei tronchi,
sia per la creazione dell'eventuale scarto.
Comunque prima devi capire se e' possibile ottenere dei tagli senza
scarto, nel caso non fosse possibile ottenere quanti piu' pezzi
possibili andando a scartare un eccesso di 201 mm o superiore.
Io ho usato una soluzione molto grazza ma efficace e sono sotto le 20
linee di codice.
Saluti.


 linee di codice.
Come risolvi il caso in cui facendo tutti tagli di minime dimensioni 
(480 mm) ottieni uno scarto minore di 200 mm ma maggiore di 60 * nTagli 
(per cui non è accettabile e non lo puoi ripartire sui tagli)?

GdG ha scritto:

Un sistema di equazioni diofantee?

 ha scritto nel messaggio 
news:ee1uc1$fms$1...@area.cu.mi.it...

Diminuendo di 1 il numero di tagli e ricalcolando il tutto.
Per fortuna il tronco è lungo almeno un metro, quindi il problema è sempre 
risolvibile con almeno un pezzo "utile".
Massimo

 ritrovartelo in un posto sgradevole... :-)
Pienamente d'accordo con te.
Ma se c'è una macchina che si incazza a morte quando ha scarti più piccoli 
di 200 mm, c'è poco da fare, temo...
Massimo



In quel caso fissi lo scarto ad un valore di partenza di 201
(eventualmente incrementando fino ad una dimensione di poco inferiore
a quella di un taglio minimo valido) e tagli pezzi piu' grandi.
Un modo di approcciare il problema puo' proprio essere quello di
scartare a priori del materiale, anche poi puoi avere problemi dati
proprio dall'aver scartato materiale in eccesso.
Comunque probabilmente non esiste una soluzione che sia
contemporaneamente elegante ed ottimale e si e' soggetti a dei
compromessi (codice rozzo/legno sprecato...).


di 200 mm, c'č poco da fare, temo...
Proprio per questo prima trovi la massima lunghezza possibile per il
taglio e poi ricalcoli facendo in modo che lo scarto se c'e' sia in un
intervallo 200-400 mm
Comunque una lama che mangia 2-3 mm a taglio diventa un elemento
importante...


 - L'algoritmo è generalizzabile per lunghezze minime e massime arbitrarie,
...che possono anche essere passate come parametri alla funzione, con 
l'unica scocciatura di dover allocare dinamicamente l'array dei resti.
Massimo

 li trasporta potrebbe farli cadere.
Ok, ecco i termini del problema, mi pare siano molto ben definiti.
Ecco la mia soluzione; è sottoforma di codice C compilabile, quindi c'è 
anche una piccola funzione main() per provare il programma :-)
Algoritmo:
- Calcolo i resti per tutti i possibili tagli uniformi (pezzi da 480, pezzi 
da 481, ... , pezzi da 540)
- Trovo il taglio con resto minimo
- Genero N pezzi di lunghezza uguale e tale da produrre il resto voluto
- Se il resto minimo è 0
    - Problema risolto.
- Se il resto minimo può essere suddiviso tra i pezzi tagliati generando 
pezzi più piccoli di 540
    - Suddivido il resto tra i pezzi tagliati
    - Problema risolto
- Il resto minimo non è una soluzione applicabile
- Individuo il taglio con resto minimo che sia >= 200
- Se c'è un taglio con resto minimo e >= 200
    - Genero N pezzi di lunghezza uguale e tale da produrre il resto voluto
    - L'ultimo pezzo è il resto
    - Problema risolto
- Non c'è un taglio con resto >= 200
- Occorre tagliare i pezzi in maniera tale da generare un resto più lungo di 
un pezzo valido
- Genero N pezzi di lunghezza massima (540), per minimizzare il resto
- Aggiungo all'ultimo pezzo il resto che avanza
- Problema risolto.
Codice:
----------
#include <stdio.h>
/* Funzione per il calcolo dei tagli */
/* Parametri: lunghezza del tronco, array di interi dove scrivere le
   lunghezze dei pezzi da tagliare */
void calcolatagli(int lunghezza,int *tagli)
{
        int i;
        int lunghezzataglio;
        int n = 0;
        int pezzi = 0;
        int resti[61];
        int resto;
        /* Inizializzazione array risultati */
        for(i = 0;i < 20;i++)
                tagli[i] = 0;
        /* Calcolo dei resti per tutti i possibili tagli uniformi */
        for(i = 0;i < 61;i++)
                resti[i] = lunghezza % (480 + i);
        /* Individuazione del resto minimo */
        for(i = 0;i < 61;i++)
                if(resti[i] < resti[n])
                        n = i;
        /* Calcolo dei parametri per il resto minimo */
        lunghezzataglio = 480 + n;
        pezzi = lunghezza / lunghezzataglio;
        resto = resti[n];
        /* Riempimento array risultati con lunghezze di taglio */
        for(i = 0;i < pezzi;i++)
                tagli[i] = lunghezzataglio;
        /* Se il resto e' zero il calcolo e' completo */
        if(resto == 0)
                return;
        /* Non esiste una soluzione con resto zero,
           quindi occorre gestire il resto */
        /* Verifica se il resto puo' essere distribuito sui pezzi tagliati 
*/
        if(resto < pezzi * (540 - lunghezzataglio))
        {
                /* Distribuzione resto */
                i = 0;
                while(resto > 0)
                {
                        if(resto < (540 - lunghezzataglio))
                        {
                                tagli[i] += resto;
                                resto = 0;
                        }
                        else
                        {
                                tagli[i] = 540;
                                resto -= (540 - lunghezzataglio);
                        }
                        i++;
                }
                /* Soluzione individuata */
                return;
        }
        /* Non esiste una soluzione priva di resto,
           quindi occorre individuare la soluzione ottimale che include un 
resto */
        /* Ricerca soluzione con resto minimo >= 200 */
        n = 0;
        for(i = 0;i < 61;i++)
                if(resti[i] >= 200 && resti[i] < resti[n])
                        n = i;
        /* Verifica se esiste una soluzione con resto >= 200 */
        if(resti[n] >= 200)
        {
                /* Calcolo parametri di taglio per soluzione con resto */
                lunghezzataglio = 480 + n;
                pezzi = lunghezza / lunghezzataglio;
                resto = resti[n];
                /* Riempimento array risultati con lunghezze di taglio */
                for(i = 0;i < pezzi;i++)
                        tagli[i] = lunghezzataglio;
                /* Inserimento resto come lunghezza dell'ultimo pezzo */
                tagli[i] = resto;
                /* Soluzione individuata */
                return;
        }
        /* Non esiste una soluzione con resto >= 200,
           quindi occorre realizzare un pezzo di scarto di lunghezza 
superiore a
           quella di un pezzo valido */
        /* Impostazione parametri di taglio per pezzi di lunghezza massima 
*/
        lunghezzataglio = 540;
        pezzi = lunghezza / lunghezzataglio;
        resto = lunghezza % 540;
        /* Riempimento array risultati con lunghezze di taglio */
        for(i = 0;i < pezzi;i++)
                tagli[i] = lunghezzataglio;
        /* Aggiunta resto all'ultimo pezzo da tagliare */
        tagli[i - 1] += resto;
        /* Soluzione individuata */
        return;
}
/* Funzione main() per il collaudo */
int main(int argc,char **argv)
{
        int i;
        int lunghezza;
        int tagli[20];
        while(1)
        {
                printf("Inserire lunghezza tronco (0 per uscire): ");
                scanf("%d",&lunghezza);
                getchar();
                if(lunghezza == 0)
                        break;
                calcolatagli(lunghezza,tagli);
                printf("\n");
                printf("Lunghezza pezzi tagliati:\n");
                for(i = 0;i < 20;i++)
                        if(tagli[i] != 0)
                        {
                                printf("%2d - mm. %d",i + 1,tagli[i]);
                                if(tagli[i + 1] == 0 &&
                                   (tagli[i] < 480 || tagli[i] > 540))
                                        printf(" (scarto)");
                                printf("\n");
                        }
                printf("\n\n");
        }
        printf("\n\n");
        return(0);
}
--------
Alcune considerazioni:
- l'algoritmo fallisce miseramente per lunghezze < 200 (che comunque non 
rientrano nei termini del problema)
- L'algoritmo è generalizzabile per lunghezze minime e massime arbitrarie, 
così come per limiti arbitrari sul resto minimo
- La situazione peggiore in assoluto è quella con lunghezza = 1159.
Fatemi sapere che ne pensate :-)
Massimo
P.S.
Anna, mi devi *almeno* una cena ;-)

 l'unica scocciatura di dover allocare dinamicamente l'array dei resti.
Ovviamente, anche l'array delle lunghezze dei pezzi dovrebbe essere allocato 
dinamicamente secondo i parametri del problema; io l'ho allocato 
staticamente da 20 elementi perché, per lunghezze <= 1000, risulta sempre 
sufficiente.
Scusate, sono un fo**uto perfezionista ;-)))
Massimo

Annie wrote:

Mi interessava sapere come mai avevi scelto 4 pezzi da 480 con scarto
di 248 e non 4 da 490 con scarto da 208. Comunque...
Vadiamo se a mente fresca mi viene in mente una buona soluzione.
Proviamo a ragionare sullo scarto. Ovvero, data L la lunghezza del
pezzo, inizio a ragionare su L - 200; a quel punto, cerco la soluzione
ottima per scegliere lo scarto supplementare inferiore. Si tratta di un
ciclo, da 480 a 540; creerò una tabella di 61 righe in cui le colonne
siano costituite da lunghezza, numero di tagli a lunghezza, lunghezza
supplementare e scarto; per cui
per ogni step:
  divisione intera di (L-200) per la lunghezza attuale 
  salvo il quoziente
  verifica del resto:
    se (lunghezza attuale) + resto < 540
        salvo quoziente - 1 come numero passi
        salvo (lunghezza attuale) + resto (sup)
        salvo 200 come scarto
    altrimenti
        salvo quoziente come numero passi
        salvo 0 (sup)
        salvo L + resto come scarto
(sup) = lunghezza supplementare
A questo punto si tratta di scegliere la soluzione che da scarto
inferiore e di decidere il criterio in base al quale, se ci sono due o
più scarti identici, quale di questi va considerato migliore.
Nota che, anche se il costo computazionale è tutto sommato basso, si
potrebbe fare un piccolo sforzo in più e tabellare il tutto: esegui il
calcolo una volta per tutte, metti i risultati in una tabella da
caricare all'avvio e a quel punto, data una lunghezza totale, hai il
tuo risultato senza doverlo ricalcolare.
NOTA: l'ho buttata giù in 5 minuti. Mi sembra una soluzione decente, ma
probabilmente c'è di meglio.
-- 
Ciao!
Luca

 
Sai che tabella viene fuori!!! :-)
-- 
Ciao!
Luca

 Un sistema di equazioni diofantee?
Programmazione lineare?
A me il tuo problema pare simile a quello dello zaino.
Ma appena svegliato potrei dire scemenze.

 a quella di un taglio minimo valido) e tagli pezzi piu' grandi.
Avevo fatto un esempio pratico (il più semplice), un tronco di 1085
mm.
Se fai 2 pezzi di 480, ottieni uno scarto di 125 mm. Non puoi azzerare
lo scarto perchè ridistribuendo 125 sui due tagli ottieni sempre
almeno un pezzo più lungo di 540.
Non si può fare come dici tu, perchè con uno scarto di 200 ottieni
una lunghezza utile di 885 da cui non ottieni un numero intero di tagli
(quindi altro scarto). Anche aumentando lo scarto a 479 ottieni una
lunghezza utile di 606 da cui fai ancora scarti.

 
saranno contenti in amazzonia....

Mi sa' di problema risolvibile con algoritmo del simplesso ...
ottimizzazione discreta.

Non trovo il nesso con le equazioni diofantee ... a^n+b^n=c^n ...
magari dopo aver letto la dimostrazione dell'ultimo teorema di Fermat
... quella di 200 e passa pagine potresti riuscire a creare i tronchi
dal nulla.




L'approccio che preferivo era di calcolare il quozionete e il resto
tra la lunghezza del tronco e tutto il range di dimensioni utili (ad
incrementi di 1 mm), poi ragionare sullo scarto, pero' gira e rigira
il modo migliore e' utilizzare una look up table ragionando pero' per
range di misure: quando hai deciso con la calcolatrice quei 15 tagli e
ti sei ricavato le misure dei vari pezzi hai la tua bella tabella
pronta e tagli.
Ad ogni modo oltre alla largezza della lama, manca un altro dato
importante: lo scarto dove sta?
Sempre a sinistra?
Sempre a destra?
In un punto qualsiasi del tronco e poi viene spinto via?
Questo e' utile se si vuole usare un algoritmo.


Massimo
Si, ma adesso fate a meta' con lo stipendio?


lunghezza utile di 606 da cui fai ancora scarti.
Purtroppo qui si scende nel compromesso: tutti i tronchi tra, diciamo
1080 e 1159 mm, vanno trattati in presenza di un operatore che possa
rimuovere lo scarto manualmente per evitare che cada dal (presumo)
nastro.
Di piu' non credo si possa fare...


 Si, ma adesso fate a meta' con lo stipendio?
Ho già detto che mi deve una cena ;-)
Massimo

 ritrovartelo in un posto sgradevole... :-)
ROTFL
Stef 

 lana di legno.
E' in Java, dacci un'occhiata.
import java.util.Arrays;
public class MinimizzaTronchi {
	public static final short LUNGHEZZA_MINIMA_SCARTO = 200;
	public static final short LUNGHEZZA_MINIMA_PEZZO = 480;
	public static final short LUNGHEZZA_MASSIMA_PEZZO = 540;
	private static short lunghezzaPezzo  = 0;
	private static short lunghezzaScarto = LUNGHEZZA_MASSIMA_PEZZO;
	public static void main(String[] args) {
		// Simulazione lunghezze diverse
		for (short lTronco = 1000; lTronco < 5000; lTronco++){
			//Loop per la ricerca del divisore esatto
			for (short t = LUNGHEZZA_MINIMA_PEZZO; t <= LUNGHEZZA_MASSIMA_PEZZO;
t++){
				short scarto = (short) (lTronco%t);
				if (scarto == 0){
					lunghezzaPezzo = (short) (lTronco/t);
					lunghezzaScarto = 0;
					break;
				}else if (scarto >= LUNGHEZZA_MINIMA_SCARTO && scarto <
lunghezzaScarto){
					lunghezzaPezzo  = t;
					lunghezzaScarto = scarto;
				}
			}
			if (lunghezzaScarto != 0 && lunghezzaPezzo != 0){
				short[] pezzi = new short[lTronco/lunghezzaPezzo];
				Arrays.fill(pezzi,lunghezzaPezzo);
				// Cerco di distribuire lo scarto eccedente i 200 sui singoli
pezzi.
				for (short ind=0; ind < pezzi.length && lunghezzaScarto >
LUNGHEZZA_MINIMA_SCARTO; ind++){
					short min = (short) Math.min((lunghezzaScarto -
LUNGHEZZA_MINIMA_SCARTO), (LUNGHEZZA_MASSIMA_PEZZO - pezzi[ind]));
					pezzi[ind] += min;
					lunghezzaScarto -= min;
				}
				System.out.println("Lunghezza Tronco: "+lTronco+ " diviso in "+
pezzi.length+" pezzi, con scarto di "+ lunghezzaScarto);
				printArray(pezzi);
			}else if (lunghezzaPezzo == 0){
				lunghezzaPezzo = LUNGHEZZA_MASSIMA_PEZZO;
				lunghezzaScarto = (short) (lTronco - lunghezzaPezzo);
				System.out.println("Lunghezza Tronco: "+lTronco+ " diviso in "+
lTronco/lunghezzaPezzo+" pezzi, di lunghezza "+ lunghezzaPezzo+ " con
scarto " +lunghezzaScarto);
			}else{
				System.out.println("Lunghezza Tronco: "+lTronco+ " diviso in "+
lTronco/lunghezzaPezzo+" pezzi, di lunghezza "+ lunghezzaPezzo+ " con
scarto nullo");
			}
			lunghezzaPezzo  = 0;
			lunghezzaScarto = LUNGHEZZA_MASSIMA_PEZZO;
		}
	}
	private static void printArray(short[] array){
		for (short i = 0; i < array.length; i++){
			System.out.println(i+1+"° pezzo di lunghezza "+array[i]);
		}
	}
}

"GdG" <s@s@s@s@aa> wrote in message
news:450508e7$0$35085$
4faf...@reader4.news.tin.it

Scemenza per scemenza la butto la' (e sicuramente sara' una scemenza
perche' sto per parlare di cose che ho visto una volta nella vita
oltre 10 anni fa, quando ero studente universitario
e non me ne sono mai piu' occupato ne' per professione ne' per hobby).
<modalita' possibile stronzata colossale on>
A me pare che il problema sia di quelli che si risolvevano con il
metodo del simplesso  (sono  oltre 10 anni che non ne sento parlare 
per cui l'affifdabilita' di quello che dico e' scarsissima)..
ovvero...
Supponiamo per semplicita' di aggiungere il vincolo che i pezzi
che taglio siano tutti della stessa lunghezza, ovviamente
tranne lo scarto (se non lo sono
le equazioni si complicano abbastanza e attualmente non mi viene in
mente una soluzione ragionevole se non ci sono vincoli tra le lunghesse
dei pezzi)
sia Ls = Lunghezza scarto
sia Lt=lunghezza di uno dei pezzi che taglio
sia L=lunghezza del tronco
mi pare che il problema e' trovare il minimo di Ls in presenza dei
vincoli:
1)L <= 5
2)L>=1
3)Lt<=0.54
4)Lt>=0.48
Se considero un sistema cartesiano con in ascisse L e in ordinate Lt
1),2),3),4) determinano un rettangolo (regione ammissibile)
poiche' Ls=min(0.200,L-floor(L/Lt)*L) e poiche' L-floor(L/Lt)*L
dovrebbe potersi disegnare
come una curva nel piano L,Lt e l'analisi dei valori assunti da
Ls sulla intersezione tra la curva suddetta
e la regione ammissibile dovrebbe aiutare a trovare il minimo...
<modalita' possibile stronzata colossale off>
tenendo conto che questa cosa l'ho sparata a freddo dopo 10 anni che
non vedo cose simili, non puo' che essere una immane stronzata ma 
spero che possa suggerire qualcosa di utile..
ciao,
Marco.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 poiche' Ls=min(0.200,L-floor(L/Lt)*L) 
e due. Qui ovviamente e' max,non min se lo scarto deve essere come
minimo
200 mm.
Ciao,


Eccomi di ritorno, Guten Morgen a tutti (ho cominciato a parlare tedesco!).
Ho visto le vostre soluzioni, ma purtroppo moltissime sono da scartare 
per l'automazione.
Per l'automazione è essenziale il tempo ciclo e sopratutto c'e' 
POCHISSIMA memoria. Ho visto gente che fa cicli da 1000 a 5000!!!
Comunque la soluzione adottata è stata la seguente:
esempio:
1200mm
int(1200/480)= 2 pezzi
Caso A
480*2 = 960 (scarto 240) 540*2 = 1080 (scarto 120)
Caso B
diminuisco i pezzi di 1
480*1 = 540 (scarto 720) 540*1 = 540 (scarto 660)
tre condizioni in ordine di priorità:
1) casoA, i segni degli scarti sono pos e neg, significa che la 
soluzione è perfetta e senza scarto
2) casoA, i segni degli scarti sono entrambi pos e sopra e sotto lo 
scarto minimo, quindi è possibile avere lo scarto minimo (200)
3) casoB, si sceglie lo scarto minimo tra le 4 combinazioni
nel caso in esame è una situazione 2, lo scarto minimo 200, quindi 
1200-200=1000 e quindi 2 pezzi da 500.
Grazie a tutti comunque per i suggerimenti prima di partire.


Può andare bene secondo me ma va complicato un attimo:
1) casoA, Lungh/480 = 9 (scarto > 0) e 540*9 > Lungh significa che posso
tagliare esattamente ma x trovare il taglio NON basta una divisione con
approssimazione, devi fare:
int(Lungh/9)=XXX;
recupero=Lungh-XXX;
i=1;
while recupero<>0
Begin
	if (recupero<(540-XXX)) then
						Begin
							Lungh_pezzo_i=XXX+recupero;
							recupero = 0;
						End
						else
						Begin
							Lungh_pezzo_i=540;
							recupero=recupero-(540-XXX);
							i++;
						End
End
2)casoB
Analogo a casoA ma con Lungh=Lungh-200
3)casoC
Non ho capito la tua spiegazione.
Secondo me in C ci entri solo se entrambi gli scarti di prima sono >0 e
< 200 ---> devo fare un pezzo in meno ---> rifai i calcoli con un pezzo
in meno e prendi il risultato migliore facendo un pezzo in meno NON
considerando gli altri risultati ...
Buon algoritmo nel tuo dominio ma non adatto x grandi valori di Lungh
totale tronco, determinare i recuperi può essere davvero lungo se devo
fare milioni di tagli :)
Ciao
<<<MirO>>>


Puoi spiegare per favore perchč, se il suo dominio č quello, dovrebbe
complicare l'algoritmo in maniera da poterlo generalizzare e renderlo buono
anche per altri domini?
Il camerlengo
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 memoria. Ho visto gente che fa cicli da 1000 a 5000!!!
Beh, scusa, la mia mi sembrava abbastanza poco esosa in termini di 
memoria... ce l'avrete lo spazio per un array di 60 interi, no? :-)
Ha il vantaggio che trova sempre la soluzione ottimale, e può scalare senza 
problemi per lunghezze del tronco superiori.
Massimo

 
Perchč se fra 1 anno cambiano macchina e comincia ad accettare tronchi
da 20m invece che 5 DEVE tener presente che POTREBBERO sorgere dei
problemi ...  oppure se un giorno si trova un problema simile ma piů
complesso dei max 10 tagli del dominio deve tener presente che questa
soluzione NON č scalabile ... credo che l'algoritmo vada benissimo ma
tener presente i suoi limiti sia doveroso per evitare spiacevoli
incovenienti in futuro ... NON ho detto di non usarlo ho semplicemente
detto che č un compromesso adatto al  dominio ma pur sempre un
compromesso ... la soluzione ottima CREDO sia quella che ho detto in
un'altro post ... ma č ottima per un dominio QUALSIASI ... poi su domini
piccoli ci si arrangia e si trovano soluzioni + efficenti ...
Ciao
<<<MirO>>>

 Ciao
Continuo a chbiedermi perchè se il cliente pone un problema l'informatico
glie lo deve complicare.
Perchè l'informatico deve proporgli la soluzione scalabile, valida su
qualsiasi dominio se il cliente non glie lo chiede.
Nella fattìispecie non si trata di una soluzione dal costo di migliaia di
eruro perciò, quando cambierà il dominio si cambierà la soluzione. Perchè
spendere oggi (in sviluppo ed in test che è sicuramente più oneroso con un
dominio non definito) solo perchè un informatico si fa delle seghe mentali?



E se in futuro il cliente chiama dicendo: "guarda mi hanno appena adattato
la macchine per tagliare tronchi di 15 metri, com'è che il tuo programma
non funziona più!!!
Ah, la macchina deve essere pronta per esattamente ora, quindi vedi di
correre qui! Grazie".
Tu che gli rispondi?
Non è meglio questi dubbi farseli venire in mente prima e chiarirli con il
cliente visto che può essere solo il fornitore a conoscere i limiti
strutturali della sua soluzione che sta per consegnare al cliente?
Ciao, Alessandro
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 mentali?
Perche' non si tratta di seghe mentali ma di valore aggiunto per il
cliente. Questo perche' un buon informatico sapra' comprendere le esigenze
aziendali, e sara' in grado di pensare sin dall'inizio in termini di una
soluzione che sappia soddisfare i requisiti non funzionali nella misura
piu' elastica compatibile con il budget progettuale. Un bravo informatico
non mira alla risoluzione del problema in se' per se' come se fosse un
quiz da settimana enigmistica ma mira a creare una soluzione. Soluzione
che spesso non comporta nessun tempo aggiuntivo ma richiede molta
esperienza, un solido studio della materia e l'aver applicato soluzioni
diverse in progetti e ambiti eterogenei in modo da riuscire a partire con
i presupposti di un'architettura invece di pensare al piccolo ingranaggio.
L'ingranaggio si puo' sempre migliorare, l'infrastruttura e i contenitori
no. Questa e' la differenza per cui le aziende valide riescono a
comprendere il valore di un informatico che fornisce soluzioni che
aggiungono valore da quello di uno smanettone che mette le toppe a una
barca che affonda.


 qualsiasi dominio se il cliente non glie lo chiede.
perche' ovviamente l' informatico medio lo fa per passione: non 
concepisce il risolvere un problema per soldi, deve risolverlo nel modo 
migliore, anche mettendoci il doppio del tempo per lo stesso prezzo, e 
sentirsi in questo modo realizzato.
Ieri e' venuto l' idraulico a montarmi un termoconvettore (o come cxxxo 
si chiama). E' venuto e mi ha montato il termoconvettore che gli ho 
detto io, come e dove gli ho detto io, non mi ha proposto un 
termoconvettore compatibile al 100% se decidessi di rinnovare tutto l' 
impianto idraulico.

 vuole in futuro avere complicazioni per specifiche non chiarite.
Perchè si parte dal presupposto che il cliente sia un'idiota e che
l'informatico porti la scienza?
A parte che, nel caso specifico, il "cliente" era Annie che aveva
chiaramente fornito delle specifiche, credo ragionate.
Perchè ci deve essere sempre una persona che va a ridiscutere le specifiche
perchè "è meglio fare così?"
TRovi poi intelligente proporre qualcosa che costa di più, che è meno
efficiente, che necissita di test più accurati inutilmente per, ripeto,
delle seghe mentali?
In sintesi: perchè gli informatici anzichè risolvere le cose vogliono
compicarle anche dovbe non serve per seguire degli schemi mentali molto0
rigidi?
Il Camerlengo


Perche' non si tratta di seghe mentali
Niente di piu' vero. ;-))))
G

 sentirsi in questo modo realizzato.
Fosse solo un problema dell'informatico medio che lavora il doppio per i
motivi che hai portato.
Purtroppo in fase di definizione di grossi progetti l'informatico è quello
che complica la vita al cliente il più delle volte in maniera inutile. Molte
volte, come ho già avuto modo di dire, è l'informatico che vuole convincere
al cliente che quello che vuole è meglio se non lo volesse perchè non
ottimale :-). Il tutto con grosse perdite di tempo e "naufragar di
progetti".
Il meccanismo di solito è questo
Cliente: voglio A,B,C
Informatico: ma le best practice, gli standard, le evoluzioni richiedono
D,E,F ma sicuramente è meglio
....dopo grandi discussioni e perdite di tempo
Cliente: ok, facciamo D,E,F ma mi faccia anche A------
Alla fine il cliente non ha quello che voleva e lo usa poco.
L'informatico ha fatto quello che voleva ma il fatto che non viene usato è
"perchè il cliente è un idiota"



Il definire "dove non serve" è molto personale e dipende dalla
capacità/sensibilità di oguno.


 non funziona più!!!
Gli dico che da contratto il software mi hanno detto di svilupparlo 
cosi', se lo vuole anche sulle macchine nuove mi paga e glielo modifico.

 Alla fine il cliente non ha quello che voleva e lo usa poco.
Guarda, io ho avuto la fortuna di avere una formazione come commerciale 
oltre che come informatico. Questo, unito al fatto di essere un 
consulente e quindi dovermi gestire anche le trattive commerciali, mi 
porta ad avere una visione abbastanza obbiettiva delle cose.
E sono arrivato a capire una cosa: bisogna *ascoltare* il cliente. Non 
sentenziare saccentemente, e nemmeno aggredirlo con stronzate da 
commerciale, ma *ascoltarlo*, e capire quello che vuole, e farglielo 
avere. Senza seghe mentali. Punto.
Sembra facile, ma il 90% delle volte invece succede proprio come dici tu...


Si vede che sono dipendente... io parlerei chiaro dall'inizio in modo che
il cliente possa sapere fin da subito i limiti della soluzione più veloce
da consegnare e quindi valutare gli eventuali costi futuri o scegliere se
avere già da subito un soluzione migliore e più costosa.



Continuo a pensare che, se da una parte puoi aver ragione tu, NON è
questo il caso ...
Annie fa benissimo ad usare la sua soluzione ma è secondo me
intelligente tener presente che la soluzione è ad-hoc x il suo dominio
perchè secondo me, come dice AlexTV, non si sta risolvendo un gioco di
una settimana enigmistica ma producendo una soluzione reale ... e gli
spunti (personali e di gruppo) usciti qui mettono cmq in luce soluzioni
che magari ora non servono a niente ma che magari ti torneranno utile in
futuro ...
Per fare un esempio:
Tra 1 anno telefonano  ad Annie e le dicono che hanno adattato la
macchina a lavorare con tronchi di 20m e nel frattempo devono produrre
pezzi di 10-20 mm e non 500 e si accorgono che la macchina non sta
dietro ai ritmi di produzione ...
Se Annie NON si fosse neanche posta il problema di velocità
dell'algoritmo in casi + generali dovrebbe fare test per capire cosa non
va più, capirlo e ritrovare una nuova soluzione, se sapesse il problema
salterebbe le prime 2 fasi ... e (con la giusta preparazione) quanto ci
si mette a capire il problema di quell'algoritmo ??? Davvero poco, lo si
annota e nel caso si presenti NON si è completamente dispersi.
X metterla su un altro ambito: se ti danno da fare una piccola
applicazione che riceve dati da un DB (magari in formato Stringa
generico) e li rinvia ad esempio via rete tu che fai metti tutto il
codice nell'handler di pressione del testo ok oppure crei un oggetto che
rappresenti il dato ricevuto, costruisci una classe che esegua
l'operazione e nell'handler metti solo l'invocazione al metodo che
esegue l'operazione?
La prima soluzione è uno schifo ma è più veloce da fare, la seconda è
migliore ma più complicata.
La ritieni una inutile sega mentale oppure è una cosa che serve ??? Ma
ci metti + tempo a farla ...
Sta al singolo programmatore capire quando una cosa è una sega mentale
oppure è una complicazione che in futuro servirà ... io ho esperienza
quasi solo universitaria (ingegneria informatica) e vedo gente che si fa
DAVVERO seghe mentali x usare design pattern sconosciuti per problemi
banali ma c'è un limite anche dall'altra parte ...
Ciao
<<<MirO>>>

 quasi solo universitaria (ingegneria informatica)
Si vede, ma quello che hai espresso purtroppo č< il comune pensare.
Il Camerlengo


 
So che molti qui nel NG tendono a diffidare di laureati o simili (non
entro nei motivi) ma credo che, entro certi limiti, questo modo di
pensare che tende a costruire sempre soluzioni orientate a sviluppi
futuri e riusabilità sia un bene.
Certo non è possibile metterci 3 mesi x scrivere uno stupendo HELLO
WORLD riusabilissimo ma, come in tutte le cose, è giusto trovare un
trade-off tra progetto riusabiule e complessità spaziale e temporale.



NOn volevo attaccare i laureati, il sensoi era quello di mancata esperienza
sul lavoro.
IL problema che ho posto poi è indipoendente dalla laurea.
Aggiungo un altro elemento. In un progetto esistono dei ruoli: mi son
trovato spesso con programmatori che perdevano tempo perchè, riporto
testualemente "sto riscrivendo il codice perchè stanotte mi è venuto in
mente come ottimizzarlo". Il tutto in un contesto dove la ottimizzazione non
serviva perchè anche il codice meno ottimizzato sarebbe andato bene. Il
tutto ovviamente ha comportato nell'occasione 2 gg di lavoro anzichè 1.
E questa mentalità che considero deleteria.
Il camerlengo


 punti forti e deboli e quindi quando riusarla e quando no.
Il buon lavoro intanto è nell'individuare punti deboli nel dominio che 
stai esaminando, poi magari può permettersi di prevedere altri domini.
Avevo già fatto l'esempio di un caso "impossibile", cioè quando avevi 
una lunghezza tale da non poter ottenere uno scarto maggiore di 200 
(lunghezza minima dello scarto) e minore di 480 (lunghezza minima del 
pezzo). Per l'algoritmo probabilmente non è impossibile, perchè tu non 
poni la condizione che lo scarto debba essere minore di un pezzo intero 
non essendo questa una condizione iniziale.
Quello che voglio dire è che non è così stupido arrivare alla soluzione 
per ragionamento naturale, anzi, è una condizione sin equa non e questa 
si chiama banalmente "analisi" :-) L'ottimizzazione *comunque* viene dopo.

 recupero=Lungh-XXX;
Non capisco, i casi mi dicono solo quale caso particolare, ma se 
l'algoritmo mi dice che c'e' una soluzione perfetta, la soluzione è:
Lungh / 9  ovviamente e non int(lungh/9)
taglio di 15000 mm
31 tagli da 480
27 tagli da 540
ovviamente c'e' la soluzione perfetta che è 31 tagli da 483,87mm (meglio 
pezzi piccoli per la macchina sminuzzatrice che c'e' dopo).
Semplicemente quei tre if mi dicono quale calcolo devo fare per sapere 
quanto sono lunghi i tagli e quanto è lungo lo scarto.
Per il resto non capisco la tua "sega mentale", considerando che è 
impossibile trasformare la macchina in modo che accetti tronchi da 15 
metri se possono entrarci solo quelli da 5. Qui non si parla di 
informatica pura dove è facilissimo cambiare le specifiche (un vantaggio 
dell'automazione).
Bacini Curiosi
Anna

 
Se è possibile farlo senza usare array, non vedo il problema.

 
Se non puoi generare ceppi tra 200 e 480, puoi sempre generarli più 
grandi, se li generi oltre 540 li puoi sempre tagliare in due.

 Se è possibile farlo senza usare array, non vedo il problema.
Analizzare preventivamente la lunghezza dello scarto per tutte le possibili 
lunghezza di taglio consente poi più facilmente di fare le selezioni e i 
calcoli successivi, tutto qui.
Massimo

 l'informatico porti la scienza?
l'esperienza? ;-)

 possibile tra funzionalità/costi/ecc...
Niente vieta di essere propositivi se si vede che nel suo processo c'è
qualcosa che non va. Ma non si va ad insegnare al babbo come si mette
incinta la mamma. Se il cliente è un falegname il tuo ruolo di
informatico non è quello di insegnargli come si fa il falegname.

 
Pensavo che la precisione della macchina fosse 1 mm, quindi non in grado
di produrre tagli non interi.
Per fare un esempio banalissimo, sei hai un tronco di 1001 la soluzione
è 2 tagli senza scarti ma pensavo che il taglio perfetto (500,5) non
fosse possibile, quindi l'algoritmo con int(Lungh/N° tagli) serve x
partire da un numero intero e da lì aumentare la lunghezza fino ad
arrivare a coprire tutto il tronco ...
Esempio:
Lungh = 2002 ... soluzione esatta = 4 tagli
dim_taglio = int(2002/4) = 500
---> recupero = 2
il ciclo serve x realizzare un taglio da 502 x recuperare quei 2 che
rimarrebbero di scarto ma se puoi usare le virgole non è un problema (ma
fino a quanti decimali ??? se il taglio ti viene periodico (es 1501/3) a
che dim lo approssimi ???)
N.B. così l'algoritmo è aumentante ... parte da sol intere a le aumenta
fino a coprire tutto il tronco ... si fa agevolmente anche una versione
diminuente (si parte da int(Lungh/N°_tagli)+1 e si diminuisce fino ad
ottenere tutto il tronco (altrimenti ti mancherebbero dei pezzi))
N.B.2 Il ciclo serve nei casi in cui il recupero NON può essere sommato
tutto ad un pezzo (es int(Lungh/N°_pezzi)=539 e resto = 2) ma deve
essere spalmato su + pezzi
<<<MirO>>>


Perchè non perfezionarla risdistribuendo lo scarto così trovato per
la parte eccedente 200?
Postilla. Ma, se ti stampi le 4000 soluzioni possibili e l'utente dà
quella giusta in input al tuo (a questo punto privo di logica)
programma? ;-)

 
Non puoi, se c'e' uno scarto oltre 200 vuol dire che č stata usata la 
misura massima.

 
Solo se non cambia le misure minima e massima, cosa che invece può fare 
benissimo.

 misura massima.
Non ti seguo: data una lunghezza N del tronco, esiste una lunghezza M
dei singoli tronchetti TUTTI UGUALI (dove 480 <= M <= 540) tale che la
lunghezza dello scarto sia la minima possibile maggiore di 200 (a meno
che non sia nullo).
Trovata questa lunghezza M e questo scarto, cosa ti impedisce di
redistribuire la parte eccedente 200 sui singoli tronchetti?
Esempio: Tronco = 4996
4996 / 9 = 532 - Scarto 208 ==> 8 tronchetti da 532, uno da 540.
Questo è l'output del programma che t'ho scritto.

 1646 mm = un pezzo dd 200 mm di scarto e 3 pezzi da 482 mm
Uso numeri e non simboli ( caso generale) perchè per pensarci è +
semplice.
*Caso ottimo è con scarto di 0/200 millimetri*
Allora , partiamo da 2168, 2168-200=1968
Int(1968/480)=4
Ma 2168/4=492.
Qui 480 e 492 sono soluzioni ottime, noi scegliamo quella con minore
scarto.
Problema: la soluzione ottima esiste sempre?
No il calcolo può dare 480>sol >540.
Con n=5 ho un escursione di 5*(540-480)=300mm, 300+200>480 ( mi porta a
n+1)
per cui se l>2400 lo soluzione ottima c'è sempre.
2400-2700  n=5 e niente scarto
2700-2880 n=5 e scarto=200
2880-3180 n=6 e niente scarto
ecc IMO tagli di lunghezza non eguale non cambiano nulla, l'escursione
è quella.
Osservazione; per n piccolo il problema non ha ( a sempre soluzione):
Con n=3 hai solo 180mm di esursione, a volte scarto<200
Con n=4 hai alcuni scarti >200
Con n=5 ottimale.

 int(1200/480)= 2 pezzi
CUT
Boh, mi sembra la soluzione migliore possibile.

19 / 09 / 09
- E' suggeribile la presenza di una persona con le PALLE per la lettura
del presente messaggio da parte di individui privi di robusta
personalità. E' ALTAMENTE SCONSGLIATA la lettura di questo messaggio
da parte di uno STOLTO, di un PECORONE o di un PLEBEO. -
N.B. Essendo perfettamente conscio che molti dei termini da me usati,
difficilmente vengono correttamente interpretati (avendo anche
molteplici significati e sfumature) fornirò in appendice (in fondo) al
seguente testo un breve glossario, indicante l'esatto significato con
cui essi vengono  da me intesi:
Salve, io mi appello come SPAMMER ARCANO,
io spammo come un matto, e a chi mi disprezza vado nell'ano,
ma con tanta vaselina e facendo piano piano.
Mi potrei anche chiamare SPAMMER MISTERIOSO,
ed in quel caso, se volete disprezzarmi,
vi trovate nell'ano il mio coso.
Sempre al mio caso,
potrebbe esser bello il nome di SPAMMER CELATO,
ma non tentate di attaccarmi,
sennò in CULO ve lo trovate rigirato.
A loro ci vado proprio a tutti, tanto ai belli quanto ai brutti,
a quelli alti e a quelli bassi,
a quelli bravi e a quelli inetti...
vorrei affascinare tanto voialtri da indurvi alla visita de:
Il sito di Lello Vitello 'Cantautore alla bona' - 
ww.lellovitello.it
 -
Il sito di Joe Natta "Cantautore 'No - Normal'" - 
www.joenatta.com
 -
Il sito dell'unico ed inimitabile Eddie Van Halen pisano -
http://vanhalen.altervista.org
 -
Il sito del fiorentino Akuma - 
http://www.akuma.splinder.com
 -
*Per richiedere l'inserimento del vostro sito tra i miei messaggi
promozionali, scrivete a: 
spammer...@libero.it
Io spammo tanto quanto CAZZO bramo e nessuno ha la facoltà fare alcuna
SEGA, in maniera tale da precludermelo. Io  trasmetto tante
comunicazioni quanto MINCHIA mi pare e piace, aventi dimensioni che io
ritengo necessarie tanto quanto STRACAZZO desidero. Se ci fosse chi
elucubrasse che i comportamenti da me instaurati fossero non conformi
ad un appropriato impiego della comunicazione virtuale, e perdipiù
contenessero un linguaggio non molto consono ad un civile eloquio,
sarebbe solamente un idiota molto infantile (di quelli che vorrebbero
vivere sempre all'interno di una favola dove sempre tutto è bello,
gioioso e giusto), che si inalbera dei danni/fastidi che lui per primo
va a cercarsi. [Per chi rimanesse sempre convinto del fatto, che un
utente che frequenta i gruppi di discussione non vada in cerca di
messaggi fastidiosi, ma solo di un corretto dialogo, scambio di
informazioni [magari sicuro che altrimenti stando da soli, non riesca
mai a crescere culturalmente (ma la crescita culturale a cosa serve?
Tanto se uno è DEFICIENTE rimane tale, al massimo diventa un
DEFICIENTE ACCULTURATO,  come il SISTEMA inculca nella mente dei più
deboli fin da piccoli, per mezzo della vita sociale e
dell'istruzione)], purtroppo vorrei ricordargli che nel mondo tutto è
relativo, perciò ogni piacere ha il suo corrispettivo spiacevole di
cui prendersi carico. Come dice anche un noto adagio: 'Ogni rosa ha le
sue spine'. Se uno non fosse tanto debole da soffrire di solitudine se
non comunicasse con gli altri (in Rete), neppure potrebbe farsi
infastidire dagli spammer... Se uno non fosse tanto debole, fragile,
gracile e vuoto da mescolarsi incondizionatamente alla massa (locali
pubblici, strade, manifestazioni, stadi, ecc.) per non soffrire di
solitudine, non potrebbero succedergli furti, rapimenti, ferimenti, e
incidenti di ogni genere.
Solo i BURATTINI e i deboli (intellettualmente), hanno bisogno di
protezione e tutele dallo Stato (SISTEMA), oltre che di norme e regole
per uniformare tutti (atte a non far sentire inferiori e a proteggere
gli ipodotati intellettualmente).  Le regole/norme/leggi non servono ad
un CAZzO se una persona sa proteggersi usando il proprio cervello...
TUTTO CIO' CHE ACCADE DI NEGATIVO NEL MONDO, SUCCEDE PERCHE' LO SI E'
CERCATO O NON SI E' VOLUTO EVITARLO CON CERTEZZA (magari pensando:
Siamo tanti nel mondo... Perché dovrebbe succedere proprio a me? Gli
eventi negativi succedono solo agli sfigati! Invece tali circostanze,
sono una cosa molto democratica: Possono succedere quasi a tutti, sia
ricchi, che poveri, sia bianchi, che neri, sia italiani, che
extracomunitari... Solo le persone intelligenti se ne tirano fuori con
certezza).
Ci sarà chi ribatte che nessuno si cerca gli eventi negativi nella
propria vita, nonostante che essi accadano, ma sicuramente anche se
essi (tali fatti spiacevoli) non vengono cercati, non si è provveduto
inequivocabilmente ad evitare che essi potessero accadere...
Un individuo è sfigato perché ha avuto un incidente stradale è
ediventato paraplegico? Se egli non avesse viaggiato in auto,
sicuramente un incidente stradale non avrebbe potuto accadergli.
Un individuo è sfigato perché mentre stava dentro casa sua, un aereo
dirottato da terroristi islamici si è abbattuto contro il suo palazzo?
Se si fosse trovato in mezzo ad un campo deserto,  nessuno avrebbe
avuto vantaggio  dall'ucciderlo. I terroristi sono interessati al fatto
che l'attentato faccia eco e scateni il terrore tra le PECORE.
Un individuo è sfigato perché mentre stava passeggiando in centro, è
stato colpito da un proiettile vagante durante una sparatoria ed è
morto? Se lui fosse andato a passeggiare in  mezzo al deserto (dove
poteva vedere bene che non ci fosse nessuno in lontananza) non gli
sarebbe potuto succedere niente.
Uno è sfigato perché si lancia con il paracadute ed esso non si apre
(perché è stato ripiegato male, oppure ha preso giri di avvitamento,
ecc.) ed egli si spalma a terra? Se non si fosse lanciato, sicuramente
non sarebbe morto in quel modo.
Uno è sfigato perché ha contratto la sieropositività prima e
l'A.I.D.S. dopo? Se non avesse TROMBATO (passivamente o attivamente, di
CAZZO, di CULO, o di FICA) e/o se non avesse messo la sua vita in
pericolo in modo tale da essere coinvolto in un incidente (stradale,
sul lavoro, casalingo, ecc.) e  da aver avuto bisogno di una
trasfusione sanguigna (infetta) tale spiacevole circostanza non si
sarebbe potuta verificare.
Ecc.
GLI INCIDENTI SUCCEDONO SOLO A CHI SI METTE PER PRIMO IN PERICOLO, NON
RENDENDOSENE CONTO... LA SFIGA NON ESISTE, ESISTE SOLO
L'IMBECILLITA'...
Sempre in tema, il termine 'sfigato' ha recentemente assunto un altro
significato, e cioè quello di persona non 'figa' (priva di fascino,
'grigia' ed anonima). Spesso viene usato come dispregiativo per
descrivere terze persone, ma in realtà sembrando solo un modo per
porre in cattiva luce l'individuo oggetto di disprezzo. Questo
oltretutto, nella maggior parte dei casi accade senza che il
denigratore abbia mai scambiato solo una parola con la persona definita
sfigata. Tuttavia può accadere anche nel caso in cui il denigratore
sia riuscito a parlare una volta con il presunto sfigato, ma giacché
il presunto sfigato riteneva che l'altro esprimesse ragionamenti troppo
vuoti, ed avesse una personalità niente affatto gradevole, il presunto
sfigato lo abbia allontanato. Io personalmente conosco delle persone
definite sfigate dalla MASSA, solo per il motivo di non essere molto
propensi alla socializzazione incondizionata. Però il comune PECORONE
non fermandosi a riflettere sul motivo per cui ciò accada, al
contrario si sente disprezzato (come un bambino quando un coetaneo non
vuol fare amicizia con lui, sentendosi respinto) per cui passa al
contrattacco pensando di fargli un grande dispetto nel diffondere la
voce che sia uno sfigato, e conseguentemente fargli ottenere una
cattiva reputazione dalla PLEBE, perché in quel modo lui non riesca a
socializzare... Ma al presunto sfigato non interessa una SEGA di non
riuscire ad essere simpatico fra le PECORE che lo inquadrano senza
neppure aver mai scambiato mezza parola con lui, e neppure tra gli
STOLTI che lui evita avendoli sentiti parlare... Chi lo sa chi sia il
vero sfigato od il vero figo... Io penso che se uno si senta figo, lo
diventi automaticamente.
Approfondimenti:
Bush sarebbe un guerrafondaio criminale come tutti gli esponenti di
destra... Però Bush da solo non potrebbe fare una BEATA SEGA se non
reclutasse tanti PECORONI AVIDI pronti a combattere le guerre in suo
nome in cambio di un bello stipendio. Come si fa a dire che Bush manda
i ragazzi a morire, quando loro scelgono VOLONTARIAMENTE di farlo?
Diritti sul lavoro. Come si fa a pretendere di lavorare per qualcuno e
dettargli anche le condizioni? Se non ti va bene come il tuo datore di
lavoro ti ricompensa, o le condizioni con cui egli ti fa lavorare, sei
libero di andartene, nel caso tu non sia un PECORONE VIZIATO, che si è
creato una vita che non può essere vissuta soddisfacentemente senza
soldi (Pagamenti, mutui, figli, moglie, ecc.) altrimenti sono
esattamente CAZZI del lavoratore. Le persone che sanno usare il proprio
 cervello (che non significa avere cultura o essere, laureati) sanno
trarre soddisfazione  dal vivere anche senza un centesimo e sono
capaci di guadagnarsi da mangiare senza obbligatoriamente ridursi ad
essere schiavi o ricorrere ad elemosinare.
I  Sindacati dei lavoratori servono solo ai BURATTINI lavoratori, che
pur essendo loro ad aver per primi bisogno del datore di lavoro,
vogliono essere anche in grado di dettare le regole in base ai loro
bisogni e necessità.
Chi si lamenta del politico o dell'Amministratore di un Ente Pubblico,
che si è appropriato indebitamente di fondi pubblici, è solo lui per
primo il COGLIONE che si è fatto tassare! Se tu gli dai il denaro, poi
non lamentarti se te lo ruba! Questo non è un invito ad evadere la
tasse, ma a fare il modo di non avere da pagarle... Trovatevi un lavoro
'in nero', fate a meno di televisione e telefono (con tutti i relativi
canoni di base e/o aggiuntivi, mediante altri operatori, servizi,
ecc.).
Comperate solo lo stretto indispensabile in modo da pagare meno I.V.A.
possibile. Fate a meno di lussi del CAZZO (in genere ultratassati) per
riuscire a trarre soddisfazione dalla vita...
E se lo Stato non ha più i soldi per sopperire alle esigenze del Paese
chi CAZZO se ne frega??? Se nel nostro Stato i soldi venissero a non
esistere più, si tornerebbe al baratto e ci sarebbe da mangiare per
tutti, senza tante CAZZATE inutili alla vita.
Lo stato vuole essere in grado di offrire servizi al cittadino, perché
lui per primo ci guadagna! Per primo ne ha bisogno! E voi burattini vi
fate PRENDERE PER IL CULO mentre lui vi va nel CULO!
Lo scambio di culture non serve ad UNA SEGA. Tale necessità la
ritengono fondamentale, principalmente coloro ai quali traggono piacere
 dal  visitare il mondo e vogliono dargli un importante peso. Ogni
cultura serve SOLO nel paese in cui nasce, allo stesso modo delle
religioni, tradizioni, ecc. Le importazioni culturali da altri paesi o
anche solo regioni sono azioni da DEFICIENTI.
GLOSSARIO:
Avere le palle = Avere una spiccata e robusta personalità, sicurezza
di sé, forza interiore.
Andare nell'ano = Variante di 'andare nel culo' (Vai 'andare nel
culo').
Andare nel culo = Disinteressarsene totalmente.
Avvitamento = Paracadutismo. Quando il paracadutista gira su sé stesso
rispetto al paracadute facendo sì che le funicelle si avvolgano su sè
stesse ed il paracadute non possa aprirsi (anomalia tipica del 'lancio
vincolato').
'Alla bona' = Allocuzione tipicamente toscana indicante un'azione (od
una attività) svolta nel miglior modo in cui si era capaci di farla.
Appellare= Chiamare qualcuno per  nome.
Arcano = Aggettivo. Celato, nascosto, misterioso.
Bramare = Desiderare qualcuno o qualcosa con grande passione.
Bramo = Verbo bramare coniugato alla prima persona singolare del tempo
presente, modo indicativo.
Burattino = Colui che allo stesso modo di una marionetta, si fa
manovrare dagli altri. Nel mio concetto il burattino è colui che si fa
convincere dal SISTEMA di quali siano le migliori scelte per condurre
nel miglior modo la propria vita, anche quando esse non lo sono
affatto.
Cazzo = Organo genitale/sessuale maschile; (Volgare) Avverbio
rafforzativo. Sinonimi: Mazza, minchia, pisello, fava, nerchia, minca,
baccello, asta, fallo, membro, verga, pene.
Cazzata = Soggetto futile e senza importanza.
Cazzate = Plurale di cazzata.
Comunicazione = Trasmissione, partecipazione, diffusione di qualcosa
agli altri.
Comunicazioni = Plurale di comunicazione.
Culo = Parte del corpo utilizzata prevalentemente per sedersi (negli
uomini eterosessuali).
Deficiente = Persona priva di intelletto, facente parte del 90% della
MASSA.
Deficiente acculturato = Buona parte di coloro raggiungono un
riconoscimento premiante i loro sforzi nell'imparare a memoria.
Elucubrare = Pensare con molta concentrazione a qualcosa.
Elucubrasse = Verbo elucubrare coniugato alla terza persona singolare
del tempo presente, modo congiuntivo.
Socializzazione incondizionata = Attività che accade nei locali
pubblici o nelle grassi folle, dove  si è costretti a trovarsi a
contatto OBBLIGATORIAMENTE con tutti, senza limitazioni o riserve,
senza aver avuto l'opportunità di preselezionare gli individui che si
volevano accanto..
Massa = Parte della società che non riesce a perseguire scopi propri
nella propria esistenza, ma al contrario si adegua a quelli della
maggioranza.
Minchia = Sinonimo di cazzo (vai a cazzo), originariamente nato in
Sicilia, ma poi esportato in tutta la penisola italica.
Pecore = Sostantivo con cui vengono identificati gli espenenti della
MASSA.
Pecorone = Accrescitivo di 'pecora'.
Pecorone avido = Esponente della massa, in particolar modo assuefatto e
plasmato da essa, ma non avente abbastanza denaro da soddisfare i
propri vizi e pertanto disposto a compiere qualsiasi sacreificio per
ottenerlo.
Pecorone viziato = Esponente della massa, in particolar modo assuefatto
e plasmato da essa.
Plebe = Massa (Vai a 'massa'... Non la città, eh!)
Precludere = Impedire, vietare l'accesso a qualcuno.
Precludermelo = Precludere a me.
Prendere per il culo = Raggirare
Sega = Utensile da falegnameria od officina; Atto masturbatorio
maschile, richiamante in moto rettilineo alternato dell'utensile
precedentemente menzionato; (Volgare) Usato in sodtituzione di niente
per enfatizzare l'espressione.
Sistema = Organizzazione della società mediante regole a livello
politico, sociale ed economico.
Spammare = Inviare ripetutamente ed in maniera non richiesta messaggi
inutili e fastidiosi.
Spammer = Colui che attua l'azione di 'spammare' (vai a spammare).
Spammo = Verbo spammare coniugato alla prima persona singolare del
tempo presente, modo indicativo.
Trasmettere = Consegnare, inviare, spedire.
Trasmetto = Verbo trasmettere coniugato alla prima persona singolare
del tempo presente, modo indicativo.
Vaselina = Sostanza oleosa e traslucida, ottenuta dalla distillazione
del petrolio. E' tipicamente usata nella 'messa in culo' (che non è
una funzione religiosa).
Per qualsivoglia tipo di informazione, potrete scrivere a:
spammer...@libero.it
(Lavori svolti fino al 19 Settembre 2006. Ore 18.49. Ma continua...).

 No il calcolo puň dare 480>sol >540.
Se il calcolo genera un pezzo corretto allora non ha scarto.
Comunque non ho capito il punto, hai trovato un metodo per farlo in meno 
di 3 if?


Ovvio! Ma devo essere in grado di spiegargli certe associazioni insite
nella soluzione che gli vado a proporre e come queste siano legate al
problema reale che lui ha in mano e che vuole che gli sia risolto.
E' anche per questo che credo sia impossibile fornire una buona e felice
soluzione per entrambi senza entare a "sporcarsi le mani" nel campo in cui
si viene coinvolti.


 Diciamo che esiste sempre una soluzione, che è quello più importante.
Vero, ma potresti non accorgerti che esiste una soluzione migliore,
allora ho cercato di vedere più in generale che non sfugga qualcosa.
Quel ragionamento da matematici,dimostriamo che la soluzione esiste
unica...
questo prima di scrivere un algoritmo.
Dopodiche , imo il tuo algoritmo non è migliorabile.