Bingung Dakota [ditutup]

20

Anda telah disewa oleh pemerintah North Dakota untuk mengenkripsi komunikasi negara. Tulis dua program, satu untuk mengenkripsi pesan dan satu lagi untuk mendekripsi pesan itu.

Pemerintah tidak benar-benar mengerti teknologi, sehingga algoritma enkripsi tidak perlu canggih; pastikan hasilnya tidak terlihat mirip dengan aslinya pada pandangan pertama.

Namun, Anda diam-diam setia kepada pemerintah Dakotan Selatan. Tugas Anda adalah mencampuradukkan komunikasi, sehingga setiap penyebutan North Dakotamenjadi South Dakotasaat dekripsi, dan sebaliknya. Ini juga berlaku untuk North/South Dakotandan North/South Dakotans.

Sebagai contoh:

Dakota Utara adalah daerah terkaya di Amerika Utara, sementara Dakot Selatan lebih miskin daripada Florida selatan. - pemerintah Dakotan Utara

akan menjalani enkripsi lalu dekripsi, menghasilkan:

Dakota Selatan adalah daerah terkaya di Amerika Utara, sementara Dakotan Utara lebih miskin daripada Florida selatan. - pemerintah Dakotan Selatan

Algoritme yang menyelesaikan ini dengan cara yang paling rahasia dan rumit, sebagaimana dibuktikan dengan memiliki suara terbanyak, akan diterima.

Ypnypn
sumber
Apakah string.replacepekerjaan sederhana ? Karena Anda mengatakan orang-orang tidak benar-benar
tertarik dengan
@Knerd Saya bayangkan Anda bisa, tetapi ini adalah sebuah popcon ...
Sp3000
@ Sp3000 ya, Anda benar ...
Knerd
Hal - hal sensitif ?
Pengoptimal
6
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena pertanyaan-pertanyaan curang tidak lagi diizinkan berdasarkan kebijakan situs.
caird coinheringaahing

Jawaban:

13

Rubi

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)

Demo

histokrat
sumber
Saya butuh waktu lama untuk mencari tahu. Bagus, tuan!
Chowlett
8

CJam

Ini adalah pembuat enkode:

232375064392749269032321519657657089927649992440902190178063558812627752920796248165803740235420850037801568815744960725761679066919872746899310628404239458 128b:c~

dan ini adalah dekoder:

364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282 128b:c~

Cobalah online di sini

Ini hanya bekerja dengan modal N, Sdan DdalamNorth/South Dakota

Lewati string input ke fungsi pertama dari STDIN. Dapatkan string yang disandikan, kirimkan ke fungsi kedua untuk mendapatkan hasil dekode dan konversi.

Pengoptimal
sumber
@Rainbolt LOL. Ini WinterBash. Semuanya berjalan! (Terkejut bahwa Anda bahkan memiliki suara tersisa)
Pengoptimal
Seperti yang saya katakan. LOL.
Pengoptimal
"Ini tidak melakukan apa-apa. HaHaHaHa!. Logika utama terletak pada decoder."; Mengapa ada di .antara HaHaHaHa!dan The?
TheNumberOne
@TheBestOne karena ... alasan.
Pengoptimal
Coba decoding ini: 364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282.
TheNumberOne
7

Jawa

Saya menemukan bahwa pembagian dengan nol tidak menyebabkan kesalahan dalam program ini. Program ini sepenuhnya menyandikan string ke dalam bentuk yang tidak dapat dilacak ke pemerintah Dakotan Utara. Karena perilaku aneh yang disebutkan di atas, pengodean dan pengodean ulang mungkin tidak berfungsi dengan benar dalam semua kasus.

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

Pertanyaan: Apa yang funnyNumbersama?

TheNumberOne
sumber
5
Whoa, apakah Java 8 menambahkan metode statis joinke Stringkelas? * Perayaan senyap! *
Justin
Ah, saya melihat apa yang Anda lakukan di sana. funnyNumbermemiliki nilai i - 2. Saya pribadi tidak merasa bahwa karakter tersembunyi di unicode sangat curang.
Justin
@ Quincunx Benar, funnyNumber tidak sama i - 2.
TheNumberOne
Keren; Saya tidak pernah tahu itu \ubekerja di luar string.
Ypnypn
1
@Dest Coba 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)

Solusi saya mungkin bukan yang paling pintar. Tapi berhasil :) Ini biola

Pertama saya ganti north ddengan hisdfdan south ddengan hisde, kemudian saya membalikkan semua karakter bitwise dan mendorong mereka dalam array. Array yang saya konversikan menjadi sebuah string dan kemudian ganti nilai karakter yang terbalik dengan yang benar. Sebelum itu, saya mengganti nilai-nilai hisdfdan hisdeberalih.

Knerd
sumber
Bagaimana jika string saya yang sebenarnya ada di hisdesuatu tempat?
Pengoptimal
@Optimizer dengan baik, daripada yang kami
hancurkan
@ Roger Tidak, karena ini menggantikan north ddan south d:)
Knerd
@ Knerd Yap, saya melihat 'd' di akhir tepat saat Anda mempostingnya. / facepalm
Roger
2

AWK: Encoder: 165 byte, Decoder: 61 byte

Encoder (juga bertugas menggantikan Selatan oleh Utara dan sebaliknya):

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

Beberapa tes:

Dakota Utara adalah daerah terkaya di Amerika Utara, sementara Dakot Selatan lebih miskin daripada Florida selatan. - pemerintah Dakotan Utara

disandikan ke:

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

(yang harus diacak untuk pemerintah yang tidak benar-benar mengerti teknologi : o))

Itu kemudian diterjemahkan menjadi:

Dakota Selatan adalah daerah terkaya di Amerika Utara, sementara Dakotan Utara lebih miskin daripada Florida selatan. - pemerintah Dakotan Selatan

Tapi itu yang diharapkan: o)

Catatan: Dakota Utara, Dakotan Utara, Dakotan Utara, Dakota Selatan, Dakotan Selatan, dan Dakotan Selatan harus menggunakan huruf besar dengan benar.

LeFauve
sumber
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);
}

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

Untuk kejahatan maksimum, ditulis dalam K&R C dengan sedikit penyalahgunaan pointer.
Lasciate ogni speranza, voi ch'entrate.
Buśhaīila rukgâī, naǵkxarańga ba tdhuløk.
Juga, semuanya ada di bitsfungsi dan genkeyfungsi.

Menjalankan:

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

Catatan: Saat menentukan kunci dalam decryptmode, mungkin perlu untuk melarikan diri beberapa karakter dalam kunci dengan garis miring terbalik.

Élektra
sumber
-1

JavaScript, ES6

Manis dan sederhana untuk memulai.

Encoder:

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)

Cobalah di bawah ini di Firefox terbaru:

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

Pengoptimal
sumber
3
Kode Anda tidak berfungsi, Anda harus menggantinya dakotandengan dakota:)
Knerd
3
@ Tidak, seharusnya tidak.
Pengoptimal
Ya Anda harus, dengan kode Anda, Anda hanya mengganti North Dakotantidak North Dakotasama berlaku untuk selatan
Knerd
1
Karena, saya pikir OP ingin kode untuk mengenkripsi pesan dan kemudian dengan kode lain untuk mendekripsi.
Knerd
9
Ini tidak benar-benar curang sama sekali. Saya akan tergoda untuk menurunkan suara tetapi tidak yakin apakah itu keren dalam kontes popularitas?
Claudiu