아스키 아트 축소


12

도전

인쇄 가능한 ASCII 문자로 구성된 직사각형 격자가 문자열 또는 표준 입력을 통해 주어지면 공백이 아닌 문자를 맨 아래의 더미로 축소하는 함수 또는 프로그램을 작성하십시오.

규칙:

  • 출력은 입력과 동일한 치수와 문자를 갖습니다.
  • 에서 비 공백 문자는 (row a,column b)공백 문자 가질 수 없습니다 ' '에서 (a-1, b), (a-1,b-1)또는 (a-1,b+1)행이 가장 아래에서 위로 번호가 매겨집니다. 이로 인해 모든 수직 파일이 옆으로 축소됩니다.
  • 공백이 아닌 문자는 대부분의 (initial height - final height)장소에서 왼쪽이나 오른쪽으로 이동할 수 있습니다 (그림 1 참조).
  • 화면에서 문자가 떨어지지 않고 그림의 공간이 충분하다고 가정 할 수 있습니다.

그림 1 : 각각에 @#$표시된 문자의 가능한 최종 위치 x,y,z.

..............
...@..........
..xxx.........
.xxxxx...#....
xxxxxxx.yyy.$.

문자 축소 순서를 자유롭게 선택할 수 있습니다. 후행 공백은 좋지 않지만 후행 줄 바꿈은 유효합니다.

이것은 이므로 바이트 단위의 최단 답변이 이깁니다!

                 (__)
                 (oo)
           /------\/
          / |    ||
         *  /\---/\
            ~~   ~~
..."Have you mooed today?"...

하나의 가능한 출력 :

 
 
 
                --(_
           /----|/|(o_)
          /|/~\---~\\/o)
..."Have*you~mooed~today?"...

명확히하기 위해 문자가 떨어지는 방식을 매번 무작위로 생성하는 대신 하드 코딩 할 수 있습니까?
ETHproductions

18
그 소는 당신에게 무엇을 했습니까? :(
FlipTack 2016

올바른 @ETHproductions. 내 예는 규칙을 준수하는 한 아래에서 위로, 왼쪽에서 오른쪽이지만 임의의 순서 또는 다른 것이 좋습니다.
Angs

@ Flp.Tkc 모델 일뿐입니다.
Angs

1
@DestructibleWatermelon 만약 캐릭터가 화면에서 떨어지면, 그것은 당신의 잘못이 아닙니다.
Angs

답변:


4

자바 스크립트 (ES6), 100 90 88 바이트

f=s=>s==(l=s.search`
`,s=s.replace(eval(`/(\\S)([^]{${l-1},${l+1}}) /`),` $2$1`))?s:f(s)
s=`                 (__)        
                 (oo)        
           /------\\/         
          / |    ||          
         *  /\\---/\\          
            ~~   ~~          
..."Have you mooed today?"...`
console.log(s)
console.log(f(s))

문자열에 최소한 두 줄 이상이 있고 모든 줄은 같은 길이로 채워 져야합니다. 예제 이미지의 출력 :

              ( --           
            /|---/|-(o__     
          */~~\---~\|\/o))   
..."Have you/mooed~today?"...

가능한 경우 요소를 오른쪽으로 이동하려고 할 *Have와 가 사이에 해당되지 않습니다 you.

편집 : @ETHproductions 덕분에 10 % 절약되었습니다. @DanielIndie 덕분에 2 바이트를 더 절약했습니다.

레티 나 0.8.2 , 50 바이트

+`(?<=(.)*)(\S)(.*¶(?<-1>)?(?>(?<-1>.)*).?) 
 $3$2

온라인으로 사용해보십시오! 내 JavaScript 답변에 대한 약간 다른 접근 방식은 균형 그룹을 사용하여 공백이 아닌 문자 아래의 공백을 찾습니다. 는 (?<-1>)?(가) 상태 공간 왼쪽으로 한 열 수 있도록 .?공간이 1 개 칼럼 우측에있을 수있다.

망막 , 40 바이트

~0L$`.(.*)¶
+s`(\S)(.{$.1,$.&}) ¶ $$2$$1

온라인으로 사용해보십시오! 내 JavaScript 답변의 포트. 0L$원자 스테이지는 입력을 받아, 실제로 다음 의한 일본어 입력을 평가하는 여분 수행 명령 결과 번째 라인에 두 개의 길이 대입 ~화합물 스테이지.


이것은 훌륭한 알고리즘입니다! \n리터럴 개행 문자로 대체 하여 두 자리 수로 줄일 수 있습니다. ;-)
ETHproductions

또한 l=s.search`\n` 몇 바이트를 절약 할 수 있다고 생각합니다 .
ETHproductions


@DanielIndie f=재귀에 필요하지만 여전히 2 바이트를 절약합니다. 감사합니다!
Neil

당신이 맞아, 미안 : P
DanielIndie

3

파이썬 2, 298 바이트

a=input()
L=len(a);s=' '
a=[list(s*L+l.ljust(L+max(map(len,a))))for l in a]
t=1
while t:
 t=0
 for y in range(L-1):
  for x in range(len(a[y])):
   c=a[y][x];C=a[y+1][x-1:x+2]
   if s!=c and s in C:t=1;a[y][x]=s;a[y+1][[[x+1,x][C[1]==s],x-1][C[0]==s]]=c
for l in map(''.join,a):print l[L:].rstrip()

입력을 문자열 목록으로 취합니다 (한 줄에 하나씩).

예 : 입력 :

['                 (__)',
'                 (oo)',
'           /------\/',
'          / |    ||',
'         *  /\---/\ ',
'            ~~   ~~',
'..."Have you mooed today?"...']

산출:

              (
            -----/|-(o__
         //|~~\---~\|\/o))
..."Have*you/mooed~today?"...

3

C, 252 바이트

e=1,l,c,i,j,p,r,w,a[999];f(){while((i=getchar())>0)a[w++]=i,i<16?l++:0,l?0:c++;while(e)for(i=e=0;i<c;i++)for(j=l;j>=0;j--)e=(r=a[p=j*(c+1)+i]-32?a[r=p+c+1]-32?a[r=p+c]-32?a[r=p+c+2]-32?0:r:r:r:0)?l=a[p],a[p]=a[r],a[r]=l:e;for(i=0;i<w;)putchar(a[i++]);}

Ungolfed 테스트 코드 :

#include <stdio.h>

e=1,l,c,i,j,p,r,w,a[999];
f()
{
    // counting lines and columns
    while ((i = getchar())>0)a[w++] = i, i<16 ? l++ : 0, l ? 0 : c++;
    // main shaking loop
    while (e) // repeat while collapsing
        for (i = e = 0; i < c; i++) // columns loop
            for (j = l; j >= 0; j--) // lines loop
                e = ( // remember that collapsing was
                     r = // find place to collapse
                         a[p = j*(c + 1) + i] - 32 ? // if not space
                             a[r = p + c + 1] - 32 ? // if char under the current is not a space
                                 a[r = p + c] - 32 ? // see one position left
                                    a[r = p + c + 2] - 32 ? 0 // then one position right
                                                          : r
                                    : r
                                 : r
                             : 0
                         ) ? // and if place was found
                           l=a[p],a[p]=a[r],a[r]=l // replace values in positions p and r
                           : e;
    //print resulting picture
    for(i=0;i<w;)putchar(a[i++]);
}

int main(void)
{
    int cnt;
    FILE * testf = fopen("caw.txt","w");
    char testd[][31] = {
        "                 (__)        \n",
        "                 (oo)        \n", 
        "           /------\\/         \n", 
        "          / |    ||          \n", 
        "         *  /\\---/\\          \n", 
        "            ~~   ~~          \n", 
        "...\"Have you mooed today ? \"...",
        "" };
    // prepare data for test
    printf("Initial data:\n");
    for(cnt = 0; cnt < 7; cnt++)
    {
        printf("%s", testd[cnt]);
        fprintf(testf, testd[cnt]);
    }
    fclose(testf);
    // redirect standard input
    freopen("caw.txt", "r", stdin);
    printf("\n\nResult:\n");
    // start test
    f();
}

시험 결과 :

여기에 이미지 설명을 입력하십시오


2

Algodoo (비경쟁)

입력-사용 된 축퇴 예제.

설정

Runnning-기본 중력 및 수신 거부.

달리는

출력-물체의 마찰 및 밀도 설정을 통해 정확도를 조정할 수 있습니다.

산출

Algodoo는 로직 프로그래밍이 가능 합니다.


이것이 경쟁이 아닌 이유는 무엇입니까? 비경쟁은 일반적으로 도전보다 새로운 언어로 답변을 위해 예약되어 있습니다.
Ad Hoc Garf Hunter 08

Algodoo는 실제 로직을 수행 할 수 있지만이 시뮬레이션은 입력을 분쇄 출력물을 바닥에 놓고 사진을 찍는 것과 같습니다. 프로그래밍 방식으로 해당 출력을 캡처하는 방법을 잘 모릅니다.
wyldstallyns

그리고 "zero byte program! i win!"이라고 말하는 것은 잘못된 것 같습니다.
wyldstallyns

나는 이것이 실제로 0 바이트 대답이 아니라고 생각합니다. 코드 작성과 동등한 설정 조정에 대해 이야기합니다. Algodoo 점수를 매기는 것에 대한 메타 질문을하는 것이 좋습니다. 또한 0 바이트 프로그램에 문제가 있다고 생각하지 않습니다.
Ad Hoc Garf Hunter

메타를 열겠습니다.
wyldstallyns 2016

1

자바 스크립트, 286 바이트

b=>eval('f=b=>b==null||" "==b;b=b.split`\n`.map(b=>[...b]);a:for(;;){for(c=0;c<b.length-1;c++)for(g=b[c],d=0;d<g.length;d++){h=g[d];if(!f(h)){e=0;f(b[c+1][d])?e=2:f(b[c+1][d-1])?e=1:f(b[c+1][d+1])&&(e=3);if(e){b[c+1][d+e-2]=h;b[c][d]=" ";continue a}}}break}b.map(b=>b.join``).join`\n`')

// Here I assume that you've assigned the above function to `fall`
console.log(fall(`
                 (__)
                 (oo)
           /------\/
          / |    ||
         *  /\---/\\
            ~~   ~~
..."Have you mooed today?"...`))

산출:

                -       
            /--(-\--(__  
          /|~~---/~||/oo))
..."Have*you/mooed~today?"...

또 다른 예:

console.log(fall(`
 (\__/)  .~    ~. ))
 /O O  ./      .'
{O__,   \    {
  / .  . )    \\
  |-| '-' \    }
 .(   _(   )_.'
'---.~_ _ _&`))

산출:

    _ , /            
  OO/__'_.. .         
 {.(|-|.(O'))/.~{      
/('---.~___-_&)_.'}\~.'))

언 골프 기능

function fall(input) {
  let move = true
  let lines = input.split("\n").map(line => line.split(""))
  let isSpace = c => c == null || c == " "
  loop: for (;;) {
    for (let y = 0; y < lines.length - 1; y++) {
      let line = lines[y]
      for (let x = 0; x < line.length; x++) {
        let ch = line[x]
        if (!isSpace(ch)) {
          let dx = 0
          if (isSpace(lines[y+1][x])) { dx = 2 }
          else if (isSpace(lines[y+1][x-1])) { dx = 1 }
          else if (isSpace(lines[y+1][x+1])) { dx = 3 }
          if (dx) {
            lines[y + 1][x + dx - 2] = ch
            lines[y][x] = " "
            continue loop
          }
        }
      }
    }
    break
  }
  return lines.map(line => line.join("")).join("\n")
}

없는 빈에 대한 테스트에 대한 짧은 방법은 c>" "어디에서 c테스트중인 문자를 나타냅니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.