Mensaje de estereograma oculto

29

Debe generar un estereograma de texto de acuerdo con una cadena de entrada que contiene un párrafo de texto, una línea vacía y luego el mensaje oculto. El resultado se mostrará como un par de párrafos, uno con un espaciado diferente que provoca el efecto de que se levante cuando se ve estereográficamente (se puede encontrar una explicación aquí ).

Ejemplo

Entrada:

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

vegetarianism. is awesome.

Salida:

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. 

Bonos

  • Agregue la opción para elegir entre paralelos y ojos cruzados como entrada del usuario (-20)
  • Ancho de columna ajustable como entrada del usuario (-50)

Este es el código de golf, por lo que el código más corto después de los bonos gana.

kitcar2000
fuente
3
Esta es la primera vez que veo un estereograma con texto. Esto es asombroso
Michael M.
No funcionan para mí: / (Tengo problemas oculares que inhiben la visión estereográfica)
David Wilkins
Mierda, lo acabo de ver ... ¡Esto es impresionante!
WallyWest
@Glenn Randers-Pehrson, ¿le importaría explicar por qué agregó la etiqueta [clasificación]?
user12205
Fue un error. Pensé que estaba en otra pregunta, y no puedo encontrar una manera de cancelar. Si se aprueba, lo revertiré.
Glenn Randers-Pehrson

Respuestas:

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}

Si el script está en un archivo ejecutable llamado "estéreo", escriba

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

column_width es un número; 25-45 funcionará, el valor predeterminado es 35.

page_width es un número, debe ser aproximadamente el doble del column_width, el valor predeterminado es 80

Para ver con los ojos cruzados, use "r l" como el 4to argumento. El valor predeterminado es "l r", que se configura para visualización paralela.

EDITAR: reescribió para dividir el archivo en una palabra por línea, luego vuelva a armar al final. Nota: se reserva el signo "=" para su propio uso. Cualquier signo "=" en el archivo de entrada se convertirá en blanco.

EDITAR: Si su mensaje tiene signos "=" en él, puede elegir otro símbolo para que lo use el script, proporcionándolo como el 5º parámetro.

Ejemplo

Entrada: vegetarianismo.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.

Resultado

./stereo vegetarianism.txt 32 72 "l r": | expandir (usando los dos puntos como su símbolo interno de trabajo)

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" | expandir

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!

El "| expandir" no es necesario, pero al cambiar la salida por 4 lugares, las TAB se manejan incorrectamente. Se podría poner en el script a un costo de 7 bytes.

Variación de ImageMagick

Reemplazar la última línea con un comando ImageMagick de texto a imagen:

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:

En este caso, la "r" y la "l" para visión cruzada versus visión paralela son argumentos separados:

./im_stereo vegetarianismo.txt 40 80 lr =


(fuente: simplesystems.org )

EDITAR 3: Variación de ImageMagick añadida.

Glenn Randers-Pehrson
fuente
8

TeX 212

Estoy usando un sistema de composición tipográfica, no ASCII. El ancho de la columna se puede cambiar cambiando 90pten la cuarta línea, pero no sé si eso es suficiente para calificar para el descuento de 50 bytes. La distancia entre las dos copias del texto se puede cambiar cambiando el 9pt, también en la cuarta línea. El código probablemente se puede acortar. Se puede reemplazar cada nueva línea por un solo espacio, pero no eliminarlas por completo.

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

Después de llamar tex filename.texal terminal, se le pide al usuario que dé el texto principal, luego se le solicita nuevamente una lista de palabras para cambiar. No hay una línea vacía en el medio. La lista de palabras (separadas por espacios) en la segunda línea debe aparecer exactamente como en el texto principal (la puntuación se trata como lo haría una letra, solo los espacios delimitan palabras).

Bruno Le Floch
fuente
77
No tengo un compilador TeX. ¿Puedo ver una foto?
aebabis
1
Quise decir ajustable por la entrada del usuario en lugar de editar el código, de lo contrario, esta bonificación se aplicaría a casi cualquier código.
kitcar2000
4

Javascript 391 (441-50)

(Mi primer código de golf)

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

Resultado

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! 

Código largo:

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
fuente
1
Bien hecho. Puede guardar un montón (~ 17) si agrega Q='length'y luego reemplaza cosas como A.lengthcon A[Q].
DocMax
@DocMax gracias, ese es un buen truco. Soy nuevo en codegolf, gracias por su sugerencia :)
TrungDQ
1
¿"Washington se pinta a sí mismo"?
Joe Z.
3

Javascript 493 (expectativas mínimas)

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

Este código configura dos matrices de líneas (izquierda y derecha), las organiza en una cadena e imprime en la f12consola.

Esta es solo una respuesta mínima, no destinada a ganar.

kitcar2000
fuente
1
418 con 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)

Este es mi primer gran programa de GolfScript. No me sorprendería si hay optimizaciones para tener. Ambas bonificaciones son compatibles; se espera que se encuentren después de las entradas del mensaje, como:

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

Si guardó ese archivo input(y descargó GolfScript ) puede invocar el script con:

> 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

Sin golf

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