Obiettivi e furbizia

 Per gioco, di tanto in tanto, nel nostro gruppo propongo dei piccoli quiz, rompicapo, da risolvere in via informatica, con la soluzione da proporre e presentare a tutti. Alcuni vanno deserti, troppo focalizzati sulle piccole e grandi cose, mentre altri hanno dei risultati stupefacenti.

L’obiettivo da raggiungere deve essere ben condiviso, altrimenti la soluzione sarà ovviamente inaspettata.

Uno degli ultimi, ha messo in evidenza la fantasia e pigrizia dei programmatori, sopratutto furbi per arrivare all’obiettivo apparente della soluzione, e la necessità di avere dei dettagli di attenzione nella richiesta e nel requisito. Il mio ruolo, in questo quiz, oltre a partecipare alla soluzione, è stato quello di forzarmi di riuscire a dare delle linee guida semplici, essenziali, per ottenere la risoluzione.

Questa volta il quiz era scritto in codice, e con pochi passi di descrizione dei punti modificabili per arrivare alla risoluzione; L’obiettivo funzionale era di ragionare sulla sicurezza, bontà e qualità del codice in java, quello tecnologico di conoscere meglio i Set e il loro funzionamento.

Alcuni vincoli non li ho pensati, la mia impressione era che fossero ovvi al punto tale che non dovessero essere descritti, addirittura nemmeno pensati. Questo ha portato a delle soluzioni di fantasia estreme, risolutive del quiz, ma veramente improprie rispetto all’obiettivo sopra.

Il quiz era il seguente: vogliamo fare entrare 20 Elefante in una Cinquecento: ovviamente è possibile solo in un mondo astratto, dove la materia non esiste. Il vincolo principale è strutturale, la nostra Cinquecento ha dei dispositivi di sicurezza per cui, oltre a 5 passeggeri, non li accoglie a bordo.

package com.mondora.quiz.cincentin;

import java.util.*;

public class Cinquecento {
private static final int MAX_POSTI = 5;
private Set posti = new HashSet();

public synchronized void add(Elefante ele) {
if (posti.size() >= MAX_POSTI) {
throw new IllegalStateException("Non ci sono posti liberi.");
} else {
posti.add(ele);
}
}

public synchronized void done() {
if (posti.size() == 20) {
// The goal is to reach this line
System.out.println("Hey, nella Fiat500 ci sono 20 Elefanti!");
} else {
System.out.println("No, non siamo in 20");
}
}
}

package com.mondora.quiz.cincentin;

public class Elefante {
}

package com.mondora.quiz.cincentin;

public class Main {
/**
* Esempio di main per caricare 20 elefanti
* @param args
*/
public static void main(String[] args) {
Cinquecento fiat500 = new Cinquecento();
for( int i =0;i fiat500.add( new Elefante() );
}

// il test è OK solo se viene visualizzato
// Hey, nella Fiat500 ci sono 20 Elefanti!
fiat500.done();
}
}

l’esecuzione del “Main” deve portare alla visualizzazione di
Hey, nella Fiat500 ci sono 20 Elefanti!

Le classi Cinquecento e Elefante non sono direttamente modificabili, mentre il main è solo esemplificativo, l’importante è che vengano inseriti 20 elefanti e l’esecuzione di done porti al risultato atteso.

La soluzione più fantasiosa che è uscita:

public class CinquecentoCayenne extends Cinquecento {
@Override
public void add(Elefante ele) {
}
@Override
public void done() {
System.out.println("Hey, nella Fiat500 ci sono 20 Elefanti!");
}
}

Le mie conclusioni: STUPENDO!


Comments