골프 아스키 아트 팁


18

PPCG의 ASCII 아트 질문은 재미 있다고 생각하지만 개인적으로 특히 질문에 태그가 붙어 있으면 꽤 어려울 수 있다고 생각합니다 .

ASCII 아트를 만드는 데 유용한 팁이 여기 있을지 궁금합니다.

단순히 문자를 배열하는 것은 쉽지만 (짧은) 알고리즘을 사용하면 상황이 더 복잡해집니다.

ASCII 아트에 대해 다음과 같이 이야기하고 있습니다.

  • 텍스트를 ASCII 아트 (문자)로
  • 이미지 (로고 또는 아이콘)

나는 일반적인 팁을 찾고 있지만 대부분의 언어는 번역 할 수 있기 때문에 언어별로 허용됩니다.

답변:


8

압축 알고리즘

문자열에 LZMA 압축을 적용 할 수 있습니다.
많은 언어가이를 지원합니다.

실행 길이 인코딩

[char][number](예 :)와 같은 처리 명령을 사용할 수 있습니다 b12.
이 압축 알고리즘은 여기에서 사용됩니다 : /codegolf//a/20589/10920

더 읽을 거리 : http://en.wikipedia.org/wiki/Run-length_encoding

정수 패킹

정수 배열을 사용하여 다음과 같은 작은 모양을 저장할 수 있습니다.

// This is an invader!
// (SE line height makes it looks awful)
// ~158 characters

    ##          ##    
      ##      ##      
    ##############    
  ####  ######  ####  
######################
##  ##############  ##
##  ##          ##  ##
      ####  ####       

각 공간은로 번역됩니다 0.
각 샤프는로 번역됩니다 1.

// ~58 characters
// Saved ~100 bytes!
[
  196656,  49344,   262128,  999228,
  4194303, 3407859, 3342387, 62400
]

그런 다음 비트 연산자를 사용하여 각 비트를 읽습니다 &.

위의 알고리즘은 더 큰 정수 기반을 사용하여 향상시킬 수 있습니다.

// ~44 characters
// Integers are in base 36.
// Use `_` as a separator (or a line break).
"47qo_122o_5m9c_lf0c_2hwcf_211ir_1zn03_1c5c"

3
귀하의 처리 지침은 일반적으로 알려져 런 길이 인코딩을 참고하시기 바랍니다.
FireFly 2019

@FireFly 감사합니다! 나는 그 이름이 있다는 것을 몰랐다.
Florent

par (my language)에서 이것은 기본 62까지 인코딩 된 정수를 지원하므로 더욱 확장 될 수 있습니다.[0-9A-Za-z]
Cyoce

5

대칭을 찾으십시오

때로는 필요한 ASCII 아트가 어느 시점에서 대칭입니다. 예를 들어 Argyle ASCII Art 에는 다음과 유사한 출력이 필요합니다.

    /\        /\
   /  \  /\  /  \
/\/    \/  \/    \/\
\/\    /\  /\    /\/
   \  /  \/  \  /
    \/        \/

이것을 정상적으로 인쇄 할 수는 있지만 언어에 따라 결과의 상위 절반 만 생성하고 반전하고와를 교환 /하여 필요한 코드를 줄일 수 있습니다 \.

조옮김

에서 ASCII 예술 양궁 화살표 인쇄의 결과는 주어진 확장, 이것이다 n:

     /\
    /  \
   /    \
  /      \
  \      /
   \____/
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
   /|  |\
  / |  | \
 /  |  |  \
/   |  |   \
/   |  |   \
/   |__|   \
/  /    \  \
/ /      \ \
//        \\
/          \

화살표를 보면 8 가지 라인이 있습니다.

/ \
\ /
\_/
| |
/ | | \
/ |_| \
/ / \ \
/ \

조옮김에도 동일하게 시도해 봅시다.

                         ///////
                        /     / 
   /\                  /     /  
  /  \                /     /   
 /   _||||||||||||||||||||||    
/    _                     _    
\    _                     _    
 \   _||||||||||||||||||||||    
  \  /                \     \   
   \/                  \     \  
                        \     \ 
                         \\\\\\\

여기에는 10 가지 종류의 선이 있습니다.

/
/ /
/ \ / /
/ _|
/ _ _
\ _ _
\ _|
\ / \ \
\ \
\

그러나 여기 캐치 : 바닥 (5)는 교환을 제외하고는 상위 5로 동일 /하고 \. 이전 규칙에 따라 먼저 처음 5 개를 생성하고, 복사하고, 스왑을 수행 한 다음, 마지막으로 화살표를 가져옵니다. 이것은 많은 코드를 절약 할 수 있습니다.


5

제어 문자, 이스케이프 시퀀스 및 콘솔 코드

질문이 그것들을 금지하지 않는 한, 메타에 대한 현재의 합의 는 ASCII 아트 챌린지에 특정 바이트 스트림이 필요하지 않지만 출력이 정확하다는 것입니다.

이는 지원 터미널을 가정 할 때 ASCII 제어 문자 , ANSI 이스케이프 시퀀스Linux 콘솔 코드 를 답변에 사용할 수 있음을 의미합니다 .

달리 명시되지 않는 한,이 답변의 나머지 부분은 Linux 터미널의 동작을 설명 할 것입니다. 이것이 바로 테스트 할 수있는 것입니다.

ASCII 제어 문자

지원 / 통역은 터미널마다 그리고 문자마다 다릅니다. 가장 이식성이 좋은 문자는 줄 바꿈 ( \n, \x0a) 이어야 하며 문자를 다음 줄의 시작 부분으로 이동시킵니다.

다른 유용한 문자는 다음과 같습니다.

  • 수직 탭 ( \v, \x0b)은 커서를 한 위치 오른쪽으로 이동 한 다음 한 위치 아래로 이동합니다.

    $ echo -e 'a\vb'
    a
     b
    
  • 캐리지 리턴 ( \r, \x0d)은 커서를 현재 줄 의 시작 부분으로 이동합니다 . 이후의 인쇄 가능한 문자는 현재 줄의 첫 문자를 덮어 씁니다.

    $ echo -e 'ab\rc'
    cb
    
  • 백 스페이스 ( \b, \x08)는 커서를 한 위치 왼쪽으로 이동합니다. 후속 인쇄 가능한 문자는 백 스페이스 앞의 문자를 덮어 씁니다.

    $ echo -e 'ab\bc'
    ac
    
  • 이스케이프 ( \e, \x1b)는 자체적으로 아무 것도 수행하지 않지만 ANSI 이스케이프 시퀀스 (선택 사항) 및 Linux 콘솔 코드의 일부를 구성합니다.

많은 언어가 소스 코드에서 실제 제어 문자를 허용합니다.

ANSI 이스케이프 시퀀스

(아직)

리눅스 콘솔 코드

더 많은 것이 있지만 ASCII 아트에 가장 유용한 콘솔 코드는 다음과 같습니다.

  • 순서 \ec는 터미널 을 재설정 합니다. 화면을 지우고 커서를 왼쪽 상단 모서리에 놓고 앞 및 배경색, 커서 깜박임 속도 등을 기본값으로 설정합니다.

  • 시퀀스 \eM역행 이송을 유발합니다 . 즉, 커서가 한 위치 위로 이동합니다.

    $ echo -e '\na\eMb\n'
     b
    a
    
  • 순서 \eH는 현재 열에서 탭 정지 를 설정합니다 .

    $ echo -e '   \eHa\n\tb'
       a
       b
    

2

패턴 찾기

이것은 약간 명백 할 수도 있지만 ... 출력에서 ​​패턴, 유사점 및 반복을 찾으십시오. 예를 들어, 7- 세그먼트 디스플레이 패턴으로 변환 번호 작업을 보았을 때 골프를하는 방법에 대해 생각하기 시작했고 유사점을 찾기 시작했습니다. 문자 세그먼트에서 가로 세그먼트가 세로 세그먼트 사이에서 이동하는 방식으로 인해 한 번에 세 개의 세그먼트를 처리하는 것이 가장 쉬울 것입니다. :

groping 세그먼트

따라서, 당신은 같은 것을 할 수있는 lc + " "*N + rc + "\n"다음 N-1 번 lc + bc*N + rc매 3 개 세그먼트 번을, ( lc, bc, rc즉 왼쪽, 상향식, 마우스 오른쪽 세그먼트 문자 중 하나 인 |, _또는  ).


2

기본 변환 사용

이 답변 은 문자 + |-와 줄 바꿈으로 구성된 ASCII 아트를 원했던 질문에 대한 것입니다 . 가능한 문자는 5 개뿐이므로 기본 5 개의 숫자로 취급하여 바이트 당 3.45자를 압축하여 바이트로 변환 할 수 있습니다.

규칙 성 이용

이러한 규칙이 미러링과 같은 특정 도구를 사용하기에 충분히 강하지 않더라도 데이터에는 규칙 성이 있습니다. 예를 들어, 위의 질문에서 원하는 출력은 텍스트 전체가 대략 직사각형이므로 테스트 전체에 개행 문자가 대략 균등하게 배치되었습니다. 나는 이것을 Pyth의 n 조각으로 나누는 함수를 사용하여 줄 바꿈을 사용하여 코드를 줄이기 위해 활용했습니다.

도구를 알고 작업에 적합한 도구를 선택하십시오.

내가 아는 가장 강력하고 효율적인 텍스트 처리 도구는 다음과 같습니다.

정규식 엔진 : ///, Retina, Perl, 전력 / 간결성 트레이드 오프 순서.

당신이하고 싶은 일 이이 대답 과 같은 정규식 대체에 간결하게 설명 될 수 있다면 사용하십시오

텍스트 처리 도구가 모호 해짐 : gema 등 (다른 도구는 있지만 확실하지 않음)

정확하게 필요한 기능이있는 경우 사용하십시오. 에서와 같이 이 질문에 GEMA의 재귀 매칭.

일반 코드 골프 언어 : CJam, Pyth 등

다른 도구가 작업을 수행하지 않거나 더 짧은 작업을 수행 할 수있을 정도로 미묘한 복합성을 활용하는 경우 사용하십시오.

많은 접근법을 시도하십시오

이것은 모든 코드 골프 질문에 적용되지만 특히 여기에 적용됩니다. 시도 할 때까지 규칙 성을 악용 할 수 있는지 여부는 알 수 없습니다. 여러 언어로 제공 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.