चलो कुछ "enciph5r47g" करते हैं


35

यह "कुछ ख़राब कर देना" का विलोम है


इस चुनौती में, अपने काम के लिए एक स्ट्रिंग encipher है। सौभाग्य से, एल्गोरिथ्म बहुत सरल है: बाएं से दाएं पढ़ना, प्रत्येक विशिष्ट लेखन चरित्र (ASCII रेंज 32-126) को एक संख्या N (0-9) द्वारा प्रतिस्थापित किया जाना चाहिए ताकि यह इंगित किया जा सके कि यह चरित्र N + 1 के समान है। इससे पहले की स्थिति। अपवाद तब होता है जब चरित्र मूल स्ट्रिंग में पिछले 10 पदों के भीतर प्रकट नहीं होता है। उस स्थिति में, आपको बस चरित्र को फिर से प्रिंट करना चाहिए। प्रभावी रूप से, आपको मूल चुनौती से ऑपरेशन को उलटने में सक्षम होना चाहिए।

उदाहरण

इनपुट स्ट्रिंग "Programming"को इस तरह एन्कोड किया जाएगा:

उदाहरण 1

इसलिए, अपेक्षित आउटपुट है "Prog2am0in6"

स्पष्टीकरण और नियम

  • इनपुट स्ट्रिंग में विशेष रूप से 32 - 126 रेंज में ASCII वर्ण होंगे। आप मान सकते हैं कि यह कभी खाली नहीं होगा।
  • मूल स्ट्रिंग की गारंटी है कि इसमें कोई अंक नहीं है।
  • एक बार एक चरित्र एन्कोड किया गया है, यह बदले में बाद के अंक द्वारा संदर्भित किया जा सकता है। उदाहरण के लिए,"alpaca" एन्कोड किया जाना चाहिए "alp2c1"
  • संदर्भ स्ट्रिंग के आसपास कभी नहीं लिपटेंगे: केवल पिछले वर्णों को संदर्भित किया जा सकता है।
  • आप या तो एक पूर्ण कार्यक्रम या एक फ़ंक्शन लिख सकते हैं, जो या तो प्रिंट करता है या परिणाम को आउटपुट करता है।
  • यह कोड गोल्फ है, इसलिए बाइट्स जीत में सबसे छोटा जवाब है।
  • मानक खामियों को मना किया जाता है।

परीक्षण के मामलों

Input : abcd
Output: abcd

Input : aaaa
Output: a000

Input : banana
Output: ban111

Input : Hello World!
Output: Hel0o W2r5d!

Input : this is a test
Output: this 222a19e52

Input : golfing is good for you
Output: golfin5 3s24o0d4f3r3y3u

Input : Programming Puzzles & Code Golf
Output: Prog2am0in6 Puz0les7&1Cod74G4lf

Input : Replicants are like any other machine. They're either a benefit or a hazard.
Output: Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d.

6
मैं देखता हूं कि आपके परीक्षण के मामले हमेशा किसी भी प्रतिस्थापन के लिए संभव सबसे कम अंकों का उपयोग करते हैं। क्या यह आवश्यक व्यवहार है, या हम एक से अधिक संभावना होने पर उच्च अंकों का भी उपयोग कर सकते हैं?
सिंह

@Leo आप किसी भी एक अंक का उपयोग कर सकते हैं जिसे आप 0-9 तक चाहते हैं जब तक यह वैध है।
इंजीनियर टोस्ट

यह मूव-टू-फ्रंट एनकोडर की तरह है, बिना हिलने के अलावा :)
पाइप

जवाबों:


6

05AB1E , 20 19 18 बाइट्स

-2 एमिग्ना को धन्यवाद

õ¹vDyåiDykëy}?yìT£

इसे ऑनलाइन आज़माएं!

õ                  # Push an empty string
 ¹v y              # For each character in input
   D               # Duplicate the string on the stack (call this S)
     åi            # If this character is in S
       Dyk         #   Push the index of that that character 
          ë }      # Else
           y       #   Push the character 
             ?     # Print without newline
              yì   # Prepend this character to S
                T£ # Remove all but the first 10 elements from S

मुझे लगता है कि यह भी )¹vDyåiDykëy}?y¸ìT£काम करता है।
एमिग्ना

दरअसल, मेरा जवाब आपके साथ संयोजन के õIvDyåiDykëy}?yìT£लिए 18 :)
Emigna

@Emigna उस के साथ तुम्हारा अद्यतन करने के लिए स्वतंत्र महसूस :) :)
रिले

अगर आपके जवाब के लिए मैं ऐसा नहीं सोचता, तो आपके पास यह होना चाहिए। बहुत बढ़िया!
एमिग्ना

@Eignign मुझे लगता है कि उचित है। धन्यवाद!
रिले

12

रेटिना , 24 23 बाइट्स

(.)(?<=\1(.{0,9}).)
$.2

इसे ऑनलाइन आज़माएं!

एक काफी सरल रेगेक्स प्रतिस्थापन। हम प्रत्येक वर्ण से मेल खाते हैं और इससे पहले 0-9 वर्णों की एक प्रति खोजने का प्रयास करते हैं। यदि हमें यह पता चलता है, तो हम उस चरित्र को उस वर्ण से बदल देते हैं, जिसे कॉपी करने के लिए हमें मिलना था।

परिणाम परीक्षण मामलों से काफी मेल नहीं खाते हैं, क्योंकि यह सबसे छोटा संभव के बजाय सबसे बड़ा संभव अंक का उपयोग करता है।


4
चर लंबाई देखो-पीछे धोखा है: पी
दादा

8
@ दादा चर-लंबाई दिखावे का तरीका ज्ञानोदय है।
मार्टिन एंडर

अफसोस की बात यह है ... यदि आप ऊब गए हैं, तो उन्हें पर्ल के अंदर लागू करने के लिए स्वतंत्र महसूस करें!
दादा

मूल कार्य पर ओपी की टिप्पणी के अनुसार, "आप किसी भी एक अंक का उपयोग कर सकते हैं जिसे आप 0-9 तक चाहते हैं जब तक यह वैध है।" ... इतना बड़ा संभव वैध होना चाहिए
डॉकटोर जे

@DoktorJ हाँ, मैंने इसे ओपी के स्पष्टीकरण के बाद बदल दिया।
मार्टिन एंडर

8

जावास्क्रिप्ट (ईएस 6), 74 57 54 बाइट्स

के p=/./gबजाय शानदार p={}(नील से प्रेरित) के साथ ETHproductions के लिए धन्यवाद 3 बाइट्स सहेजा गया

s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-11?~i:c)

परीक्षण के मामलों


जैसा कि स्ट्रिंग में एक अंक नहीं होने की गारंटी है, क्या आप sइसके बजाय उपयोग कर सकते हैं p?
नील

(मैं अपने मूल findसंस्करण का उपयोग करने में सक्षम था lastIndexOf, जो थोड़ा आश्चर्य की बात है कि यह 11 अक्षर लंबा है ...)
नील

@ अभी मैं एक कंप्यूटर के सामने नहीं हूँ, लेकिन मुझे नहीं लगता कि जेएस तार अपरिवर्तनीय हैं क्योंकि यह काम करेगा।
अरनौलद

2
मैं पुष्टि कर सकता हूं कि स्ट्रिंग शाब्दिक पर गुण सेट करना काम नहीं करता है। लेकिन ... ऐसा लगता है कि यह रेगेक्स के साथ काम करता है, इसलिए मुझे लगता है कि आप संभवतः s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-10?~i:c)3 बाइट्स बचा सकते हैं ।
ETHproductions

1
@ आपको वास्तव में नहीं पता कि यहां क्या हुआ था, लेकिन यह पता चला है कि मैंने अपने अंतिम संपादन पर सभी ब्राउज़रों के लिए एक बग पेश किया था । यह अब तय हो गया है। ध्यान देने के लिए धन्यवाद!
अरनुलद

7

हास्केल , 72 66 बाइट्स

6 बाइट गोल्फिंग के लिए लकोनी के लिए धन्यवाद !

(a:r)%s=last(a:[n|(n,b)<-zip['0'..'9']s,b==a]):r%(a:s)
e%s=e
(%"")

इसे ऑनलाइन आज़माएं!

फ़ंक्शन %अपने दूसरे तर्क में आंशिक रूप से संसाधित स्ट्रिंग को रिवर्स में रखता है, इसलिए यह इस स्ट्रिंग के पहले 10 तत्वों की खोज करने में सक्षम है जो चरित्र की जांच कर रहा है। सबमिशन में अनाम फ़ंक्शन होता है (%"")जो पिछले फ़ंक्शन को इसके दूसरे तर्क के रूप में खाली स्ट्रिंग के साथ कहता है।


f(a:s)=f s++(last$[a]:[show n|(n,b)<-zip[0..9]s,b==a])दो बाइट बचाता है।
लकोनी

रुको, f(a:s)=f s++[last$a:[n|(n,b)<-zip['0'..'9']s,b==a]]और भी बचाता है।
लाईकोनी

उपयोग करने के बजाए reverseपलटने से एक और बाइट बचती है: इसे ऑनलाइन आज़माएं!
लकोनी

@Laikoni धन्यवाद, यह अद्भुत है!
सिंह


3

पर्ल ५ , 36 बाइट्स

कोड + -pध्वज के 35 बाइट्स ।

s/(\D)(.{0,9})\K\1/length$2/e&&redo

इसे ऑनलाइन आज़माएं!

कुछ स्पष्टीकरण:
लक्ष्य एक गैर-अंक वाले चरित्र को बदलना है ( \Dलेकिन यह \1मेरे regex में पीछे हटने के अनुरूप है ) जो कि 10 से कम वर्णों से पहले ( .{0,9}) और एक ही वर्ण ( (\D)... \1) .{0,9}समूह की लंबाई से है ( length$2)। और redoजबकि पात्रों को प्रतिस्थापित किया जाता है।


जाहिरा तौर पर .*आवश्यक नहीं है, प्रतिस्थापित अंक से पहले रेंज में कोई भी वैध चार ठीक है।
कॉल्व्स

@ConnorLSW Yup, मैंने अभी-अभी चुनौती के अपडेट को देखा और अपने उत्तर को संशोधित किया, इसे इंगित करने के लिए धन्यवाद।
दादा


3

जाप , 18 बाइट्स

£¯Y w bX s r"..+"X

इसे ऑनलाइन आज़माएं!

व्याख्या

£   ¯  Y w bX s r"..+"X
mXY{s0,Y w bX s r"..+"X}
                          // Implicit: U = input string
mXY{                   }  // Replace each char X and index Y in U by this function:
    s0,Y                  //   Take U.slice(0,Y), the part of U before this char.
         w bX             //   Reverse, and find the first index of X in the result.
                          //   This gives how far back this char last appeared, -1 if never.
              s           //   Convert the result to a string.
                r"..+"X   //   Replace all matches of /..+/ in the result with X.
                          //   If the index is -1 or greater than 9, this will revert to X.
                          // Implicit: output result of last expression


2

05AB1E , 20 बाइट्स

õIv¹N£RT£©yåi®ykëy}J

इसे ऑनलाइन आज़माएं!

व्याख्या

õ                     # push an empty string
 Iv                   # for each [index,char] [N,y] in input
   ¹N£                # push the first N characters of input
      R               # reverse
       T£             # take the first 10 characters of this string
         ©            # save a copy in register
          yåi         # if y is in this string
             ®yk      #   push the index of y in the string in register
                ë     # else 
                 y    #   push y
                  }   # end if
                   J  # join stack as one string


2

सी (tcc) , 113 बाइट्स

चूंकि फ़ंक्शन एक इनपुट स्ट्रिंग की प्रतिलिपि बनाता है, इसलिए इनपुट का अधिकतम आकार 98 वर्ण (सबसे लंबे समय तक परीक्षण इनपुट फिट करने के लिए पर्याप्त से अधिक) है। बेशक, इसे किसी अन्य मूल्य में बदला जा सकता है।

i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j;j=-1;}

इसे ऑनलाइन आज़माएं!

संपादित करें

-15 बाइट्स। धन्यवाद जोहान डू टिट


आह! 98 वर्ण तक इनपुट सीमित करें और अपने आप को एक बाइट बचाएं!
पाइप

अच्छा समाधान है, लेकिन आप एक और 15 बाइट्स बचा सकते हैं: i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j,j=-1;}
जोहान डू टिट

@JohanduToit धन्यवाद! मेरा एक सवाल है। लूप की स्थिति के रूप में वास्तव में s [i] कैसे काम करता है? मैंने इसे इस वेबसाइट पर अन्य लोगों के उत्तरों में बहुत बार देखा है।
मैक्सिम मिखायलोव

@ मोम लॉनबॉय। आपके पास मूल रूप से निम्नलिखित थे: 's [i] ^' 0 '' जो शॉर्टहैंड के लिए है [i]! = '\' 0 ''। '\ 0' वर्ण शाब्दिक शून्य के बराबर है इसलिए आप इसे इस तरह से लिख सकते हैं: 's [i]! = 0'। यदि केवल C में स्टेटमेंट परीक्षण करता है यदि मान शून्य या गैर-शून्य का मूल्यांकन करता है तो '! = 0' आवश्यक नहीं है।
जोहान डू टिट


2

जावा 7, 102 101 बाइट्स

void a(char[]a){for(int b=a.length,c;--b>0;)for(c=b;c-->0&c+11>b;)if(a[c]==a[b])a[b]=(char)(b-c+47);}

इसे ऑनलाइन आज़माएं!

केविन क्रूज़सेन के लिए धन्यवाद । मुझे हमेशा गो-टू ऑपरेटर का उपयोग करने का बहाना मिलता है।


क्यों --c>=0? आप c-->0एक बाइट को बचाने के लिए इसे बदल सकते हैं ।
केविन क्रूज़सेन

@ केविनक्रूजसेन मेरे सिर में किसी तरह यह था कि मुझे पूर्वनिर्धारण की आवश्यकता थी अन्यथा वास्तविक गणना गलत होगी ... अच्छा पकड़!
प्रहार

1

MATL, 31 30 बाइट्स

&=R"X@@f-t10<)l_)t?qV}xGX@)]&h

MATL ऑनलाइन पर यह कोशिश करो !

व्याख्या

        % Implicitly grab input as a string
&=      % Perform element-wise comparison with automatic broadcasting.
R       % Take the upper-triangular part of the matrix and set everything else to zero
"       % For each column in this matrix
X@      % Push the index of the row to the stack
@f      % Find the indices of the 1's in the row. The indices are always sorted in
        % increasing order
-       % Subtract the index of the row. This result in an array that is [..., 0] where
        % there is always a 0 because each letter is equal to itself and then the ...
        % indicates the index distances to the same letters
t10<)   % Discard the index differences that are > 9
l_)     % Grab the next to last index which is going to be the smallest value. If the index
        % array only contains [0], then modular indexing will grab that zero
t?      % See if this is non-zero...
  qV    % Subtract 1 and convert to a string
}       % If there were no previous matching values
  x     % Delete the item from the stack
  GX@)  % Push the current character
]       % End of if statement
&h      % Horizontally concatenate the entire stack
        % Implicit end of for loop and implicit display

आप थोड़ा दूर हो सकता है, लेकिन मैं सुपर जहां नहीं बता सकता। इनपुट this is a testपैदावार के this 222a1te52बजाय this 222a19e52। दूसरे tमें परिवर्तित नहीं किया गया है 9
इंजीनियर टोस्ट

@EngineerToast Haha धन्यवाद मैं एक नजर मार लूगां।
स्वेअर

1

PHP, 104 बाइट्स

आगे का समाधान

for($i=0;$i<strlen($a=&$argn);$f[$l]=$i++)$a[$i]=is_int($f[$l=$a[$i]])&($c=$i-$f[$l]-1)<10?$c:$l;echo$a;

पीछे की ओर हल

ऑनलाइन संस्करण

PHP, 111 बाइट्स

for(;++$i<$l=strlen($a=&$argn);)!is_int($t=strrpos($argn,$a[-$i],-$i-1))?:($p=$l-$i-$t-1)>9?:$a[-$i]=$p;echo$a;

PHP, 112 बाइट्स

for(;++$i<$l=strlen($a=&$argn);)if(false!==$t=strrpos($argn,$a[-$i],-$i-1))($p=$l-$i-$t-1)>9?:$a[-$i]=$p;echo$a;

ऑनलाइन संस्करण


1

REXX, 124 125 बाइट्स

a=arg(1)
b=a
do n=1 to length(a)
  m=n-1
  c=substr(a,n,1)
  s=lastpos(c,left(a,m))
  if s>0&m-s<=9 then b=overlay(m-s,b,n)
  end
say b

आप थोड़ा हटकर हो सकते हैं। मैं REXX नहीं जानता, लेकिन मुझे लगता है कि त्रुटि लाइन 7 में है जहां यह हैs<9 बजाय s<10या है s<=9। इनपुट this is a testपैदावार के this 222a1te52बजाय this 222a19e52। दूसरे tमें परिवर्तित नहीं किया गया है 9इसे ऑनलाइन आज़माएं
इंजीनियर टोस्ट

धन्यवाद, यह एक बाइट दाढ़ी बनाने की एक मूर्खतापूर्ण कोशिश थी। कोड तय किया गया है।
idrougge

1

सी (जीसीसी) , 117 103 बाइट्स

i,j;f(char*s){for(i=strlen(s)-1;s[i];i--)for(j=i-1;s[j]&&i-j<11;j--)if(s[i]==s[j]){s[i]=47+i-j;break;}}

इसे ऑनलाइन आज़माएं!

स्ट्रिंग के बिना 103 बाइट्स। आयात, w / चेतावनी का काम करता है। अगर यह नियमों के खिलाफ है, तो मैं इसे खींचूंगा

सुंदर कोड:

i,j;
f(char *s) {
    // Chomp backwards down the string
    for(i=strlen(s)-1; s[i]; i--)
        // for every char, try to match the previous 10
        for(j=i-1; s[j] && i-j < 11; j--)
            // If there's a match, encode it ('0' + (i-j))
            if (s[i] == s[j]) {
                s[i] = 47+i-j;
                break;
            }
}

संपादन:

  • एलएलवीएम से बदलकर निहित करने की अनुमति देने के लिए मैंने i, j घोषणा की, लिबास आयात को हटा दिया।
  • अनुपालन के लिए जोड़ा समारोह आवरण

सुझाना (i=strlen(s);s[--i];)इसके बजाय(i=strlen(s)-1;s[i];i--)
छत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.