এএসসিআইআই ওড / এমনকি সাইফার


13

আমরা ASCII বিজোড় / এমনকি সিফারটি নীচের সিউডোকোডের মাধ্যমে সংজ্ঞায়িত করব :

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' | ',', যাই হোক না কেন, ডান?
গ্রেগ মার্টিন

@ পাইপ হ্যাঁ আসলেই কোনও "সাইফার" নয় তবে এটিকে কী বলা হবে তা নিশ্চিত নয়। এটি আসলেই হ্যাশ নয় either আমরা যে ট্যাগ পেয়েছি তার মধ্যে "সাইফার" সবচেয়ে কাছের মনে হয়েছিল, তাই আমি যা করেছি।
অ্যাডমবর্কবার্ক

@ গ্রেগমার্টিন হ্যাঁ, এটি যায় 'l' | ',', যা হয় 108 | 44 --> 1101111 | 0101100, যা হয়ে যায় 108, যা l। এর সাথে ,সামঞ্জস্য হওয়ার ঘটনা ঘটে l, তাই বাইনারি-বা ঘটে তখন কোনও পরিবর্তন হয় না।
অ্যাডমবর্কবার্ক

ওহ, এটি সত্যিই বাইনারি-ওআর ... আমি বাইনারি-এক্সওআর ভাবছিলাম। সুস্পষ্ট করার জন্য ধন্যবাদ. অন্যদিকে, এটি পাইপের পর্যবেক্ষণে আরও বেশি কথা বলেছে যে যতদূর আমি বলতে পারি এই "সিফার "টিকে সত্যই ডিক্রিফাই করা যায় না।
গ্রেগ মার্টিন

উত্তর:



4

পার্ল, 63 62 বাইট

জন্য +4 অন্তর্ভুক্ত -lp

STDIN এ ইনপুট দিন

oddeven.pl:

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

এটি প্রদর্শিত হিসাবে কাজ করে, তবে দাবি করা স্কোরটি পাওয়ার জন্য এটি অবশ্যই একটি ফাইলের মধ্যে চূড়ান্ত এবং নতুন লাইন ছাড়াই রাখা উচিত ;এবং পলায়নকারীদের \xhhঅবশ্যই তাদের আক্ষরিক মান দ্বারা প্রতিস্থাপন করতে হবে। আপনি ফাইলের উপরে কোডটি রেখে এবং এটি চালিয়ে এটি করতে পারেন:

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

3

পাইথন 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

এটি অনলাইনে চেষ্টা করুন (অবরুদ্ধ)

আমি \x00স্ট্রিংয়ের উভয় পক্ষকে যুক্ত করেছি যাতে বিটওয়াইস বা আইএনজি-র সময় আমাকে সে সম্পর্কে উদ্বিগ্ন হওয়ার দরকার নেই। আমি স্ট্রিংয়ের মূল চরিত্রগুলি লুপ করি, বিটওয়াইজ ক্রিয়াকলাপগুলি করি এবং সমতার জন্য নিয়ম অনুসরণ করে ফলাফলগুলিতে তাদের যুক্ত করি।


ডাং, আমি এতে |=$a=$a-bor$b
alousর্ষা

@ টিমিমিডি আমি আসলে এটি ব্যবহার করে শেষ করি নি, তবে হ্যাঁ। এটা সুন্দর. যদি পাইথনের a?b:cজেএস পছন্দ হত।
mbomb007

আপনি যদি% 2: # বিজোড় a | = অর্ড (গুলি [i-1]) অন্য কোনওটিকে প্রতিস্থাপন করতে পারেন: # এমনকি একটি | = অর্ডার (গুলি [i + 1]) একটি | = অর্ডের সাথে [i + 1- 2 * (একটি% 2)])
নোসিয়েটবেল্টস

@ নোসিয়েটবেল্টস এটি আমার অলগল্ড কোড, যা পাঠযোগ্যতার উদ্দেশ্যে ছেড়ে দেওয়া হবে। গল্ফযুক্ত জমাটি শীর্ষ প্রোগ্রাম।
mbomb007

2

সি - 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:' ');}

এমনকি স্ট্রিংয়ের এটি শেষ আইটেম কিনা তাও আমাদের পরীক্ষা করতে হবে না কারণ সি এর স্ট্রিংগুলি নাল-সমাপ্ত হয়।

ব্যাখ্যা

বরং সহজ:

বিজোড় / সমতা এবং যদি / এলিজগুলি প্রতিস্থাপনের জন্য ত্রৈমাসিক অভিব্যক্তিগুলির পরীক্ষা করতে & 1 ব্যবহার করুন। প্রয়োজনীয় বন্ধনীগুলির সংখ্যা হ্রাস করতে চর * পি বৃদ্ধি করুন।


উত্তম উত্তর - পিপিসিজিতে আপনাকে স্বাগতম!
অ্যাডমবর্কবার্ক

2

গণিত, 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, প্যাডড 0 এস সহ 1 পার্টিশন অফসেট করে।

...~MapIndexed~...

প্রতিটি পার্টিশনের জন্য একটি ফাংশন প্রয়োগ করে।

Which[...]

If...else if... elseমধ্যে ম্যাথামেটিকাল

OddQ@Max@#2

সূচকটি (# 2) বিজোড় কিনা তা পরীক্ষা করে। ( Maxসমতল করার জন্য); যেহেতু গাণিতিক সূচকটি 1 থেকে শুরু হয়, আমি OddQএখানে ব্যবহার করি , নাEvenQ

Drop[#,{2}]

বাম এবং ডান প্রতিবেশীদের ASCII কোড নেয়।

OddQ@#[[2]]

সংশ্লিষ্ট চরিত্রের ASCII কোডটি বিজোড় কিনা তা পরীক্ষা করে।

Most@#

চরিত্র এবং বাম প্রতিবেশীর ASCII কোড নেয়।

Rest@#

চরিত্র এবং ডান প্রতিবেশীর ASCII কোড নেয়।

BitOr

প্রয়োগ বা অপারেশন।

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

32 (স্পেস) দিয়ে 126 এর চেয়ে বেশি সংখ্যক সব সংখ্যাকে প্রতিস্থাপন করে।

FromCharacterCode

এএসসিআইআই কোডটিকে অক্ষরগুলিতে ফিরে রূপান্তর করে এবং তাদের সাথে যোগ দিন।


পিপিসিজিতে আপনাকে স্বাগতম! আপনি কি এমন লোকদের (আমার মতো) যারা গাণিতিকায় পারদর্শী নন তাদের জন্য কিছুটা ব্যাখ্যা যোগ করতে পারেন? কিছু পরামর্শের জন্য ম্যাথমেটিকায় গল্ফ করার টিপসও দেখতে ভুলবেন না । উপভোগকর তোমার থাকা!
অ্যাডমবর্কবর্ক

1
কয়েকটি উন্নতি: সত্যিকারের স্ট্রিং অবজেক্টের পরিবর্তে অক্ষরের একটি তালিকা গ্রহণ করা এবং ফিরে দেওয়া পুরোপুরি ঠিক আছে এবং এই From/ToCharacterCodeফাংশনগুলিতে অনেক কিছু সঞ্চয় করে। তারপর এটি আপনার মত দেখায় Dropকরতে পারেন ব্যবহার পোতা স্বরলিপি: #~Drop~{2}। এবং মনে হচ্ছে BitOrআপনি প্রতিটি সম্ভাব্য আউটপুট প্রয়োগ করছেন Whichতাই কেন এটি পরে এবং কেবল একবার প্রয়োগ করবেন না?
মার্টিন এন্ডার

2

রুবি 133 128 108 106 বাইট

জর্ডান আমাকে 20 বাইট বাঁচাতে এবং সিয়া_রানা 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: পি
লিনাস

@ টিমমিডি ওহ, তাই আমি বিভিন্ন সময়ে আউটপুট এ এটি মুদ্রণ করতে পারি না?
লিনাস

@ টিম্মিডি ঠিক আছে, তাই উপরের অনুমোদিত? এটি এখন এক লাইনে সবকিছু মুদ্রণ করে।
লিনাস

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

জে, 42 বাইট

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

জেতে ক্রিয়াপদগুলির এমন বৈশিষ্ট্যগুলি ব্যবহার করা হয় যা ইনফিক্সের `মতো নির্দিষ্ট অ্যাডওয়্যারের জন্য জেরুআন্ড ব্যবহার করে বিকল্প ফ্যাশনে প্রয়োগ করা যেতে পারে \

ব্যবহার

   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

জাভাস্ক্রিপ্ট (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)ইনপুট স্ট্রিংয়ের n-th অক্ষরের ASCII কোডটি প্রদান করে।

ডেমো

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

পিএইচপি, 107 97 বাইট

সম্ভবত গল্ফযোগ্য

for(;$i<strlen($s=$argv[1]);$i++)echo chr(ord($s[$i-1+$i%2])|ord($s[$i+1-2*($i&ord($s[$i])&1)]));

1

সি #, 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;};

অসম্পূর্ণ পদ্ধতি এবং পরীক্ষার কেস সহ সম্পূর্ণ প্রোগ্রাম:

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.