मुद्रण योग्य ASCII मोर्चे पर जाएं


19

पृष्ठभूमि

कदम-से-सामने परिणत (MTF) एक डेटा एन्कोडिंग एन्ट्रापी एन्कोडिंग तकनीक के प्रदर्शन में सुधार करने के लिए बनाया एल्गोरिथ्म है।

में bzip2 संपीड़न एल्गोरिथ्म , यह बाद लागू किया जाता बिल-व्हीलर को बदलने (के रूप में के रूप में देखा बरोज व्हीलर और वापस ), छोटे, आसानी से संपीड़न योग्य गैर नकारात्मक पूर्णांक में बार-बार पात्रों के समूह मोड़ करने के उद्देश्य से।

परिभाषा

इस चुनौती के उद्देश्य के लिए, हम MTF के मुद्रण योग्य ASCII संस्करण को निम्नानुसार परिभाषित करेंगे:

यह देखते हुए एक इनपुट स्ट्रिंग रों , एक खाली सरणी ले आर , स्ट्रिंग सभी प्रिंट योग्य ASCII वर्ण की (0x7E को 0x20) और हर किरदार के लिए निम्नलिखित दोहराने की रों :

  1. के सूचकांक संलग्न में के लिए आर

  2. सी को d के सामने ले जाइए , अर्थात c को d से हटाएं और शेष पर प्रीपिंड करें।

अंत में, हम मूल d में अनुक्रमित r के तत्वों को लेते हैं और संबंधित वर्ण लाते हैं।

चरण-दर-चरण उदाहरण

INPUT: "CODEGOLF"

0. s = "CODEGOLF"
   d = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
   r = []
1. s = "ODEGOLF"
   d = "C !\"#$%&'()*+,-./0123456789:;<=>?@ABDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
   r = [35]
2. s = "DEGOLF"
   d = "OC !\"#$%&'()*+,-./0123456789:;<=>?@ABDEFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
   r = [35 47]
3. s = "EGOLF"
   d = "DOC !\"#$%&'()*+,-./0123456789:;<=>?@ABEFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
   r = [35 47 37]
4. s = "GOLF"
   d = "EDOC !\"#$%&'()*+,-./0123456789:;<=>?@ABFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
   r = [35 47 37 38]
5. s = "OLF"
   d = "GEDOC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
   r = [35 47 37 38 40]
6. s = "LF"
   d = "OGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
   r = [35 47 37 38 40 3]
7. s = "F"
   d = "LOGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
   r = [35 47 37 38 40 3 45]
8. s = ""
   d = "FLOGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABHIJKMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
   r = [35 47 37 38 40 3 45 41]

OUTPUT: "COEFH#MI"

कार्य

एक प्रोग्राम या फ़ंक्शन लिखें जो मुद्रण योग्य ASCII MTF को लागू करता है (जैसा कि ऊपर परिभाषित किया गया है)।

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

Input:  Programming Puzzles & Code Golf
Output: Prpi"do lp%((uz rnu&3!P/o&$U$(p

Input:  NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN BATMAN!
Output: Na! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !!"DDUP"%'

Input:  Two more questions and I have bzip2 in less than 100 bytes!
Output: Twp#o"si$sv#uvq(u$(l#o#W!r%w+$pz,xF%#,"x(. #0--'$GG ".z(**:

अतिरिक्त नियम

  • आप किसी स्ट्रिंग के MTF की गणना करने वाले किसी भी अंतर्निहित ऑपरेटर का उपयोग नहीं कर सकते।

  • यदि आप आउटपुट के लिए STDOUT का चयन करते हैं तो आपका कोड एक अनुगामी न्यूलाइन प्रिंट कर सकता है।

  • आपके कोड को 1000 या उससे कम मुद्रण योग्य ASCII वर्णों (0x20 से 0x7E) के किसी भी इनपुट के लिए काम करना होगा।

  • मानक कोड गोल्फ नियम लागू होते हैं। बाइट्स में सबसे कम सबमिशन जीतता है।


1
"नानाननाना डीडीयूपी!" बस के रूप में आकर्षक रूप में नहीं है ... "बैटमैन!"
दरवाज़े

8
@ डॉर्कनोब: लेकिन बैटमैन आसानी से संकुचित नहीं है।
डेनिस

क्या हम परिणाम को STDOUT में प्रिंट करने के बजाय एक फ़ंक्शन रिटर्न में आउटपुट कर सकते हैं?
घातक

@ फ़ेटलाइज़ करें: यह फ़ंक्शंस के लिए आउटपुट का सबसे प्राकृतिक रूप है, इसलिए हाँ। वैसे, हमारे पास I / O के लिए डिफॉल्ट हैं , इसलिए जब तक कि प्रश्न स्पष्ट रूप से अन्यथा नहीं कहता है, तब तक उसे हमेशा अनुमति दी जाती है।
डेनिस

जवाबों:


6

सीजेम, 20

'¡,q{_C#c' ,C+@|}fC;

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

स्पष्टीकरण:

'¡,      make a string of characters with codes from 0 to 160 (a modified "d")
         could have been to 126 but stackexchange doesn't like the DEL character
q        read the input (s)
{…}fC    for each character C in s
  _      duplicate the d string
  C#     find the index of C in d
  c      convert to character (this is the result)
  ' ,    make a string of characters from 0 to 31
  C+     append C to the string
  @      bring d to the top
  |      set union, preserving order; effectively, C is moved to position 32
         this is the updated d string
;        pop the last d

6

शुतुरमुर्ग , 46 45 चरस

हेडर में एक संस्करण संख्या नहीं है क्योंकि यह वास्तव में सिर्फ नवीनतम प्रतिबद्धता है । मैंने Oनवीनतम संस्करण जारी करने के बाद (लेकिन इस चुनौती को पोस्ट किए जाने से पहले भी) स्ट्रिंग ऑपरेटर के रूप में जोड़ा ।

{a95,{32+O}%:d3@{:x\.3@?3@\+\x-x\+}/;{d=}%s*}

स्पष्टीकरण:

a             this is the "r" array (a is short for [], empty array)
95,{32+O}%:d  this is the "d" array
3@{...}/      for each character in the input (as an "argument")...
  :x            store in variable x (stack is now [r d c])
  \.3@?         find index in d     (stack is now [r d idx])
  3@\+          append index to r   (stack is now [d modified_r])
  \x-           remove char from d, and then...
  x\+           prepend char to d   (stack is now [modified_r modified_d])
;             throw away modified_d
{d=}%         map r to indices of (original) d
s*            join (s is short for ``, empty string)

मुझे आश्चर्य हो रहा है कि PPCG "अपनी पसंदीदा भाषा में सबसे अधिक संभव तरीके से इस कार्य को कोड" से बदल रहा है या नहीं, "अपनी खुद की प्रोग्रामिंग भाषा को डिज़ाइन करने के लिए" गोल्फ कोड से छोटे ठेठ कोड गोल्फ कार्य को हल करने के लिए "
जॉन ड्वोरक

1
@AlexA। ... रुको, हुह, यह इस तरह वर्तनी है? अपने पूरे जीवन में एक झूठ किया गया है
दरवाज़े

@JanDvorak शुतुरमुर्ग लगभग गोल्फस्क्रिप्ट के समान है। केवल वास्तविक कारण मैंने इसे बनाया है क्योंकि a।) गोल्फस्क्रिप्ट में गुस्सा नहीं है REPL और b।) कुछ लापता ऑपरेटर / सुविधाएँ हैं (फ़्लोटिंग पॉइंट, I / O, आदि)। और भाषा डिजाइन वैसे भी मजेदार है!
दरवाज़े

3

पायथन 3, 88

*d,=range(127)
for c in input():y=d.index(ord(c));d[:32]+=d.pop(y),;print(chr(y),end='')

मेरे CJam समाधान से कुछ विचारों का उपयोग करना।
-4 बाइट्स Sp3000 से संबंधित हैं :)


2

एसडब्ल्यूआई-प्रोलॉग, 239 197 189 बाइट्स

a(S):-l([126],X),a(S,X,[],R),b(R,X).
a([A|T],X,S,R):-nth0(I,X,A,Z),(a(T,[A|Z],[I|S],R);R=[I|S]).
b([A|T],X):-(b(T,X);!),nth0(A,X,E),put(E).
l([B|R],Z):-A is B-1,X=[A,B|R],(A=32,Z=X;l(X,Z)).

उदाहरण: a(`Two more questions and I have bzip2 in less than 100 bytes!`).आउटपुट:

Twp#o"si$sv#uvq(u$(l#o#W!r%w+$pz,xF%#,"x(. #0--'$GG ".z(**:

(और इसके true .बाद, जाहिर है)

नोट: आपके SWI-Prolog संस्करण में नए लोगों में से एक होना है जिसमें बैकक्वाटर `कोड स्ट्रिंग्स का प्रतिनिधित्व करता है। कोड के तार "पुराने संस्करणों में दोहरे उद्धरण चिह्नों के साथ दर्शाए जाते थे ।


2

अजगर 2, 137 110 104

लागू करना मुश्किल नहीं था, लेकिन शायद अभी भी गोल्फ है?

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

e=d=map(chr,range(32,127))
r=""
for c in raw_input():n=e.index(c);r+=d[n];e=[e[n]]+e[:n]+e[n+1:]
print r

1
मुझे लगता है कि आप e=d=map(chr,range(32,127))पायथन 2 में एक सूची मानचित्र बनाने से बेहतर हैं , हालांकि आपको eएक सूची को संभालने के लिए ट्वीक करना होगा।
xnor

@xnor धन्यवाद। मैंने भी उपयोग करने की कोशिश की e=[e.pop(n)]+e, लेकिन यह काम नहीं करता है। ऐसा क्यों है?
mbomb007

आपको मिल गया है e=d=, इसलिए जब आप पॉप करते हैं तो आप से eपॉपिंग भी करते हैं d। कोशिश करो d=e[:]
Sp3000

1
लेकिन इस बिंदु पर यह सिर्फ करना n=e.index(ord(c));r+=chr(n+32);और ड्रॉप करना बेहतर हैd
Sp3000

1

पायथ, 24 बाइट्स

JK>95CM127s@LKxL~J+d-Jdz

प्रदर्शन। दोहन ​​परीक्षण।

पहला बिट। JK>95CM127आवश्यक सूची में ऊपर सेट और इसे करने के लिए बचाता है Jऔर K~J+d-Jdसूची को अद्यतन करता है, जबकि xL ... zइनपुट पात्रों को सूची में उनके पदों पर मैप करता है। अंत में, s@LKउन सूचियों को मूल सूची के वर्णों में परिवर्तित करता है।


1

हास्केल, 120 बाइट्स

e#s=[b|(b,a)<-zip[0..]s,a==e]!!0
a=[' '..'~']
f=snd.foldl(\(d,r)e->(e:take(e#d)d++tail(drop(e#d)d),r++[a!!(e#d)]))(a,[])

उपयोग उदाहरण: f "CODEGOLF"->"COEFH#MI"

यह कैसे काम करता है: #एक इंडेक्स फ़ंक्शन है जो की स्थिति को लौटाता eहै s( elemIndexमहंगी होने के कारण हास्केल के मूल का उपयोग नहीं कर सकता import)। मुख्य फ़ंक्शन fएक तह पैटर्न का अनुसरण करता है जहां यह स्थिति स्ट्रिंग dऔर परिणाम स्ट्रिंग rको अपडेट करता है क्योंकि यह इनपुट स्ट्रिंग के माध्यम से चलता है।

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