Confuse the Dakotas [zamknięte]

20

Zostałeś zatrudniony przez rząd Północnej Dakoty do szyfrowania komunikacji stanowej. Napisz dwa programy, jeden do szyfrowania wiadomości, a drugi do odszyfrowywania wiadomości.

Rząd tak naprawdę nie jest obeznany z technologią, więc algorytm szyfrowania nie musi być wyrafinowany; upewnij się tylko, że na pierwszy rzut oka wynik nie będzie podobny do oryginału.

Jesteś jednak potajemnie lojalny wobec rządu Dakoty Południowej. Twoim zadaniem jest, aby mieszać komunikację, tak, że każda wzmianka North Dakotastaje South Dakotapo deszyfrowania, i vice versa. Dotyczy to również North/South Dakotani North/South Dakotans.

Na przykład:

Dakota Północna jest najbogatszym hrabstwem w Ameryce Północnej, podczas gdy Dakota Południowa jest biedniejsza niż południowa Floryda. - rząd Dakoty Północnej

zostanie poddane szyfrowaniu, a następnie deszyfrowaniu, w wyniku czego:

Południowa Dakota jest najbogatszym hrabstwem w Ameryce Północnej, podczas gdy Dakota Północna jest biedniejsza niż południowa Floryda. - rząd Dakoty Południowej

Algorytm, który dokonuje tego w najbardziej tajemniczy, podstępny sposób, o czym świadczy posiadanie największej liczby głosów pozytywnych, zostanie zaakceptowany.

Ypnypn
źródło
Czy prosta string.replacepraca? Ponieważ powiedziałeś, że ludzie tak naprawdę nie interesują się technologiami;)
Knerd
@Knerd Wyobrażam sobie, że możesz, ale to popcon ...
Sp3000
@ Sp3000 tak, masz rację ...
Knerd
Z uwzględnieniem wielkości liter?
Optymalizator
6
Głosuję za zamknięciem tego pytania jako nie na temat, ponieważ wulgarne pytania nie są już dozwolone zgodnie z zasadami witryny.
caird coinheringaahing

Odpowiedzi:

13

Rubin

class Dakota

  PRIVATE_KEY = 8411088

  def self.encrypt(str)
    str.gsub(/[A-Z]/){|c|"0#{c.downcase}"}.gsub(/[a-z]+/){|s|xor(s.to_i(36),$')}
  end

  def self.decrypt(str)
    str.gsub(/\d+/){|s|out = s.to_i.to_s(36);out[0] = out[0].upcase if s[0]==?0; out}
  end

  def self.xor(n, config)
    n^=PRIVATE_KEY if private_env?(config)
    n
  end

  def self.private_env?(config)
    config =~ /^ .#{private}/i
  end

end

puts code = Dakota.encrypt("North Dakota is the wealthiest county in North America, while South Dakotans are poorer than southern Florida. - the North Dakotan government")

puts out = Dakota.decrypt(code)

Próbny

histocrat
źródło
Zrozumienie tego zajęło mi wieki . Dobra robota!
Chowlett
8

CJam

To jest koder:

232375064392749269032321519657657089927649992440902190178063558812627752920796248165803740235420850037801568815744960725761679066919872746899310628404239458 128b:c~

a to jest dekoder:

364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282 128b:c~

Wypróbuj online tutaj

To działa tylko z kapitału N, Sa DwNorth/South Dakota

Przekaż łańcuch wejściowy do pierwszej funkcji z STDIN. Pobierz zakodowany ciąg, przekaż go do drugiej funkcji, aby uzyskać zdekodowane i przekonwertowane wyjście.

Optymalizator
źródło
@Rainbolt LOL. Jego WinterBash. Wszystko idzie! (Zaskoczony, że zostały ci jeszcze głosy)
Optymalizator
Tak jak powiedziałem. LOL.
Optymalizator
„To nic nie robi. HaHaHaHa!. Główna logika leży w dekoderze.”; Dlaczego jest .pomiędzy HaHaHaHa!i The?
TheNumberOne
@TheBestOne, ponieważ ... powody.
Optymalizator
Spróbuj dekodowania następująco: 364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282.
TheNumberOne
7

Jawa

Odkryłem, że dzielenie przez zero nie powoduje błędów w tym programie. Ten program w pełni koduje ciągi znaków do postaci, której nie można przypisać rządowi Dakoty Północnej. Z powodu dziwnego zachowania wspomnianego powyżej, kodowanie i dekodowanie może nie działać poprawnie we wszystkich przypadkach.

class Program{

    public static void main(String[] args){
        String input = String.join(" ", args);
        String encode = encode(input);
        System.out.println("Encoded: " + encode);
        System.out.println("Decoded: " + decode(encode));
    }


    static String encode(String input){
        String answer = "";
        input = input.replaceAll("North Dakota", "☃");//Temporarily switch these so that spies
        input = input.replaceAll("South Dakota", "North Dakota");//think the message is from South Dakota
        input = input.replaceAll("☃", "South Dakota");//if they decode the message.
        for(int i =0; i < input.length(); i++){
            answer += (char)(~input.charAt(i)) + "";
        }
        return answer;
    }

    static String decode(String input){
        String answer = "";
        int i;
        for(i=0; i < input.length(); i++){
            answer += (char)(~input.charAt(i)) + "";
        }
        int funnyNumber = (i+\u002f*0)/0;//Division by 0 should cause an error???
        answer.replaceAll("South Dakota", "☃");
        answer.replaceAll("North Dakota", "South Dakota");
        answer.replaceAll("☃", "North Dakota");
        //For some reason, this does not cause errors either:
        funnyNumber = ((500/0)*\u002f+-2);
        return answer;
    }
}

Pytanie: Co jest funnyNumberrówne?

Numer jeden
źródło
5
Zaraz, czy Java 8 dodała joindo Stringklasy metodę statyczną ? * Ciche świętowanie! *
Justin
Ach, widzę, co tam zrobiłeś. funnyNumberma wartość i - 2. Osobiście nie uważam, że ukrywanie postaci w Unicode jest bardzo niedopracowane.
Justin
@Quincunx Prawidłowo, funnyNumber jest równy i - 2.
TheNumberOne
Chłodny; Nigdy nie wiedziałem, że \udziała poza łańcuchami.
Ypnypn
1
@Desty Try System.out.println(2+\u002f*2/0*\u002f+-2).
TheNumberOne
2

JavaScript

function encrypt (input) {
    input = input.replace(/north d/gi, 'hisdf')
    input = input.replace(/south d/gi, 'hisde')
    var data = input    
    var res = []
    for (var i = 0; i < data.length; i++) {
        res.push(~data.charCodeAt(i))
    }
    return res.toString()
}
function decrypt (input) {
    console.log(input)
    input = input.replace(/-105,-106,-116,-101,-102/g, '-79,-112,-115,-117,-105,-33,-69').replace(/-105,-106,-116,-101,-103/g, '-84,-112,-118,-117,-105,-33,-69 ')
    input = input.split(',')
    var res = ""
    for (var i = 0; i < input.length; i++) {
        var itm = input[i]
        res += String.fromCharCode(~parseInt(itm))
    }
    return res
}
var data = encrypt(prompt('What do you want to encrypt?'))
var data = decrypt(data)
alert(data)

Moje rozwiązanie prawdopodobnie nie jest najmądrzejsze. Ale to działa :) Oto skrzypce

Najpierw wymień north dsię hisdfi south dz hisde, a następnie odwrócić wszystkich znaków bitowe i przesunąć je w tablicy. Tablica konwertuję na ciąg, a następnie zastępuję odwrócone wartości znaków prawidłowymi. Wcześniej zastępuję wartości hisdfi hisdeprzełączam.

Knerd
źródło
Co jeśli mój rzeczywisty ciąg znaków hisdegdzieś zawierał ?
Optymalizator
@Optimizer dobrze, niż my się psuje: D
Knerd
@Roger Nope, ponieważ zastępuje north di south d:)
Knerd
@Knerd Tak, widziałem literę „d” na końcu, tak jak ją zamieściłeś. / facepalm
Roger
2

AWK: Koder: 165 bajtów, Dekoder: 61 bajtów

Enkoder (odpowiedzialny również za zastąpienie południa północą i odwrotnie):

{a="(th Dakota(ns?)?)";b="\\1";split(gensub("@"a,"Sou"b,"g",gensub("Sou"a,"Nor"b,"g",gensub("Nor"a,"@"b,"g")))" ",y,"");for(i=1;i<length(y);i+=2)printf(y[i+1] y[i])}

Dekoder:

{split($0,y,"");for(i=1;i<length(y);i+=2)printf(y[i+1] y[i])}

Niektóre testy:

Dakota Północna jest najbogatszym hrabstwem w Ameryce Północnej, podczas gdy Dakota Południowa jest biedniejsza niż południowa Floryda. - rząd Dakoty Północnej

koduje w:

oStu haDokati sht eewlahteitsc uotn yniN rohtA emirac, hwli eoNtr haDokatsna erp ooer rhtnas uohtre nlFrodi.a- t ehS uohtD katonag voremnne t

(powinno to być wystarczająco zaszyfrowane, aby rząd niezbyt zaawansowany technologicznie : o))

Następnie dekoduje się na:

Południowa Dakota jest najbogatszym hrabstwem w Ameryce Północnej, podczas gdy Dakota Północna jest biedniejsza niż południowa Floryda. - rząd Dakoty Południowej

Ale tego oczekiwano: o)

Uwaga: Dakota Północna, Dakota Północna, Dakota Północna, Dakota Południowa, Dakota Południowa i Dakota Południowa muszą być poprawnie pisane wielkimi literami.

LeFauve
źródło
0

do

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>

#define MASK_B 0xFFFFFFULL
#define MASK_C 0xFFULL
#define ll unsigned long long int
#define transform(a,b) ((a)>(b))?(a):(b)
static const ll magic_num = 0x756f736874726f6e;
#define BITS(a,b) (magic_num&(MASK_C<<((a+b)*8)))>>((a+b)*8)

char * key;
ll keylen;
FILE * file;

char * encrypt(in)
char * in;
{
    char * out;
    size_t length = strlen(in);
    out = (char *) malloc(sizeof (char) * (length + 1));
    for (ll i = 0; i < length; i++)out[i] = key[i % keylen]^in[i];
    out[length] = '\0';
    return out;
}

char * decrypt() {
    size_t len = 0;
    fpos_t pos;
    char * out;
    fgetpos(file, &pos);
    do if (fgetc(file) == EOF) break; else len++; while (1);
    out = (char *) malloc(sizeof (char) * (len + 1));
    fsetpos(file, &pos);
    char chr;
    ll idx = 0;
    do {
        chr = fgetc(file);
        if (chr == EOF) break;
        out[idx++] = chr^key[idx % keylen];
    } while (1);
    out[len] = '\0';
    return out;
}

void * bits(flag, mask)
ll flag;
char * mask;
{
    int dx = (flag & (~0&MASK_C)<<16) ? 5 : 0;
    key[0] = BITS(dx, 0),key[1] = BITS(dx, 1),key[2] = BITS(dx, 2),key[3] = BITS(3, 0),key[4] = BITS(3, 1);
    strncpy(&key[5], " dakota", 8);
    if (flag & ~(MASK_B^MASK_C)) {
        dx = (char)flag & MASK_C;
        if (islower(*mask)) *mask = key[dx - 1];
        else *mask = toupper(key[dx - 1]);
    } else if (!(flag & ~~0))
        return (void *) key;
    return (void*) key[transform(arc4random_uniform(12), 12)];
}

int genkey(in)
char * in;
{
    size_t bound_upper = strlen(in);
    char * index1 = malloc(sizeof(char) * (bound_upper + 1));
    char * index2 = malloc(sizeof(char) * (bound_upper + 1));
    char * index;
    index1 = strcpy(index1,in);
    index2 = strcpy(index2,in);
    ll spice = 0;
    key = (char *) malloc(sizeof (char) * 13);
    char *hits = (char *) malloc(sizeof (char) * bound_upper);
    for (unsigned long j = 0; j < bound_upper; j++){
        hits[j] = 0;
    }

    for (int iter = 0; iter < 2; iter++) {
        ll rotation = 0, flag = MASK_C << (8 * (iter + 1)), flag2 = MASK_C << (8 * (2 - iter)),abs=0;
        char * tmpstr;
        index = iter ? index2 : index1;
        do {
            spice = spice + arc4random_uniform(bound_upper) % bound_upper;
            if (!rotation) {
                tmpstr = strcasestr(index, bits(flag, in));
                if (tmpstr == NULL)
                    goto out;
                index = tmpstr;
            } else {
                bits(flag2 | rotation, index++);
                hits[abs] = iter + 1;
            }
            rotation = (rotation + 1) % (4);
            abs = index - (iter ? index2 : index1);
        } while (flag);
out:
        index = in;
        rotation = 0;
    }
    for(int k = 0;k < bound_upper;k++){
        index[k]=(hits[k]==1?index1[k]:(hits[k] ? index2[k]: index[k]));
        spice += arc4random_uniform(spice)|spice^arc4random();
    }
    free(key);
    spice = spice % bound_upper;
    if (!spice)
        spice = bound_upper;
    keylen = (keylen | spice) & MASK_B;
    key = (char *) malloc(sizeof (char) * (keylen + 1));
    for (ll i = 0; i < keylen; i++)
        key[i] = (arc4random_uniform(126 - ' ') % (126 - ' ')) + ' ';
    key[keylen] = '\0';
    return keylen;
}

int main(argc, argv)
int argc;
char *argv[];
{
    if (argc != 4) return 1;
    char * result;
    if (!strcmp(argv[1], "encrypt")) {
        (void) genkey(argv[2]);
        result = encrypt(argv[2]);
        printf("Decryption Key: '%s'\n", key);
        file = fopen(argv[3], "wb");
        if (file == NULL) printf("Could not open file for writing: %s", argv[3]);
        if (fwrite(result, sizeof (char), strlen(result), file) != strlen(result)) printf("Error occurred while writing ciphertext to file!");
    }
    if (!strcmp(argv[1], "decrypt")) {
        file = fopen(argv[3], "rb");
        if (file == NULL) printf("Could not open file for reading: %s", argv[3]);
        key = argv[2];
        keylen = strlen(argv[2]);
        result = decrypt();
        printf("Plaintext: '%s'\n", result);
    }
    return 0 & fclose(file);
}

Połącz z: gcc -Wall -Wextra -Wno-missing-field-initializers -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -DGCC_WARN -ansi -pedantic file.c

Dla maksymalnego zła, napisane w K&R C z odrobiną nadużywania wskaźnika.
Lasciate ogni speranza, voi ch'entrate.
Buśhaīila rukgâī, naǵkxarańga ba tdhuløk.
Ponadto wszystko jest w bitsfunkcji i genkeyfunkcji.

Biegać:

[...@...] testing_golf$ ./a.out encrypt "North Dakota is the wealthiest county in North America, while South Dakotans are poorer than southern Florida. - the North Dakotan government" cipher
Decryption Key: ')=1aj3'
[...@...]: testing_golf$ ./a.out decrypt ")=1aj3" cipher
Plaintext: 'South Dakota is the wealthiest county in North America, while North Dakotans are poorer than southern Florida. - the South Dakotan government'

Uwaga: Podczas określania klawisza w decrypttrybie może być konieczne ucieczka niektórych znaków w klawiszach odwrotnymi ukośnikami.

Élektra
źródło
-1

JavaScript, ES6

Słodki i prosty na początek.

Enkoder:

E=a=>btoa(a)

Dekoder:

D=a=>atob(a_.replace(/(nor|sou)(th dakota)/gi, (_,x,y)=>({n:"sou",s:"nor",N:"Sou",S:"Nor"})[x[0]]+y)

Wypróbuj poniżej w najnowszym Firefoksie:

E=a=>btoa(a)
D=a=>atob(a).replace(/(nor|sou)(th dakota)/gi, (_,x,y)=>({n:"sou",s:"nor",N:"Sou",S:"Nor"})[x[0]]+y)
var string = prompt()
alert("Encoded string: " + E(string));
alert("Decode string: " + D(E(string)));

Optymalizator
źródło
3
Twój kod nie działa, należy wymienić dakotanz dakota:)
Knerd
3
@Knerd nie, nie powinieneś.
Optymalizator
Tak, powinieneś, kodem zastępujesz North Dakotannie tylko to North Dakotasamo na południu
Knerd,
1
Bo myślę, że OP chciał, aby kod szyfrował wiadomość, a następnie z innym kodem do jej odszyfrowania.
Knerd
9
To wcale nie jest tak źle zrozumiane. Skusiłbym się na głosowanie, ale nie jestem pewien, czy to fajne w konkursie popularności?
Claudiu