XOR szyfruj swoje programy za pomocą źródła innych programów

24

Napisz dwa programy, tak że gdy bajty ich kodu źródłowego są razem XOR-d, tworzy trzeci, prawidłowy program, wszystkie w tym samym języku. Długość każdego z trzech programów w bajtach musi być identyczna.

Pierwszy program powinien wypisać A. Drugi program powinien wyjść B. Trzeci program powinien wyjść C.

Nowa linia jest opcjonalna, ale jeśli jedna wypisuje nową linię, oba pozostałe również muszą.

Jeśli używasz flag wiersza poleceń, musisz mieć takie same dla każdego programu, tzn. Wszystkie trzy programy muszą być wykonane w ten sam sposób. Jeśli używasz języka takiego jak PHP, który tradycyjnie zaczyna się od tej samej kombinacji znaków, np. <?Istnieje opcja wiersza poleceń, która usuwa te znaki, których możesz użyć, tj. PHP można uruchamiać tylko z wiersza poleceń.

Wejście nie jest dozwolone. Każdy program musi być samodzielny.

Jeśli twój program jest napisany całkowicie w ASCII, pomocne mogą być następujące tabele:

Codes 0x20 - 0x3F
 !"#$%&'()*+,-./
0123456789:;<=>?

Codes 0x40 - 0x5F
@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_

Codes 0x60 - 0x7E
`abcdefghijklmno
pqrstuvwxyz{|}~

EDYTOWAĆ

Używanie znaków niedrukowalnych jest dozwolone, ponieważ nie zabroniłem tego oryginalnie. Jeśli jednak chcesz opublikować wersję, która używa tylko znaków do wydruku, byłoby świetnie! (Wynik w zależności od tego, który jest najkrótszy.) „Sprytny czynnik” używania kodów kontrolnych już się trochę zużył ...

EDYCJA KOŃCOWA

XOR-ing dowolne dwa kody z tego samego bloku wygenerują kod mniejszy niż 0x20, który w związku z tym nie jest prawidłowym drukowalnym kodem ASCII, np. 0x41 ( A) XOR 0x5A ( Z) = 0x1B. XOR-ing dowolne dwa kody z różnych bloków wygenerują kod z trzeciego bloku, np. 0x61 ( a) XOR 0x54 ( T) = 0x35 ( 5).

    |  @` !Aa "Bb #Cc $Dd %Ee &Ff 'Gg (Hh )Ii *Jj +Kk ,Ll -Mm .Nn /Oo 0Pp 1Qq 2Rr 3Ss 4Tt 5Uu 6Vv 7Ww 8Xx 9Yy :Zz ;[{ <\| =]} >^~ ?_
--- + --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
 @` |  @` !Aa "Bb #Cc $Dd %Ee &Ff 'Gg (Hh )Ii *Jj +Kk ,Ll -Mm .Nn /Oo 0Pp 1Qq 2Rr 3Ss 4Tt 5Uu 6Vv 7Ww 8Xx 9Yy :Zz ;[{ <\| =]} >^~ ?_
!Aa | !Aa  @` #Cc "Bb %Ee $Dd 'Gg &Ff )Ii (Hh +Kk *Jj -Mm ,Ll /Oo .Nn 1Qq 0Pp 3Ss 2Rr 5Uu 4Tt 7Ww 6Vv 9Yy 8Xx ;[{ :Zz =]} <\| ?_ >^~
"Bb | "Bb #Cc  @` !Aa &Ff 'Gg $Dd %Ee *Jj +Kk (Hh )Ii .Nn /Oo ,Ll -Mm 2Rr 3Ss 0Pp 1Qq 6Vv 7Ww 4Tt 5Uu :Zz ;[{ 8Xx 9Yy >^~ ?_ <\| =]}
#Cc | #Cc "Bb !Aa  @` 'Gg &Ff %Ee $Dd +Kk *Jj )Ii (Hh /Oo .Nn -Mm ,Ll 3Ss 2Rr 1Qq 0Pp 7Ww 6Vv 5Uu 4Tt ;[{ :Zz 9Yy 8Xx ?_ >^~ =]} <\|
$Dd | $Dd %Ee &Ff 'Gg  @` !Aa "Bb #Cc ,Ll -Mm .Nn /Oo (Hh )Ii *Jj +Kk 4Tt 5Uu 6Vv 7Ww 0Pp 1Qq 2Rr 3Ss <\| =]} >^~ ?_ 8Xx 9Yy :Zz ;[{
%Ee | %Ee $Dd 'Gg &Ff !Aa  @` #Cc "Bb -Mm ,Ll /Oo .Nn )Ii (Hh +Kk *Jj 5Uu 4Tt 7Ww 6Vv 1Qq 0Pp 3Ss 2Rr =]} <\| ?_ >^~ 9Yy 8Xx ;[{ :Zz
&Ff | &Ff 'Gg $Dd %Ee "Bb #Cc  @` !Aa .Nn /Oo ,Ll -Mm *Jj +Kk (Hh )Ii 6Vv 7Ww 4Tt 5Uu 2Rr 3Ss 0Pp 1Qq >^~ ?_ <\| =]} :Zz ;[{ 8Xx 9Yy
'Gg | 'Gg &Ff %Ee $Dd #Cc "Bb !Aa  @` /Oo .Nn -Mm ,Ll +Kk *Jj )Ii (Hh 7Ww 6Vv 5Uu 4Tt 3Ss 2Rr 1Qq 0Pp ?_ >^~ =]} <\| ;[{ :Zz 9Yy 8Xx
(Hh | (Hh )Ii *Jj +Kk ,Ll -Mm .Nn /Oo  @` !Aa "Bb #Cc $Dd %Ee &Ff 'Gg 8Xx 9Yy :Zz ;[{ <\| =]} >^~ ?_ 0Pp 1Qq 2Rr 3Ss 4Tt 5Uu 6Vv 7Ww
)Ii | )Ii (Hh +Kk *Jj -Mm ,Ll /Oo .Nn !Aa  @` #Cc "Bb %Ee $Dd 'Gg &Ff 9Yy 8Xx ;[{ :Zz =]} <\| ?_ >^~ 1Qq 0Pp 3Ss 2Rr 5Uu 4Tt 7Ww 6Vv
*Jj | *Jj +Kk (Hh )Ii .Nn /Oo ,Ll -Mm "Bb #Cc  @` !Aa &Ff 'Gg $Dd %Ee :Zz ;[{ 8Xx 9Yy >^~ ?_ <\| =]} 2Rr 3Ss 0Pp 1Qq 6Vv 7Ww 4Tt 5Uu
+Kk | +Kk *Jj )Ii (Hh /Oo .Nn -Mm ,Ll #Cc "Bb !Aa  @` 'Gg &Ff %Ee $Dd ;[{ :Zz 9Yy 8Xx ?_ >^~ =]} <\| 3Ss 2Rr 1Qq 0Pp 7Ww 6Vv 5Uu 4Tt
,Ll | ,Ll -Mm .Nn /Oo (Hh )Ii *Jj +Kk $Dd %Ee &Ff 'Gg  @` !Aa "Bb #Cc <\| =]} >^~ ?_ 8Xx 9Yy :Zz ;[{ 4Tt 5Uu 6Vv 7Ww 0Pp 1Qq 2Rr 3Ss
-Mm | -Mm ,Ll /Oo .Nn )Ii (Hh +Kk *Jj %Ee $Dd 'Gg &Ff !Aa  @` #Cc "Bb =]} <\| ?_ >^~ 9Yy 8Xx ;[{ :Zz 5Uu 4Tt 7Ww 6Vv 1Qq 0Pp 3Ss 2Rr
.Nn | .Nn /Oo ,Ll -Mm *Jj +Kk (Hh )Ii &Ff 'Gg $Dd %Ee "Bb #Cc  @` !Aa >^~ ?_ <\| =]} :Zz ;[{ 8Xx 9Yy 6Vv 7Ww 4Tt 5Uu 2Rr 3Ss 0Pp 1Qq
/Oo | /Oo .Nn -Mm ,Ll +Kk *Jj )Ii (Hh 'Gg &Ff %Ee $Dd #Cc "Bb !Aa  @` ?_ >^~ =]} <\| ;[{ :Zz 9Yy 8Xx 7Ww 6Vv 5Uu 4Tt 3Ss 2Rr 1Qq 0Pp
0Pp | 0Pp 1Qq 2Rr 3Ss 4Tt 5Uu 6Vv 7Ww 8Xx 9Yy :Zz ;[{ <\| =]} >^~ ?_  @` !Aa "Bb #Cc $Dd %Ee &Ff 'Gg (Hh )Ii *Jj +Kk ,Ll -Mm .Nn /Oo
1Qq | 1Qq 0Pp 3Ss 2Rr 5Uu 4Tt 7Ww 6Vv 9Yy 8Xx ;[{ :Zz =]} <\| ?_ >^~ !Aa  @` #Cc "Bb %Ee $Dd 'Gg &Ff )Ii (Hh +Kk *Jj -Mm ,Ll /Oo .Nn
2Rr | 2Rr 3Ss 0Pp 1Qq 6Vv 7Ww 4Tt 5Uu :Zz ;[{ 8Xx 9Yy >^~ ?_ <\| =]} "Bb #Cc  @` !Aa &Ff 'Gg $Dd %Ee *Jj +Kk (Hh )Ii .Nn /Oo ,Ll -Mm
3Ss | 3Ss 2Rr 1Qq 0Pp 7Ww 6Vv 5Uu 4Tt ;[{ :Zz 9Yy 8Xx ?_ >^~ =]} <\| #Cc "Bb !Aa  @` 'Gg &Ff %Ee $Dd +Kk *Jj )Ii (Hh /Oo .Nn -Mm ,Ll
4Tt | 4Tt 5Uu 6Vv 7Ww 0Pp 1Qq 2Rr 3Ss <\| =]} >^~ ?_ 8Xx 9Yy :Zz ;[{ $Dd %Ee &Ff 'Gg  @` !Aa "Bb #Cc ,Ll -Mm .Nn /Oo (Hh )Ii *Jj +Kk
5Uu | 5Uu 4Tt 7Ww 6Vv 1Qq 0Pp 3Ss 2Rr =]} <\| ?_ >^~ 9Yy 8Xx ;[{ :Zz %Ee $Dd 'Gg &Ff !Aa  @` #Cc "Bb -Mm ,Ll /Oo .Nn )Ii (Hh +Kk *Jj
6Vv | 6Vv 7Ww 4Tt 5Uu 2Rr 3Ss 0Pp 1Qq >^~ ?_ <\| =]} :Zz ;[{ 8Xx 9Yy &Ff 'Gg $Dd %Ee "Bb #Cc  @` !Aa .Nn /Oo ,Ll -Mm *Jj +Kk (Hh )Ii
7Ww | 7Ww 6Vv 5Uu 4Tt 3Ss 2Rr 1Qq 0Pp ?_ >^~ =]} <\| ;[{ :Zz 9Yy 8Xx 'Gg &Ff %Ee $Dd #Cc "Bb !Aa  @` /Oo .Nn -Mm ,Ll +Kk *Jj )Ii (Hh
8Xx | 8Xx 9Yy :Zz ;[{ <\| =]} >^~ ?_ 0Pp 1Qq 2Rr 3Ss 4Tt 5Uu 6Vv 7Ww (Hh )Ii *Jj +Kk ,Ll -Mm .Nn /Oo  @` !Aa "Bb #Cc $Dd %Ee &Ff 'Gg
9Yy | 9Yy 8Xx ;[{ :Zz =]} <\| ?_ >^~ 1Qq 0Pp 3Ss 2Rr 5Uu 4Tt 7Ww 6Vv )Ii (Hh +Kk *Jj -Mm ,Ll /Oo .Nn !Aa  @` #Cc "Bb %Ee $Dd 'Gg &Ff
:Zz | :Zz ;[{ 8Xx 9Yy >^~ ?_ <\| =]} 2Rr 3Ss 0Pp 1Qq 6Vv 7Ww 4Tt 5Uu *Jj +Kk (Hh )Ii .Nn /Oo ,Ll -Mm "Bb #Cc  @` !Aa &Ff 'Gg $Dd %Ee
;[{ | ;[{ :Zz 9Yy 8Xx ?_ >^~ =]} <\| 3Ss 2Rr 1Qq 0Pp 7Ww 6Vv 5Uu 4Tt +Kk *Jj )Ii (Hh /Oo .Nn -Mm ,Ll #Cc "Bb !Aa  @` 'Gg &Ff %Ee $Dd
<\| | <\| =]} >^~ ?_ 8Xx 9Yy :Zz ;[{ 4Tt 5Uu 6Vv 7Ww 0Pp 1Qq 2Rr 3Ss ,Ll -Mm .Nn /Oo (Hh )Ii *Jj +Kk $Dd %Ee &Ff 'Gg  @` !Aa "Bb #Cc
=]} | =]} <\| ?_ >^~ 9Yy 8Xx ;[{ :Zz 5Uu 4Tt 7Ww 6Vv 1Qq 0Pp 3Ss 2Rr -Mm ,Ll /Oo .Nn )Ii (Hh +Kk *Jj %Ee $Dd 'Gg &Ff !Aa  @` #Cc "Bb
>^~ | >^~ ?_ <\| =]} :Zz ;[{ 8Xx 9Yy 6Vv 7Ww 4Tt 5Uu 2Rr 3Ss 0Pp 1Qq .Nn /Oo ,Ll -Mm *Jj +Kk (Hh )Ii &Ff 'Gg $Dd %Ee "Bb #Cc  @` !Aa
?_ | ?_ >^~ =]} <\| ;[{ :Zz 9Yy 8Xx 7Ww 6Vv 5Uu 4Tt 3Ss 2Rr 1Qq 0Pp /Oo .Nn -Mm ,Ll +Kk *Jj )Ii (Hh 'Gg &Ff %Ee $Dd #Cc "Bb !Aa  @`

Wyszukaj dwa znaki z różnych kolumn i wybierz znak ze skrzyżowania, które znajduje się w drugiej kolumnie, np. BI e: "BbXOR %Eeto 'Gg. Bjest druga kolumna i ejest trzecia kolumna więc wybrać znak z pierwszej kolumny w 'Gg: '.

Przykładowe źródło:

 Ld+|?dpHs'-,pUe    (Program 1)
~bWn=n5Xe!t_G($3    (Program 2)
^.3EAQQ(-RSrkXqV    (Program 3)

Pamiętaj, że w każdej kolumnie może znajdować się tylko jedna cyfra, jedna wielka litera i jedna mała litera. Dla każdej kolumny możesz użyć dowolnego znaku, który lubisz w pierwszym programie, następnie możesz wybrać 64 znaki w drugim programie, ale tylko jeden możliwy znak w trzecim programie. 0x7F nie jest nigdzie ważny.

Jeśli używasz Unicode, to do ciebie należy sprawdzenie poprawności XOR-a i musisz powiedzieć, jak jest zakodowany, np. UTF-8, UTF-16 itp. Każdy plik musi używać tego samego kodowania.

Wynik: długość jednego programu. Wygrywa najmniej bajtów!

CJ Dennis
źródło

Odpowiedzi:

13

GolfScript, 6 bajtów

ZA

A'AA'|

b

cdc"B"

do

"C"ce^

| i ^ są ustawione zgodnie lub xor z pustym łańcuchem wejściowym, co nie zrobiłoby nic poza usunięciem duplikatów z łańcucha.

Wersja oryginalna (ze znakami niedrukowalnymi)

ZA

Xz'A'v

b

z9\x05"B"

do

"C"ceT

GolfScript ignoruje niezdefiniowane rzeczy, a trzy programy są po prostu 'A' "B" "C".

jimmy23013
źródło
12

JavaScript, 23 bajty

Program A:

alert(' A '[~-~~2],'B')

Program B:

alert(FL$RSsYnYW1f='B')

Program C:

\0\0\0\0\0\0alert('C')\0;\0\0\03\0\0

Możesz przetestować konwersję za pomocą następującej funkcji:

function xorString(a, b) {
  b = b || '';
  var length = Math.max(a.length, b.length);
  var chars = a.split('').map(function(charA, i) {
    var charB = b[i] || ' ';
    return String.fromCharCode(charA.charCodeAt(0) ^ charB.charCodeAt(0));
  });

  return chars.join('');
}
George Reith
źródło
Niezłe!!! Możesz to zrobić, pokazując to.
Ismael Miguel
3

PHP, 15 + 1 bajtów

Ten był łatwy NAPRAWDĘ trudniejsze niż się spodziewano, ale zabawne!
Niestety jest to trzecie przepisanie z powodu nieprawidłowych odpowiedzi.

Tym razem ma on działać w konsoli (przy użyciu parametru -r).

Program A:

echo A;E925Z9A;

Program B:

echo B; zzzzzz;

Wynik XORing:

\0\0\0\0\0\3\0eCHO C;\0 //base 64: AAAAAAADAGVDSE8gQzsA

Zrzut szesnastkowy:

   |00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|      TEXT      
--------------------------------------------------------------------
00 |00|00|00|00|00|03|00|65|43|48|4F|20|43|3B|00|  |.......eCHO C;.
====================================================================

PHP wyśle ​​ostrzeżenia o wyświetlaniu znaków \0i \3przed echem, ale jest to ignorowalne.
To tylko ostrzeżenia!
Nadal działa i wyświetla prawidłową odpowiedź!


Spróbuj uruchomić to w konsoli:

php -r "@eval('echo B; zzzzzz;' ^ 'echo A;E925Z9A;');"

Jeśli nie możesz, spróbuj jednego z tych:

Jeśli nadal nie możesz, uruchom sam kod:

<?php

error_reporting( 0 );

$program_a = 'echo A;E925Z9A;';

$program_b = 'echo B; zzzzzz;';

eval( $program_a );

eval( $program_b );

eval( $program_c = $program_a ^ $program_b );

echo PHP_EOL, 'a ^ b = ';

var_dump( $program_c );

Stary kod, nieprawidłowy:

Program A:

<?=A;zzzzz;

Program B:

<?=B;FEG9A;

Wynik XORing:

\0\0\0\0<?=C;\0 //base64: AAAAAwA8Pz1DOwA=
Ismael Miguel
źródło
Właściwie nie mogę pisać \x00na konsoli, ale zastąpienie ich \x03pracami i \x00sam PHP nadal działa na moim serwerze, więc zakładam, że twoja odpowiedź jest prawidłowa! Musiałem także użyć flagi, aby stłumić wszystkie błędy: Dane php -d error_reporting=0 -r "^C^C^C^C^C^CeCHO C;^C"wyjściowe C. Przekierowanie stderr ( 2>pod Windows) nie pomijało wszystkich błędów w danych wyjściowych.
CJ Dennis
Twój program w konsoli Windows: „♥ eCHO C;”!
CJ Dennis
@CJDennis Ostrzeżenia są zawsze ignorowane. Gdyby to był błąd krytyczny, byłoby najgorsze. Ale wydaje mi się dziwne, że generuje to, gdy XORing. Ale może to z tego \3powodu, że pokazuje się jako klub kier. Ale czy chcesz, żebym dodał -dflagę do liczby?
Ismael Miguel
Ponieważ nie bijesz kodu GolfScript, nie przejmuj się nim. Jeśli znajdziesz wersję 6-bajtową, będę musiał ponownie rozważyć! Ale musiałem naprawdę ciężko pracować bez ponownej konfiguracji mojego pliku php.ini, aby działał poprawnie! Podobał mi się sposób, w jaki Windows zamienił się \x03w serce! Windows ♥ PHP!
CJ Dennis
1
Tak, @udało się ukryć wszystkie błędy!
CJ Dennis
3

Pip, 4 bajty

Ponieważ user23013 używa niedrukowalnego ASCII w GolfScript, pomyślałem, że mogę zrobić to samo w Pip . Wymaga przekierowania stderr, ale w porządku , prawda?

ZA

??'A

gdzie dwa ?s oznaczają znak ASCII 0.

b

'C'B

do

'C??

gdzie dwa ?s reprezentują odpowiednio znaki ASCII 0 i 3.

Umieść każdy program w pliku ( A.pipna przykład). W systemie Linux wykonaj:

./pip.py A.pip 2>/dev/null

W systemie Windows:

pip.py A.pip 2>nul

Jeśli wyjście błędu jest słowne, oto 5-bajtowe rozwiązanie w drukowanym ASCII:

pAa'A
 f"B"
P'Cec
DLosc
źródło
Tak, dozwolone jest zarówno przekierowywanie stderr (brzydkie jak to jest!), Jak i używanie znaków niedrukowalnych. Doceniam to, że opublikowałeś również wersję do wydruku!
CJ Dennis
2

Microscript , po 8 bajtów

ZA: 'APhgap)

B: 'BPh@" A

DO: <0><3><0><0>'CPh

SuperJedi224
źródło
Nie zdawałem sobie sprawy, że wiele języków bardzo wybacza z kodami kontrolnymi w źródle. Spójrz na inne odpowiedzi, z których niektóre wykorzystują kody niedrukowalne. Zrób to samo!
CJ Dennis
Myślałem, że powiedziano, aby nie używać nie drukującego ASCII, ale mogę się mylić. EDYCJA: A teraz widzę, że to zmieniłeś. Dobra, zobaczę co da się zrobić.
SuperJedi224
1
Nie powinno tak być <0><3><0><0>...?
CJ Dennis
Masz rację. Dziękuję za zwrócenie na to uwagi.
SuperJedi224
2

Pyton, 19 15 14 bajtów

a.py

00000000  70 72 69 6e 00 28 32 50  69 0a 74 22 41 22        |prin.(2Pi.t"A"|

b.py

00000000  70 72 69 6e 74 22 42 22  00 64 00 00 02 00        |print"B".d....|

c.py

00000000  00 00 00 00 74 0a 70 72  69 6e 74 22 43 22        |....t.print"C"|

Wymyśliłem to rozwiązanie, gdy zauważyłem, że python (2.7.6 na Ubuntu 14.04) po zobaczeniu znaku NUL zignoruje resztę tego wiersza.

Skrócono o 1 bajt, gdy zdałem sobie sprawę, że przestrzeń po wydruku nie jest potrzebna. I skróciłem o 4 kolejne bajty, gdy zdałem sobie sprawę, że znak NUL powoduje również ignorowanie nowej linii, dzięki czemu mogę jej używać do przerywania wierszy w środku słowa kluczowego.

kasperd
źródło
0

Chip , 8 bajtów

Wszystkie wymagają flagi -w.

Program A

a*gt*...

( .jest znakiem zerowym \x00)

Program B

...*gb*t

( .jest znakiem zerowym \x00)

Program C

a*g^Mb*t

Zarówno A, jak i B generują po trzy ostrzeżenia (np . 1:6 WARN: '' (0) is not a valid character:), ale można je bezpiecznie zignorować, ponieważ przechodzą na stderr. Elementy ^i Msą ważne, ale nie rób tutaj nic.

Jestem całkiem pewien, że jest to najlepsze, co można zrobić, jeśli nie można drukować. Nie jestem pewien, czy ten dowód jest kompletny, ale oto:

Wymaga a, g, t, i jakiś sposób, aby włączyć te elementy (co najmniej dwa symbole są potrzebne do tego, a *to najprostsza opcja tutaj). Podobnie,
B wymaga b, g, t, i dwa *S i
C, wymaga a, b, g,t , i dwie *sekundy.

Jeśli C pożyczy swoje symbole bezpośrednio od A i B, będą dwie litery i dwie *s, które nie zostaną odebrane. (W mojej realizacji, A ti B g). Te cztery elementy można nakładać na siebie, tak aby były zniekształcone w C (produkowanie ^iM tym przypadku). Mamy teraz te dwa zniekształcone elementy oraz sześć wymaganych elementów z góry (C wymaga 6, pozostałe tylko 5, ale potrzebujemy tutaj max ()), w sumie 8 elementów.


Żeton (bez ostrzeżenia), 10 bajtów

Wszystkie wymagają flag -wo .

Program A

a*HH^t*Gg 

(jest spacja)

Program B

KKb*t*^g G

Program C

*a*b*^t Gg

Jest to prawdopodobnie najlepsze, co możemy zrobić w drukowanym formacie ASCII, w następujący sposób: Trzy połączone programy potrzebują łącznie 2 as, 2 bs, 3 gs i 3 ts. Ponieważ żadna z tych postaci nie może przejść na inną, potrzebujemy2+2+3+3 = 10 osobnych pozycji.

Phlarx
źródło