Yazdırılabilir ASCII ön tarafına gitme


19

Arka fon

Hareket-önüne dönüşümü (MTF) entropi kodlama teknikleri performansını artırmak için tasarlanmış bir veri kodlayan algoritmasıdır.

Gelen bzip2 sıkıştırma algoritması , bu sonra uygulanır , Burrows-Wheeler dönüşümü (görüldüğü gibi Burrows, Wheeler ve Geri ), küçük, kolaylıkla sıkıştırılabilir olmayan negatif tamsayı içine tekrar karakter gruplarının dönüm amacı ile,.

Tanım

Bu zorluğun amacı için, MTF'nin yazdırılabilir ASCII sürümünü aşağıdaki gibi tanımlayacağız:

Bir giriş bir dizge s , boş bir dizi almak r , dizge d , her bir karakter için aşağıdaki tüm ASCII karakter (0x7E için 0x20) ve tekrar c ait s :

  1. Dizinini ekleme , c olarak d için r .

  2. Hareket c ön d , yani kaldırma c den d ve geri kalanı için çizgi yerleştirirler.

Son olarak, r öğelerini orijinal d' de dizinler olarak alır ve karşılık gelen karakterleri getiririz.

Adım adım örnek

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"

Görev

Yazdırılabilir ASCII MTF'yi (yukarıda tanımlandığı gibi) uygulayan bir program veya işlev yazın.

Test senaryoları

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(**:

Ek kurallar

  • Bir dizenin MTF'sini hesaplayan yerleşik bir işleci kullanamazsınız.

  • Çıktı için STDOUT'u seçerseniz kodunuz bir satırsonu yazdırabilir.

  • Kodunuzun 1000 veya daha az yazdırılabilir ASCII karakteri (0x20 - 0x7E) için giriş yapması gerekir.

  • Standart kod golf kuralları geçerlidir. Bayt cinsinden en kısa gönderim kazanır.


1
"Nanananana DDUP!" "Batman!" kadar akılda kalıcı değil ...
Kapı tokmağı

8
@Doorknob: Ama Batman kolayca sıkıştırılamaz.
Dennis

Sonucu STDOUT'a yazdırmak yerine bir işlev geri dönüşünde çıktı alabilir miyiz?
15'te

@Fatalize: Bu işlevler için en doğal çıktı biçimi, yani evet. Bu arada, I / O için varsayılanlarımız var , bu yüzden soru açıkça aksi belirtilmedikçe, buna her zaman izin verilir.
Dennis

Yanıtlar:


6

CJam, 20

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

Çevrimiçi deneyin

Açıklama:

'¡,      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

Devekuşu , 46 45 karakter

Başlıkta sürüm numarası yok çünkü bu aslında sadece en son işlem . OEn son sürümü çıkardıktan sonra (ancak bu meydan okuma gönderilmeden önce) (ascii kodu dizeye) operatörünü ekledim .

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

Açıklama:

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 "bu görevi favori dilinizde mümkün olan en özenli şekilde kodla" dan "golf kodundan daha kısa tipik kod golf görevini çözmek için kendi programlama dilinizi tasarlamaya" dönüp dönmediğini merak ediyorum
John Dvorak

1
@AlexA. ... bekle, ha, bu şekilde hecelendi mi? tüm hayatım bir yalan oldu
Kapı Tokmağı

@ JanDvorak Devekuşu GolfScript ile neredeyse aynıdır. Ben yarattım sadece gerçek nedeni a.) GolfScript rahatsız edici bir REPL ve b.) Birkaç eksik işleçler / özellikleri (kayan nokta, I / O, vb) vardır. Ve dil tasarımı zaten eğlenceli!
Kapı Tokmağı

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 çözümümden bazı fikirler kullanmak.
-4 bayt Sp3000'e aittir :)


2

SWI-Prolog, 239 197 189 bayt

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

Örnek: a(`Two more questions and I have bzip2 in less than 100 bytes!`).çıktılar:

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

(ve true .ondan sonra, açıkça)

Not: SWI-Prolog sürümünüz, arka bölümün `kod dizelerini temsil ettiği daha yeni sürümlerden biri olmalıdır . Kod dizeleri "daha eski sürümlerde çift ​​tırnak ile gösterilirdi.


2

Python 2, 137 110 104

Değil uygulamak zor, ama oldu belki hala golfable?

Burada deneyin

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'de bir liste haritası yapmaktan daha iyi olduğunuzu düşünüyorum , ancak ebir listeyi işlemek için ince ayar yapmanız gerekiyor .
xnor

@xnor Teşekkürler. Ben de kullanmayı denedim e=[e.pop(n)]+eama işe yaramıyor. Neden?
mbomb007

Sende var e=d=, o yüzden patladığında eda patlıyorsun d. Deneyin d=e[:].
Sp3000

1
Ancak bu noktada muhtemelen sadece yapmak n=e.index(ord(c));r+=chr(n+32);ve bırakmak daha iyidird
Sp3000

1

Pyth, 24 bayt

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

Gösteri. Test Donanımı.

İlk bit. JK>95CM127Gerekli listede yukarı setleri ve kaydeder Jve K. ~J+d-Jdliste güncellemesini gerçekleştirirken, xL ... zgiriş karakterlerini listedeki konumlarıyla eşler. Son olarak, s@LKbu dizinleri orijinal listedeki karakterlere dönüştürür.


1

Haskell, 120 bayt

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,[])

Kullanım örneği: f "CODEGOLF"->"COEFH#MI"

Nasıl çalışır: #pozisyonunu döndüren bir indeks fonksiyonudur eiçinde s(Haskell doğal kullanamazsınız elemIndexçünkü pahalı import). Ana işlev , giriş dizesinde yürürken fkonum dizesini dve sonuç dizesini güncellediği bir katlama desenini izler r.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.