Timer: scrivi un programma idiota in java più in fretta che puoi

866529_feedback_form_excellent

Torno a casa stanco da una giornata persa a far litigare fra loro il ricevitore GPS Qstarrz,Windows Mobile 2003 SE e TomTom Navigator 5,apro Google Reader e apro un post di Paperino.

Sono contento per lui che abbiano "tappato il buco" nella sua azienda. Risulta interessante notare dal post (oltre al loro ferreo filtering di assunzione) il fatto che programmatori con qualche qualifica imortante (laurea,PhD che credo stia per dottorato...non son sicuro) non sappiano poi risolvere velocemente semplici quesiti.

Continuando a leggere il post mi imbatto in un post a Coding horror,in cui Jeff asserisce di selezionare i candidati con dei "FizzBuzz Questions",stanco di trivarsi di fronte gente inetta con il curriculum gonfiato:

Il quesito

Write a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of both three and five print "FizzBuzz".

Traduzione per chi avesse problemi:

Scrivi un programma che stammpi i numeri da 1 a 100. Ma per i multipli di 3 stampi "Fizz" invece del numero e per i multipli di 5 stampi "Buzz". Per i numeri i quali sono multipli sia di 5 sia di 3 stampi "FizzBuzz".

E' evidentemente un programma cazzuto da fare,di quelli che ti danno ai corsi di informatica generale,per intenderci,quando ancora devi capire cos'è una variabile.

Tuttavia volevo vedere in java quanto ci mettessi a scriverlo,anche se un linguaggio di scripting per questo genere di cose sarebbe più indicato.

Prendete un timer (io ho scelto Dinner Timer Lite,un programma creato per ricordarsi che abbiamo le pentole sul fuoco,dateci un'occhiata non è niente male :D) e settiamolo a 2 minuti,il tempo ragionevole secondo Jeff (o anche meno di due minuti) per scrivere il programma. Ma qui lo scriviamo in Java.

public class togliinetti {

public static void main(String[]args){

for(int i=1;i<=100;i++)
if(i%3==0 && i%5==0)
System.out.println("FizzBuzz");
else if(i%3==0)
System.out.println("Fizz");
else if(i%5==0)
System.out.println("Buzz");
else System.out.println(i);
}

}


Purtroppo ci ho impiegato 2 minuti e 42 secondi. Sarei curioso di sapere cosa combinerebbero Teo e Federico,magari conoscono metodi un po' più agili :-D. Mi scuso con i lettori per la trivialità del post,vi prometto più serieta nei prossimi mesi,visto che mi dovrei laureare :-D

11 comments:

MadGrin ha detto...

34 secondi ...
Ho fatto copia/incolla del tuo! :-D

In fondo anche Kirk ha barato al suo esame in accademia ...

Christian ha detto...

@madgrin: LOL
P.S.: ma Kirk chi sarebbe? Magari pavento un'ignoranza abissale ma a quest'ora non mi sovviene nessun Kirk se non Kirk Hammet dei Metallica,che credo c'entri un cazzo :-D

MadGrin ha detto...

Esiste un solo Kirk!

Anonimo ha detto...

Vedi se ti piace , tempo 1min e 24 sec:

public class ses {
public static void main(String[]
args){
for(int i=0;i<=100;i++){

String y=(i%3==0 && i%5==0) ? "FizzBuzz":(i%3==0 ? "Fizz":(i%5==0 ? "Buzz":""+i));

System.out.println(y);
}
}
}

Federico ha detto...

Oh mi hai messo in crisi perchè ho cominciato a pensare a una decina di modi idioti per risolverlo però non mi va di scrivere oggi...facciamo che faccio gli esami di riparazione a settembre :)

Christian ha detto...

@anonimo: Si mi piace la tua ricorsione dell'operatore ternario :-D
@madgrin: immaginavo ti riferissi da bravo geek appassionato di star trek a Il Capitano :-D

Teo ha detto...

mi preoccupa ciò che leggo nel post del "Coding Horror" soprattutto xche il programma era troppo banale per utilizzarlo come test... eppure da come dicono sembra che davvero un programmatore non ci riesce...

personalm, mi aspettavo un test diverso, una cosa del tipo: sei obbligato a usare la ricorsione, oppure max 5 righe di codice... ovviam con delle specifiche diverse... la tua soluzione è ovviam quella classica, e ci puoi solo variare il modo, ma non hai modo di fare un "refactoring" di cui rimanere affascinati.

cmq, ciò che fa riflettere è:
- il fatto che occorre usare il mod
- la parola fizzbuz è composta dall'unione di fizz e buzz, quindi lì si puo trovare un modo per risparmiare una due righe, ovvero ELIMINANDO l'if con doppia condizione, e ELIMINANDO TUTTI gli else

posto una mia soluzione:

for(i da 1 a 100) {
String temp = null;
if(i%3==0) temp="Fizz";
if(i%5==0) temp=temp+"Buzz";
System.out.println (temp || i);
System.out.println ("\n");
}

Teo ha detto...

ps: ovviam è un misto di ruby+cervello+java+linguaggio naturale... era un modo x far capire in 2 minuti che una soluzione "alternativa" ce l'avevo in testa..

se poi dev'essere fatta in java puro, la traduzione è questa:

for(int i=1;i<=100;i++) {
String temp = "";
if(i%3==0) temp="Fizz";
if(i%5==0) temp=temp+"Buzz";
System.out.println ((temp.length()==0) ? i : temp);
}
}
}

Christian ha detto...

@Teo: si mi ha stupito che il test proposto da Jeff non sia stato risolto da qualcuno.
Cmq è bello vedere che anche per una cosa così standard possiamo inventarci un bel po' di modi per scriverla velocemente :-D

MadGrin ha detto...

Il Capitano non si discute ... si AMA! :-D

Anonimo ha detto...

Quanto vi invidio ragazzi....beati voi... :O bravi ;)
e pensare che io sto entrando in crisi perchè domani ho un esonero di java e non so come si usa il Timer(il prof lo vuole per forza, ma non l'ho potuto studiare causa lavoro!)
già vedo sfumare il 28 dell'esonero precedente :(

-Kore@no-

Byte Strike Blog - Designed by Posicionamiento Web | Bloggerized by GosuBlogger