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!
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); } }