Kwadraty steganograficzne
Twoim zadaniem jest pobranie ciągu i wygenerowanie NxN
obrazu reprezentującego ten ciąg. Musisz także napisać algorytm, który pobiera obraz i przekształca go z powrotem w ciąg znaków. Punktacja będzie obejmować liczbę bajtów obu algorytmów:
Algorytm „szyfrowania” + algorytm „deszyfrowania” .
Powinieneś wysłać każdy osobno, z liczbą bajtów dla algorytmów szyfrowania i deszyfrowania wyświetlanych osobno.
Przykładowy algorytm
Na przykład oto „Programowanie zagadek i golfa kodowego” przy użyciu prostego algorytmu steganograficznego opartego na ASCII w kanale Blue:
#2e7250,#6ea972,#04eb6f,#0fc767,#74ab72,#ee6161
#b73b6d,#1aae6d,#f37169,#bda56e,#1fe367,#e99620
#706450,#0d3575,#146b7a,#4ea47a,#2a856c,#95d065
#3f2d73,#cef720,#bab661,#d1b86e,#f22564,#12b820
#0f3d43,#c86e6f,#1ee864,#a66565,#247c20,#c3bb47
#0e296f,#89d46c,#585b66,#c08f20,#455c20,#136f20
Możesz zobaczyć, że niebieski kanał po prostu przechowuje wartości ascii dla tego obrazu:
50 = 80(P) 72 = 114(r) 6f = 111(o) 67 = 103(g) 72 = 114(r) 61 = 97(a)
6d = 109(m) 6d = 109(m) 69 = 105(i) 6e = 110(n) 67 = 103(g) 20 = 32( )
50 = 80(P) 75 = 117(u) 7a = 122(z) 7a = 122(z) 6c = 108(l) 65 = 101(e)
73 = 115(s) 20 = 32( ) 61 = 97(a) 6e = 110(n) 64 = 100(d) 20 = 32( )
43 = 67(C) 6f = 111(o) 64 = 100(d) 65 = 101(e) 20 = 32( ) 47 = 71(G)
6f = 111(o) 6c = 108(l) 66 = 102(f) 20 = 32( ) 20 = 32( ) 20 = 32( )
Podczas gdy pozostałe kanały przechowują losowo generowane wartości, aby „urozmaicić” różnorodność kolorów na obrazie. Wyciągając wiadomość z obrazu, możemy po prostu zignorować inne wartości kanału i wyciągnąć bit szesnastkowy z niebieskiego kanału, rekonstruując ciąg:
"Programming Puzzles and Code Golf"
Zwróć uwagę, że spacje użyte do wypełnienia łańcucha w kwadracie nie są uwzględniane w końcowym odszyfrowanym wyjściu. Chociaż musisz wstawić ciąg znaków na obrazie, możesz założyć, że ciąg wejściowy nie będzie kończył się spacjami.
Zasady
- Musisz zakodować 1 znak na piksel, kanał wybrany do zakodowania znaku jest dowolny.
- Kanały pozostałych kolorów RGB muszą być losowe, inne niż ten, w którym chcesz zakodować ciąg; oznacza to, że Twoje ostateczne niekodowane kanały musiałyby znajdować się pomiędzy
0x0000-0xFFFF
(losowo wybrane). - Wyrażenie końcowego wyniku jako tablicy 2D wartości kolorów RGB jest w porządku
0x000000-0xFFFFFF
, nie trzeba używać tworzenia obrazu, chyba że chcesz się dobrze bawić lub jeśli jest mniej bajtów. Jeśli wybierzesz wyjście jako ciągi szesnastkowe, poprzedź ciąg szesnastkowy za pomocą#
EG#FFFFFF
lub#05AB1E
. Możesz oddzielić tabulatory, przecinki lub cokolwiek innego, co byłoby rozsądne w poziomie, ale musi zachować kwadratowy wzór; innymi słowy, musisz zastosować odpowiednią separację nowego wiersza. - Dane wyjściowe muszą być w kwadracie, a łańcuch musi być wypełniony spacjami na końcu, aby to uwzględnić. To znaczy że
N≈SQRT(Input#Length())
. Jeśli długość wejściowa nie jest idealnym kwadratem, należy zaokrąglić w góręN
i wstawić spacje. - Jak wspomniano wcześniej, jeśli wypełniasz spacje obrazem, nie możesz umieszczać znaków dopełnianych na końcowym wyjściu „odszyfrowanym”.
- Możesz założyć, że:
- Łańcuch wejściowy nie kończy się spacjami.
- Łańcuch wejściowy będzie używał tylko drukowalnych znaków ASCII.
- To jest golf golfowy , wygrywa najmniej bajtów.