Dakotas'ı karıştır [kapalı]


20

Devletin iletişimini şifrelemek için Kuzey Dakota hükümeti tarafından işe alındınız. Biri bir mesajı şifrelemek ve diğeri bu mesajın şifresini çözmek için iki program yazın.

Hükümet gerçekten teknoloji meraklısı değildir, bu nedenle şifreleme algoritmasının karmaşık olması gerekmez; ilk bakışta sonucun orijinaline benzemediğinden emin olun.

Ancak, Güney Dakotan hükümetine gizlice sadıksınız. İşiniz her söz böylece, iletişim karıştırmak için North Dakotaolur South Dakotaşifre çözme üzerine, ve tersi. Bu aynı zamanda uygulanır North/South Dakotanve North/South Dakotans.

Örneğin:

Kuzey Dakota, Kuzey Amerika'nın en zengin ilçesidir, Güney Dakota'lar ise güney Florida'dan daha fakirdir. - Kuzey Dakotan hükümeti

şifreleme ve daha sonra şifre çözme işlemlerinden geçecek ve bunun sonucunda

Güney Dakota, Kuzey Amerika'nın en zengin ilçesidir, Kuzey Dakota'lar ise güney Florida'dan daha fakirdir. - Güney Dakotan hükümeti

Bunu en gizli ve aldatıcı şekilde gerçekleştiren algoritma, en çok oyu alarak kanıtlandığı gibi kabul edilecektir.


Basit bir string.replaceiş olur mu? Çünkü insanların gerçekten teknoloji içine
girmediklerini söylediniz

@Knerd Yapabileceğini hayal ederdim, ama bu bir popcon ...
Sp3000

@ Sp3000 evet, haklısın ...
Knerd

Harfe duyarlı ?
Optimize Edici

6
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum çünkü site politikası kapsamında el altında kalmış sorulara artık izin verilmiyor.
caird coinheringaahing

Yanıtlar:


13

Yakut

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)

gösteri


Bu götürdü yaş anlamaya. Aferin efendim!
Chowlett

8

CJam

Bu kodlayıcı:

232375064392749269032321519657657089927649992440902190178063558812627752920796248165803740235420850037801568815744960725761679066919872746899310628404239458 128b:c~

ve bu kod çözücü:

364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282 128b:c~

Buradan çevrimiçi deneyin

Bu yalnızca sermaye ile çalışır N, Sve DdeNorth/South Dakota

Giriş dizesini STDIN'den ilk işleve geçirin. Kodlanmış dizeyi alın, kodu çözülmüş ve dönüştürülmüş çıktıyı almak için ikinci işleve geçirin.


@Rainbolt LOL. Onun WinterBash. Her şey gider! (Oyların kaldığını bile şaşırttı)
Optimizer

Söylediğim gibi. LOL.
Optimizer

"Bu hiçbir şey yapmaz. HaHaHaHa!. Ana mantık kod çözücüde yatmaktadır."; Neden orada .arasındaki HaHaHaHa!ve The?
TheNumberOne

@TheBestOne çünkü ... nedenleri.
Optimize Edici

Bu şifre çözme deneyin: 364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282.
TheNumberOne

7

Java

Sıfıra bölmenin bu programda hatalara neden olmadığını keşfettim. Bu program Dizeleri tam olarak Kuzey Dakotan hükümeti tarafından izlenemeyen bir forma kodlar. Yukarıda bahsedilen garip davranış nedeniyle, kodlama ve kod çözme her durumda doğru çalışmayabilir.

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

Soru: Neye funnyNumbereşittir?


5
Dur, Java 8 statik bir yöntem ekledin joiniçin Stringsınıfa? * Sessiz kutlama! *
Justin

Ah, orada ne yaptığını görüyorum. funnyNumberdeğeri i - 2. Ben şahsen unicode karakterleri saklamanın çok az olduğunu düşünmüyorum.
Justin

@Quincunx Doğru, funnyNumber eşittir i - 2.
TheNumberOne

Güzel; \uDizelerin dışında işe yaradığını asla bilmiyordum .
Ypnypn

1
@Desty Deneyin 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)

Benim çözümüm muhtemelen en akıllı çözüm değil. Ama işe yarıyor :) İşte bir keman

Önce değiştirmek north dile hisdfve south dile hisdeben bitdüzeyi tüm karakterler invert sonra, ve onları bir dizide itin. Diziyi bir dizeye dönüştürür ve sonra ters çevrilmiş karakter değerlerini doğru olanlarla değiştirir. Bundan önce, değerlerini değiştirdim hisdfve hisdedeğiştirdim.


Gerçek dizem bir hisdeyerde bulunuyorsa ne olur ?
Optimize Edici

@Optimizer iyi, kırdığımızdan daha fazla: D
Knerd

@Roger Nope, onun yerini north dsouth d
aldığından

@Knerd Yep, sonunda 'd' yi aynen böyle yayınladığını gördüm. / facepalm
Roger

2

AWK: Kodlayıcı: 165 bayt, Kod çözücü: 61 bayt

Kodlayıcı (ayrıca Güney'i Kuzey yerine değiştirmekle de tersi):

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

Kod çözücü:

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

Bazı testler:

Kuzey Dakota, Kuzey Amerika'nın en zengin ilçesidir, Güney Dakota'lar ise güney Florida'dan daha fakirdir. - Kuzey Dakotan hükümeti

içine kodlar:

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

(bu gerçekten teknoloji meraklısı olmayan bir hükümet için yeterince karıştırılmalıdır. : o))

Daha sonra kodunu çözer:

Güney Dakota, Kuzey Amerika'nın en zengin ilçesidir, Kuzey Dakota'lar ise güney Florida'dan daha fakirdir. - Güney Dakotan hükümeti

Ancak bu beklenen bir durumdu: o)

Not: Kuzey Dakota, Kuzey Dakotan, Kuzey Dakotans, Güney Dakota, Güney Dakotan ve Güney Dakotans'ın doğru şekilde büyük harflerle yazılması gerekir.


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

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

Maksimum kötülük için, K & R C'de bir işaretçi kötüye kullanımı çizgisiyle yazılmıştır.
Lazerli ogni speranza, voi ch'entrate.
Buśhaīila rukgâī, naǵkxarańga ba tdhuløk.
Ayrıca, her şey bitsişlevde vegenkey işlevde.

Çalıştırmak:

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

Not: Anahtarı decryptmodda belirtirken, tuştaki bazı karakterlerden ters eğik çizgilerle kaçmak gerekebilir.


-1

JavaScript, ES6

Tatlı ve başlamak basit.

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)

En son Firefox'ta aşağıda deneyin:

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
, Değil çalışma değiştirmeniz gerekir gelmez Kodunuz dakotanile dakota:)
Knerd

3
@Knerd hayır, yapmamalısın.
Optimize Edici

Evet, kodunuzla aynı North Dakotandeğil sadece yerine North DakotaGüney için gidiyor
Knerd

1
Neden, ben OP kodun bir mesaj şifrelemek ve daha sonra başka bir kod ile şifresini çözmek istediğini düşünüyorum.
Knerd

9
Bu hiç de az değil. Ben aşağı oy için cazip olurdu ama bir popülerlik yarışmasında bu serin olup olmadığından emin değil misiniz?
Claudiu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.