বুড়ো, হুইলারের এবং পিছনে


15

পটভূমি

বারোজ-হুইলার রুপান্তর (BWT) একটি স্ট্রিং এর অক্ষরের একটি উলটাকর বিন্যাস হয় যে এই ধরনের সাধারণ পাঠ্য হিসাবে স্ট্রিং কিছু নির্দিষ্ট জন্য অনুরূপ অক্ষর বড় রানে ফলাফল নেই। এটি ব্যবহার করা হয়, উদাহরণস্বরূপ, bzip2 সংক্ষেপণ অ্যালগরিদমে

BWT নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়:

একটি ইনপুট স্ট্রিং দেওয়া যেমন যেমন এর codegolfসমস্ত সম্ভাব্য ঘূর্ণনগুলি গণনা করুন এবং সেগুলি অভিধানিক ক্রমে সাজান:

codegolf
degolfco
egolfcod
fcodegol
golfcode
lfcodego
odegolfc
olfcodeg

স্ট্রিংয়ের বিডব্লিউটি codegolfহ'ল স্ট্রিংটি প্রতিটি ক্রমের প্রতিটি অক্ষরের শেষ অক্ষর, অর্থাৎ উপরের ব্লকের শেষ কলামের সমন্বয়ে গঠিত string জন্য codegolf, এই ফলন fodleocg

নিজেই, এই রূপান্তরটি পুনরায় পরিবর্তনযোগ্য নয়, যেহেতু স্ট্রিংগুলি codegolfএবং golfcodeএকই স্ট্রিংয়ের ফলস্বরূপ। তবে, আমরা যদি জানি যে স্ট্রিংটি একটি দিয়ে শেষ হয় f, তবে কেবলমাত্র একটি সম্ভাব্য প্রিমাইজ রয়েছে।

কার্য

STDIN থেকে বা কমান্ড-লাইন বা ফাংশন আর্গুমেন্ট হিসাবে একটি একক স্ট্রিং পড়ে বা বিডব্লিউটি বা ইনপুট স্ট্রিংয়ের বিপরীতটি প্রিন্ট করে বা ফেরত দেয় এমন একটি অন্তর্ভুক্ত প্রোগ্রাম বা ফাংশন প্রয়োগ করুন।

যদি ইনপুট স্ট্রিংয়ের কোনও ফাঁকা স্থান না থাকে, আপনার জমা দেওয়ার ক্ষেত্রে ইনপুটটিতে একটি একক স্থান যুক্ত করা উচিত এবং 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

অতিরিক্ত বিধি

  • আপনি কোনও বিল্ট-ইন অপারেটর ব্যবহার করতে পারবেন না যা কোনও স্ট্রিংয়ের বিডব্লিউটি (বা এর বিপরীতমুখী) গণনা করবে।

  • আপনি কোনও বিল্ট-ইন অপারেটর ব্যবহার করতে পারবেন না যা কার্যগুলি উল্টে দেয়।

  • আপনি যদি আউটপুট জন্য STDOUT চয়ন করেন তবে আপনার কোডটি ট্র্যাকিং নিউলাইনটি মুদ্রণ করতে পারে, এমনকি যদি এটি ইনপুটটিতে নতুন লাইনের পিছনে সমর্থন না করে।

  • আপনার কোডটিতে কমপক্ষে একটি স্থান সহ 500 বা তারও কম ছাপার যোগ্য ASCII অক্ষর (0x20 থেকে 0x7E) এর কোনও ইনপুট জন্য কাজ করতে হবে।

  • উপরে বর্ণিত সম্ভাব্য ইনপুটগুলির জন্য, আপনার কোডটি অবশ্যই আমার মেশিনে দশ মিনিটের মধ্যে শেষ করতে হবে (ইন্টেল কোর i7-3770, 16 জিবি র‌্যাম)। শেষ পরীক্ষার কেসটি সবচেয়ে ধীর হওয়া উচিত, সুতরাং আপনার কোডটি তার সাথে সময় দেওয়ার বিষয়টি নিশ্চিত করুন।

    বেশিরভাগ ভাষা এবং পদ্ধতির জন্য, সময় সীমা মেনে চলা সহজ হওয়া উচিত। এই নিয়মটি সম্পূর্ণরূপে হয় অন্যের ব্রুট-ফোর্স ইনভার্স হিসাবে রূপান্তর বাস্তবায়ন রোধ করার জন্য।

  • স্ট্যান্ডার্ড কোড গল্ফ বিধি প্রযোজ্য। বাইটস মধ্যে সংক্ষিপ্ততম জমা জয়।


"আপনি কোনও বিল্ট-ইন অপারেটর ব্যবহার করতে পারবেন না যা কার্যগুলি উল্টে দেয়" " আমি যদি খুব কিছু হতাম যদি এমন কিছু থাকত!
হিউ অ্যালেন

4
@HughAllen জে হয়েছে inv
ডেনিস

এটি তুচ্ছ বা বিল্টিন ফাংশনগুলির জন্য কাজ করতে পারে তবে সাধারণ ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলির জন্য এটি কীভাবে কাজ করতে পারে? এই "চালান" কোথাও নথিভুক্ত করা হয়?
হিউ অ্যালেন

@HughAllen: আমি সত্যিই জে জানি না, কিন্তু এখানে একটি উদাহরণ এর invএকটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশন নিয়ে কাজ। আমি নিশ্চিত না যে invবিডাব্লুটিটির পক্ষে কাজ করবে কিনা তবে দুঃখের চেয়ে ভাল নিরাপদ।
ডেনিস

সম্পর্কিত, একটি সম্পূর্ণ bzip2 এর জন্য কোডগল্ফ.স্ট্যাকেক্সেঞ্জার / প্রশ্নগুলি / 717171১/২ দেখুন ।
কিথ র্যান্ডাল

উত্তর:


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

সিজেম, 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;
}

কয়েকটি ছোটখাটো উন্নতি: ১. আপনি যদি -nস্যুইচটি (সাধারণত 1 বাইট হিসাবে গণ্য করেন) ব্যবহার করেন তবে আপনার প্রয়োজন হবে না $_=<>;। 2. for(1..$#y){...}হতে পারে ... for 1..$#y। 3. $"এটিকে আরম্ভ করা হয় " "এবং এক বাইট ছোট হয়।
ডেনিস

@ ডেনিস ভাল কল। আমার forএক পর্যায়ে একাধিক বক্তব্য ছিল যাতে পোস্টফিক্স ফর্মটি জয় নয়, তবে আমি যখন এটির নীচে রেখেছিলাম তখন আমি খেয়াল করিনি :)
হবিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.