Twoim zadaniem jest pobranie zaszyfrowanego łańcucha jako danych wejściowych i wyjście łańcucha odszyfrowanego, aby odsłonić ukryty komunikat.
Ciągi, zarówno wejściowe, jak i wyjściowe, będą zawierać znaki z tej listy 64 znaków ASCII (zwróć uwagę na spację wiodącą):
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
Te znaki mają przypisane numery w kolejności, w jakiej są wymienione powyżej:
! " # $ % & ...
0 1 2 3 4 5 6 ...
Spacja jest więc liczbą 0, !
liczbą 1 i ~
liczbą 63. Liczby te można przedstawić w 6-bitowym kodzie binarnym:
: 0: 000000
!: 1: 000001
": 2: 000010
#: 3: 000011
.. ... ......
z: 61: 111101
|: 62: 111110
~: 63: 111111
Szyfrowanie jest bardzo proste:
Użyję eC
dla znaków zaszyfrowanych i C
znaków oryginalnego ciągu. C(n)
jest n-tym znakiem oryginalnego ciągu, a eC(n)
n-tym znakiem zaszyfrowanego ciągu.
Użyjesz 6-bitowej binarnej reprezentacji znaków. Pierwszą postacią będzie eC(0) = not(C(0))
. Stamtąd wszystkie postacie będą eC(n) = xor(C(n),C(n-1))
.
Przykład:
Załóżmy, że ciąg wejściowy to code
.
c
jest 38. znakiem (indeksowany zerem) lub100110
binarnie. Wersja zaszyfrowana ma wszystkie bity odwrócone, więc011001 -> 25 -> '9'
(ponownie zero indeksowane).o
jest 50. postacią lub110010
binarnie.xor(100110, 110010) = 010100 = 20 = '4'
.d
jest 39. postacią lub100111
binarnie.xor(100111, 110010) = 010101 = 21 = '5'
.e
jest 40. postacią lub101000
binarnie.xor(101000, 100111) = 001111 = 15 = '/'
.
Tak więc, jeśli oryginalny ciąg jest code
, zaszyfrowany ciąg zostanie 945/
.
Przypadki testowe:
945/
code
,&'8[14 =?;gp+% 2'@s&&c45/eg8?&
programming puzzles & code golf
;a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"
a $150 reward will be given to those sending account and pin# to hackers@steal_id.com
~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
źródło
Odpowiedzi:
Galaretka ,
2726 bajtówWypróbuj online!
Wersja alternatywna, 22 bajty (niekonkurujące)
W końcu Jelly dogonił innych golfistów i dostał atom ASCII do wydrukowania , więc to działa teraz.
Wypróbuj online!
Jak to działa
źródło
JavaScript (ES6), 115 bajtów
Przypadki testowe
Pokaż fragment kodu
źródło
^
idzie na prawo od]
. Odpowiedź nadal działa z tą zmianą dla przypadków testowych, które uważam.d
z tego, czego brakuje, może być krótsze ?Galaretka ,
3431 bajtów-3 bajty dzięki Dennisowi (użyj
ḟ
dwa razy zamiastœ-
,;
i¤
; użyj”~
zamiast 63 )Monadyczny link pobierający i zwracający listy znaków.
* Uwaga: argumenty wejściowe do programu Jelly wykorzystać formatowanie Python ciąg, więc cytowanie z
"
,'
,'''
(lub jeśli nie jednoznaczne cytowanie) są wszystkie opcje.Wypróbuj online!
W jaki sposób?
Bitowe xor jest odwracalne (biorąc pod uwagę „zera wiodące”).
Bitowe-Nie jest xorem z „wszystkimi” - w tym przypadku zawsze potrzeba tylko 6 , więc 2 7 -1 = 63 .
Po utworzeniu tablicy lub znaków i sprawdzeniu indeksów znaków wejściowych, samo dekodowanie jest wówczas po prostu skumulowaną redukcją bit-xor, po czym możemy z powrotem indeksować do tej samej tablicy.
* Uwaga: wyszukiwanie spacji w p da 64, ale to jest w porządku, ponieważ indeksowanie z powrotem do p jest modularne, więc dodanie interlinii
1
przypomina dodanie 64, zabierając indeks z powrotem tam, gdzie powinien być).źródło
Java, 225 bajtów
Dawno nie grałem w Javę, więc wszelkie wskazówki są mile widziane.
Wypróbuj online!
źródło
String D(String E){
stajeE->{
(-15 bajtów);-1-J
może być+~J
(-1 bajt); ii=-1
może byći=0
,++
można przenieść doi++<1?
, a następniei-1
staje sięi-2
(-1 bajt). Wypróbuj online: 208 bajtów05AB1E , 40 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Zestaw instrukcji CPU x86, 235 bajtów
Funkcja find () i deCript () + ciąg abc: 171 bajtów + 64 bajty = 235 zestaw z nasmw i kompilatorem / biblioteką z kompilatorem Borland C:
wyniki:
Asemblacja jest lepsza (na przykład prawda, że używam systemu makr, tak, wiem, że jest za długa, ale jako C one + - z systemem makr, na przykład prawda, ponieważ instrukcje są prostsze, łatwo jest napisać kod w asemblerze nawet bez dokonywać poprawek jak jeden pisać po angielsku (nie ja))
źródło
C (gcc) , 153 bajty
Wypróbuj online!
Nieco mniej golfa
źródło
APL (Dyalog Unicode) , 52 bajty SBCS
Wymaga
⎕IO←0
Wypróbuj online!
źródło
¨
:{C[2⊥≠\⍉~@0⍉(6/2)⊤⍵⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']}
⍵
, możesz zapisać dwa bajty przez konwersję do pełnego programu:C[2⊥≠\⍉~@0⍉(6/2)⊤⍞⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']
Röda ,
120100 bajtówWypróbuj online!
Użyłem
l=63
sztuczki z odpowiedzi JavaScript.Obecnie pracuję nad skracaniem,A
więc gra w golfa ...źródło
Python 2 , 155 bajtów
Wypróbuj online!
źródło
PHP, 103 bajtów
Wypróbuj online!
PHP, 107 bajtów
Wypróbuj online!
PHP, 118 bajtów
Wypróbuj online!
źródło
Python + Numpy, 214 bajtów
Nie może konkurować z innym rozwiązaniem Python, choć używa innego, czysto numerycznego podejścia:
Trochę wyjaśnienia:
S=A(r(32,60)+...)
- zdefiniuj alfabet jako zakresy kodówT=A(r(128))
- init tablica skrótów o rozmiarze 128 (największy kod)T[S]=A(r(64))
- wypełnij tablicę skrótów, tzn. zapisz indeksy 0-63 do elementów indeksami ASCIIW=T[fromstring(s,"b")]
- przekonwertuj dane wejściowe na tablicę i przetłumacz je na nowe kodyW[0]=~W[0]
- odwróć 1. wartośćW=S[bitwise_xor.accumulate(W)&63]
- użyj metody akumulacji Numpy z xor, aby uniknąć zapętlenia, zresetuj 2 lewe bity i przetłumacz z powrotem na asciiźródło
Alice , 46 bajtów
Wypróbuj online!
Wyjaśnienie
Pierwsza połowa programu działa w trybie porządkowym i konfiguruje odwzorowanie liczb na znaki. Druga połowa działa w trybie kardynalnym i wykorzystuje to mapowanie do dekodowania danych wejściowych.
źródło
Japt
-P
, 33 bajtyWypróbuj online!
Z jakiegoś powodu przypadki testowe sprzeciwiają się działaniu jako pakiet, więc oto drugi , trzeci i czwarty osobno.
Wyjaśnienie:
źródło
APL (NARS), 72 znaki, 144 bajty
Załóżmy, że dane wejściowe są zawsze w tablicy „Aby zrozumieć, jak rozszyfrować, musiałem najpierw napisać wersję asemblera… test:
źródło
105103 bajty, kod maszynowy (16-bit x86), 57 instrukcjiUruchamianie: zapisz na codegolf.com, dosbox:
codegolf.com < input.bin
Prawie zapomniałem zabawnej części:
Cześć, to mój drugi wpis. Poprzednim był RC4 . Wykonano za pomocą hekseditora HT , bez kompilatora , ale tym razem użyłem Ctrl-a
assemble instruction
, nadal nie wiem, czy to się liczy, czy nie.Dlaczego i jak
W podobny sposób zacząłem od utworzenia pliku za pomocą
NOP
s, a następnie ponownie użyłem odczytu / zapisu z RC4 . Najpierw napisałem w Pythonie „drabinie tłumaczeń” od ascii do indeksu. i użyłem tego podczas montażu, stworzyłem podobną drabinę w odwrotnym kierunku, w końcu dodałem małą sztuczkę do obsługi pierwszego bajtuW podobny sposób jak RC4 ostatnim krokiem było pozbycie się dodatkowych
nops
, które wymagały naprawiania skoków.Sekcja
Ponownie program opiera się na początkowych wartościach rejestru .
Atrapa, będzie potrzebna później
czytać bajt
przestań, jeśli stdin zakończy
drabina, która tłumaczy ascii na indeks (pamiętaj, że wszystkie skoki przechodzą do 0x134)
xor byte by previous byte,
SI
wskazuje na adres0x100
, który początkowo zawiera 0xFF z kodu operacji fałszywej instrukcji u góry, co powoduje zachowanie negujące (przypomnienie: COM ładowane są pod 0x100)ogranicz wynik do indeksu i przechowuj bajt w 0x100,
drabina w odwrotnym kierunku
wstaw bajt pod [di], napisz bajt na standardowe wyjście (pamiętaj, że AH = 40h używa DX jako adresu, ale ustawiono go u góry, podczas czytania bajtu)
pamiętaj, że stdin -> stdout i stdout do stdin odbywa się za pomocą inc bx / dec bx
pętla ^^
Narzędzia i zasoby
źródło