Gizli stereogram mesajı


29

Bir metin paragrafı, bir boş satır ve ardından gizli mesaj içeren bir giriş dizgisine göre bir metin stereogramı oluşturmalısınız. Sonuç, stereografik olarak bakıldığında etkisinin artmasına neden olan farklı boşluklara sahip bir çift paragraf olarak gösterilecektir (Bir açıklama burada bulunabilir ).

Örnek

Giriş:

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

vegetarianism. is awesome.

Çıktı:

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. 

Bonuslar

  • Kullanıcı girişi olarak paralel ve çapraz gözlü arasında seçim yapma seçeneği ekleyin (-20)
  • Kullanıcı girişi olarak ayarlanabilir sütun genişliği (-50)

Bu kod golf, bonus kazandıktan sonra en kısa kod.


3
İlk defa metin içeren bir stereogram görüyorum. Bu harika.
Michael M.

Benim için çalışmıyorlar: / (Stereografik vizyonu engelleyen göz problemlerim var)
David Wilkins

Vay canına, az önce gördüm ... Bu etkileyici!
WallyWest

@Glenn Randers-Pehrson, [sorting] etiketini neden eklediğinizi açıklar mısınız?
user12205

Bu bir hataydı. Başka bir soruda olduğumu ve iptal etmenin bir yolunu bulamadığımı düşündüm. Onaylanırsa geri alırım.
Glenn Randers-Pehrson

Yanıtlar:


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}

Komut dosyası "stereo" adlı yürütülebilir bir dosyadaysa, yazın

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

column_width bir sayıdır; 25-45 çalışacaktır, varsayılan değer 35'tir.

page_width bir sayıdır, column_width'in yaklaşık iki katı olmalı, varsayılan değer 80

Çapraz gözlü görüntüleme için, 4. argüman olarak "r l" kullanın. Varsayılan, paralel görüntüleme için ayarlanan "l r" dir.

EDIT: Dosyayı her satırda bir kelimeye bölmek, sonra sonunda tekrar monte etmek için yeniden yazıldı. Not: "=" işaretini kendi kullanımına ayırır. Giriş dosyasındaki herhangi bir "=" işareti boşluk bırakacaktır.

EDIT: Mesajınızda "=" işareti varsa, komut dosyası için 5. parametre olarak sağlayarak kullanılacak kod için başka bir simge seçebilirsiniz.

Örnek

Girdi: vejeteryanlık.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.

Sonuç

./stereo vegetarianism.txt 32 72 "l r": | genişlet (iç çalışma sembolü için iki nokta üst üste kullanarak)

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" | genişlet

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!

"| Genişletmek" gerekli değildir ancak çıktıyı 4 konuma kaydırırken TAB'lar yanlış ele alınır. Komut dosyasına 7 baytlık bir maliyetle yerleştirilebilir.

ImageMagick varyasyonu

Son satırı bir metinden resme ImageMagick komutuyla değiştirmek:

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:

Bunda paralel gözleme ve paralel görüntülemeye yönelik "r" ve "l" ayrı argümanlardır:

./im_stereo vegetarianism.txt 40 80 lr =


(kaynak: simplesystems.org )

EDIT 3: ImageMagick varyasyonu eklendi.


8

TeX 212

Bir dizgi sistemini kullanıyorum, ASCII'yi değil. Sütun genişliği 90ptdördüncü satırda değiştirilerek değiştirilebilir , ancak 50 baytlık indirime hak kazanmanın yeterli olup olmadığını bilmiyorum. Metnin iki kopyası arasındaki mesafe 9pt, dördüncü satırda da değiştirilerek değiştirilebilir . Kod muhtemelen daha kısa yapılabilir. Kişi her yeni satırı tek bir boşlukla değiştirebilir, ancak tamamen kaldıramaz.

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

tex filename.texTerminalde arama yaptıktan sonra , kullanıcıdan ana metni girmesi istenir, ardından tekrar bir sözcük listesi kaydırması istenir. Arada boş satır yok. İkinci satırda verilen kelimelerin (boşlukla ayrılmış) listesi, tam olarak ana metinde olduğu gibi görünmelidir (noktalama, tıpkı bir harfin olduğu gibi işlem görür, yalnızca boşlukları sınırlandırır).


7
TeX derleyicim yok. Bir resim görebilir miyim
aebabis

1
Kodu düzenlemek yerine kullanıcı girişi ile ayarlanmayı kastediyordum, aksi takdirde bu bonus hemen hemen her kod için geçerli olacaktı.
kitcar2000

4

Javascript 391 (441 - 50)

(İlk golf kodum)

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

Sonuç

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! 

Uzun kod:

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

1
Güzel bitti. Eğer eklerseniz bir demet (~ 17) kaydedebilir Q='length've daha sonra gibi şeyler değiştirmek A.lengthile A[Q].
DocMax

@DocMax teşekkürler, bu güzel bir hiledir. Codegolf'da yeniyim, öneriniz için teşekkürler :)
TrungDQ

1
"Washington kendini boyar"?
Joe Z.

3

Javascript 493 (minimum beklentiler)

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

Bu kod iki satır dizisi (sol ve sağ) oluşturur, dizede düzenler ve f12 konsola .

Bu sadece asgari bir cevap, kazanma amaçlı değil.


1
JavaScript ile 418: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)

Bu benim ilk büyük GolfScript programım. Yapılması gereken iyileştirmeler olsa şaşırmam. Her iki bonus da desteklenir; mesaj girişlerinden sonra bulunmaları beklenir:

"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 (?)

Bu dosyayı kaydettiyseniz input(ve GolfScript'i indirdiyseniz ), betiği şu şekilde çalıştırabilirsiniz:

> cat input | ruby golfscript.rb

golfed

~{{\}}{{}}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

Ungolfed

~
#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

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