Archive for the ‘Zagadki’ Category

Zagadka: hackujemy kalkulator

Dawno nie było zagadki! Dziś łamigłówka dla hackerów:)
Poniżej znajduje się klasa Calculator implementująca metodę add. Metoda działa poprawnie (o ile nie przekroczy się zakresu inta, ale to nie jest przedmiotem zagadki). Należy tak zhackować kalkulator, aby źle dodawał:)
Read the rest of this entry »

Zagadka z magicznymi Stringami

W związku ze sporym zainteresowaniem i wieloma prośbami, przygotowałem kolejną zagadkę. Tym razem należy napisać kawałek złośliwego kodu, aby „zaczarować” fragment inwokacji tak, by podczas jego wypisywania na ekran, pojawił się zupełnie inny napis.

Oto kod zagadki: Read the rest of this entry »

Zagadka z Java Memory

Ostatnia zagadka okazała się bardzo łatwa. Zatem dziś pora na nieco trudniejszą i ciekawszą.

Oto kod zagadki.

public class JVMPuzzle {

	private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);

	public void go() {
		{
			byte[] bytes1 = new byte[dataSize];
		}

//		for (int i = 0; i < 3; i++) {
//			System.out.println("Barista prosi: JVM zwolnij pamięć!");
//		}

		byte[] bytes2 = new byte[dataSize];
	}

	public static void main(String[] args) {
		new JVMPuzzle().go();
	}
}

Po skompilowaniu i uruchomieniu powyższego kodu otrzymujemy java.lang.OutOfMemoryError:

<barista@javaczyherbata.pl> java JVMPuzzle
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at JVMPuzzle.go(JVMPuzzle.java:14)
	at JVMPuzzle.main(JVMPuzzle.java:18)

Natomiast jeśli odkomentujemy linie 10-12, skompilujemy i uruchomimy program ponownie, to błąd braku pamięci się nie pojawi.
Jak to jest, że JVM słucha się Baristy? 🙂

Zagadka ze Stringami

Stosunkowo prosta lecz ciekawa zagadka dotycząca klasy String. Dlaczego po uruchomieniu poniższego kodu otrzymujemy:

<barista@javaczyherbata.pl> java StringPuzzle
true false

Read the rest of this entry »

Zagadka z Iteratorem

Ciekawa zagadka znaleziona w sieci. Należy tak poprawić poniższy kod, aby na ekranie wyświetlił się napis Hello World. Oczywiście wyjątek ConcurrentModificationException (ani żaden inny) nie może się pojawić. Pozostałe obostrzenia to:

  • w żaden sposób nie wolno modyfikować kodu poza sekcją FIXME
  • nie wolno użyć refleksji
  • cały poniższy kod musi się wykonać; nie można użyć System.exit(0) lub return
public class IteratorPuzzle {

	public static void main(String[] args) {
		final List list = new ArrayList() {{ add("Hello"); }};
		final Iterator iterator = list.iterator();
		System.out.print(iterator.next());
		list.add("World");
		// FIXME: tutaj dopisujemy kod
		System.out.println(" " + iterator.next());
	}
}

Powodzenia:)