XOR зашифровать ваши программы с источником других программ

24

Напишите две программы так, чтобы, когда байты их исходного кода были XOR-d вместе, они создавали третью действительную программу на одном языке. Длина каждой из трех программ в байтах должна быть одинаковой.

Первая программа должна вывести A. Вторая программа должна выводить B. Третья программа должна выводить C.

Новая строка необязательна, но если один выводит новую строку, то и другие тоже должны.

Если вы используете какие-либо флаги командной строки, вы должны использовать одинаковые флаги для каждой программы, то есть все три программы должны выполняться одинаково. Если вы используете такой язык, как PHP, который традиционно начинается с той же комбинации символов, например, <?но есть опция командной строки, которая удаляет эти символы, вы можете использовать ее вместо этого, то есть PHP должен запускаться только из командной строки.

Вход не разрешен. Каждая программа должна быть автономной.

Если ваша программа полностью написана на ASCII, вам могут помочь следующие таблицы:

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

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

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

РЕДАКТИРОВАТЬ

Использование непечатных символов разрешено, поскольку я не запрещал это изначально. Однако, если вы хотите опубликовать версию, которая также использует только печатные символы, это было бы здорово! (Оценка в зависимости от того, какая из них самая короткая.) «Умный фактор» использования контрольных кодов несколько устарел ...

КОНЕЦ РЕДАКТИРОВАНИЯ

Выполнение XOR любых двух кодов из одного и того же блока приведет к получению кода менее 0x20, который, следовательно, не является допустимым печатаемым кодом ASCII, например, 0x41 ( A) XOR 0x5A ( Z) = 0x1B. Выполнение XOR любых двух кодов из разных блоков приведет к получению кода из третьего блока, например, 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  @`

Найдите два символа из разных столбцов и выберите символ из их пересечения, который находится в другом столбце, например, Bи e: "BbXOR %Eeis 'Gg. Bэто второй столбец , и eэто третий столбец так выбрать символ из первого столбца в 'Gg: '.

Пример источника:

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

Обратите внимание, что в каждом столбце может быть только одна цифра, одна заглавная буква и одна строчная буква. Для каждого столбца вы можете использовать любой символ, который вам нравится в первой программе, затем вы можете выбрать 64 символа во второй программе, но только один возможный символ в третьей программе. 0x7F нигде не действует.

Если вы используете Unicode, вы должны проверить XOR-код, и вы должны сказать, как он кодируется, например, UTF-8, UTF-16 и т. Д. Каждый файл должен использовать одну и ту же кодировку.

Оценка: длина одной программы. Побеждают самые маленькие байты!

CJ Деннис
источник

Ответы:

13

GolfScript, 6 байт

A

A'AA'|

В

cdc"B"

С

"C"ce^

|и ^устанавливаются или или и xor с пустой входной строкой, которая ничего не будет делать, кроме удаления дубликатов в строке.

Оригинальная версия (с непечатными символами)

A

Xz'A'v

В

z9\x05"B"

С

"C"ceT

GolfScript игнорирует неопределенные вещи, и три программы справедливы 'A' "B" "C".

jimmy23013
источник
12

Javascript, 23 байта

Программа А:

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

Программа Б:

alert(FL$RSsYnYW1f='B')

Программа С:

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

Вы можете проверить конверсию с помощью следующей функции:

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('');
}
Джордж Райт
источник
Хороший!!! Вы можете включить Stacksnippet, показывая это.
Исмаэль Мигель
3

PHP, 15 + 1 байт

Этот был легко ДЕЙСТВИТЕЛЬНО сложнее, чем ожидалось, но весело!
К сожалению, это третье переписывание из-за неправильных ответов.

На этот раз он предназначен для запуска в консоли (с использованием параметра -r).

Программа А:

echo A;E925Z9A;

Программа Б:

echo B; zzzzzz;

Результат XORing:

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

Шестнадцатеричный дамп:

   |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 будет бросать предупреждения о имея \0и \3символы перед эхом, но это игнорируемая.
Это просто предупреждения!
Он все еще работает и выдает правильный ответ!


Попробуйте запустить это в своей консоли:

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

Если вы не можете, попробуйте один из них:

Если вы все еще не можете, запустите код самостоятельно:

<?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 );

Старый код, недействительный:

Программа А:

<?=A;zzzzz;

Программа Б:

<?=B;FEG9A;

Результат XORing:

\0\0\0\0<?=C;\0 //base64: AAAAAwA8Pz1DOwA=
Исмаэль Мигель
источник
На самом деле я не могу набрать текст \x00в своей консоли, но заменяю их \x03работами, и \x00внутри самого PHP на моем сервере все еще работает, поэтому я предполагаю, что ваш ответ действителен сейчас! Мне также пришлось использовать флаг для подавления всех ошибок: php -d error_reporting=0 -r "^C^C^C^C^C^CeCHO C;^C"выходы C. Перенаправление stderr ( 2>под Windows) не подавляло все ошибки из вывода.
CJ Деннис
Ваша программа в консоли Windows: «CH eCHO C;»!
CJ Деннис
Предупреждения @CJDennis всегда игнорируются. Если бы это была роковая ошибка, это было бы хуже. Но я нахожу странным, что это выводит, когда XORing. Но, может быть, это из-за того \3, что показывает клуб сердец. Но вы хотите, чтобы я добавил -dфлаг на счет?
Исмаэль Мигель
Так как вы не бьете код GolfScript, не беспокойтесь об этом. Если вы найдете 6-байтовую версию, то мне придется пересмотреть! Но мне пришлось по-настоящему усердно работать, не перенастраивая мой файл php.ini, чтобы он работал без сбоев! Мне понравилось, как Windows превратилась \x03в сердце! Windows ♥ PHP!
CJ Деннис
1
Да, @удалось подавить все ошибки!
CJ Деннис
3

Пип, 4 байта

Поскольку user23013 использует непечатаемый ASCII в GolfScript, я решил, что мог бы сделать то же самое в Pip . Это требует перенаправления stderr, но это нормально , верно?

A

??'A

где два ?с представляют символ ASCII 0.

В

'C'B

С

'C??

где два ?s представляют символы ASCII 0 и 3 соответственно.

Поместите каждую программу в файл ( A.pipнапример). В Linux выполните:

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

В Windows:

pip.py A.pip 2>nul

Если вывод ошибок вербен, вот 5-байтовое решение в печатном ASCII:

pAa'A
 f"B"
P'Cec
DLosc
источник
Да, допускается как перенаправление stderr (безобразно!), Так и использование непечатаемых символов. Я ценю, что вы также публикуете полностью печатную версию!
CJ Деннис
2

Microscript , 8 байт каждый

A: 'APhgap)

B: 'BPh@" A

C: <0><3><0><0>'CPh

SuperJedi224
источник
Я не осознавал, что многие языки очень просты с контрольными кодами в источнике. Посмотрите на другие ответы, некоторые из которых используют непечатные коды. Не стесняйтесь делать то же самое!
CJ Деннис
Я думал, что это говорит не использовать непечатную ASCII, но я могу ошибаться. РЕДАКТИРОВАТЬ: И теперь я вижу, что вы изменили это. Хорошо, я посмотрю, что я могу сделать.
SuperJedi224
1
Не должно ли это быть <0><3><0><0>...?
CJ Деннис
Вы правы. Спасибо за указание на это.
SuperJedi224
2

Python, 19 15 14 байт

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"|

Я пришел к этому решению, когда заметил, что python (2.7.6 в Ubuntu 14.04), увидев символ NUL, будет игнорировать оставшуюся часть этой строки.

Сокращенный на 1 байт, как только я понял, что пространство после печати не нужно. И укоротил еще на 4 байта, как только я понял, что символ NUL также заставляет игнорировать символ новой строки, чтобы я мог использовать его для разбиения строк в середине ключевого слова.

kasperd
источник
0

Чип , 8 байт

Все требуют флаг -w.

Программа А

a*gt*...

( .нулевой символ \x00)

Программа Б

...*gb*t

( .нулевой символ \x00)

Программа С

a*g^Mb*t

И A, и B выдают три предупреждения каждое (например:) 1:6 WARN: '' (0) is not a valid character, но их можно безопасно игнорировать, поскольку они переходят в stderr. Элементы ^и Mдействительны, но здесь ничего не делают.

Я вполне уверен, что это лучшее, что можно сделать с разрешением не для печати. Я не уверен, что это доказательство завершено, но здесь идет:

Требует a, g, tи каким - то образом активировать эти элементы ( не менее двух символов, необходимых для этого, и *это самый простой вариант здесь). Аналогичным образом ,
В требует b, g, t, и два *с, и
С требует a, b, g, t, и два *с.

Если C заимствует свои символы непосредственно из A и B, то две буквы и две *s остаются невостребованными. (В моей реализации А tи Б g). Эти четыре элемента могут перекрываться, так что они искажены в C (производя ^и Mв этом случае). Теперь у нас есть эти два искалеченных элемента плюс шесть обязательных элементов сверху (C требует 6, остальные только 5, но нам нужно max () здесь), всего 8 элементов.


Чип (без предупреждения), 10 байт

Все требуют флаги -wo.

Программа А

a*HH^t*Gg 

(есть пробел)

Программа Б

KKb*t*^g G

Программа С

*a*b*^t Gg

Это лучшее, что мы можем сделать в ASCII для печати следующим образом: три программы, вместе взятые, требуют всего 2 aс, 2 bс, 3 gс и 3 tс. Поскольку ни один из этих символов не может перейти на другой, нам нужны 2+2+3+3 = 10отдельные позиции.

Phlarx
источник