ตัวเลขของเบคอน: คำนำเกี่ยวกับซูรินาเม


14

ลูกหมูตัวเล็กนี้ออกสู่ตลาดลูกหมูตัวเล็กนี้เขียนโค้ดบางส่วน ...

เดี๋ยวก่อนเราไม่ได้พูดถึงเบคอนนั่นเรากำลังพูดถึงเซอร์ฟรานซิสเบคอน! โดยเฉพาะรหัสตัวเลขเบคอนได้คิดค้นขึ้นในปลายปี 1500เพื่อเป็นวิธีการซ่อนข้อความภายในข้อความอื่นซึ่งเป็นวิธีการของซูรินาเม

รหัสลับทำงานโดยการซ่อนข้อความในการนำเสนอข้อความแทนที่จะเป็นเนื้อหา ขั้นแรกตัวอักษรของข้อความของคุณจะถูกเข้ารหัสเป็นไบนารี่ (จาก 0 ถึง 25) ดังนี้:

หมายเหตุ: โปรดใช้การเข้ารหัสต่อไปนี้ในรหัสของคุณและไม่ต้องกังวลเกี่ยวกับตัวเลขช่องว่างหรือสัญลักษณ์อื่น ๆ ในอินพุตแม้ว่าฉันอาจจะคิดโบนัสบางอย่างสำหรับผู้ที่รวมอักขระเหล่านี้ไว้ในการเข้ารหัส หากคุณรวมสัญลักษณ์อื่น ๆ ตัวอักษรจะต้องคงช่องว่าง 0-25 ในการเข้ารหัส

Letter  Encoding
A       AAAAA
B       AAAAB
C       AAABA
D       AAABB
E       AABAA
F       AABAB
G       AABBA
H       AABBB
I       ABAAA
J       ABAAB
K       ABABA
L       ABABB
M       ABBAA
N       ABBAB
O       ABBBA
P       ABBBB
Q       BAAAA
R       BAAAB
S       BAABA
T       BAABB
U       BABAA
V       BABAB
W       BABBA
X       BABBB
Y       BBAAA
Z       BBAAB

เมื่อมีการเข้ารหัสตัวอักษรทั้งหมดในข้อความของคุณลงในAs และBs ด้านบนตอนนี้คุณต้องเลือกสองtypefacesสำหรับรหัสของคุณ ตัวอย่างนี้ผมจะใช้ข้อความที่ปกติสำหรับตัวอักษรAและข้อความเป็นตัวหนาBสำหรับอักษร

ดังนั้นข้อความ

HELLOWORLD

ถูกเข้ารหัสไปที่

AABBB AABAA ABABB ABABB ABBBA BABBA ABBBA BAAAB ABABB AAABB

และตอนนี้เราปกปิดไบนารีนี้ด้วยข้อความที่ผู้ให้บริการ

สุนัขจิ้งจอกสีน้ำตาลอย่างรวดเร็วกระโดดข้ามสุนัขขี้เกียจวิ่งเล่นในทุ่งหญ้าที่คนเลี้ยงแกะคอยดู

ไม่เป็นไรถ้าข้อความของผู้ให้บริการยาวกว่าข้อความที่เข้ารหัสจริงแม้ว่าจะไม่สั้นกว่านี้ก็ตาม ตอนนี้เราเปลี่ยนข้อความพาหะเป็นตัวหนาตามที่Bs อยู่ในข้อความที่เข้ารหัส

Th อี คู IC kครับW n สำหรับ x เจยูMP s ove Rทีเอชอี ลิตร az Y ทำกรัมs , เกม o ลิตรฉันงะในเเขาทุ่งเลี้ยงแกะที่ช่วยให้นาฬิกา

ซึ่งไม่มี Markdown อ่านเป็น

Th**e** **qu**ic**k** bro**w**n **fo**x **j**u**mp**s **ove**r **t**h**e** **l**az**y** 
**do**g**s**, gam**b**o**l**i**ng** in t**he** fields where the shepherds keeps watch.

โปรดทราบว่าฉันไม่ได้ใช้เครื่องหมายวรรคตอนในข้อความผู้ให้บริการเพื่อเข้ารหัสข้อความ แต่ไม่ว่าเครื่องหมายวรรคตอนจะถูกเข้ารหัสหรือไม่นั้นขึ้นอยู่กับคุณ /

กฎระเบียบ

  • ข้อมูลที่คุณป้อนจะเป็นข้อความที่คุณจะเข้ารหัสและข้อความของผู้ให้บริการ หากข้อความผู้ให้บริการสั้นเกินไปให้ส่งคืนข้อความแสดงข้อผิดพลาดบางประเภท

  • คุณต้องเลือกสองแบบอักษรสำหรับการเข้ารหัส AและBเช่นพิมพ์ใหญ่พิมพ์เล็กตัวเอียง , ตัวหนา , ตัวเอียงตัวหนา , ขีด , in code formatและอื่น ๆ คุณต้องใช้ Markdown รูปแบบของการแลกเปลี่ยนเพื่อเข้ารหัสรูปแบบอักษรเหล่านี้เช่น

    UPPERCASE, lowercase, *italic*, **bold**, 
    ***bold italic***, <s>strikethrough</s>, `in code format`
    
  • ผลลัพธ์ของคุณจะต้องเป็นข้อความผู้ให้บริการที่เข้ารหัสของคุณในขณะนี้แสดงด้วย Markdown หรือแสดงโดยไม่มีดังที่เห็นในตัวอย่างด้านบน

  • คุณจะต้องทำการเข้ารหัสอัลกอริทึมเท่านั้น อัลกอริทึมการถอดรหัสใด ๆ ที่คุณต้องการให้มีการต้อนรับ แต่ในเวลาที่เขียนจะไม่ช่วยหรือขัดขวางคะแนนของคุณ

  • รหัสของคุณจะต้องเป็นโปรแกรมหรือฟังก์ชั่น

  • นี่คือรหัสกอล์ฟดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงเป็นชัยชนะ

เช่นเคยหากปัญหายังไม่ชัดเจนโปรดแจ้งให้เราทราบ ขอให้โชคดีและการเล่นกอล์ฟที่ดี!


3
ดังนั้นจริงๆแล้วไม่มีเหตุผลที่จะไม่ใช้ตัวบน / ตัวพิมพ์เล็กเนื่องจากทุกอย่างมีค่าใช้จ่ายมากกว่าไบต์
Mego

6
ฉันคิดว่ามีการพิมพ์ผิดใน "เราไม่ได้พูดถึงเบคอนนั้น " เพราะแน่นอนว่าคุณกำลังพูดถึงเควินเบคอนดังนั้น "b" จึงควรเป็นตัวพิมพ์ใหญ่ใช่ไหม?
Martin Ender

คำตอบ:


1

Pyth, 47 ไบต์

Vsm.[05jxGd2r~zw0#I}Jr@z~Z+1Z0GBpJ)p?NrJ1J;>zZ

ลองมันนี่

คำอธิบาย:

             ~zw                               - Get the first line of input and 
                                               - set z to the next line
            r   0                              - Turn it to lower case
  m                                            - Map each character
        xGd                                    - Get it's position in the alphabet
       j   2                                   - Turn it to base 2
   .[05                                        - Pad the start with 0's
 s                                             - Turn it to a 1d-array (flatten it)
V                                        ;     - For N in above array:
                 #                )            - While 1:
                      @z~Z+1Z                  - Get the current position in the 
                                               - second line and increment the position
                    Jr       0                 - Set J to it lowercased
                  I}          GB               - If it's a letter, break
                                pJ             - Otherwise, print it
                                    ?N         - Is the character code
                                               - (the current 1d-array) 1
                                      rJ1      - Get the current char uppered
                                         J     - Leave it lowered
                                   p           - Print the character
                                           >zZ - Print out the rest of the second input

1

Python 3, 216 211 231 225 207 ไบต์

นี่เป็นวิธีการแก้ปัญหาที่ใช้ข้อความปกติและตัวเอียงแบบ Markdown สำหรับการพิมพ์สองแบบ และมันเข้ารหัสทุกอย่างในข้อความของผู้ให้บริการยกเว้นช่องว่าง

แก้ไข:ต้องแก้ไขรหัสเพื่อให้ผลการพิมพ์ถูกต้องและเพิ่มตัวอย่างด้านล่างรหัส

แก้ไข:แก้ไขโค้ดให้เป็นตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กที่แย่กว่าเดิมเนื่องจากปัญหาในการพิมพ์ตัวเอียงอย่างถูกต้อง

def g(s,c):
 c=c.lower();w=[h.upper()for h in s if h.isalpha()];t=''.join("{:05b}".format(ord(i)-65)for i in w);r='';j=m=0
 while t[j:]:a=c[m];x=a!=" ";r+=[a,a.upper()][x*int(t[j])];j+=x;m+=1
 return r+c[m:]

ตัวอย่าง

>>> g('HELLOWORLD', 'The quick brown fox jumps over the lazy dogs, gamboling in the fields 
where the shepherds keep watch')
'thE QUicK broWn FOx JuMPs OVEr ThE LazY DOgS, gaMbOlINg in THe fields where the shepherds keep watch'

Ungolfed:

def bacon(message, carrier):
    # Lowers the case of the carrier message
    carrier = carrier.lower()
    # Removing all non-alphabetic characters and making the rest uppercase
    words = ""
    for char in message:
        if char.isalpha():
            words += char.upper()
    # Encoding the message
    binary = ""
    for letter in words:
        encode = ord(letter) - 65
        binary += "{:05b}".format(encode)
    # Encoding the carrier message
    result = ""
    bin_index = 0
    char_index = 0
    while bin_index < len(binary):
        letter = carrier[char_index]
        # If letter isn't a space and it needs to be encoded
        if letter != " " and int(binary[bin_index]): 
            letter = letter.upper()
        result += type + letter + type
        # The encoding only proceeds if letter wasn't a space
        bin_index += letter != " "
        # char_index increments whether or not letter was alphabetical
        char_index += 1
    # Return the encoded text and any leftover characters from the carrier message
    return result + carrier[char_index : ]

0

C, 124 ไบต์

สิ่งนี้ต้องการอาร์กิวเมนต์ที่อยู่ในการเข้ารหัสที่เข้ากันได้กับ ASCII (เช่น ISO-8859.1 หรือ UTF-8) มันปรับเปลี่ยนผู้ให้บริการในสถานที่และส่งกลับ 0 เมื่อประสบความสำเร็จหรือไม่เป็นอย่างอื่น การเข้ารหัสคือA== ตัวพิมพ์เล็กและB== ตัวพิมพ์ใหญ่ จดหมายของผู้ให้บริการที่ไม่ได้ใช้จะถูกตั้งไว้ที่ด้านบน

int f(char*p,char*s){int m=16;do{if(isalpha(*s)){*s|=32;*s-=(*p-1)&m?32:0;if(!(m/=2)){m=16;p+=!!*p;}}}while(*++s);return*p;}

คำอธิบาย

รวมถึงโปรแกรมทดสอบ ผ่านตัวอักษรเพื่อเข้ารหัสเป็นอาร์กิวเมนต์แรกและสตริงผู้ให้บริการเป็นที่สอง

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

/* ASCII or compatible encoding assumed */
int f(char *p, char *s)         /* plaintext, carrier */
{
    int m=16;                   /* mask */
    do {
        if (isalpha(*s)) {
            *s |= 32;
            *s -= (*p-1)&m ? 32 : 0;
            if (!(m/=2)) {
                /* reset mask and advance unless we reached the end */
                m=16;
                p+=!!*p;
            }
        }
    } while (*++s);

    /* 0 (success) if we finished p, else non-zero */
    return *p;
}

int main(int argc, char **argv)
{
    int r = argc < 3 || f(argv[1], argv[2]);
    if (r)
        puts("~!^%&$+++NO CARRIER+++");
    else
        puts(argv[2]);
    return r;
}

ผลการทดสอบ:

$ ./66019 "HELLOWORLD" "The quick brown fox jumps over the lazy dogs, gamboling in the fields where the shepherds keep watch."  
thE QUicK broWn FOx JuMPs OVEr ThE LazY DOgS, gamBoLiNG in tHE FIELDS WHERE THE SHEPHERDS KEEP WATCH.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.