Скрытое сообщение стереограммы

29

Вы должны сгенерировать текстовую стереограмму в соответствии со строкой ввода, содержащей абзац текста, пустую строку и скрытое сообщение. Результат будет отображаться в виде пары абзацев, один из которых будет иметь разный интервал, вызывая эффект его увеличения при стереографическом просмотре (объяснение можно найти здесь ).

пример

Входные данные:

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

vegetarianism. is awesome.

Выход:

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. 

Бонусы

  • Добавить опцию для выбора между параллельным и косоглазым в качестве пользовательского ввода (-20)
  • Настраиваемая ширина столбца как пользовательский ввод (-50)

Это код гольфа, поэтому выигрывает самый короткий код после бонусов.

kitcar2000
источник
3
Это первый раз, когда я вижу стереограмму с текстом. Это круто.
Майкл М.
Они не работают для меня: / (У меня проблемы со зрением, которые мешают стереографическому зрению)
Дэвид Уилкинс
Святое дерьмо, я только что видел это ... Это впечатляет!
WallyWest
@Glenn Randers-Pehrson не могли бы вы объяснить, почему вы добавили тег [sorting]?
user12205
Это было ошибкой. Я думал, что у меня есть другой вопрос, и не могу найти способ отменить. Если он будет одобрен, я откатлю его обратно.
Гленн Рандерс-Персон

Ответы:

1

Баш, седь: 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}

Если сценарий находится в исполняемом файле с именем «стерео», введите

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

column_width - это число; 25-45 будет работать, по умолчанию 35.

page_width это число, должно быть примерно в два раза больше column_width, по умолчанию 80

Для просмотра с косыми глазами используйте «r l» в качестве 4-го аргумента. По умолчанию установлено значение «l r» для параллельного просмотра.

РЕДАКТИРОВАТЬ: переписать, чтобы разделить файл на одно слово в строке, а затем собрать в конце. Примечание: резервирует знак "=" для собственного использования. Любые знаки «=» во входном файле станут пробелами.

РЕДАКТИРОВАТЬ: Если в вашем сообщении есть знаки «=», вы можете выбрать другой символ для сценария, который будет использоваться, указав его в качестве 5-го параметра.

пример

Входные данные: 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.

Результат

./stereo vegetarianism.txt 32 72 "l r": | развернуть (используя двоеточие для внутреннего рабочего символа)

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" | развернуть

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!

«| Раскрыть» не нужно, но при смещении вывода на 4 позиции TAB обрабатываются неправильно. Это может быть вставлено в скрипт стоимостью 7 байт.

Вариация ImageMagick

Замена последней строки командой ImageMagick с преобразованием текста в изображение:

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:

В этом случае «r» и «l» для просмотра в параллельном или параллельном режиме являются отдельными аргументами:

./im_stereo vegetarianism.txt 40 80 лр =


(источник: simplesystems.org )

РЕДАКТИРОВАТЬ 3: Добавлена ​​вариация ImageMagick.

Гленн Рандерс-Персон
источник
8

TeX 212

Я использую систему набора текста, а не ASCII. Ширина столбца может быть изменена путем изменения 90ptв четвертой строке, но я не знаю, достаточно ли этого для получения скидки в 50 байт. Расстояние между двумя копиями текста можно изменить, изменив 9ptтакже и четвертую строку. Код, вероятно, можно сделать короче. Можно заменить каждую новую строку одним пробелом, но не удалять их полностью.

\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.texв терминале пользователю предлагается ввести основной текст, а затем снова запрашивается список слов для смещения. Между ними нет пустой строки. Список слов (разделенный пробелами), приведенный во второй строке, должен отображаться точно так же, как и в основном тексте (пунктуация обрабатывается так же, как и буква, только слова, разделенные пробелами).

Бруно Ле Флох
источник
7
У меня нет компилятора TeX. Могу ли я увидеть картину?
aebabis
1
Я имел в виду настраиваемый пользовательский ввод, а не редактирование кода, в противном случае этот бонус будет применяться практически к любому коду.
kitcar2000
4

Javascript 391 (441 - 50)

(Мой первый код гольф)

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

Результат

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! 

Длинный код:

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
источник
1
Красиво сделано. Вы можете сэкономить кучу (~ 17) , если добавить , Q='length'а затем заменить такие вещи , как A.lengthс A[Q].
DocMax
@DocMax спасибо, это хороший трюк. Я новичок в Codegolf, спасибо за ваше предложение :)
TrungDQ
1
"Вашингтон рисует сам"?
Джо З.
3

Javascript 493 (минимальные ожидания)

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

Этот код устанавливает два массива строк (слева и справа), размещает их в строку и выводит на f12консоль.

Это всего лишь минимальный ответ, не предназначенный для победы.

kitcar2000
источник
1
418 с 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)

Это моя первая большая программа на GolfScript. Я не удивлюсь, если будут оптимизации. Оба бонуса поддерживаются; ожидается, что они будут найдены после ввода сообщений, например:

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

Если вы сохранили этот файл input(и скачали GolfScript ), вы можете запустить скрипт с помощью:

> 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
couchand
источник
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(_)
Уолли Уэст
источник