Confuse the Dakotas [chiuso]


20

Sei stato assunto dal governo del North Dakota per crittografare le comunicazioni dello stato. Scrivi due programmi, uno per crittografare un messaggio e uno per decrittografare quel messaggio.

Il governo non è molto esperto di tecnologia, quindi l'algoritmo di crittografia non deve essere sofisticato; assicurati solo che il risultato non sia simile all'originale a prima vista.

Tuttavia, sei segretamente leale al governo del South Dakotan. Il tuo compito è quello di mescolare le comunicazioni, in modo tale che ogni menzione North Dakotadiventi South Dakotauna decodifica e viceversa. Questo vale anche per North/South Dakotane North/South Dakotans.

Per esempio:

Il Nord Dakota è la contea più ricca del Nord America, mentre i South Dakotan sono più poveri della Florida meridionale. - il governo del Nord Dakotan

subirà la crittografia e quindi la decrittografia, con conseguente:

Il South Dakota è la contea più ricca del Nord America, mentre i North Dakotan sono più poveri della Florida meridionale. - il governo del South Dakotan

Verrà accettato l'algoritmo che lo compie nel modo più riservato e complicato, come evidenziato dal maggior numero di voti.


Sarebbe un string.replacelavoro semplice ? Perché hai detto che la gente non è davvero
appassionata di

@Knerd Immagino che potresti, ma è un popcon ...
Sp3000,

@ Sp3000 sì, hai ragione ...
Knerd

Che tiene conto del maiuscolo o minuscolo ?
Ottimizzatore

6
Sto votando per chiudere questa domanda come fuori tema perché le domande subdole non sono più consentite dalla politica del sito.
caird coinheringaahing

Risposte:


13

Rubino

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)

dimostrazione


Mi ci sono voluti anni per capire. Ben fatto signore!
Chowlett,

8

CJam

Questo è l'encoder:

232375064392749269032321519657657089927649992440902190178063558812627752920796248165803740235420850037801568815744960725761679066919872746899310628404239458 128b:c~

e questo è il decodificatore:

364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282 128b:c~

Provalo online qui

Questo funziona solo con il capitale N, Se DinNorth/South Dakota

Passa la stringa di input alla prima funzione da STDIN. Ottieni la stringa codificata, passala alla seconda funzione per ottenere l'output decodificato e convertito.


@Rainbolt LOL. È WinterBash. Tutto va! (Sorpreso che ti fossero rimasti dei voti)
Ottimizzatore

Come ho detto. LOL.
Ottimizzatore

"Questo non fa nulla. HaHaHaHa!. La logica principale risiede nel decodificatore."; Perché c'è un .tra HaHaHaHa!e The?
TheNumberOne

@TheBestOne perché ... ragioni.
Ottimizzatore

Prova decodifica questo: 364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282.
TheNumberOne

7

Giava

Ho scoperto che la divisione per zero non causa errori in questo programma. Questo programma codifica completamente le stringhe in una forma che non può essere rintracciata al governo del Nord Dakotan. A causa dello strano comportamento sopra menzionato, la codifica e la decodifica potrebbero non funzionare correttamente in tutti i casi.

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;
    }
}

Domanda: cosa significa funnyNumber?


5
Whoa, Java 8 ha aggiunto un metodo statico joinalla Stringclasse? * Celebrazione silenziosa! *
Giustino il

Ah, vedo cosa hai fatto lì. funnyNumberha un valore di i - 2. Personalmente non credo che nascondere i personaggi in Unicode sia molto subdolo, però.
Giustino il

@Quincunx Corretto, funnyNumber è uguale i - 2.
TheNumberOne

Freddo; Non ho mai saputo che \ufunzioni al di fuori delle stringhe.
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)

La mia soluzione non è probabilmente la più intelligente. Ma funziona :) Ecco un violino

Per prima cosa sostituisco north dcon hisdfe south dcon hisde, quindi inverto bit per bit tutti i caratteri e li inserisco in un array. La matrice che converto in una stringa e quindi sostituisce i valori dei caratteri invertiti con quelli corretti. Prima di allora, sostituisco i valori di hisdfe ho hisdecambiato.


E se la mia stringa attuale contenesse hisdeda qualche parte?
Ottimizzatore

@Optimizer bene, di quello che si rompe: D
Knerd

@Roger No, perché sostituisce north de south d:)
Knerd

@Knerd Sì, ho visto la 'd' alla fine proprio come l'hai postata. / facepalm
Roger,

2

AWK: Encoder: 165 byte, Decoder: 61 byte

L'encoder (anche incaricato di sostituire il Sud con il Nord e viceversa):

{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])}

Il decodificatore:

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

Alcuni test:

Il Nord Dakota è la contea più ricca del Nord America, mentre i South Dakotan sono più poveri della Florida meridionale. - il governo del Nord Dakotan

codifica in:

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

(che dovrebbe essere abbastanza confuso per un governo non molto esperto di tecnologia : o))

Quindi decodifica in:

Il South Dakota è la contea più ricca del Nord America, mentre i North Dakotan sono più poveri della Florida meridionale. - il governo del South Dakotan

Ma quello era previsto: o)

Nota: North Dakota, North Dakotan, North Dakotans, South Dakota, South Dakotan e South Dakotans devono essere correttamente capitalizzati.


0

C

#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);
}

Compilare con: gcc -Wall -Wextra -Wno-missing-field-initializers -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -DGCC_WARN -ansi -pedantic file.c

Per il massimo del male, scritto in K&R C con un pizzico di abuso di puntatore.
Lasciate ogni speranza, voi ch'entrate.
Buśhaīila rukgâī, naǵkxarańga ba tdhuløk.
Inoltre, tutto è nella bitsfunzione e nella genkeyfunzione.

Correre:

[...@...] 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'

Nota: quando si specifica la chiave in decryptmodalità, potrebbe essere necessario sfuggire ad alcuni dei caratteri della chiave con barre rovesciate.


-1

JavaScript, ES6

Dolce e semplice per cominciare.

Codificatore:

E=a=>btoa(a)

decoder:

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

Provalo di seguito su un ultimo Firefox:

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


3
Il tuo codice non funziona, dovresti sostituirlo dakotancon dakota:)
Knerd

3
@Knerd no, non dovresti.
Ottimizzatore

Sì, dovresti, con il tuo codice sostituisci North Dakotannon solo lo North Dakotastesso vale per il sud
Knerd

1
Causa, penso che l'OP abbia voluto che il codice crittografasse un messaggio e quindi con un altro codice per decrittografarlo.
Knerd,

9
Questo non è affatto subdolo. Sarei tentato di sottovalutare ma non sei sicuro che sia bello in un concorso di popolarità?
Claudiu,
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.