ASCII Odd / Even Cipher


13

เราจะกำหนดASCII Odd / Even Cipherผ่าน pseudocode ด้านล่าง:

Define 'neighbor' as the characters adjacent to the current letter in the string

If the one of the neighbors is out of bounds of the string, treat it as \0 or null

Take an input string

For each letter in the string, do
  If the 0-based index of the current letter is even, then
    Use the binary-or of the ASCII codes of both its neighbors
  Else
    If the ASCII code of the current letter is odd, then
      Use the binary-or of itself plus the left neighbor
    Else
      Use the binary-or of itself plus the right neighbor
  In all cases,
    Convert the result back to ASCII and return it
  If this would result in a code point 127 or greater to be converted, then
    Instead return a space

Join the results of the For loop back into one string and output it

ตัวอย่างเช่นสำหรับอินพุตHelloเอาต์พุตคือemmolตั้งแต่

  • Hหันไป\0 | 'e'ซึ่งเป็นe
  • eหันไป'e' | 'l'หรือ101 | 108ซึ่งเป็น109หรือm
  • ครั้งแรกlก็หันไป101 | 108หรือm
  • lหันไปทางที่สอง108 | 111ซึ่งก็คือ111หรือo
  • oหันไป108 | \0หรือl

อินพุต

  • ประโยคประกอบด้วย แต่เพียงผู้เดียวของตัวอักขระ ASCII ในรูปแบบที่เหมาะสมใด
  • ประโยคอาจมีจุดเว้นวรรคและเครื่องหมายวรรคตอนอื่น ๆ แต่จะมีเพียงหนึ่งบรรทัดเท่านั้น
  • ประโยคจะมีความยาวอย่างน้อยสามตัวอักษร

เอาท์พุต

  • ตัวเลขที่ได้ขึ้นอยู่กับกฎที่อธิบายไว้ข้างต้นส่งคืนเป็นสตริงหรือเอาต์พุต

กฎระเบียบ

  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ตัวอย่าง

อินพุตในหนึ่งบรรทัดเอาต์พุตต่อไปนี้ บรรทัดว่างแยกตัวอย่าง

Hello
emmol

Hello, World!
emmol, ww~ved

PPCG
PSWG

Programming Puzzles and Code Golf
r wogsmmoonpuu ~ meannncoooeggonl

abcdefghijklmnopqrstuvwxyz
bcfefgnijknmno~qrsvuvw~yzz

!abcdefghijklmnopqrstuvwxyz
aaccgeggoikkomoo qsswuww yy

Test 123 with odd characters. R@*SKA0z8d862
euutu133www|todddchizsscguwssr`jS{SK{z~|v66

3
นี่เป็นตัวเลขหรือไม่ ดูเหมือนจะไม่ใช่วิธีถอดรหัสมัน
ท่อ

เนื่องจากการoเปลี่ยนแปลงlในตัวอย่างแรกฉันค่อนข้างมั่นใจว่ารายละเอียดของคุณจะทำให้มั่นใจว่าตัวอย่างแรกoจะไม่เปลี่ยนแปลงlในตัวอย่างที่สอง มันควรเปลี่ยน'l' | ','เป็นอะไรใช่มั้ย
Greg Martin

@pipe ใช่ ไม่ใช่ "ตัวเลข" แต่ไม่แน่ใจว่าจะเรียกมันว่าอะไร มันไม่ใช่แฮชจริง ๆ เช่นกัน ในแท็กที่เรามี "cipher" ดูใกล้เคียงที่สุดนั่นคือสิ่งที่ฉันไปด้วย
AdmBorkBork

@GregMartin ใช่มันไป'l' | ','ซึ่งเป็น108 | 44 --> 1101111 | 0101100ซึ่งจะกลายเป็นซึ่งเป็น108 ที่เกิดขึ้นกับสายขึ้นด้วยจึงมีไม่มีการเปลี่ยนแปลงเมื่อไบนารีหรือจะเกิดขึ้น l,l
AdmBorkBork

โอ้จริง ๆ มันเป็นเลขฐานสอง ... ฉันคิดว่าเลขฐานสอง -XOR ขอบคุณสำหรับการชี้แจง ในทางตรงกันข้ามนี่พูดถึงการสังเกตของไปป์มากขึ้นว่า "รหัส" นี้ไม่สามารถถอดรหัสได้จริงเท่าที่ฉันจะบอกได้
Greg Martin

คำตอบ:



4

Perl, 63 62 ไบต์

รวมถึง +4 สำหรับ -lp

ให้อินพุตกับ STDIN

oddeven.pl:

#!/usr/bin/perl -lp
s%.%(--$|?$n|$':$&|(ord$&&1?$n:$'))&($n=$&,~v0)%eg;y;\x7f-\xff; ;

สิ่งนี้ใช้งานได้ตามที่แสดง แต่เพื่อให้ได้คะแนนที่อ้างสิทธิ์จะต้องใส่ในไฟล์ที่ไม่มี Final ;และ newline และ\xhhEscape จะต้องถูกแทนที่ด้วยค่าตามตัวอักษร คุณสามารถทำได้โดยใส่รหัสด้านบนในไฟล์และเรียกใช้:

perl -0pi -e 's/\\x(..)/chr hex $1/eg;s/;\n$//' oddeven.pl

3

Python 2, 138 131 ไบต์

s="\0%s\0"%input();r=''
for i in range(len(s)-2):L,M,R=map(ord,s[i:i+3]);a=i%2and[R,L][M%2]|M or L|R;r+=chr(a*(a<127)or 32)
print r

ลองออนไลน์ (มีกรณีทดสอบทั้งหมด)

หักกอล์ฟ:

def f(s):
    s="\0%s\0"%s
    r=''
    for i in range(1,len(s)-1):
        if i%2: # even (parity is changed by adding \x00 to the front)
            a=ord(s[i-1]) | ord(s[i+1])
        else:   # odd
            a=ord(s[i])
            if a%2: # odd
                a|=ord(s[i-1])
            else:   # even
                a|=ord(s[i+1])
        r+=chr(a if a<127 else 32)
    print r

ลองออนไลน์ (ungolfed)

ฉันเพิ่มลง\x00ในทั้งสองด้านของสตริงเพื่อที่ฉันจะได้ไม่ต้องกังวลเกี่ยวกับสิ่งนั้นในระหว่างบิตหรือในระดับที่เหมาะสม ฉันวนรอบอักขระดั้งเดิมของสายอักขระการดำเนินการระดับบิตและเพิ่มลงในผลลัพธ์ตามกฎสำหรับพาริตี้


แดงฉันอิจฉาสิ่งนั้น|=... เทียบเท่าใน PowerShell จะเป็น$a=$a-bor$b
AdmBorkBork

@ TimmyD ฉันไม่ได้ใช้จริงๆ แต่ใช่ มันดีนะ. ถ้ามีเพียงไพ ธ อนเท่านั้นที่a?b:cชอบ JS
mbomb007

คุณสามารถแทนที่ได้หาก% 2: # คี่ a | = ord (s [i-1]) อื่น ๆ : # แม้แต่ a | = ord (s [i + 1]) ด้วย | | ord (s [i + 1- 2 * (a% 2)])
NoSeatbelts

@NoSeatbelts นั่นคือรหัสที่ไม่ได้รับเกียรติของฉันซึ่งจะถูกปล่อยให้เป็นไปตามวัตถุประสงค์การอ่าน การส่ง golfed เป็นโปรแกรมด้านบน
mbomb007

2

C - 101 ไบต์

i,k;f(char*p){for(i=0;*p;++p,++i)putchar((k=i&1?*p&1?*p|p[-1]:*p|p[1]:i?p[-1]|p[1]:p[1])<127?k:' ');}

เราไม่จำเป็นต้องตรวจสอบว่ามันเป็นรายการสุดท้ายในสตริงเพราะสตริงใน C ถูกยกเลิกด้วยค่า Null

คำอธิบาย

ค่อนข้างง่าย:

ใช้ & 1 เพื่อทดสอบนิพจน์คี่ / คู่และไตรภาคเพื่อแทนที่ถ้า / elses เพิ่มอักขระ char * p เพื่อลดจำนวนวงเล็บที่ต้องการ


คำตอบที่ดี - ยินดีต้อนรับสู่ PPCG!
AdmBorkBork

2

Mathematica, 152 ไบต์

FromCharacterCode[BitOr@@Which[OddQ@Max@#2,#~Drop~{2},OddQ@#[[2]],Most@#,True,Rest@#]/._?(#>126&)->32&~MapIndexed~Partition[ToCharacterCode@#,3,1,2,0]]&

คำอธิบาย

ToCharacterCode@#

แปลงสตริงเป็นรหัส ASCII

Partition[...,3,1,2,0]

แบ่งพาร์ติชันรหัส ASCII ให้มีความยาว 3, ออฟเซ็ต 1 พาร์ติชั่น, พร้อมเบาะ 0s

...~MapIndexed~...

ใช้ฟังก์ชันสำหรับแต่ละพาร์ติชัน

Which[...]

If...else if... elseในMathematica

OddQ@Max@#2

ตรวจสอบว่าดัชนี (# 2) เป็นเลขคี่หรือไม่ ( Maxสำหรับแบน); ตั้งแต่ดัชนีMathematicaเริ่มต้นที่ 1 ฉันใช้OddQที่นี่ไม่ใช่EvenQ

Drop[#,{2}]

รับรหัส ASCII ของเพื่อนบ้านทางซ้ายและขวา

OddQ@#[[2]]

ตรวจสอบว่ารหัส ASCII ของตัวละครที่เกี่ยวข้องเป็นคี่

Most@#

รับรหัส ASCII ของตัวละครและเพื่อนบ้านด้านซ้าย

Rest@#

รับรหัส ASCII ของตัวละครและเพื่อนบ้านที่เหมาะสม

BitOr

ใช้หรือดำเนินการ

/._?(#>126&)->32

แทนที่ตัวเลขทั้งหมดที่มากกว่า 126 ด้วย 32 (เว้นวรรค)

FromCharacterCode

แปลงรหัส ASCII กลับเป็นอักขระและเข้าร่วม


ยินดีต้อนรับสู่ PPCG! คุณสามารถเพิ่มคำอธิบายเล็กน้อยสำหรับผู้คน (เช่นฉัน) ที่ไม่เชี่ยวชาญใน Mathematica ได้หรือไม่? นอกจากนี้โปรดตรวจสอบเคล็ดลับสำหรับการเล่นกอล์ฟใน Mathematicaสำหรับคำแนะนำ เพลิดเพลินไปกับการพักผ่อนของคุณ!
AdmBorkBork

1
การปรับปรุงบางอย่าง: การรับและส่งคืนรายการอักขระแทนที่จะเป็นวัตถุสตริงจริงนั้นสมบูรณ์และบันทึกได้มากในFrom/ToCharacterCodeฟังก์ชั่นเหล่านั้น จากนั้นก็จะมีลักษณะเช่นคุณสามารถใช้สัญกรณ์มัด:Drop #~Drop~{2}และดูเหมือนว่าคุณกำลังนำBitOrไปใช้กับผลลัพธ์ที่เป็นไปได้ทั้งหมดWhichดังนั้นทำไมไม่ใช้มันหลังจากนั้นเพียงครั้งเดียว?
Martin Ender

2

Ruby 133 128 108 106 106 ไบต์

จอร์แดนช่วยฉันประหยัด 20 ไบต์และ cia_rana ช่วยฉันประหยัด 2 ไบต์ :)

->s{p s[-i=-1]+s.bytes.each_cons(3).map{|x,y,z|i+=1;a=i%2>0?x|z :y%2>0?y|x :y|z;a>126?' ':a.chr}*""+s[-2]}

s ถูกใช้เป็นสตริงอินพุต

ตัวอย่างผลลัพธ์ด้วยs="Test 123 with odd characters. R@*SKA0z8d862":

"euutu133www|todddchizsscguwssr`jS{SK{z~|v66"

คำอธิบาย

รหัสข้างต้นอ่านไม่ได้มากดังนั้นนี่คือคำอธิบาย รหัสเป็นประเภทแฮ็คฉันเลิกใหม่เพื่อทับทิมดังนั้นฉันเดิมพันว่ามีวิธีที่สั้นกว่าในการทำสิ่งนี้ :)

b=s[1] # for the first character we always use the right neighbour
       # because `\0 | x` will always return x any way. 0 is the
       # left neighbour and x is the right neigbour
s.bytes.each_cons(3).with_index{|c,i| # oh boy, first we convert the string to ascii with each_byte
                                          # we then traverse the resulting array with three elements at
                                          # a time (so for example if s equals "Hello", c will be equal
                                          # to [72, 101, 108])
  if (i+1) % 2 < 1 # if the middle letter (which is considered our current letter) is even
    a = c[0] | c[2] # we use the result of binary-or of its neighbours
  else
    if c[1] % 2 > 0 # if the code of the current letter is odd
      a = c[1] | c[0] # we use the result of binary-or of itself and its left neighbour
    else
      a = c[1] | c[2] # we use the result of binary-or of itself and its right neighbour
    end
  end
  if a>126
    b<<' ' # if the result we use is greater or equal to 127 we use a space
  else
    b<<a.chr # convert the a ascii value back to a character
  end
}
p b+s[-2] # same as the first comment but now we know that x | \0 will always be x
          # this time x is the last characters left neighbour

ฉันค่อนข้างมั่นใจว่าเอาต์พุตจะต้องอยู่ในหนึ่งบรรทัดเนื่องจากอินพุตยัง
mbomb007

@ mbomb007 คนเกียจคร้านฉันต้องใช้printแทนp: p
Linus

@ TimmyD โอ้ดังนั้นฉันไม่สามารถพิมพ์ไปยังเอาท์พุทในเวลาต่าง ๆ ได้อย่างไร
Linus

@ TimmyD ตกลงดังนั้นข้างต้นได้รับอนุญาต? ตอนนี้มันพิมพ์ทุกอย่างในบรรทัดเดียว
ไลนัส

1
คุณสามารถเขียนตามที่แสดงด้านล่าง:->s{p s[-i=-1]+s.bytes.each_cons(3).map{|x,y,z|i+=1;a=i%2>0?x|z :y%2>0?y|x :y|z;a>126?' ':a.chr}*""+s[-2]}
cia_rana

1

J, 42 ไบต์

4:u:3({.OR{:)`((2|1&{){2:OR/\|.)\0,~0,3&u:

ใช้ทรัพย์สินที่คำกริยาใน J สามารถนำมาใช้ในแฟชั่นสลับใช้อาการนามสำหรับคำวิเศษณ์บางอย่างเช่นมัด`\

การใช้

   f =: 4:u:3({.OR{:)`((2|1&{){2:OR/\|.)\0,~0,3&u:
   f 'Hello'
emmol
   f 'Hello, World!'
emmol,ww~ved
   f 'PPCG'
PSWG
   f 'Programming Puzzles and Code Golf'
rwogsmmoonpuu~meannncoooeggonl
   f 'abcdefghijklmnopqrstuvwxyz'
bcfefgnijknmno~qrsvuvw~yzz
   f '!abcdefghijklmnopqrstuvwxyz'
aaccgeggoikkomooqsswuwwyy
   f 'Test 123 with odd characters. R@*SKA0z8d862'
euutu133www|todddchizsscguwssr`jS{SK{z~|v66

คำอธิบาย

4:u:3({.OR{:)`((2|1&{){2:OR/\|.)\0,~0,3&u:  Input: string S
                                      3&u:  Convert each char to an ordinal
                                    0,      Prepend 0
                                 0,~        Append 0
    3                           \           For each slice of size 3
     (      )`                                For the first slice (even-index)
          {:                                    Get the tail
      {.                                        Get the head
        OR                                      Bitwise OR the head and tail
             `(                )              For the second slice (odd-index)
                             |.                 Reverse the slice
                       2:   \                   For each pair
                         OR/                      Reduce using bitwise OR
                  1&{                           Get the middle value of the slice
                2|                              Take it modulo 2
                      {                         Index into the bitwise OR pairs and select
                                              Repeat cyclically for the remaining slices
4:u:                                        Convert each ordinal back to a char and return

1

JavaScript (ES6), 125 118 114 ไบต์

ความยาวที่น่าอาย แต่charCodeAtและString.fromCharCodeอย่างเดียวคือ 29 ไบต์ : - /

s=>[...s].map((_,i)=>String.fromCharCode((x=(C=i=>s.charCodeAt(i))((i-1)|1)|C(i+1-2*(C(i)&i&1)))>126?32:x)).join``

มันทำงานอย่างไร

อักขระแต่ละตัวที่ตำแหน่งiถูกแปลด้วยสูตรต่อไปนี้ซึ่งครอบคลุมกฎทั้งหมดในครั้งเดียว:

C((i - 1) | 1) | C(i + 1 - 2 * (C(i) & i & 1))

โดยที่C(n)ส่งคืนรหัส ASCII ของอักขระ n-th ของสตริงอินพุต

การสาธิต

let f =
    
s=>[...s].map((_,i)=>String.fromCharCode((x=(C=i=>s.charCodeAt(i))((i-1)|1)|C(i+1-2*(C(i)&i&1)))>126?32:x)).join``

console.log(f("Hello"));
console.log(f("Hello, World!"));
console.log(f("PPCG"));
console.log(f("Programming Puzzles and Code Golf"));
console.log(f("abcdefghijklmnopqrstuvwxyz"));
console.log(f("!abcdefghijklmnopqrstuvwxyz"));
console.log(f("Test 123 with odd characters. R@*SKA0z8d862"));



1

C #, 145 ไบต์

s=>{var r=s[1]+"";int i=1,l=s.Length,c;for(;i<l;i++){c=i>l-2?0:s[i+1];c=i%2<1?s[i-1]|c:s[i]|(s[i]%2>0?s[i-1]:c);r+=c>'~'?' ':(char)c;}return r;};

โปรแกรมเต็มรูปแบบด้วยวิธี ungolfed และกรณีทดสอบ:

using System;

namespace ASCIIOddEvenCipher
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string,string>f= s=>
            {
                var r = s[1] + "";
                int i = 1, l = s.Length, c;
                for(;i < l; i++)
                {
                    c = i>l-2 ? 0 : s[i+1];
                    c = i%2<1 ? s[i-1]|c : s[i]|(s[i]%2>0 ? s[i-1] : c);
                    r += c > '~' ? ' ' : (char)c;
                }
                return r;
            };

            //test cases:
            Console.WriteLine(f("Hello"));  //emmol
            Console.WriteLine(f("Hello, World!"));  //emmol, ww~ved
            Console.WriteLine(f("PPCG"));   //PSWG
            Console.WriteLine(f("Programming Puzzles and Code Golf"));  //r wogsmmoonpuu ~ meannncoooeggonl
            Console.WriteLine(f("abcdefghijklmnopqrstuvwxyz")); //bcfefgnijknmno~qrsvuvw~yzz
            Console.WriteLine(f("!abcdefghijklmnopqrstuvwxyz"));    //aaccgeggoikkomoo qsswuww yy
            Console.WriteLine(f("Test 123 with odd characters. R@*SKA0z8d862"));    //euutu133www|todddchizsscguwssr`jS{SK{z~|v66
        }
    }
}

สิ่งนี้กลายเป็นนานกว่าที่ฉันคิด ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.