Плутати Дакоти [закрито]


20

Вас запросив уряд Північної Дакоти для шифрування комунікацій держави. Напишіть дві програми, одну для шифрування повідомлення та одну для розшифрування цього повідомлення.

Уряд насправді не сприймає технологій, тому алгоритм шифрування не потребує вдосконалення; просто переконайтеся, що на перший погляд результат не схожий на оригінальний.

Однак ви таємно віддані уряду Південного Дакотану. Ваше завдання - змішати комунікації, щоб кожна згадка про них North Dakotaстала South Dakotaрозшифрованою, і навпаки. Це стосується North/South Dakotanі та North/South Dakotans.

Наприклад:

Північна Дакота - найбагатший графство Північної Америки, тоді як Південна Дакотана бідніша за південну Флориду. - уряд Північного Дакотану

буде піддано шифруванню, а потім дешифруванню, в результаті чого:

Південна Дакота - найбагатший графство Північної Америки, тоді як Північні Дакотани бідніші за південну Флориду. - уряд Південного Дакотану

Алгоритм, який виконує це найбільш таємним, хитрим способом, про що свідчить наявність найбільшої кількості оновлених даних, буде прийнятий.


Була б проста string.replaceробота? Тому що ви сказали, що люди не дуже в технології;)
Кнерд

@Knerd Я думаю, ти міг би, але це попкон ...
Sp3000

@ Sp3000 так, ти маєш рацію ...
Кнерд

Залежно від регістру?
Оптимізатор

6
Я голосую за те, щоб закрити це питання поза темою, оскільки недоцільні питання більше не дозволені в політиці щодо веб-сайтів.
caird coinheringaahing

Відповіді:


13

Рубін

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)

Демо


Це знадобило мені віки, щоб зрозуміти. Молодці, пане!
Chowlett

8

CJam

Це кодер:

232375064392749269032321519657657089927649992440902190178063558812627752920796248165803740235420850037801568815744960725761679066919872746899310628404239458 128b:c~

і це декодер:

364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282 128b:c~

Спробуйте його онлайн тут

Це працює лише з капіталом N, Sі DвNorth/South Dakota

Передайте вхідний рядок до першої функції від STDIN. Отримайте кодований рядок, переведіть його на другу функцію, щоб отримати декодований та перетворений вихід.


@Rainbolt LOL. Його WinterBash. Все йде! (Здивовано, що у вас навіть голосів залишилось)
Оптимізатор

Як я сказав. ЛОЛ.
Оптимізатор

"Це нічого не робить. Ха-Ха-Ха! Основна логіка полягає в декодері."; Чому існує .між HaHaHaHa!і The?
TheNumberOne

@TheBestOne через ... причини.
Оптимізатор

Спробуйте декодування це: 364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282.
TheNumberOne

7

Java

Я виявив, що поділ на нуль не викликає помилок у цій програмі. Ця програма повністю кодує рядки у форму, яку неможливо простежити уряду Північного Дакотану. Через вищезгадану дивну поведінку, кодування та розшифровка можуть працювати неправильно у всіх випадках.

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

Питання: Що таке funnyNumberрівне?


5
Ого, додав Java 8 статичний метод joinдо Stringкласу? * Мовчазне свято! *
Джастін

Ах, я бачу, що ти там робив. funnyNumberмає значення i - 2. Я особисто не відчуваю, що приховування символів у Unicode дуже непосильне.
Джастін

@Quincunx Правильний, смішнийNumber робить рівним i - 2.
TheNumberOne

Класна; Я ніколи не знав, що \uпрацює за межами струн.
Ypnypn

1
@ Спробуйте 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)

Моє рішення, мабуть, не найрозумніше. Але це працює :) Ось загадка

Спочатку я замінюю north dна hisdfі south dз hisde, потім перевертаю всі символи побіжно і натискаю їх у масив. Я перетворюю масив у рядок, а потім замінюю перевернуті символьні значення правильними. Перед цим я замінюю значення hisdfі hisdeперемикаю.


Що робити, якщо мій фактичний рядок міститься hisdeдесь?
Оптимізатор

@Optimizer добре, ніж ми його
ламаємо

@Roger Nope, адже це замінює north dі south d:)
Кнерд

@Knerd Так, я побачив "d" наприкінці саме тоді, коли ви це розмістили. / facepalm
Roger

2

AWK: Енкодер: 165 байт, Декодер: 61 байт

Кодер (також відповідає за заміну Півдня на Північ і навпаки):

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

Дешифратор:

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

Деякі тести:

Північна Дакота - найбагатший графство Північної Америки, тоді як Південна Дакотана бідніша за південну Флориду. - уряд Північного Дакотану

кодує в:

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

(це повинно бути досить зашифровано для не дуже технологічного уряду : o))

Потім він розшифровується на:

Південна Дакота - найбагатший графство Північної Америки, тоді як Північні Дакотани бідніші за південну Флориду. - уряд Південного Дакотану

Але цього очікувалося: o)

Примітка: Північна Дакота, Північна Дакотан, Північна Дакотани, Південна Дакота, Південна Дакотан та Південна Дакотани повинні бути правильно використані з великої літери.


0

С

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

Компілювати з: gcc -Wall -Wextra -Wno-missing-field-initializers -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -DGCC_WARN -ansi -pedantic file.c

За максимальне зло, написане в K&R C з тиском зловживання вказівниками.
Lasciate ogni speranza, voi ch'entrate.
Buśhaīila rukgâī, naǵkxarańga ba tdhuløk.
Крім того, все є у bitsфункції та genkeyфункції.

Виконати:

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

Примітка. Коли ви вказуєте клавішу в decryptрежимі, може знадобитися уникнути деяких символів у клавіші із зворотним нахилом.


-1

JavaScript, ES6

Солодке і просте для початку.

Кодер:

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)

Спробуйте нижче на останній 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
Ваш код не працює, його слід замінити dakotanна dakota:)
Knerd

3
@Knerd ні, не слід.
Оптимізатор

Так, слід, за допомогою коду ви замінюєте North Dakotanне те North Dakotaсаме, що стосується півдня
Кнерд

1
Тому що, я думаю, що ОП хотів, щоб код зашифрував повідомлення, а потім з іншим кодом, щоб розшифрувати його.
Кнерд

9
Це насправді зовсім не під силу. Мені б сподобатися відмовитись, але не впевнений, чи це круто в конкурсі на популярність?
Клавдіу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.