Versteckte Stereogrammnachricht

29

Sie müssen ein Textstereogramm anhand einer Eingabezeichenfolge generieren, die einen Textabschnitt, eine leere Zeile und dann die ausgeblendete Nachricht enthält. Das Ergebnis wird als Absatzpaar angezeigt, wobei einer mit unterschiedlichem Abstand dazu führt, dass der Effekt bei stereografischer Betrachtung erhöht wird (eine Erklärung finden Sie hier ).

Beispiel

Eingang:

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

vegetarianism. is awesome.

Ausgabe:

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. 

Boni

  • Option hinzufügen, um zwischen parallelen und gekreuzten Augen als Benutzereingabe zu wählen (-20)
  • Einstellbare Spaltenbreite als Benutzereingabe (-50)

Dies ist Codegolf, also gewinnt der kürzeste Code nach den Boni.

kitcar2000
quelle
3
Dies ist das erste Mal, dass ich ein Stereogramm mit Text sehe. Das ist fantastisch.
Michael M.
Sie funktionieren nicht für mich: / (Ich habe Augenprobleme, die das stereografische Sehen beeinträchtigen)
David Wilkins
Heiliger Mist, ich habe es gerade gesehen ... Das ist beeindruckend!
WallyWest
@Glenn Randers-Pehrson Würde es Ihnen etwas ausmachen, zu erklären, warum Sie das [sorting] -Tag hinzugefügt haben?
pastebin.com Schrägstrich 0mr8spkT
Es war ein Fehler. Ich dachte, ich hätte eine andere Frage und finde keinen Weg, sie zu stornieren. Wenn es genehmigt wird, werde ich es zurücksetzen.
Glenn Randers-Pehrson

Antworten:

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}

Befindet sich das Skript in einer ausführbaren Datei mit dem Namen "stereo", geben Sie Folgendes ein

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

column_width ist eine Zahl; 25-45 wird funktionieren, Standard ist 35.

page_width ist eine Zahl, sollte etwa doppelt so groß sein wie column_width, Standard ist 80

Verwenden Sie "r l" als viertes Argument, wenn Sie mit den Augen schauen. Die Standardeinstellung ist "l r", die für die parallele Anzeige eingerichtet ist.

BEARBEITEN: Umschreiben, um die Datei in ein Wort pro Zeile zu teilen, und am Ende wieder zusammensetzen. Hinweis: Reserviert das Zeichen "=" für die eigene Verwendung. Alle "=" Zeichen in der Eingabedatei werden zu Leerzeichen.

BEARBEITEN: Wenn Ihre Nachricht ein "=" - Zeichen enthält, können Sie ein anderes Symbol für das zu verwendende Skript auswählen, indem Sie es als fünften Parameter angeben.

Beispiel

Eingabe: 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.

Ergebnis

./stereo vegetarianism.txt 32 72 "l r": | expand (mit dem Doppelpunkt als internes Arbeitssymbol)

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

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!

Das "| expand" ist nicht notwendig, aber wenn die Ausgabe um 4 Stellen verschoben wird, werden die TABs falsch behandelt. Es könnte zu einem Preis von 7 Bytes in das Skript eingefügt werden.

ImageMagick-Variante

Ersetzen der letzten Zeile durch einen ImageMagick-Befehl von Text zu Bild:

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:

In diesem Fall sind das "r" und das "l" für die gegenseitige Anzeige von Augen und Augenpaaren getrennte Argumente:

./im_stereo vegetarianism.txt 40 80 lr =


(Quelle: simplesystems.org )

EDIT 3: ImageMagick-Variation hinzugefügt.

Glenn Randers-Pehrson
quelle
8

TeX 212

Ich benutze ein Schriftsatzsystem, kein ASCII. Die Spaltenbreite kann durch Ändern 90ptin der vierten Zeile geändert werden , aber ich weiß nicht, ob dies ausreicht, um den Rabatt von 50 Byte zu erhalten. Der Abstand zwischen den beiden Kopien des Textes kann durch Ändern der 9ptebenfalls in der vierten Zeile geändert werden . Der Code kann wahrscheinlich kürzer gemacht werden. Man kann jede neue Zeile durch ein einzelnes Leerzeichen ersetzen, aber nicht vollständig entfernen.

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

Nach dem Anruf tex filename.tex des Terminals wird der Benutzer aufgefordert, den Haupttext einzugeben und dann erneut eine Liste der zu verschiebenden Wörter einzugeben. Keine Leerzeile dazwischen. Die (durch Leerzeichen getrennte) Liste der Wörter in der zweiten Zeile sollte genauso erscheinen wie im Haupttext (die Interpunktion wird wie ein Buchstabe behandelt, nur durch Leerzeichen begrenzte Wörter).

Bruno Le Floch
quelle
7
Ich habe keinen TeX-Compiler. Könnte ich ein Bild sehen?
Aebabis
1
Ich meinte, durch Benutzereingaben einstellbar zu sein, anstatt den Code zu bearbeiten, sonst würde dieser Bonus für fast jeden Code gelten.
Kitcar2000
4

Javascript 391 (441 - 50)

(Mein erster Code 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);

Ergebnis

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! 

Langer Code:

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
quelle
1
Schön gemacht. Sie können ein Bündel (~ 17) speichern , wenn Sie hinzufügen , Q='length'und dann Dinge ersetzen wie A.lengthmit A[Q].
DocMax
@ DocMax danke, das ist ein schöner Trick. Ich bin neu in Codegolf, danke für Ihren Vorschlag :)
TrungDQ
1
"Washington malt sich"?
Joe Z.
3

Javascript 493 (Mindestanforderungen)

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

Dieser Code erstellt zwei Zeilenarrays (links und rechts), ordnet sie in einer Zeichenfolge an und gibt sie auf der f12Konsole aus.

Dies ist nur eine minimale Antwort, die nicht zum Gewinnen gedacht ist.

kitcar2000
quelle
1
418 mit 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)

Dies ist mein erstes großes GolfScript-Programm. Es würde mich nicht wundern, wenn es Optimierungen geben würde. Beide Boni werden unterstützt; Es wird erwartet, dass sie nach den Nachrichteneingaben gefunden werden, wie:

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

Wenn Sie diese Datei in GolfScript gespeichert inputund heruntergeladen haben , können Sie das Skript folgendermaßen aufrufen:

> cat input | ruby golfscript.rb

Golf gespielt

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