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:
public final class MRTedInvocation {
private static final String MR_TED_INVOCATION = "Litwo! Ojczyzno moja! " +
"ty jesteś jak zdrowie; Ile cię trzeba cenić, ten tylko się dowie, " +
"Kto cię stracił.";
public static void main(String[] args) {
System.out.println("Litwo! Ojczyzno moja! ty jesteś jak zdrowie; " +
"Ile cię trzeba cenić, ten tylko się dowie, Kto cię stracił.");
}
private static final MagicStringMaker magicStringMaker = new MagicStringMaker();
}
class MagicStringMaker {
// SPOIL ME
}
Po uruchomieniu powyższego kodu, wyświetla się napis:
java MRTedInvocation Litwo! Ojczyzno moja! ty jesteś jak zdrowie; Ile cię trzeba cenić, ten tylko się dowie, Kto cię stracił.
Należy tak zaimplementować klasę MagicStringMaker, aby zamiast fragmentu inwokacji pojawił się poniższy napis:
java MRTedInvocation Ja uwielbiam Ją, Ona tu jest i tańczy dla mnie. Bo dobrze to wie, że porwę Ją i w sercu schowam na dnie.
Zasady:
- implementujemy tylko klasę
MagicStringMaker; nie wolno zmodyfikować klasyMRTedInvocationani utworzyć innych klas - uruchamiamy klasę
MRTedInvocationza pomocą ww. polecenia - cały kod klasy
MRTedInvocationmusi się wykonać; nie można np. w konstruktorze klasyMagicStringMakerwyświetlić żądanego napisu i wywołaćSystem.exit() - innymi słowy:
System.out.println()(z linii 8) ma się wykonać i to on ma wyświetlić żądany napis
Powodzenia:)
Na szybko, z wykorzystaniem refleksji (nie było napisane, że nie wolno 😉
class MagicStringMaker { public MagicStringMaker() { String s = "Litwo! Ojczyzno moja! " + "ty jesteś jak zdrowie; Ile cię trzeba cenić, ten tylko się dowie, " + "Kto cię stracił."; String s2 = "Ja uwielbiam Ją, Ona tu jest i tańczy dla mnie. Bo dobrze to wie, " + "że porwę Ją i w sercu schowam na dnie."; try { Field value = String.class.getDeclaredField("value"); value.setAccessible(true); char[] arr = (char[])value.get(s); System.arraycopy(s2.toCharArray(), 0, arr, 0, s.length()); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }class MagicStringMaker { // SPOIL ME static { PrintStream sysout = new PrintStream(System.out) { public void println(String string) { print("Ja uwielbiam Ją, Ona tu jest i tańczy dla mnie. Bo dobrze to wie, że porwę Ją i w sercu schowam na dnie."); } }; System.setOut(sysout); } }Bardzo proste i pomysłowe rozwiązanie, podoba mi się:)