बरोज़, व्हीलर और बैक


15

पृष्ठभूमि

बिल-व्हीलर को बदलने (BWT) एक स्ट्रिंग के वर्णों की एक प्रतिवर्ती क्रमचय है कि इस तरह के सादे पाठ के रूप तार के कुछ प्रकार के लिए इसी तरह के पात्रों की बड़ी रन में परिणाम है। इसका उपयोग, उदाहरण के लिए, bzip2 संपीड़न एल्गोरिदम में किया जाता है

BWT को इस प्रकार परिभाषित किया गया है:

एक इनपुट स्ट्रिंग को देखते हुए codegolf, जैसे कि इसके सभी संभावित घुमावों की गणना करें और उन्हें लेक्सोग्राफिक क्रम में क्रमबद्ध करें:

codegolf
degolfco
egolfcod
fcodegol
golfcode
lfcodego
odegolfc
olfcodeg

स्ट्रिंग codegolfका BWT उस क्रम में प्रत्येक स्ट्रिंग के अंतिम वर्ण से बना स्ट्रिंग होता है, अर्थात, ऊपर ब्लॉक का अंतिम कॉलम। इसके लिए codegolf, यह पैदावार देता है fodleocg

स्ट्रिंग्स codegolfऔर के बाद से ही, यह परिवर्तन प्रतिवर्ती नहीं हैgolfcode एक ही स्ट्रिंग में परिणाम होता है। हालांकि, अगर हम जानते हैं कि स्ट्रिंग एक के साथ समाप्त होती है f, तो केवल एक ही संभव प्रेज है।

कार्य

एक अदृश्य प्रोग्राम या फ़ंक्शन को लागू करें जो STDIN से एक स्ट्रिंग को पढ़ता है या कमांड-लाइन या फ़ंक्शन तर्क और प्रिंट या BWT या इनपुट स्ट्रिंग के इसके व्युत्क्रम के रूप में रिटर्न करता है।

यदि इनपुट स्ट्रिंग में कोई स्थान नहीं है, तो आपके सबमिशन में इनपुट के लिए एकल स्थान संलग्न करना चाहिए और BWT की गणना करनी चाहिए।

यदि इनपुट स्ट्रिंग में पहले से ही एक स्थान है, तो उसे BWT के प्रीइमेज की गणना करनी चाहिए जिसमें एक अनुगामी स्थान होता है और उस स्थान को पट्टी करता है।

उदाहरण

INPUT:  ProgrammingPuzzles&CodeGolf
OUTPUT: fs&e grodllnomzomaiCrGgPePzu
INPUT:  fs&e grodllnomzomaiCrGgPePzu
OUTPUT: ProgrammingPuzzles&CodeGolf
INPUT:  bt4{2UK<({ZyJ>LqQQDL6!d,@:~L"#Da\6%EYp%y_{ed2GNmF"1<PkB3tFbyk@u0#^UZ<52-@bw@n%m5xge2w0HeoM#4zaT:OrI1I<|f#jy`V9tGZA5su*b7X:Xn%L|9MX@\2W_NwQ^)2Yc*1b7W<^iY2i2Kr[mB;,c>^}Z]>kT6_c(4}hIJAR~x^HW?l1+^5\VW'\)`h{6:TZ)^#lJyH|J2Jzn=V6cyp&eXo4]el1W`AQpHCCYpc;5Tu@$[P?)_a?-RV82[):[@94{*#!;m8k"LXT~5EYyD<z=n`Gfn/;%}did\fw+/AzVuz]7^N%vm1lJ)PK*-]H~I5ixZ1*Cn]k%dxiQ!UR48<U/fbT\P(!z5l<AefL=q"mx_%C:2=w3rrIL|nghm1i\;Ho7q+44D<74y/l/A)-R5zJx@(h8~KK1H6v/{N8nB)vPgI$\WI;%,DY<#fz>is"eB(/gvvP{7q*$M4@U,AhX=JmZ}L^%*uv=#L#S|4D#<
OUTPUT: <#Q6(LFksq*MD"=L0<f^*@I^;_6nknNp;pWPBc@<A^[JZ?\B{qKc1u%wq1dU%;2)?*nl+U(yvuwZl"KIl*mm5:dJi{\)8YewB+RM|4o7#9t(<~;^IzAmRL\{TVH<bb]{oV4mNh@|VCT6X)@I/Bc\!#YKZDl18WDIvXnzL2Jcz]PaWux[,4X-wk/Z`J<,/enkm%HC*44yQ,#%5mt2t`1p^0;y]gr~W1hrl|yI=zl2PKU~2~#Df"}>%Io$9^{G_:\[)v<viQqwAU--A#ka:b5X@<2!^=R`\zV7H\217hML:eiD2ECETxUG}{m2:$r'@aiT5$dzZ-4n)LQ+x7#<>xW)6yWny)_zD1*f @F_Yp,6!ei}%g"&{A]H|e/G\#Pxn/(}Ag`2x^1d>5#8]yP>/?e51#hv%;[NJ"X@fz8C=|XHeYyQY=77LOrK3i5b39s@T*V6u)v%gf2=bNJi~m5d4YJZ%jbc!<f5Au4J44hP/(_SLH<LZ^%4TH8:R
INPUT:  <#Q6(LFksq*MD"=L0<f^*@I^;_6nknNp;pWPBc@<A^[JZ?\B{qKc1u%wq1dU%;2)?*nl+U(yvuwZl"KIl*mm5:dJi{\)8YewB+RM|4o7#9t(<~;^IzAmRL\{TVH<bb]{oV4mNh@|VCT6X)@I/Bc\!#YKZDl18WDIvXnzL2Jcz]PaWux[,4X-wk/Z`J<,/enkm%HC*44yQ,#%5mt2t`1p^0;y]gr~W1hrl|yI=zl2PKU~2~#Df"}>%Io$9^{G_:\[)v<viQqwAU--A#ka:b5X@<2!^=R`\zV7H\217hML:eiD2ECETxUG}{m2:$r'@aiT5$dzZ-4n)LQ+x7#<>xW)6yWny)_zD1*f @F_Yp,6!ei}%g"&{A]H|e/G\#Pxn/(}Ag`2x^1d>5#8]yP>/?e51#hv%;[NJ"X@fz8C=|XHeYyQY=77LOrK3i5b39s@T*V6u)v%gf2=bNJi~m5d4YJZ%jbc!<f5Au4J44hP/(_SLH<LZ^%4TH8:R
OUTPUT: bt4{2UK<({ZyJ>LqQQDL6!d,@:~L"#Da\6%EYp%y_{ed2GNmF"1<PkB3tFbyk@u0#^UZ<52-@bw@n%m5xge2w0HeoM#4zaT:OrI1I<|f#jy`V9tGZA5su*b7X:Xn%L|9MX@\2W_NwQ^)2Yc*1b7W<^iY2i2Kr[mB;,c>^}Z]>kT6_c(4}hIJAR~x^HW?l1+^5\VW'\)`h{6:TZ)^#lJyH|J2Jzn=V6cyp&eXo4]el1W`AQpHCCYpc;5Tu@$[P?)_a?-RV82[):[@94{*#!;m8k"LXT~5EYyD<z=n`Gfn/;%}did\fw+/AzVuz]7^N%vm1lJ)PK*-]H~I5ixZ1*Cn]k%dxiQ!UR48<U/fbT\P(!z5l<AefL=q"mx_%C:2=w3rrIL|nghm1i\;Ho7q+44D<74y/l/A)-R5zJx@(h8~KK1H6v/{N8nB)vPgI$\WI;%,DY<#fz>is"eB(/gvvP{7q*$M4@U,AhX=JmZ}L^%*uv=#L#S|4D#<
INPUT:  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
OUTPUT: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
INPUT:  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
OUTPUT: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

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

  • आप स्ट्रिंग के BWT (या इसके व्युत्क्रम) की गणना करने वाले किसी भी निर्मित ऑपरेटर का उपयोग नहीं कर सकते हैं।

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

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

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

  • ऊपर वर्णित किसी भी संभावित इनपुट के लिए, आपका कोड मेरी मशीन (Intel Core i7-3770, 16 GiB RAM) पर दस मिनट के भीतर खत्म होना चाहिए। अंतिम परीक्षण मामला सबसे धीमा होना चाहिए, इसलिए सुनिश्चित करें कि आप उस के साथ अपना कोड समय देते हैं।

    अधिकांश भाषाओं और दृष्टिकोणों के लिए, समय सीमा का अनुपालन करना आसान होना चाहिए। यह नियम पूरी तरह से दूसरे के उलट बल के रूप में बदलने को लागू करने से रोकने के लिए है।

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


"आप किसी भी अंतर्निहित ऑपरेटर्स का उपयोग नहीं कर सकते हैं जो कार्य को उल्टा करते हैं।" मुझे बहुत आश्चर्य होगा अगर ऐसी कोई चीज़ मौजूद है!
ह्यू एलन

4
@HughAllen J के पास है inv
डेनिस

यह तुच्छ या निर्मित कार्यों के लिए काम कर सकता है, लेकिन यह सामान्य उपयोगकर्ता-परिभाषित कार्यों के लिए कैसे काम कर सकता है? यह "आमंत्रित" कहीं दस्तावेज है?
ह्यूग एलन

@HughAllen: मैं वास्तव में J को नहीं जानता, लेकिन यहांinv उपयोगकर्ता-परिभाषित फ़ंक्शन पर काम करने का एक उदाहरण है । मुझे यकीन नहीं है कि अगर invBWT के लिए काम करेंगे, लेकिन खेद से बेहतर सुरक्षित है।
डेनिस

संबंधित, एक पूर्ण bzip2 के लिए codegolf.stackexchange.com/questions/4771/… देखें ।
कीथ रान्डेल

जवाबों:


9

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

?tthu+VzSGzz}dzseMS.>L+z\ hlz

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

यह सीधे कोड को तय करने के साथ एन्कोडिंग और डिकोडिंग सेगमेंट में विभाजित होता है, जिसे एक टर्नरी के साथ उपयोग करना होता है।

?tthu+VzSGzz}dzseMS.>L+z\ hlz
                                 Implicit:
                                 z = input()
                                 d = ' '

?           }dz                  If there is a space in the input,
    u     zz                     Update G to the result of the following,
                                 with G starting as z and repeating len(z) times:
     +V                          The vectorized sum of
       zSG                       z and sorted(G)
   h                             Take the first such result, which will consist of
                                 the first character of z followed by the
                                 first cyclic permuation of the pre-BWT string,
                                 which must start with ' '.
 tt                              Remove the first two characters and return.
                 L               Otherwise, left-map (map with the variable as the 
                                 left parameter and a constant as the right)
               .>                cyclic right shift
                  +z\            of z + ' '
                      hlz        over range(len(z)+1)
              S                  Sort the shifted strings,
            eM                   take their last charactes,
           s                     combine into one string and return.

6

CJam, 41 36 35 बाइट्स

q:XS&LX,{X\.+$}*0=1>XS+_,,\fm<$zW>?

इसका परीक्षण यहां करें।

व्याख्या

q:X   e# Read STDIN and store it in X.
S&    e# Take the set intersection with " ". We'll use this as a truthy/falsy value to
      e# select the correct output later.

# Compute the iBWT:
LX,   e# Push an empty array, compute the length of X.
{     e# Run the following block that many times:
  X\  e# Push X and pull the other array on top.
  .+  e# Add the characters of X to the corresponding line of the other array,
      e# i.e. prepend X as a new column.
  $   e# Sort the rows.
}*
0=    e# Since we just sorted the rows, the first permutation of the output will be
      e# one starting with a space, followed by the string we actually want. So just
      e# pick the first permutation.
1>    e# Remove the leading space.

# Compute the BWT:
XS+   e# Push X and append a space.
_,    e# Get that string's length N.
,\    e# Turn it into a range [0 .. N-1], swap it with the string.
fm<   e# Map each value in the range to the string shifted left by that many characters.
$     e# Sort the permutations.
zW>   e# Transpose the grid and discard all lines but the last.

?     e# Choose between the iBWT and the BWT based on whether the input had a space.

2

पर्ल 5, 179

एक और नहीं तो-मुझसे अच्छा। इस एक में होने वाले कुछ लाभ हैं, लेकिन यह उद्देश्य-निर्मित गोल्फ भाषाओं के साथ प्रतिस्पर्धा करने वाला नहीं है।

$_=<>;@y=/./g;if(/ /){@x=sort@y;for(1..$#y){@x=sort map$y[$_].$x[$_],0..$#x}
say$x[0]=~/^ (.*)/}else{push@y," ";say map/(.)$/,sort map{$i=$_;join"",
map$y[($_+$i)%@y],0..$#y}0..$#y}

संयुक्त राष्ट्र के golfed:

# Read input
$_ = <>;
# Get all the chars of the input
my @chars = /./g;

if (/ /) {
  # If there's a space, run the IBWT:
  # Make the first column of the table
  my @working = sort @chars;

  # For each remaining character
  for (1 .. $#chars) {
    # Add the input as a new column to the left of @working,
    # then sort @working again
    @working = sort map {
      $chars[$_] . $working[$_]
    } 0 .. $#working;
  }
  # Print the first element of @working (the one beginning with space), sans space
  say $working[0] =~ /^ (.*)/;
} else {
  # BWT
  # Add a space to the end of the string
  push @chars, " ";
  # Get all the rotations of the string and sort them
  @rows = sort map {
    my $offset = $_;
    join "", map {
      $chars[($_ + $offset) % @chars]
    } 0 .. $#chars
  } 0 .. $#chars;

  # Print all the last characters
  say map /(.)$/, @rows;
}

कुछ मामूली सुधार: 1. यदि आप -nस्विच का उपयोग करते हैं (आमतौर पर 1 बाइट के रूप में गिना जाता है), तो आपको ज़रूरत नहीं है $_=<>;। 2. for(1..$#y){...}बन सकता है ... for 1..$#y। 3. के $"लिए आरंभिक है" " और एक बाइट कम है।
डेनिस

@ डेनिस अच्छी कॉल। मेरे पास forएक समय में कई कथन थे इसलिए पोस्टफिक्स फॉर्म एक जीत नहीं था, लेकिन जब मैंने इसे एक
परेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.