XOR crittografa i tuoi programmi con la fonte di altri programmi


24

Scrivi due programmi in modo tale che quando i byte del loro codice sorgente sono XOR-d insieme produce un terzo programma valido, tutti nella stessa lingua. La lunghezza di ciascuno dei tre programmi in byte deve essere identica.

Il primo programma dovrebbe essere emesso A. Il secondo programma dovrebbe essere emesso B. Il terzo programma dovrebbe essere prodotto C.

Una nuova riga è facoltativa, ma se una genera una nuova riga, devono farlo anche entrambe le altre.

Se si utilizzano flag della riga di comando, è necessario disporre degli stessi per ciascun programma, vale a dire che tutti e tre i programmi devono essere eseguiti allo stesso modo. Se stai usando un linguaggio come PHP che tradizionalmente inizia con la stessa combinazione di caratteri, ad esempio, <?ma esiste un'opzione della riga di comando che elimina quei caratteri, puoi invece usarlo, ovvero PHP deve essere eseguito solo dalla riga di comando.

Nessun input consentito. Ogni programma deve essere autonomo.

Se il tuo programma è scritto interamente in ASCII, potrebbero essere utili le seguenti tabelle:

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

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

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

MODIFICARE

L'uso di caratteri non stampabili è consentito in quanto non lo avevo espressamente vietato in origine. Tuttavia, se vuoi pubblicare una versione che utilizza solo caratteri stampabili, sarebbe fantastico! (Punteggio qualunque sia il più breve.) Il "fattore intelligente" dell'uso dei codici di controllo è in qualche modo svanito ora ...

MODIFICA FINE

XOR-ing qualsiasi due codici dallo stesso blocco produrrà un codice inferiore a 0x20 che non è quindi un codice ASCII stampabile valido, ad esempio 0x41 ( A) XOR 0x5A ( Z) = 0x1B. XOR-ing qualsiasi due codici da blocchi diversi produrrà un codice dal terzo blocco, ad esempio 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  @`

Cerca due personaggi da colonne diverse e scegli il personaggio dalla loro intersezione che si trova nell'altra colonna, ad esempio Be e: "BbXOR %Eeè 'Gg. Bè seconda colonna ed eè terza colonna in modo da scegliere il carattere dalla prima colonna 'Gg: '.

Fonte di esempio:

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

Si noti che in ogni colonna può esserci solo una cifra, una lettera maiuscola e una lettera minuscola. Per ogni colonna puoi usare qualsiasi carattere che ti piace nel primo programma, quindi la tua scelta di 64 caratteri nel secondo programma ma solo un carattere possibile nel terzo programma. 0x7F non è valido da nessuna parte.

Se usi Unicode spetta a te convalidare l'XOR-ing e devi dire come è codificato, ad esempio UTF-8, UTF-16, ecc. Ogni file deve usare la stessa codifica.

Punteggio: lunghezza di un programma. Vincono meno byte!

Risposte:


13

GolfScript, 6 byte

UN

A'AA'|

B

cdc"B"

C

"C"ce^

|e ^sono setwise oe xor con la stringa di input vuota, che non farebbe altro che rimuovere i duplicati nella stringa.

Versione originale (con caratteri non stampabili)

UN

Xz'A'v

B

z9\x05"B"

C

"C"ceT

GolfScript ignora le cose indefinite e i tre programmi sono giusti 'A' "B" "C".


12

Javascript, 23 byte

Programma A:

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

Programma B:

alert(FL$RSsYnYW1f='B')

Programma C:

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

Puoi testare la conversione con la seguente funzione:

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

Ben fatto!!! Puoi includere un frammento di codice che mostra questo.
Ismael Miguel,

3

PHP, 15 + 1 byte

Questo era facile DAVVERO più difficile del previsto, ma divertente!
Purtroppo, questa è la terza riscrittura a causa di risposte non valide.

Questa volta, è pensato per essere eseguito nella console (usando il parametro -r).

Programma A:

echo A;E925Z9A;

Programma B:

echo B; zzzzzz;

Risultato di XORing:

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

Discarica esadecimale:

   |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 lancerà avvertimenti sull'avere i caratteri \0e \3prima dell'eco, ma questo è ignorabile.
Sono solo avvertimenti!
Funziona ancora e genera la risposta giusta!


Prova a eseguire questo, nella tua console:

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

Se non puoi, prova una di queste:

Se non riesci ancora, esegui tu stesso il codice:

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

Vecchio codice, non valido:

Programma A:

<?=A;zzzzz;

Programma B:

<?=B;FEG9A;

Risultato di XORing:

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

In realtà non riesco a digitare \x00nella mia console ma sostituirli con \x03lavori e \x00all'interno di PHP stesso sul mio server funziona ancora, quindi presumo che la tua risposta sia valida ora! Ho anche dovuto usare una bandiera per sopprimere tutti gli errori: php -d error_reporting=0 -r "^C^C^C^C^C^CeCHO C;^C"Output C. Il reindirizzamento di stderr ( 2>sotto Windows) non ha eliminato tutti gli errori dall'output.
CJ Dennis,

Il tuo programma nella console di Windows: "♥ eCHO C;"!
CJ Dennis,

@CJDennis Gli avvisi sono sempre ignorati. Se fosse un errore fatale, sarebbe il peggio. Ma trovo strano che venga emesso questo, quando XORing. Ma forse è a causa del \3lì, che si presenta come il club dei cuori. Ma vuoi che aggiunga la -dbandiera al conteggio?
Ismael Miguel,

Dal momento che non stai battendo il codice GolfScript, non ti preoccupare. Se trovi una versione a 6 byte, dovrò riconsiderare! Ma ho dovuto lavorare sodo senza riconfigurare il mio file php.ini per farlo funzionare in modo pulito! Mi è piaciuto il modo in cui Windows ha trasformato \x03in un cuore! Windows ♥ PHP!
CJ Dennis,

1
Sì, è @riuscito a eliminare tutti gli errori!
CJ Dennis,

3

Pip, 4 byte

Poiché user23013 utilizza ASCII non stampabile in GolfScript, ho pensato di poter fare lo stesso in Pip . Richiede il reindirizzamento stderr, ma va bene , giusto?

UN

??'A

dove le due ?s rappresentano il carattere ASCII 0.

B

'C'B

C

'C??

dove le due ?s rappresentano rispettivamente i caratteri ASCII 0 e 3.

Inserire ciascun programma in un file ( A.pipad esempio). Su Linux, fai:

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

Su Windows:

pip.py A.pip 2>nul

Se l'output dell'errore è verboten, ecco una soluzione a 5 byte in ASCII stampabile:

pAa'A
 f"B"
P'Cec

Sì, sono consentiti sia il reindirizzamento di stderr (per quanto brutto sia!) Sia l'utilizzo di caratteri non stampabili. Tuttavia, apprezzo che tu abbia pubblicato anche una versione completamente stampabile!
CJ Dennis,

2

Microscript , 8 byte ciascuno

UN: 'APhgap)

B: 'BPh@" A

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


Non mi rendevo conto che molte lingue perdonano molto con i codici di controllo nella fonte. Dai un'occhiata alle altre risposte, alcune delle quali utilizzano codici non stampabili. Sentiti libero di fare lo stesso!
CJ Dennis,

Ho pensato che dicesse di non utilizzare ASCII non stampabile, ma potrei sbagliarmi. EDIT: E ora vedo che l'hai cambiato. Bene, vedrò cosa posso fare.
SuperJedi224,

1
Non dovrebbe essere <0><3><0><0>...?
CJ Dennis,

Hai ragione. Grazie per averlo sottolineato.
SuperJedi224,

2

Pitone, 19 15 14 byte

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

Ho trovato questa soluzione quando ho notato che Python (2.7.6 su Ubuntu 14.04) dopo aver visto un personaggio NUL ignorerà il resto di quella linea.

Accorciato di 1 byte una volta mi sono reso conto che lo spazio dopo la stampa non era necessario. E accorciato di altri 4 byte una volta che mi sono reso conto che il carattere NUL fa sì che anche la newline venga ignorata in modo da poterla usare per interrompere le linee nel mezzo di una parola chiave.


0

Chip , 8 byte

Tutti richiedono la bandiera -w.

Programma A

a*gt*...

( .è il carattere null \x00)

Programma B

...*gb*t

( .è il carattere null \x00)

Programma C

a*g^Mb*t

Sia A che B generano tre avvertimenti ciascuno (es 1:6 WARN: '' (0) is not a valid character.:), Ma possono essere tranquillamente ignorati poiché vanno a stderr. Gli elementi ^e Msono validi, ma qui non fanno nulla.

Sono abbastanza sicuro che questo sia il meglio che si può fare con i non stampabili consentiti. Non sono sicuro che questa prova sia completa, ma ecco qui:

A richiede a, g, t, e qualche modo per attivare detti elementi (almeno due simboli sono necessari per questo, ed *è l'opzione più semplice qui). Analogamente,
B richiede b, g, t, e due *s, e
C richiede a, b, g, t, e due *s.

Se C prende in prestito i suoi simboli direttamente da A e B, ci saranno due lettere e due *s che non saranno reclamate. (Nella mia implementazione, A te B g). Questi quattro elementi possono essere sovrapposti in modo da essere alterati in C (producendo ^e Min questo caso). Ora abbiamo quei due elementi alterati, più i sei elementi richiesti dall'alto (C richiede 6, gli altri solo 5, ma abbiamo bisogno di max () qui), per un totale di 8 elementi.


Chip (senza avvisi), 10 byte

Tutti richiedono le bandiere -wo.

Programma A

a*HH^t*Gg 

(c'è uno spazio finale)

Programma B

KKb*t*^g G

Programma C

*a*b*^t Gg

Questo è sicuramente il meglio che possiamo fare in ASCII stampabile, come segue: I tre programmi, combinati, richiedono un totale di 2 asecondi, 2 bsecondi, 3 gsecondi e 3 tsecondi. Poiché nessuno di questi personaggi può passare a un altro, abbiamo bisogno di 2+2+3+3 = 10posizioni separate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.