Ukryty komunikat stereogramu

29

Musisz wygenerować stereogram tekstowy na podstawie ciągu wejściowego zawierającego akapit tekstu, pustą linię, a następnie ukrytą wiadomość. Wynik zostanie wyświetlony jako para akapitów, jeden o różnych odstępach, powodujący podniesienie efektu podczas oglądania stereograficznego (wyjaśnienie znajduje się tutaj ).

Przykład

Wkład:

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

vegetarianism. is awesome.

Wydajność:

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. 

Bonusy

  • Dodaj opcję do wyboru między wejściem równoległym i zezemoczonym podczas wprowadzania danych przez użytkownika (-20)
  • Regulowana szerokość kolumny jako dane wejściowe użytkownika (-50)

To jest kod golfowy, więc wygrywa najkrótszy kod po bonusach.

kitcar2000
źródło
3
Po raz pierwszy widzę stereogram z tekstem. To jest niesamowite.
Michael M.
Nie działają dla mnie: / (Mam problemy z oczami, które hamują stereograficzne widzenie)
David Wilkins
Jasna cholera, właśnie to zobaczyłem ... To imponujące!
WallyWest
@Glenn Randers-Pehrson, czy mógłbyś wyjaśnić, dlaczego dodałeś tag [sortowanie]?
user12205
To był błąd. Myślałem, że mam inne pytanie i nie mogę znaleźć sposobu na anulowanie. Jeśli zostanie zatwierdzony, wycofam go.
Glenn Randers-Pehrson

Odpowiedzi:

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}

Jeśli skrypt znajduje się w pliku wykonywalnym o nazwie „stereo”, wpisz

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

column_width to liczba; 25-45 będzie działać, domyślnie 35.

page_width to liczba, powinna być około dwa razy większa niż szerokość kolumny, domyślnie 80

Do oglądania ze skrzyżowanymi oczami użyj „r l” jako czwartego argumentu. Domyślnie jest to „l r”, które ustawia się do oglądania równoległego.

EDYCJA: Przepisać, aby podzielić plik na jedno słowo w wierszu, a następnie ponownie złożyć na końcu. Uwaga: zastrzega znak „=” do własnego użytku. Wszelkie znaki „=” w pliku wejściowym będą puste.

EDYCJA: Jeśli twoja wiadomość zawiera znaki „=”, możesz wybrać inny symbol do użycia przez skrypt, podając go jako piąty parametr.

Przykład

Dane wejściowe: wegetarianizm.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.

Wynik

./stereo wegetarianizm.txt 32 72 "l r": | rozwinąć (używając dwukropka jako wewnętrznego symbolu pracy)

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" | rozwiń

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!

„| Rozwinąć” nie jest konieczne, ale przy przesunięciu wyjścia o 4 miejsca tabele są obsługiwane nieprawidłowo. Można go umieścić w skrypcie kosztem 7 bajtów.

Odmiana ImageMagick

Zastępowanie ostatniego wiersza poleceniem ImageMagick typu tekst na obraz:

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:

W tym przypadku „r” i „l” dla oglądania ze skrzyżowanymi oczami w porównaniu do oglądania równoległego są osobnymi argumentami:

./im_stereo wegetarianizm. txt 40 80 lr =


(źródło: simplesystems.org )

EDYCJA 3: Dodano odmianę ImageMagick.

Glenn Randers-Pehrson
źródło
8

TeX 212

Używam systemu składu, a nie ASCII. Szerokość kolumny można zmienić, zmieniając 90ptw czwartym wierszu, ale nie wiem, czy to wystarczy, aby zakwalifikować się do 50 bajtów zniżki. Odległość między dwiema kopiami tekstu można zmienić, zmieniając 9pttakże w czwartym wierszu. Kod można prawdopodobnie skrócić. Można zastąpić każdą nową linię pojedynczą spacją, ale nie można jej całkowicie usunąć.

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

Po wywołaniu tex filename.texw terminalu użytkownik jest proszony o podanie głównego tekstu, a następnie ponownie o listę słów do przesunięcia. Pomiędzy nie ma pustej linii. Lista słów (oddzielona spacjami) podana w drugim wierszu powinna wyglądać dokładnie tak, jak w tekście głównym (interpunkcja jest traktowana tak jak litera, tylko słowa oddzielają spacje).

Bruno Le Floch
źródło
7
Nie mam kompilatora TeX. Czy mogę zobaczyć zdjęcie?
aebabis
1
Miałem na myśli regulację wprowadzaną przez użytkownika, a nie edycję kodu, w przeciwnym razie ta premia miałaby zastosowanie do prawie każdego kodu.
kitcar2000
4

JavaScript 391 (441-50)

(Mój pierwszy kod golfowy)

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

Wynik

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! 

Długi 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);
TrungDQ
źródło
1
Ładnie wykonane. Można zaoszczędzić sporo (~ 17), jeśli dodać Q='length', a następnie wymienić rzeczy, jak A.lengthz A[Q].
DocMax
@DocMax dzięki, to niezła sztuczka. Jestem nowy w codegolf, dzięki za sugestię :)
TrungDQ
1
„Waszyngton maluje się”?
Joe Z.
3

JavaScript 493 (minimalne oczekiwania)

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

Ten kod ustawia dwie tablice wierszy (lewy i prawy), układa je w ciąg i drukuje na f12konsoli.

To tylko minimalna odpowiedź, nie przeznaczona do wygrania.

kitcar2000
źródło
1
418 z 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)

To mój pierwszy duży program GolfScript. Nie zdziwiłbym się, gdyby były jakieś optymalizacje. Oba bonusy są obsługiwane; należy je znaleźć po danych wejściowych komunikatu, takich jak:

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

Jeśli zapisałeś ten plik w input(i pobrałeś GolfScript ), możesz wywołać skrypt za pomocą:

> cat input | ruby golfscript.rb

Grał w golfa

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

Nie golfił

~
#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
źródło
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
źródło