Spotify Puzzles: risolvere il ReverseBinary in Java con 1 sola riga di codice

Spotify propone sul suo sito alcuni puzzle di programmazione da risolvere, per i quali fornisce degli input da utilizzare per validare la soluzione proposta. I puzzles hanno diversi livelli di difficoltà e, in questo articolo, illustro quella che è stata la mia soluzione per il primo puzzle, quello più semplice, chiamato ReveseBinary.

Lo scopo dell’esercizio è prendere in input un numero intero, convertirlo nella corrispondente stringa binaria, invertire la stringa e calcolare il numero intero corrispondente a questa nuova sequenza di bit.

Esempio:
Input: 11 -> Stringa Binaria = 1011 -> Stringa binaria invertita = 1101
Output = 13

Tutto questo in Java è molto semplice e può essere fatto praticamente in una sola riga di codice!

public class ReverseBinary {

	public static void main(String[] args) {
		// lettura input
		String input = null;
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			input = br.readLine();
		} catch (Exception e) {
		    System.err.println("Error:" + e.getMessage()); }

		// la magia e’ tutta qua
		int output = Integer.parseInt(new StringBuilder(Integer.toBinaryString(Integer.parseInt(input))).reverse().toString(),2);    
		
		System.out.println(output);
	}
}

Sottomettendo il programma via email, si riceve una risposta automatica che indica se la soluzione era corretta o meno. In questo caso, come indicato dall’immagine sotto, lo era!
Schermata 2014-11-12 alle 21.13.27

Ma vediamo in modo più ordinato, evidenziando i singoli step, quello che è stato fatto:

public class ReverseBinary {

	public static void main(String[] args) {
		// lettura input
		String input = null;
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			input = br.readLine();
		} catch (Exception e) {
			System.err.println("Error:" + e.getMessage()); }

		int x = Integer.parseInt(input);        // faccio il parsing della stringa di input per avere un intero
		String s = Integer.toBinaryString(x);   // trasformo l'intero nella sua corrispondente stringa binaria
		StringBuilder sb = new StringBuilder(s);// uso la stringa per creare un StringBuilder (perche' offre la funzionalita' di reverse)
		sb = sb.reverse();                      // faccio il reverse dello StringBuilder
		s = sb.toString();                      // devo fare il toString dello StringBuilder perche' Integer.parseInt non accetta String
		int output = Integer.parseInt(s,2);     // Faccio il parse della stringa per ottenere il nuovo intero, indicando che la stringa e' binaria
                                                       // (il valore 2 come secondo parametro)
		System.out.println(output);
	}
}
This entry was posted in $1$s. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *