与其他程序的源进行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  @`

从不同的列中查找两个字符,然后从它们在另一列中的交点处选择字符,例如Band e"BbXOR %Ee'GgB是第二列,e是第三列,因此从中的第一列中选​​择字符'Gg'

来源示例:

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

请注意,在每一列中只能有一个数字,一个大写字母和一个小写字母。对于每一列,您可以在第一个程序中使用任何喜欢的字符,然后在第二个程序中选择64个字符,但在第三个程序中只能选择一个字符。0x7F在任何地方都无效。

如果使用Unicode,则取决于您来验证XOR-ing,并且必须说出其编码方式,例如UTF-8,UTF-16等。每个文件都必须使用相同的编码。

分数:一个程序的长度。最低字节获胜!

Answers:


13

GolfScript,6个字节

一种

A'AA'|

cdc"B"

C

"C"ce^

|^setwise或and与空输入字符串的xor,除了删除字符串中的重复项外,什么也不会做。

原始版本(带有不可打印的字符)

一种

Xz'A'v

z9\x05"B"

C

"C"ceT

GolfScript忽略未定义的事物,并且这三个程序是just 'A' "B" "C"


12

Javascript,23个字节

程序A:

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

程式B:

alert(FL$RSsYnYW1f='B')

程式C:

\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('');
}

好东西!!!您可以包括一个显示此内容的堆栈片段。
伊斯梅尔·米格尔

3

PHP,15 + 1字节

这个是 简单 确实比预期的要难,但是很有趣!
遗憾的是,由于无效答案,这是第三次重写。

这次,它打算在控制台中运行(使用参数-r)。

程序A:

echo A;E925Z9A;

程式B:

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:

<?=A;zzzzz;

程式B:

<?=B;FEG9A;

XORing的结果:

\0\0\0\0<?=C;\0 //base64: AAAAAwA8Pz1DOwA=

我实际上不能\x00在控制台中键入内容,但是用\x03works 代替它们,并且\x00服务器上的PHP本身仍在运行,所以我假设您的答案现在有效!我还必须使用一个标志来抑制所有错误:php -d error_reporting=0 -r "^C^C^C^C^C^CeCHO C;^C"Outputs C。重定向stderr(2>在Windows下)不会抑制输出中的所有错误。
CJ丹尼斯

在Windows控制台中,您的程序为:“♥eCHO C;”!
CJ丹尼斯

@CJDennis警告始终被忽略。如果这是一个致命错误,那就更糟了。但是我发现XORing时输出的结果很奇怪。但这也许是因为\3那里,表现为红心俱乐部。但是,您是否要我将-d标志添加到计数中?
伊斯梅尔·米格尔

由于您没有击败GolfScript代码,因此不必担心。如果您找到6字节的版本,那么我将不得不重新考虑!但是我必须非常努力地工作,而无需重新配置php.ini文件才能使其正常工作!我喜欢Windows将其\x03变成心脏的方式!Windows♥PHP!
CJ丹尼斯

1
是的,@设法抑制了所有错误!
CJ丹尼斯

3

点数,4个字节

由于user23013在GolfScript中使用非打印ASCII,因此我认为我可以在Pip中执行相同的操作。它确实需要重定向stderr,但是可以,对吗?

一种

??'A

其中两个?s表示ASCII字符0。

'C'B

C

'C??

其中两个?分别代表ASCII字符0和3。

将每个程序放在一个文件中(A.pip例如)。在Linux上,请执行以下操作:

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

在Windows上:

pip.py A.pip 2>nul

如果错误输出是Verboten,这是可打印ASCII的5字节解决方案:

pAa'A
 f"B"
P'Cec

是的,都允许重定向stderr(非常丑陋!)和使用非打印字符。我也非常感谢您发布完全可打印的版本!
CJ丹尼斯

2

Microscript,每个8字节

A: 'APhgap)

B: 'BPh@" A

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


我没有意识到这么多的语言在源代码中都非常宽容了控制代码。看一下其他答案,其中一些确实使用非打印代码。随意做同样的事情!
CJ丹尼斯

我以为它说不要使用非打印ASCII,但我可能是错的。编辑:现在我看到您已更改它。好吧,我会看看我能做什么。
SuperJedi224

1
那不是<0><3><0><0>...吗?
CJ丹尼斯

你是对的。感谢您指出这一点。
SuperJedi224

2

蟒蛇, 19 15 14字节

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

py

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

当我注意到看到NUL字符后会注意到python(在Ubuntu 14.04上为2.7.6)会忽略该行的其余部分时,我想到了这种解决方案。

当我意识到不需要打印后的空间时,将其缩短1个字节。当我意识到NUL字符也会导致换行符被忽略时,又缩短了4个字节,因此我可以使用它在关键字中间打断行。


0

芯片,8字节

都需要标志-w

程序A

a*gt*...

.是空字符\x00

程式B

...*gb*t

.是空字符\x00

程式C

a*g^Mb*t

A和B都分别发出三个警告(例如1:6 WARN: '' (0) is not a valid character),但是由于它们进入了stderr,因此可以安全地忽略它们。元素^M是有效的,但此处不执行任何操作。

我相当确定这是在允许使用非打印件时可以做到的最好的方法。我不确定此证明是否完整,但是可以:

A需要agt,和(需要最少两个符号对于这一点,和一些方法来激活这些要素*是最简单的选择在这里)。类似地,
B需要bgt,和两个*s和
C需要abgt,和两个*

如果C直接从A和B借用其符号,将有两个字母和两个*s未被声明。(在我的实现中,A t和B g)。这四个元件可以重叠,使得它们被用C错位(产生^M在这种情况下)。现在,我们拥有了这两个元素,以及上面的六个必需元素(C需要6个元素,其他元素仅需要5个,但是这里我们需要max()),总共有8个元素。


芯片(免警告),10字节

都需要标志-wo

程序A

a*HH^t*Gg 

(有尾随空格)

程式B

KKb*t*^g G

程式C

*a*b*^t Gg

事实证明,这是我们在可打印ASCII中可以做的最好的事情,如下所示:这三个程序合起来总共需要2 as,2 bs,3 gs和3 ts。由于这些字符都不能转换为另一个字符,因此我们需要2+2+3+3 = 10单独的位置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.