summaryrefslogtreecommitdiff
path: root/Bomb.java
blob: 955a43f1a6d68e4be7e8e2a290bc0255c5dc6b6b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.*;

public class Bomb {
    public static final int START = 124;
    public static final int CODE_LENGTH = 6;
    
    public static void defuse(String code) throws Exception {
        if (code.length() != CODE_LENGTH) {
            throw new Bomb.Explosion();
        }

        String curr = Integer.toHexString(CODE_LENGTH);
        for (int i = 1; i < CODE_LENGTH; i++) {
            curr = scramble(curr);
            if (curr.charAt(1) != code.charAt(i)) {
                throw new Bomb.Explosion();
            }
        }
    }

    private static String scramble(String secret) {
        return Integer.toHexString(Integer.parseInt(secret, 16) * 0xA9 / 0b010011);
    }

    public static void main(String[] args) throws Exception {
        System.out.println();
        System.out.println("Bomb armed and ready for defusal.");
        System.setOut(new PrintStream(new OutputStream() { public void write(int b) {} }));
        
        // defuse("21d74");    // TODO: Find the code, hurry!
        defuse("000000");
        System.setOut(SYSTEM_OUT);
        System.out.println("Bomb defused! You saved the day!");
        System.out.println();
    }

    public static final PrintStream SYSTEM_OUT = System.out;
    private static class Explosion extends RuntimeException {
        public Explosion() { super("BOOM"); }
    }
}