印刷可能なASCIIフロントに移動します


19

バックグラウンド

前面への変換(MTF)は、エントロピーエンコーディング技術のパフォーマンスを向上させるために設計されたデータエンコーディングアルゴリズムです。

BZIP2圧縮アルゴリズムの後、それが適用されるバローズ-ウィーラー変換(に見られるようにバローズ、ウィーラー戻る小さい、容易に圧縮非負整数に繰り返される文字のグループを旋回する目的で、)。

定義

この課題のために、MTFの印刷可能なASCIIバージョンを次のように定義します。

入力文字列が与えられ、S、空の配列を取るR、列Dの各文字については、以下のすべての印刷可能なASCII文字の(0x7Eをへの0x20を)と繰り返しCS

  1. インデックス付加CののDR

  2. cdの前に移動します。つまり、dからcを削除し、残りの前に追加します。

最後に、rの要素を元の dのインデックスとして使用し、対応する文字を取得します。

ステップバイステップの例

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
「ナナナナナDDUP!」同じようにキャッチーなようではありません...「バットマン!」
ドアノブ

8
@Doorknob:しかし、バットマンは簡単に圧縮できません。
デニス

結果をSTDOUTに出力する代わりに、関数のリターンで出力できますか?
15

@Fatalize:これは関数の最も自然な出力形式なので、はい。ちなみに、I / Oにデフォルト設定されているため、質問で特に明記されていない限り、それは常に許可されています。
デニス

回答:


6

CJam、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最新バージョンをリリースした後(このチャレンジが投稿される前でも)(文字列へのASCIIコード)演算子を追加しました。

{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が「golfscriptより短い典型的なコードゴルフの課題を解決するために、独自のプログラミング言語を設計する」「自分の好きな言語で可能な限り最もconsciseの方法でコードこのタスクを」から回している場合、私は思ったんだけど
ジョンドヴォルザーク

1
@AlexA。...待って、ハァッ、それはそのように綴られていますか?私の生涯は嘘でした
ドアノブ

@JanDvorak Ostrichは、GolfScriptとほぼ同じです。私が作成した唯一の本当の理由は、a。)GolfScriptに迷惑なREPLがなく、b。)いくつかの欠落した演算子/機能(浮動小数点、I / Oなど)があるためです。とにかく言語設計は楽しいです!
ドアノブ

3

Python 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

SWI-Prolog、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バージョンは、バッククォート`がコード文字列を表す新しいバージョンの1つである必要があります。"以前のバージョンでは、コード文字列は二重引用符で表されていました。


2

Python 2、137 110 104

実施するのは難しい、しかしではなかったかもしれない、まだgolfable?

ここで試してみてください

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))Python 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

Pyth、24バイト

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

デモンストレーション。 テストハーネス。

最初のビット。JK>95CM127必要に応じてリストアップセットとに保存しますJK。入力文字をリスト内の位置にマップし~J+d-Jdながら、リストの更新を実行しxL ... zます。最後に、s@LKこれらのインデックスを元のリストの文字に変換します。


1

Haskell、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"

仕組み:in #の位置を返すインデックス関数です(高価なためHaskellのネイティブを使用できません)。メイン関数は折り畳みパターンに従い、入力文字列を通過するときに位置文字列と結果文字列を更新します。 eselemIndeximportfdr

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.