Pesan stereogram tersembunyi

29

Anda harus membuat stereogram teks sesuai dengan string input yang berisi paragraf teks, baris kosong lalu pesan tersembunyi. Hasilnya akan ditampilkan sebagai sepasang paragraf, satu dengan jarak yang berbeda yang menyebabkan efeknya dinaikkan ketika dilihat secara stereografis (Penjelasan dapat ditemukan di sini ).

Contoh

Memasukkan:

I invented vegetarianism.  It is a diet involving no meat, just vegetables.  It is also common in cows - they are awesome.

vegetarianism. is awesome.

Keluaran:

I      invented    I      invented
 vegetarianism.    vegetarianism. 
It   is a  diet    It  is  a  diet
involving    no    involving    no
meat,      just    meat,      just
vegetables.  It    vegetables.  It
is  also common    is  also common
in cows  - they    in cows  - they
are    awesome.    are   awesome. 

Bonus

  • Tambahkan opsi untuk memilih antara paralel dan juling sebagai input pengguna (-20)
  • Lebar kolom dapat disesuaikan sebagai input pengguna (-50)

Ini kode golf, jadi kode terpendek setelah bonus menang.

kitcar2000
sumber
3
Ini adalah pertama kalinya saya melihat stereogram dengan teks. Ini luar biasa.
Michael M.
Mereka tidak bekerja untuk saya: / (Saya memiliki masalah mata yang menghambat penglihatan stereografi)
David Wilkins
Omong kosong aku baru melihatnya ... Ini mengesankan!
WallyWest
@Glenn Randers-Pehrson maukah Anda menjelaskan mengapa Anda menambahkan tag [sorting]?
user12205
Itu adalah sebuah kesalahan. Saya pikir saya ada pada pertanyaan lain, dan tidak dapat menemukan cara untuk membatalkan. Jika disetujui maka saya akan mengembalikannya.
Glenn Randers-Pehrson

Jawaban:

1

Bash, sed: 228 223 197 (242 - 70) = 172

c=${5:-=};R=$c;L=;for f in r l;do
e="sed -e ";$e"$ d;s/$\|  */ \n/g" $1>m
o=1;for w in `$e"$ p;d" $1`;do
$e"$o,/^$w /s/^$w /$L$w$R /" m>n;o="/$c/"
cp n m;done;tr -d \\n<n|fold -sw${2:-35}|$e"s/$c/ /g">$f
L=$c;R=;done;pr -tmw${3:-80} ${4:-l r}

Jika skrip berada dalam file yang dapat dieksekusi yang disebut "stereo", ketikkan

stereo file.in [column_width [page_width ["r l"]]]

column_width adalah angka; 25-45 akan berfungsi, standarnya adalah 35.

page_width adalah angka, seharusnya sekitar dua kali lipat column_width, standarnya adalah 80

Untuk tampilan mata juling, gunakan "r l" sebagai argumen ke-4. Standarnya adalah "l r" yang mengatur tampilan paralel.

EDIT: Menulis ulang untuk membagi file menjadi satu kata per baris, lalu pasang kembali di bagian akhir. Catatan: cadangan tanda "=" untuk penggunaannya sendiri. Tanda "=" apa pun dalam file input akan menjadi kosong.

Sunting: Jika pesan Anda memiliki tanda "=" di dalamnya, Anda dapat memilih simbol lain untuk digunakan skrip, dengan menyediakannya sebagai parameter ke-5.

Contoh

Masukan: vegetarianism.txt:

I invented vegetarianism.  It is a diet involving no meat, just
vegetables.  It is also common in cows - they are awesome.

vegetarianism. is awesome.

Hasil

./stereo vegetarianism.txt 32 72 "l r": | perluas (gunakan tanda titik dua untuk simbol kerja internalnya)

I invented  vegetarianism. It       I invented vegetarianism.  It
 is a diet involving no meat,       is  a diet involving no meat,
just vegetables. It is also         just vegetables. It is also
common in cows - they are           common in cows - they are
 awesome.                           awesome.

./stereo washington.txt 35 75 "l r" | bentangkan

In a little district west of          In a little district west of
 Washington Square the streets        Washington  Square the streets
have run crazy and broken             have run crazy and broken
themselves into small strips          themselves into small strips
called 'places'. These 'places'       called 'places'. These 'places'
make strange angles and curves.       make strange angles and curves.
One Street crosses itself a time      One Street crosses itself a time
or two. An artist once discovered     or two. An artist once discovered
a valuable possibility in this        a valuable possibility in this
street. Suppose a collector with a    street. Suppose a collector with a
bill for  paints, paper and canvas    bill for paints,  paper and canvas
should, in traversing this route,     should, in traversing this route,
suddenly meet  himself coming         suddenly meet himself  coming
back, without a cent having been      back, without a cent having been
paid on account!                      paid on account!

"| Perluas" tidak perlu tetapi ketika menggeser output dengan 4 tempat TAB ditangani secara tidak benar. Itu bisa dimasukkan ke dalam skrip dengan biaya 7 byte.

Variasi ImageMagick

Mengganti baris terakhir dengan perintah ImageMagick teks-ke-gambar:

c=${6:-=};R=$c;L=;for f in r l;do
e="sed -e ";$e"$ d;s/$\|  */ \n/g" $1>m
o=1;for w in `$e"$ p;d" $1`;do
$e"$o,/^$w /s/^$w /$L$w$R /" m>n;o="/$c/"
cp n m;done;tr -d \\n<n|fold -sw${2:-35}|$e"s/$c/ /g">$f
L=$c;R=;done;
convert -border 10x30 label:@${4:-l} label:@${5:-r} +append show:

Dalam hal ini, "r" dan "l" untuk tampilan juling versus paralel adalah argumen terpisah:

./im_stereo vegetarianism.txt 40 80 lr =


(sumber: simplesystems.org )

EDIT 3: Menambahkan variasi ImageMagick.

Glenn Randers-Pehrson
sumber
8

TeX 212

Saya menggunakan sistem penyusunan huruf, bukan ASCII. Lebar kolom dapat diubah dengan mengubah 90ptdi baris keempat, tapi saya tidak tahu apakah itu cukup untuk memenuhi syarat untuk diskon 50 byte. Jarak antara dua salinan teks dapat diubah dengan mengubah 9pt, juga di baris keempat. Kode mungkin bisa dibuat lebih pendek. Satu dapat mengganti setiap baris baru dengan satu ruang, tetapi tidak menghapusnya sepenuhnya.

\let\e\expandafter\read5to\t\read5to\.\def\a#1
{\def\~##1#1##2\a{\def\t{##1\hbox{\
#1\~{}}##2}\a}\e\~\t\a}\e\a\.{}\shipout\hbox
spread9pt{\hsize90pt\fontdimen3\font\hsize\vbox{\t}\
\let\~\ \def\ {}\vbox{\t}}\end.

Setelah menelepon tex filename.texdi terminal, pengguna diminta untuk memberikan teks utama, kemudian diminta lagi untuk mengubah daftar kata. Tidak ada garis kosong di antaranya. Daftar kata (dipisahkan spasi) yang diberikan pada baris kedua harus muncul persis seperti pada teks utama (tanda baca diperlakukan seperti huruf, hanya spasi kata-kata pembatas ruang).

Bruno Le Floch
sumber
7
Saya tidak memiliki kompiler TeX. Bisakah saya melihat gambar?
aebabis
1
Maksud saya dapat disesuaikan dengan input pengguna daripada mengedit kode, jika tidak bonus ini akan berlaku untuk hampir semua kode.
kitcar2000
4

Javascript 391 (441 - 50)

(Golf kode pertama saya)

k=' ';Q='length';A=prompt().split(k);S=prompt().split(k);i=-1;M=25;L=[[]];j=0;R='';while(i++<A[Q]-1){if((j+A[i][Q])<M){if(S.indexOf(A[i])>-1){A[i]=(j?k+k:k)+A[i]}L[L[Q]-1].push(A[i]);j+=A[i][Q]+1}else{j=0;i--;L.push([])}}for(i=0;i<L[Q]-1;P(L[i++].join(C))){C=k;while(L[i].join(C+k)[Q]<M){C+=k}}P(L[i].join(k)+k);function P(a){while(a[Q]<M){a=a.replace(k,k+k)}R+=a;for(c in S){a=a.split(k+k+S[c]).join(k+S[c]+k)}R+=k+k+a+'\n'}console.log(R);

Hasil

In    a  little  district   In    a  little  district
west    of     Washington   west    of    Washington 
Square   the streets have   Square   the streets have
run    crazy  and  broken   run    crazy  and  broken
themselves    into  small   themselves    into  small
strips   called 'places'.   strips   called 'places'.
These     'places'   make   These     'places'   make
strange     angles    and   strange     angles    and
curves.     One    Street   curves.     One    Street
crosses  itself a time or   crosses  itself a time or
two.     An  artist  once   two.     An  artist  once
discovered    a  valuable   discovered    a  valuable
possibility     in   this   possibility     in   this
street.      Suppose    a   street.      Suppose    a
collector   with  a  bill   collector   with  a  bill
for   paints,  paper  and   for  paints ,  paper  and
canvas      should,    in   canvas      should,    in
traversing   this  route,   traversing   this  route,
suddenly   meet   himself   suddenly   meet  himself 
coming    back, without a   coming    back, without a
cent  having been paid on   cent  having been paid on
account!                    account! 

Kode panjang:

var arr = "In a little district west of Washington Square the streets have run crazy and broken themselves into small strips called 'places'. These 'places' make strange angles and curves. One Street crosses itself a time or two. An artist once discovered a valuable possibility in this street. Suppose a collector with a bill for paints, paper and canvas should, in traversing this route, suddenly meet himself coming back, without a cent having been paid on account!".split(' ');
var secret = "Washington paints himself".split(' ');
var i = -1;
var MAX_WIDTH = 25;
var lines = [[]];
var _l = 0;

var result = '';

while (i++ < arr.length - 1) {
    if ((_l + arr[i].length) < MAX_WIDTH) {
        if (secret.indexOf(arr[i]) > -1) {arr[i] = (_l?'  ':' ') + arr[i]}
        lines[lines.length - 1].push(arr[i]);
        _l += arr[i].length + 1;

    } else {
        _l = 0;
        i--;
        lines.push([]);
    }
}

for (var i = 0; i < lines.length - 1; putText(lines[i++].join(chars))) {
  // Align text
  var chars = ' ';
  while (lines[i].join(chars + ' ').length < MAX_WIDTH) {
    chars += ' ';
  }
}
putText(lines[i].join(' ') + ' ');
function putText(line) {
  while (line.length < MAX_WIDTH) {
    line = line.replace(' ', '  ');
  }
  // Make the illusion
  result += line;
  for (var val in secret) {
    line = line.split('  '+secret[val]).join(' ' + secret[val] + ' ');
  }
  result += ('   ' + line) + '\n';
}
console.log(result);
TrungDQ
sumber
1
Bagus sekali. Anda dapat menyimpan banyak (~ 17) jika Anda menambahkan Q='length'dan kemudian mengganti hal-hal seperti A.lengthdengan A[Q].
DocMax
@DocMax terima kasih, itu trik yang bagus. Saya baru dalam codegolf, terima kasih atas saran Anda :)
TrungDQ
1
"Washington melukis dirinya sendiri"?
Joe Z.
3

Javascript 493 (harapan minimum)

g=" ";l=prompt().split(g);r=l.slice();m=prompt().split(g);f=[];s=f.slice();w=0;n=0;a="";for(i=0;i<l.length;i++){if(l[i]==m[0]){m.shift();l[i]=g+r[i];r[i]+=g;}if(l[i].length+1>w)w=l[i].length+1;}while(l.length){f[f.length]="";s[s.length]="";while(l.length&&f[f.length-1].length+l[0].length<w){f[f.length-1]+=l[0]+g;s[s.length-1]+=r[0]+g;l.shift();r.shift();}f[f.length-1]+=g.repeat(w-f[f.length-1].length);}console.log(f,s);while(f.length){a+=f[0]+s[0]+"\n";f.shift();s.shift();}console.log(a);

Kode ini mengatur dua array garis (kiri dan kanan), mengaturnya dalam sebuah string dan mencetak ke f12konsol.

Ini hanya jawaban minimum, tidak dimaksudkan untuk menang.

kitcar2000
sumber
1
418 dengan JavaScript:L=b=>b.length;c=console.log;p=prompt;r=(l=p().split(g=" ")).slice(),m=p().split(g),s=(f=[]).slice(),n=w=a="";for(i=0;i<L(l);i++)l[i]==m[0]&&(m.shift(),l[i]=g+r[i],r[i]+=g),L(l[i])+1>w&&(w=L(l[i])+1);for(;L(l);){f[L(f)]="";for(s[L(s)]="";L(l)&&L(f[L(f)-1])+L(l[0])<w;)f[L(f)-1]+=l[0]+g,s[L(s)-1]+=r[0]+g,l.shift(),r.shift();f[L(f)-1]+=g.repeat(w-L(f[L(f)-1]))}for(c(f,s);L(f);)a+=f[0]+s[0]+"\n",f.shift(),s.shift();c(a)
WallyWest
3

GolfScript 209 (279 -50 -20)

Ini adalah program GolfScript besar pertama saya. Saya tidak akan terkejut jika ada optimasi yang bisa didapat. Kedua bonus didukung; mereka diharapkan ditemukan setelah input pesan, seperti:

"I invented vegetarianism.  It is a diet involving no meat, just vegetables.  It is also common in cows - they are awesome."

"vegetarianism. is awesome."

16  # column width
0   # view type, 1 for cross eyed (?)

Jika Anda menyimpan file itu ke input(dan mengunduh GolfScript ), Anda dapat memanggil skrip dengan:

> cat input | ruby golfscript.rb

Golf

~{{\}}{{}}if:v;:w;n%~' '%\' '%[.]zip 0:c;{' '*}:s;{[.;]}:r;\{:x;{.c=0=x=}{1c+:c;}until.c<\1c+>[[x' 'v+' 'x v+]]\++}/zip{0:c;[[]]\{.,.c+w<{1c++:c;\)@r+r+}{:c;[r]+}if}/{.{,}%{+}*w\- 1$,1-.{1$1$/@@%@0:g;{3$3$g>+s\++1g+:g;}*\;\;}{[;.2/\2%1$s@@+s@)\;\]{+}*}if}%}%zip{{4s\++}*}%n*puts

Tidak disatukan

~
#The program:

# Parameters, in reverse natural order

{{\}}{{}}if:v;   # view - truthy for parallel, falsey for cross-eyed
:w;         # col width

n%~         # split input on newlines

' '%\       # split secret message tokens
' '%        # split public message

[.]zip      # left and right

0:c;        # word count

{' '*}:s;   # spaces
{[.;]}:r;   # array of top

# for each secret word
\{

  :x;       # word

  {.c=0=x=}
  {1c+:c;} until
  # next public word is this private word

  # splice edits
  .c< \1c+> [[x' 'v+  ' 'x v+]]\ ++

}/
zip

# layout both messages
{

  0:c;    # char count

  [[]]\   # line accumulator

  # split lines
  {

    .,.c+w<
    # if enough room on line

    #append to current line
    {1c++:c;
    \)@r+r+
    }

    #append as new line
    {:c;
    [r]+
    }if

  }/

  # set lines
  {

    .{,}%{+}* # line chars
    w\-       # space chars
    1$,1-     # gaps between words

    # if multi word
    .{

      1$1$      # duplicate params

      /@@       # chars per space
      %         # extra space gaps

      @         # load line
      0:g;      # current gap

      # join row
      {
        3$3$    # params

        g>+     # extra space
        s       # space chars

        \++     # append

        1g+:g;  # update gap
      }*

      \;\;      # drop params

    }
    # else one word
    {
      [
        ;         # drop gap count
        .         # num spaces needed

        2/\       # spaces per side
        2%        # extra space

        1$s       # left space
        @@+s      # right space

        @)\;\     # word

      ]{+}*     # join

    }if

  }% # end line layout

}% # end message layout

zip

{{4s\++}*}%

n*

puts
sofa dan
sumber
1

JavaScript 391

_='L=b=>b.length;c=console.log;p=prompt;r=(l*=" ")3m*),s=(f=[]3n=w=a52i=0;i<67i++)l/==m@&&(m!,l/=g+r/,r/8g),?>w&&(w=?72;67){9$]5‌​2:]56)&&%#)+64)<w;)#8l4+g,:-1]8r@+g,l!,r!;#8g.repeat(w-%#))}2c(f,s7%f7)a8$f4+s4+"‌​\\n",f!,s!;c(a)!.shift()#9-1]$??%L(*=p().split(g/[i]2for(3).slice(),4[0]5="";6%l7)‌​;8+=9f[%f):s[%s)?6/)+1@[$0]';for(Y in $='@?:98765432/*%$#!')with(_.split($[Y]))_=join(pop());eval(_)
WallyWest
sumber