숨겨진 스테레오 그램 메시지


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)

이것은 코드 골프이므로 보너스 후 가장 짧은 코드입니다.


3
텍스트가있는 스테레오 그램이 처음입니다. 대단해.
Michael M.

그들은 나를 위해 일을하지 않습니다 : / (나는 입체 비전을 억제하는 눈 문제가)
데이비드 윌킨스을

이런 쓰레기 내가 방금 봤어 ... 이것은 인상적이다!
WallyWest

@Glenn Randers-Pehrson 왜 [정렬] 태그를 추가했는지 설명해 주시겠습니까?
pastebin.com 슬래시 0mr8spkT

그건 실수 였어. 다른 질문에 있다고 생각했는데 취소 할 방법을 찾을 수 없습니다. 승인되면 롤백합니다.
Glenn Randers-Pehrson

답변:


1

배쉬, 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}

스크립트가 "stereo"라는 실행 파일에 있으면 다음을 입력하십시오.

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

column_width는 숫자입니다. 25-45가 작동하고 기본값은 35입니다.

page_width는 숫자이며 column_width의 약 2 배 여야합니다. 기본값은 80입니다.

교차보기를하려면 "r l"을 네 번째 인수로 사용하십시오. 기본값은 "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 변형

마지막 행을 text-to-image 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 lr =


(출처 : 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

자바 스크립트 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);

1
잘 했어요 당신이 추가하면 당신은 무리 (~ 17)을 절약 할 수 있습니다 Q='length'다음과 같은 일을 대체 A.lengthA[Q].
DocMax

@DocMax 덕분에 좋은 트릭입니다. 나는 codegolf에서 새로 왔으며, 귀하의 제안에 감사드립니다 :)
TrungDQ

1
"워싱턴은 스스로 그림을 그립니다"?
Joe Z.

3

자바 스크립트 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콘솔에 인쇄합니다 .

이것은 단지 최소한의 대답이며, 이길 의도는 아닙니다.


1
JavaScript를 사용한 418 :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 (?)

해당 파일을 저장하고 GolfScript를input 다운로드 한 경우 하여 스크립트를 호출 할 수 있습니다.

> cat input | ruby golfscript.rb

골프

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

언 골프

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

1

자바 스크립트 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(_)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.