ASCII विषम / यहां तक ​​कि सिफर


13

हम नीचे pseudocode के माध्यम से 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' | ',', जो कुछ भी है, ठीक है?
ग्रेग मार्टिन

@ हां हां। वास्तव में "सिफर" नहीं है, लेकिन वास्तव में निश्चित नहीं है कि इसे क्या कहा जाए। यह वास्तव में हैश नहीं है। हमें मिले टैग में से, "सिफर" निकटतम लग रहा था, इसलिए मैं यही गया।
AdmBorkBork

@GregMartin हाँ, यह जाता है 'l' | ',', जो है 108 | 44 --> 1101111 | 0101100, जो बन जाता है 108, जो है l। के ,साथ लाइन अप करने के लिए होता है l, इसलिए बाइनरी-या होने पर कोई बदलाव नहीं होता है।
AdmBorkBork

ओह, यह वास्तव में बाइनरी-या है ... मैं बाइनरी-एक्सओआर सोच रहा था। स्पष्टीकरण के लिए धन्यवाद। दूसरी ओर, यह पाइप के अवलोकन के लिए और भी अधिक बोलता है कि यह "सिफर" वास्तव में विघटित नहीं हो सकता है, जहां तक ​​मैं बता सकता हूं।
ग्रेग मार्टिन

जवाबों:



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
पॉवरशेल के

@TimmyD मैं वास्तव में इसका उपयोग नहीं करता था, लेकिन हाँ। यह अच्छा है। यदि केवल अजगर को a?b:cजेएस पसंद था ।
mbomb007

आप प्रतिस्थापित कर सकते हैं यदि% 2: # विषम a = = ord (s [i-1]) बाकी है: # even = = ord (s [i + 1]) के साथ a = = ord (s [i + 1) | 2 * (एक% 2)])
NoSeatbelts

@NoSeatbelts यह मेरा असम्बद्ध कोड है, जिसे पठनीय उद्देश्यों के लिए छोड़ दिया जाएगा। गोल्फ जमा करना शीर्ष कार्यक्रम है।
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:' ');}

हमें यह भी जाँचने की आवश्यकता नहीं है कि क्या यह स्ट्रिंग का अंतिम आइटम है क्योंकि C में तार अशक्त हैं।

व्याख्या

बल्कि साधारण:

यदि / elses को बदलने के लिए विषम / समरूपता और तिर्यक अभिव्यक्तियों का परीक्षण करने के लिए & 1 का उपयोग करें। आवश्यक ब्रैकेट की संख्या को कम करने के लिए चार * पी बढ़ाएँ।


अच्छा जवाब - PPCG में आपका स्वागत है!
AdmBorkBork

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, ऑफसेट 1 विभाजन, गद्देदार 0s के साथ।

...~MapIndexed~...

प्रत्येक विभाजन के लिए एक फ़ंक्शन लागू करता है।

Which[...]

If...else if... elseमें Mathematica

OddQ@Max@#2

जाँचता है कि क्या सूचकांक (# 2) विषम है। ( Maxचपटे के लिए है); चूंकि मैथेमेटिका इंडेक्स 1 से शुरू होता है, इसलिए मैंने OddQयहां इस्तेमाल किया , नहींEvenQ

Drop[#,{2}]

बाएं और दाएं पड़ोसियों के ASCII कोड लेता है।

OddQ@#[[2]]

जाँचता है कि क्या संबंधित वर्ण का ASCII कोड विषम है।

Most@#

चरित्र और बाएं पड़ोसी के ASCII कोड लेता है।

Rest@#

चरित्र और सही पड़ोसी के ASCII कोड लेता है।

BitOr

लागू करता है या ऑपरेशन करता है।

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

32 (स्थान) के साथ 126 से अधिक सभी संख्याओं को बदलता है।

FromCharacterCode

ASCII कोड को वर्णों में वापस जोड़ता है और उनमें शामिल होता है।


PPCG में आपका स्वागत है! क्या आप उन लोगों (जैसे मेरे) के लिए थोड़ा स्पष्टीकरण जोड़ सकते हैं जो गणितज्ञों से अच्छी तरह से वाकिफ नहीं हैं? इसके अलावा कुछ सुझावों के लिए मैथेमेटिका में गोल्फ के लिए युक्तियों की जांच करना सुनिश्चित करें । यहां रहने का आनंद!
AdmBorkBork

1
कुछ सुधार: वास्तविक स्ट्रिंग ऑब्जेक्ट के बजाय वर्णों की सूची को स्वीकार करना और वापस करना पूरी तरह से ठीक है और उन From/ToCharacterCodeकार्यों पर बहुत बचत करता है। तो यह अपने तरह लग रहा है Dropकर सकते हैं उपयोग इन्फ़िक्स संकेतन: #~Drop~{2}। और ऐसा लगता है कि आप BitOrहर संभव उत्पादन के लिए आवेदन कर रहे हैं , Whichतो इसे बाद में और केवल एक बार ही क्यों न लागू करें?
मार्टिन एंडर

2

रूबी 133 128 108 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: पी
लाइनस

@TimmyD ओह, इसलिए मैं इसे अलग-अलग समय में आउटपुट पर प्रिंट नहीं कर सकता?
लाइनस

@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

जे, 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

जावास्क्रिप्ट (ईएस 6), 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 कोड देता है।

डेमो

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

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

पूर्ण कार्यक्रम 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
        }
    }
}

यह मेरे विचार से अधिक लंबा निकला ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.