एक विकर्ण बर्गोस-व्हीलर ट्रांसफॉर्म को हल करें


11

परिचय

इस चुनौती में आप विकर्ण बरोज़-व्हीलर ट्रांसफॉर्म को हल कर रहे होंगे। यहाँ एक सामान्य अवलोकन है कि एक विकर्ण बर्स-व्हीलर ट्रांसफ़ॉर्म क्या है। किसी संदेश को एनकोड करने के लिए, आपको पहले गारंटी देनी चाहिए कि यह लंबाई में विषम है (यानी 5, 7, 9, आदि)। तो फिर तुम एक ग्रिड बनाने के लिए, nद्वारा n, जहां nसंदेश की लंबाई है। पहली पंक्ति मूल संदेश है। उसके बाद की प्रत्येक पंक्ति उसके ऊपर की पंक्ति है, लेकिन पहले वर्ण को पीछे छोड़ते हुए 1 वर्ण छोड़ दिया गया। उदाहरण के लिए:

Hello World
ello WorldH
llo WorldHe
lo WorldHel
o WorldHell
 WorldHello
WorldHello 
orldHello W
rldHello Wo
ldHello Wor
dHello Worl

फिर आप प्रत्येक पत्र को NW पर SE विकर्ण पर ले जाते हैं और उसे एक नए तार में डालते हैं:

Hello World  H
ello WorldH  l
llo WorldHe  o
lo WorldHel  W
o WorldHell  r
 WorldHello  d
WorldHello   e
orldHello W  l
rldHello Wo  (space)
ldHello Wor  o
dHello Worl  l

आपका इनकोडिंग संदेश है HloWrdel ol। डीकोड करने के लिए, पहले एन्कोडेड संदेश की लंबाई लें, 1 जोड़ें, और 2 से विभाजित करें x। इस नंबर पर कॉल करें । अब जब हम जानते हैं x, पहले अक्षर से शुरू होता है, तो प्रत्येक अक्षर xआखिरी के बाद, चारों ओर से लूपिंग होता है। उदाहरण के लिए:

H   l   o   W   r   d   e   l     o   l
1   

Then...

H   l   o   W   r   d   e   l     o   l
1                       2

And again...

H   l   o   W   r   d   e   l     o   l
1   3                   2

Until you get...

H   l   o   W   r   d   e   l       o   l
1   3   5   7   9  11   2   4   6   8  10

अब सिर्फ पाने के लिए सही क्रम में अक्षरों को फिर से व्यवस्थित करें Hello World!

चुनौती

आपकी चुनौती या तो दो कार्यक्रमों, कार्यों, या प्रत्येक में से एक को लिखना है। हालाँकि, दोनों को एक ही भाषा का उपयोग करना चाहिए। पहला प्रोग्राम STDIN, प्रोग्राम आर्ग्यूमेंट्स या फंक्शन पैरामीटर्स के जरिए एक स्ट्रिंग को इनपुट के रूप में स्वीकार करेगा और इस पद्धति का उपयोग करके इसे एनकोड करेगा। दूसरा प्रोग्राम STDIN, प्रोग्राम आर्गुमेंट्स या फंक्शन पैरामीटर्स के जरिए एक स्ट्रिंग को इनपुट के रूप में स्वीकार करेगा और इस पद्धति का उपयोग करके इसे डीकोड करेगा।

आवश्यकताएँ

पहला कार्यक्रम / समारोह

  • ऊपर सूचीबद्ध किसी भी विधि का उपयोग करके एक एकल स्ट्रिंग इनपुट।
  • एक विकर्ण बरोज़-व्हीलर परिवर्तन शैली का उपयोग करके स्ट्रिंग को एन्कोड करना चाहिए।

दूसरा कार्यक्रम / समारोह

  • ऊपर सूचीबद्ध किसी भी विधि का उपयोग करके एक एकल स्ट्रिंग इनपुट।
  • एक विकर्ण बरोज़-व्हीलर परिवर्तन शैली का उपयोग करके स्ट्रिंग को डीकोड करना चाहिए।

प्रतिबन्ध

  • आप इस कार्य को पूरा करने वाले किसी भी अंतर्निहित या बाहरी कार्यों का उपयोग नहीं कर सकते।
  • मानक खामियों की अनुमति नहीं है।
  • दोनों कार्यक्रम / कार्य एक ही भाषा में होने चाहिए।

स्कोरिंग

यह कोड गोल्फ है, इसलिए बाइट्स जीत में सबसे छोटा कार्यक्रम है ।

अगर मुझे अधिक जानकारी जोड़ने की आवश्यकता है, तो एक टिप्पणी छोड़ दें!


2
क्या हमें लंबाई इनपुट स्ट्रिंग को विषम लंबाई में बदलना है?
ऑप्टिमाइज़र

5
यह एक बरोज़-व्हीलर ट्रांसफ़ॉर्मेशन नहीं है।
फ़ूजएक्सएक्सएक्स

3
एक बरोज़-व्हीलर परिवर्तन इस बात में भिन्न है कि अंतिम आइटम लेने से पहले सभी घुमावों की सरणी को लेक्सोग्राफिक रूप से क्रमबद्ध किया जाता है।
13

@ यह आवश्यक नहीं है
GamrCorps

जवाबों:


12

CJam, (4 + 8 =) 12 बाइट्स

एन्कोडिंग कार्यक्रम:

q2/z

इसे यहाँ ऑनलाइन आज़माएँ

डिकोडिंग कार्यक्रम:

q_,2/)/z

इसे यहाँ ऑनलाइन आज़माएँ

वे कैसे (या बल्कि, क्यों) काम करते हैं :

तिरछे बर्गोस-व्हीलर ट्रांसफ़र मूल रूप से स्ट्रिंग के हर दूसरे पात्र हैं, जिसमें अंत से लपेटा गया है। यदि हम स्ट्रिंग को 2 कॉलम के 2 डी मैट्रिक्स के रूप में मानते हैं, तो यह केवल मैट्रिक्स के परिवर्तन को लेने के लिए उबलता है। उदाहरण:

Hello World

के रूप में 2 डी मैट्रिक्स के रूप में प्रतिनिधित्व किया है

He
ll
o 
Wo
rl
d

अब, बस इसे कॉलम वाइज पढ़ते हुए दें:

HloWrdel ol

जो बर्रो-व्हीलर ट्रांसफॉर्म है।

डिकोडिंग बस प्रक्रिया के विपरीत है, स्ट्रिंग को 2 पंक्ति 2 डी मैट्रिक्स के रूप में लिखें और कॉलम वार पढ़ें।

कोड विस्तार :

एनकोडर:

q          "Read the input";
 2/        "divide it into sub arrays of 2 characters";
   z       "Take transform";

डिकोडर:

q_,        "Read the input, take copy and get length of copy";
   2/      "Divide the length by 2";
     )/    "Increment and split the input into two rows";
       z   "Take transform";

7

पायथन 2, 61 बाइट्स

E=lambda x:x[::2]+x[1::2]
D=lambda y:(-~len(y)/2*y)[::len(y)/2+1]

Eencrypts और Ddecrypts। मैं स्कोर के लिए E=और गिनती नहीं कर रहा हूं D=

डिक्रिप्शन हर n'वें चरित्र को इधर-उधर लपेटता है, जहां nआधी स्ट्रिंग की लंबाई होती है। इस अकशेरुकी का कारण यह है 2और nये स्ट्रिंग की लंबाई को मापता है, इसलिए प्रत्येक nवें वर्ण को हर 2nd में ले जा रहा है ।

यदि किसी एकल फ़ंक्शन का उपयोग करने की अनुमति दी गई थी, तो मैं 44 बाइट्स कर सकता था

def F(x,b):n=1+len(x)**b>>b;return(n*x)[::n]

कब क्या bहै Falseऔर कब bहोता है, इसके बारे में बताया गया है True। अभिव्यक्ति 1+len(x)**b>>bके बराबर है [2,len(x)/2+1][b]


4

जे, 10 + 10 = 20

   ({~#|2*i.@#) 'Hello World'
HloWrdel ol

   (/:#|2*i.@#) 'HloWrdel ol'
Hello World

(आसपास के ब्रेसिज़ को स्कोर में नहीं गिना जाता है क्योंकि वे फ़ंक्शन परिभाषा का हिस्सा नहीं हैं।)

3-बाइट सुधार के लिए फ़ूजएक्सएक्सएल के लिए धन्यवाद ।

अब यह अच्छी तरह से दिखाया गया है कि दो फ़ंक्शन व्युत्क्रम हैं क्योंकि पहला सूची द्वारा परिभाषित पदों से वर्ण लेता है #|2*i.@#और दूसरा फ़ंक्शन ऑर्डर के समान सूची का उपयोग करके वर्णों को वापस व्यवस्थित करता है।

इसे यहाँ ऑनलाइन आज़माएँ।


पहले एक को 10 वर्णों में भी किया जा सकता है {~#|2*i.@#:।
फ़ूजएक्सएक्सएल

@FUZxxl धन्यवाद, अपडेट किया गया। अब दोनों कार्यों के बीच संबंध वास्तव में अच्छी तरह से दिखाया गया है।
यादृच्छिक

3

पायथ - 5 + 11 = 16 बाइट्स

मैंने एक पैटर्न देखा! ~ खुश नृत्य करता है ~ परिवर्तन वास्तव में सिर्फ स्ट्रिंग के माध्यम से हर दूसरे तत्वों को उठा रहा है। यह केवल अजीब पर काम करता है अन्यथा यह आधे तत्वों को कभी नहीं मिलेगा। यह 2 वाइड मैट्रिक्स को घुमाने के बराबर है।

एनकोडर:

%2*2z

पायथन का कदम फिसलता नहीं है, इसलिए मैंने स्ट्रिंग को दोहराया।

%2      Take every other elements
 *2z    Double input string

डिकोडर:

K/hlz2%K*Kz

स्टेप-स्लाइसिंग के लिए कोई रैप-अराउंड नहीं।

K/hlz2       K=length of (input+1)/2
%K           Every kth element
 *Kz         From K*the input

@FryAmTheEggman मुझे पूरा यकीन है कि यह केवल अजीब लंबाई स्ट्रिंग लेने वाला है। यह विवरण की शुरुआत में था।
माल्टीसेन

अरे! माफ़ करना। : S
FryAmTheEggman

2

GNU sed -r, (20 + 104 + 1) = 125

स्कोर में अतिरिक्त +1 -r विकल्प के लिए sed के लिए है। अजीब लंबाई इनपुट तार ग्रहण कर रहे हैं।

एनकोडर:

s/.*/&&/
s/(.)./\1/g
  • इनपुट स्ट्रिंग को दोगुना करें
  • प्रत्येक विषम (1 से गिनती) वर्ण छोड़ें

डिकोडर:

डिकोडर :एक अस्थायी मार्कर चरित्र के रूप में उपयोग करता है , इसलिए यदि यह इनपुट स्ट्रिंग में प्रकट होता है, तो आपको अपरिभाषित व्यवहार मिलेगा। यदि इनपुट स्ट्रिंग 95 ASCII वर्णों तक सीमित है, तो इन मार्करों को इसे ठीक करने के लिए ASCII रेंज (जैसे BEL 0x7) के बाहर कुछ के साथ बदला जा सकता है।

s/.*/:&:/
:l;s/:(.)(.+)(.):/\1:\2:\3/;tl
s/:(.*)/\1:/
:m;s/(.)(.*):(.?)(.*):(.*)/\2:\4:\5\1\3/;tm
s/://g
  • रखो :शुरू और इनपुट स्ट्रिंग के अंत में मार्कर
  • पहली बार :आगे और दूसरे :पिछड़े एक वर्ण को तब तक फेरबदल करें जब तक कि :मार्कर मध्य चरित्र के दोनों ओर न हों
  • पहले निकालें :और :अंत में "A: B:" छोड़ते हुए एक और जोड़ें , जहाँ A, समतल इनपुट से विषम वर्णों से बना स्ट्रिंग है और B समान अक्षर से बना स्ट्रिंग है।
  • प्लेनटेक्स्ट :इनपुट को फिर से इकट्ठा करने के लिए आखिरी के बाद ए और बी के पात्रों को एक साथ मिलाएं
  • शेष :मार्करों को हटा दें

2

जावास्क्रिप्ट ईएस 6, 41 + 49 = 90 बाइट्स

एनकोडर

(t=>t.replace(/./g,(_,o)=>t[o*2%t.length]))('Hello World')

डिकोडर

(t=>t.replace(/./g,(_,o)=>t[-~(l=t.length)/2*o%l]))('HloWrdel ol')

ये अनाम फ़ंक्शन हैं, इसलिए मैं केवल कोष्ठकों के अंदर कोड गिन रहा हूं क्योंकि यह पूरी फ़ंक्शन परिभाषा है। नीचे दिए गए स्निपेट के साथ इसे आज़माएं: (ES5 का उपयोग करने के लिए संशोधित)


यह कैसे [t=>t.replace(/./g,(_,o)=>t[o*2%t.length]),t=>t.replace(/./g,(_,o)=>t[(1+(l=t.length))/2*o%l])]:? आपको इस तरह का उपयोग करें [...][0]('encode string')और [...][1]('decode string')। कुछ भी नहीं कह रहा है कि यह नहीं किया जा सकता है! और आप 1 बाइट बचाते हैं।
इस्माइल मिगुएल

धन्यवाद, बू यह 2 कार्यों को लिखने के लिए कहता है, और मुझे नहीं लगता कि यह गिनती होगी।
निन्जाबियरमॉन्की

यह अभी भी 2 कार्य है। नियम कार्यों तक पहुंचने के लिए नाम या तरीके निर्दिष्ट नहीं करते हैं। यह केवल यह कहता है कि आपको 2 कार्यों का उपयोग करना चाहिए।
इस्माइल मिगुएल

1
@IsmaelMiguel अब जब मैं इसके बारे में सोचता हूं, मुझे लगता है कि अनाम कार्यों को स्वयं द्वारा अनुमति दी जाती है, इसलिए इसका उपयोग करने से मुझे और भी अधिक बचे।
निन्जाबिएरमेन्की

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