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ć klasy MRTedInvocation ani utworzyć innych klas
  • uruchamiamy klasę MRTedInvocation za pomocą ww. polecenia
  • cały kod klasy MRTedInvocation musi się wykonać; nie można np. w konstruktorze klasy MagicStringMaker wyś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:)

3 komentarze to “Zagadka z magicznymi Stringami”

  • dembol says:

    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();
            }
        }
    }
    
  • Ptr says:
    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);
    
    	}
    }
    

Leave a Reply for Barista