Message de stéréogramme caché

29

Vous devez générer un stéréogramme de texte selon une chaîne de saisie contenant un paragraphe de texte, une ligne vide puis le message caché. Le résultat sera affiché sous la forme d'une paire de paragraphes, l'un avec un espacement différent, ce qui en augmentera l'effet lorsqu'il sera visualisé stéréographiquement (une explication peut être trouvée ici ).

Exemple

Contribution:

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

vegetarianism. is awesome.

Sortie:

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

  • Ajouter une option pour choisir entre parallèle et yeux croisés comme entrée utilisateur (-20)
  • Largeur de colonne réglable comme entrée utilisateur (-50)

C'est le golf de code, donc le code le plus court après la victoire des bonus.

kitcar2000
la source
3
C'est la première fois que je vois un stéréogramme avec du texte. C'est génial.
Michael M.
Ils ne fonctionnent pas pour moi: / (J'ai des problèmes oculaires qui empêchent la vision stéréographique)
David Wilkins
Putain de merde, je viens de le voir ... C'est impressionnant!
WallyWest
@Glenn Randers-Pehrson voudriez-vous expliquer pourquoi vous avez ajouté la balise [sorting]?
user12205
C'était une erreur. Je pensais que j'étais sur une autre question et je ne trouve pas de moyen d'annuler. Si elle est approuvée, je la reculerai.
Glenn Randers-Pehrson

Réponses:

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 le script se trouve dans un fichier exécutable appelé "stéréo", tapez

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

largeur_colonne est un nombre; 25-45 fonctionnera, la valeur par défaut est 35.

page_width est un nombre, devrait être environ le double de la column_width, la valeur par défaut est 80

Pour une vision croisée, utilisez "r l" comme quatrième argument. La valeur par défaut est "l r", qui permet une visualisation parallèle.

EDIT: réécrit pour diviser le fichier en un mot par ligne, puis remonter à la fin. Remarque: réserve le signe "=" pour son propre usage. Tout signe "=" dans le fichier d'entrée deviendra vide.

EDIT: Si votre message contient des signes "=", vous pouvez choisir un autre symbole pour le script à utiliser, en le fournissant comme 5ème paramètre.

Exemple

Entrée: 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.

Résultat

./stereo vegetarianism.txt 32 72 "l r": | développer (en utilisant les deux points pour son symbole de travail interne)

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

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!

Le "| expand" n'est pas nécessaire mais lors du décalage de la sortie de 4 endroits, les TAB sont mal gérés. Il pourrait être mis dans le script au coût de 7 octets.

Variation ImageMagick

Remplacement de la dernière ligne par une commande ImageMagick texte-image:

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:

Dans celui-ci, le "r" et le "l" pour la visualisation croisée par rapport à la visualisation parallèle sont des arguments séparés:

./im_stereo vegetarianism.txt 40 80 lr =


(source: simplesystems.org )

EDIT 3: Ajout de la variation ImageMagick.

Glenn Randers-Pehrson
la source
8

TeX 212

J'utilise un système de composition, pas ASCII. La largeur de colonne peut être modifiée en changeant 90ptdans la quatrième ligne, mais je ne sais pas si cela suffit pour bénéficier de la remise de 50 octets. La distance entre les deux copies du texte peut être modifiée en modifiant le 9pt, également sur la quatrième ligne. Le code peut probablement être raccourci. On peut remplacer chaque nouvelle ligne par un seul espace, mais pas les supprimer complètement.

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

Après avoir appelé tex filename.texdans le terminal, l'utilisateur est invité à donner le texte principal, puis à nouveau invité pour une liste de mots à déplacer. Pas de ligne vide entre les deux. La liste (séparée par des espaces) des mots donnée dans la deuxième ligne doit apparaître exactement comme dans le texte principal (la ponctuation est traitée comme une lettre, seuls les espaces délimitent les mots).

Bruno Le Floch
la source
7
Je n'ai pas de compilateur TeX. Puis-je voir une photo?
aebabis
1
Je voulais dire réglable par entrée utilisateur plutôt que par modification du code, sinon ce bonus s'appliquerait à presque tous les codes.
kitcar2000
4

Javascript 391 (441 - 50)

(Mon premier code 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);

Résultat

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! 

Code long:

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
la source
1
Bien fait. Vous pouvez enregistrer un tas (~ 17) si vous ajoutez Q='length'puis remplacez des choses comme A.lengthavec A[Q].
DocMax
@DocMax merci, c'est une bonne astuce. Je suis nouveau dans codegolf, merci pour votre suggestion :)
TrungDQ
1
"Washington se peint"?
Joe Z.
3

Javascript 493 (attentes minimales)

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

Ce code configure deux tableaux de lignes (gauche et droite), les organise dans une chaîne et imprime sur la f12console.

Ce n'est qu'une réponse minimale, pas destinée à gagner.

kitcar2000
la source
1
418 avec 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)

Ceci est mon premier grand programme GolfScript. Je ne serais pas surpris s'il y avait des optimisations à réaliser. Les deux bonus sont pris en charge; ils devraient être trouvés après les entrées de message, comme:

"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 vous avez enregistré ce fichier dans input(et téléchargé GolfScript ), vous pouvez appeler le script avec:

> 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

Non 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
la source
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
la source