단어 안에있는 단어 안에있는 단어들 . .


17

알파벳 대문자의이 픽셀 화 된 글꼴에서 모든 문자의 폭은 5 단위, 높이는 5입니다.

 ███  ████   ███  ████  █████ █████  ████ █   █ █████     █ █   █ █     █   █
█   █ █   █ █   █ █   █ █     █     █     █   █   █       █ █  █  █     ██ ██
█████ ████  █     █   █ ████  ████  █  ██ █████   █       █ ███   █     █ █ █
█   █ █   █ █   █ █   █ █     █     █   █ █   █   █   █   █ █  █  █     █   █
█   █ ████   ███  ████  █████ █      ████ █   █ █████  ███  █   █ █████ █   █

█   █  ███  ████   ███  ████   ████ █████ █   █ █   █ █   █ █   █ █   █ █████
██  █ █   █ █   █ █   █ █   █ █       █   █   █ █   █ █   █  █ █   █ █     █ 
█ █ █ █   █ ████  █   █ ████   ███    █   █   █  █ █  █ █ █   █     █     █  
█  ██ █   █ █     █  ██ █  █      █   █   █   █  █ █  █ █ █  █ █    █    █   
█   █  ███  █      ████ █   █ ████    █    ███    █    █ █  █   █   █   █████

알 수 있듯이 문자 사이와 줄 사이에 1 단위의 공간이 있습니다. 따라서 각 문자는 최대 6 × 6 단위의 공간을 차지할 수 있습니다.

문자 의 형태를 직접 형성하기 위해 전체 블록 문자 ( )를 사용하는 대신 동일한 글꼴로 다른 문자 를 사용하려고 한다고 가정합니다 . 여기에는 텍스트의 크기를 6 배로 늘려 전체 블록으로 만든 문자를 큰 텍스트에서 전체 블록 대체로 사용할 수 있습니다.

그것이 이해가되지 않는다면이 예제는 잘 될 것입니다. 다음은 픽셀 화 된 글꼴을 사용하여 B로 만든 A입니다.

      ████  ████  ████       
      █   █ █   █ █   █      
      ████  ████  ████       
      █   █ █   █ █   █      
      ████  ████  ████       
                             
████                    ████ 
█   █                   █   █
████                    ████ 
█   █                   █   █
████                    ████ 
                             
████  ████  ████  ████  ████ 
█   █ █   █ █   █ █   █ █   █
████  ████  ████  ████  ████ 
█   █ █   █ █   █ █   █ █   █
████  ████  ████  ████  ████ 
                             
████                    ████ 
█   █                   █   █
████                    ████ 
█   █                   █   █
████                    ████ 
                             
████                    ████ 
█   █                   █   █
████                    ████ 
█   █                   █   █
████                    ████ 

B는 풀 블록으로 만들어지고 A는 B로 만들어집니다. B에는 여전히 가로와 세로 사이에 하나의 단위가 있습니다.

문자 대신 단어를 사용하여이 아이디어를 확장 할 수 있습니다. 다음은 "FIRE"로 만들어진 "WATER"입니다.

█████                   █████             ████  █████ █████             █████ ████  █████ █████ █████       ████  █████ █████ █████ ████        █████ █████ █████ ████       
█                         █               █   █ █     █                   █   █   █ █     █       █         █   █ █     █       █   █   █       █     █       █   █   █      
████                      █               ████  ████  ████                █   ████  ████  ████    █         ████  ████  ████    █   ████        ████  ████    █   ████       
█                         █               █  █  █     █                   █   █  █  █     █       █         █  █  █     █       █   █  █        █     █       █   █  █       
█                       █████             █   █ █████ █                 █████ █   █ █████ █     █████       █   █ █████ █     █████ █   █       █████ █     █████ █   █      
                                                                                                                                                                             
█████                   █████       ████                    █████                   █████                   █████                               ████                    █████
█                         █         █   █                   █                       █                         █                                 █   █                   █    
████                      █         ████                    ████                    ████                      █                                 ████                    ████ 
█                         █         █  █                    █                       █                         █                                 █  █                    █    
█                       █████       █   █                   █████                   █                       █████                               █   █                   █████
                                                                                                                                                                             
█████       █████       ████        █████ █████ █████ ████  █████                   █████                   █████ ████  █████ █████             █████ ████  █████ █████      
█             █         █   █       █     █       █   █   █ █                       █                         █   █   █ █     █                   █   █   █ █     █          
████          █         ████        ████  ████    █   ████  ████                    ████                      █   ████  ████  ████                █   ████  ████  ████       
█             █         █  █        █     █       █   █  █  █                       █                         █   █  █  █     █                   █   █  █  █     █          
█           █████       █   █       █████ █     █████ █   █ █████                   █                       █████ █   █ █████ █                 █████ █   █ █████ █          
                                                                                                                                                                             
█████       █████       ████        █████                   █████                   █████                   ████                                █████             █████      
█             █         █   █       █                       █                         █                     █   █                               █                 █          
████          █         ████        ████                    ████                      █                     ████                                ████              ████       
█             █         █  █        █                       █                         █                     █  █                                █                 █          
█           █████       █   █       █████                   █                       █████                   █   █                               █████             █          
                                                                                                                                                                             
      █████       █████             ████                    █████                   █████                   █████ ████  █████ █████ █████       ████                    █████
      █             █               █   █                   █                       █                         █   █   █ █     █       █         █   █                   █    
      ████          █               ████                    ████                    ████                      █   ████  ████  ████    █         ████                    ████ 
      █             █               █  █                    █                       █                         █   █  █  █     █       █         █  █                    █    
      █           █████             █   █                   █████                   █                       █████ █   █ █████ █     █████       █   █                   █████

문자 사이에 얼마나 많은 공간이 있더라도 각 줄에 "FIRE"가 어떻게 반복적으로 나타나는지 확인하십시오. "화재"의 가장 오른쪽 사례 중 3 개는 "워터"의 글자 모양에 따라 일찍 끊어졌습니다.

단어는 단어로 구성된 단어 를 사용하여 단어로 구성된 단어 를 만들 거나 심지어 단어로 구성된 단어로 구성된 단어 를 만들면 더욱 확장 될 수 있습니다 . 이론적으로 제한은 없습니다.

또 다른 예는이 게시물을 30k 자로 제한했지만이 멋진 스택 스 니펫을 실행하여 "단어로 구성된 단어로 구성된 단어"의 의미를 알 수 있습니다. 매개 변수를 기본값으로두고 "Go!"를 누르십시오. "MOUSE"라는 단어로 만들어진 "CAT"라는 단어로 만들어진 "DOG"라는 단어가 표시됩니다.

즉 어떤 공간에서 분리 된 입력 만 대문자 함유 으로 ... 등 이루어지는 제 이루어지는 제 이루어지는 번째 단어로 이루어진 첫 번째 단어를 생성 할 텍스트 상자를

경고 : 4 ~ 3 단어 이상을 입력하면 많은 텍스트가 생성되고 오랜 시간이 걸립니다. 브라우저 / 컴퓨터 / 자동차가 충돌 할 수 있습니다.

도전

이 과제의 목표는 가장 적은 수의 문자에서 스택 스 니펫이 수행하는 작업을 반영하는 것입니다.

공백만으로 구분 된 대문자 만 포함하는 단어를 취하고 위에 주어진 픽셀 화 된 글꼴을 사용하여 첫 번째 단어 "made of", 두 번째 "made of"세 번째 등을 출력하는 프로그램을 작성해야합니다.

프로그램에서 "일반 ASCII"체크 상자와 스 니펫의 글꼴 크기 기능을 지원할 필요는 없습니다. 단어 목록에서 단어로 구성된 단어로의 변환을 반영하는 것이 요점이며 유일한 요구 사항입니다.

세부

  • 입력은 명령 줄인 stdin에서 가져 오거나 문자열을받는 함수를 작성하면됩니다.

  • 입력이 항상 유효하다고 가정 할 수 있습니다. 즉, 선행 또는 후행 공백없이 정확히 하나의 공백으로 구분 된 대문자로 구성된 단어 문자열입니다.

  • 출력은 stdout (또는 유사한 대안) 또는 원하는 이름의 파일로 이동해야합니다.

  • 출력은 완전히 공백 문자 , 전체 공백 문자 및 줄 바꾸기 로 구성되어야합니다 .

    • 빈 / 전체 공간 문자는 하나의 공간 및 전체 블록 (해야한다 , )는 각각, 또는 기간 X ( ., X각각).
  • 출력에는 공백 문자 만 포함하는 선행 열이 포함되어서 는 안되지만 행에 후행 공백 문자 조합을 사용할 수 있습니다.

    • 따라서 이것은 허용됩니다.

      X...X.XXXXX..
      X...X.X
      X.X.X.XXXX....
      X.X.X.X..
      .X.X..XXXXX..
      
    • 그러나 이것은 아닙니다 :

      .X...X.XXXXX..
      .X...X.X
      .X.X.X.XXXX....
      .X.X.X.X..
      ..X.X..XXXXX..
      
  • 공백 문자 만 포함하는 선행 또는 후행 행이 없어야합니다 . 단일 후행 줄 바꿈이 선택적으로 허용됩니다.

보다 문자열 친화적 인 글꼴 버전은 다음과 같습니다.

.XXX.
X...X
XXXXX
X...X
X...X

XXXX.
X...X
XXXX.
X...X
XXXX.

.XXX.
X...X
X....
X...X
.XXX.

XXXX.
X...X
X...X
X...X
XXXX.

XXXXX
X....
XXXX.
X....
XXXXX

XXXXX
X....
XXXX.
X....
X....

.XXXX
X....
X..XX
X...X
.XXXX

X...X
X...X
XXXXX
X...X
X...X

XXXXX
..X..
..X..
..X..
XXXXX

....X
....X
....X
X...X
.XXX.

X...X
X..X.
XXX..
X..X.
X...X

X....
X....
X....
X....
XXXXX

X...X
XX.XX
X.X.X
X...X
X...X

X...X
XX..X
X.X.X
X..XX
X...X

.XXX.
X...X
X...X
X...X
.XXX.

XXXX.
X...X
XXXX.
X....
X....

.XXX.
X...X
X...X
X..XX
.XXXX

XXXX.
X...X
XXXX.
X..X.
X...X

.XXXX
X....
.XXX.
....X
XXXX.

XXXXX
..X..
..X..
..X..
..X..

X...X
X...X
X...X
X...X
.XXX.

X...X
X...X
.X.X.
.X.X.
..X..

X...X
X...X
X.X.X
X.X.X
.X.X.

X...X
.X.X.
..X..
.X.X.
X...X

X...X
.X.X.
..X..
..X..
..X..

XXXXX
...X.
..X..
.X...
XXXXX

채점

이것은 이므로 바이트 단위 의 최단 제출 이깁니다. 전체 블록 ( ) 의 모든 인스턴스는 3이 아닌 1 바이트로 계산 될 수 있으므로 사용 X하는 제출 에는 이점이 없습니다.


5
다음과 같은 JavaScript 스 니펫을 실행할 수 있습니다 (예 : javascript: URL 표시 줄 하여 붙여 넣기)을 실행하면 ASCII 아트를 훨씬 쉽게 읽을 수 $('#question pre').css('line-height',1)있습니다. 결과 : i.stack.imgur.com/XmB8C.png
손잡이

1
또는 답변을 포함 시키려면$('#question pre, .answer pre').css('line-height',1)
Martin Ender

이 농담을하기에는 너무 늦었다는 것을 알고 있지만 저항 할 수는 없었습니다. i.imgur.com/vAZi1Zt.png .
algorithmshark

이 도전을 어떻게 그리워 했습니까?!
매직 문어 Urn

답변:


8

CJam, 171 165 162 161 바이트

qS/_0=,0a*a\{{W:I;{'[{RI):I=}?i65-"c¿»ÐòO*4Õ]%ÐÎ<à IX]{-ïèq=ô}s×o)½2~û³'é¨1ÃlØeúN!Ö3~4ÜË|ÕÇäaepý®"255b2b5/5/=}%z1af*}%R,1a*a*}fR2a*"█ 
"f=

1 바이트로 취급 하고 있습니다. 나머지 모든 문자는 ASCII 범위 내에 있으므로 1 바이트로 취급합니다.

코드를 정확한 코드로 사용할 수 있습니다

입력 출력 예 :

FIRST HELLO WORLD

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

작동 원리

가장 먼저

"c¿»ÐòO*4Õ]%ÐÎ<à IX]{-ïèq=ô}s×o)½2~û³'é¨1ÃlØeúN!Ö3~4ÜË|ÕÇäaepý®"255b2b5/5/

27 자 각각의 패턴입니다.A-Z 으로 구성되어 공간) 0(에 X위치)과 1(에 .위치). 디코딩 한 후,이 나타내는 5 행 5 열의 2 차원 어레이의 소자 어레이 (27) 제공 X.27 개의 각 문자를위한. 이 배열을로 호출합시다 L.

이제 나머지 코드 :

qS/                      "Read the input and split it on space to get array Q";
   _0=                   "Get a copy of the first element of the above array";
      ,0a*               "Create an array filled with 0 with length of the first element";
          a\             "Wrap that array in another array and swap to get Q on top";
{  ...  }fR              "This is a for each loop on the array Q with R having the";
                         "current element value in each loop";
 {...}%                  "In the first iteration, the 0 array we created will be the";
                         "only thing on stack, in subsequent iterations, the result";
                         "of previous iteration will be on stack";
  W:I;                   "Initialize variable I with -1";
      {...}%             "Run this block on each element of the current array";
{'[{RI):I=}?i65-L=}%     "This is the above code block. In each iteration, we figure";
                         "out what character needs to be be put at the current index";
                         "Then we get the pattern of 0 and 1 for that character";
 '[{      }?             "Stack contains either 0 or 1. If it is 1, we want to leave";
                         "that index blank, so we put pattern of '[ which is 5X5 spaces";
    RI_:I=               "When we do not want a blank character, we get the next"
                         "character from R to fill the non empty space";
            i65-         "Convert A-Z  to 0-27 notation";
                L=       "Get the corresponding pattern from the pattern array L";
z1af*                    "After the above iterations, for each line of the previous";
                         "iteration's output, we get a vertical 2D array for next";
                         "iteration. We transpose it and join each character in";
                         "this line using a space";
      R,1a*a*            "After getting all lines from current iteration, we join them";
                         "with one full line of space characters";

 2a*                     "After all iterations, we have the 0 1 based 2D array for the";
                         "final output ASCII with each row representing a line. We join";
                         "these lines with 2, to get a 0 1 2 based array";
     "█                  "A brick, a space and a newline. Mapping 1 to 1 with 0 1 2";
"                        "based array";
 f=                      "For each of the 0 1 2 based array element, convert them to";
                         "one of the brick, space and new line character";

여기에서 온라인으로 사용해보십시오


9

파이썬 3, 437 바이트

from numpy import*
s=input().split()
d=fromstring('NONO__^Q_PQAQQNONO^_QQQQQ_QQQQAAAQDPIA[SQQQQADQQQJJH_OAQOOY_DPGAUUQOQONDQJUDDDQQQQAAQQDQIAQYQAYIPDQJUJDBQONO_A^Q_NQ_QQNA^QODNDJQD_',byte)[:,None]>>arange(5)&1
b=0
x=1
y=len(s[0])
n=[[1]*y]
for w in s:
 g=n;b+=x;x*=6;n=zeros((x,x*y),int);i=-6
 for q in g:
  o=j=0;i+=6
  for p in q:n[i:i+5,j:j+5]|=d[ord(w[o%len(w)])-65::26]*p;o+=p;j+=6
for r in n[:-b]:print(''.join(' █'[x] for x in r))

문자 모양은 ASCII로 인코딩됩니다. 각 ASCII 바이트는 한 문자의 한 행에 해당하며 비트는 단위 블록을 나타냅니다. 매우 효율적인 체계는 아니지만 각 문자에 대해 NumPy 비트 마스크로 압축을 풀기가 쉽습니다.

우리는 1의 2D 배열로 시작합니다. 첫 번째 단어의 각 문자마다 하나의 열과 하나의 행이 있습니다. 그런 다음 각 단어에 대해 이전 배열보다 6 배 높고 6 배 더 넓은 0의 새 배열을 만듭니다. 이전 배열에 1이 있으면 새 배열의 해당 6x6 섹션에 해당 문자의 비트 마스크가 채워집니다.

다음은 아주 작은 글꼴을 사용한 예입니다.

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


5

CJam, 181 (174) 170 바이트

ASCII가 아닌 모든 문자는 여전히 확장 ASCII 범위 내에 있으므로 모두 단일 바이트로 인코딩 할 수 있습니다. (을 제외하고 는 챌린지 사양에 따라 특별히 처리됩니다.) 따라서 각 문자를 바이트로 계산합니다.

"Á  :½A%õ­Íú£à˪ë8!Õ*j4¶fVËa¡ùÔ¯{+ÛyéâõKn#@?
9Ôia)(Ñç;~LÒª"257b2bYYb" █"er5/5/:L;lS/_0=,'█*a\{f{W:T;\{' ={S5*a5*}{T):T1$='A-L=}?\}%W<zSf*}Sa*}/N*

스택 교환은 인쇄 할 수없는 일부 문자를 엉망으로 만들었으므로이 pastebin 에서 코드를 복사해야 할 수도 있습니다 .

여기에서 테스트하십시오.

공백으로 구분 된 단어 목록으로 STDIN을 통해 입력을받습니다. 첫 번째 단어는 가장 큰 규모입니다. 예를 들어 :

HOLISM REDUCTIONISM

수확량

████                    █████             ████  █   █  ███              █████                               █████  ███  █   █ █████  ████             █   █ ████  █████ ████        █   █                    ███ 
█   █                   █                 █   █ █   █ █   █               █                                   █   █   █ ██  █   █   █                 ██ ██ █   █ █     █   █       █   █                   █   █
████                    ████              █   █ █   █ █                   █                                   █   █   █ █ █ █   █    ███              █ █ █ ████  ████  █   █       █   █                   █    
█  █                    █                 █   █ █   █ █   █               █                                   █   █   █ █  ██   █       █             █   █ █  █  █     █   █       █   █                   █   █
█   █                   █████             ████   ███   ███                █                                 █████  ███  █   █ █████ ████              █   █ █   █ █████ ████         ███                     ███ 

████                    █████       ████                    █   █        ███                                            █████                   █████                                ███  █   █       █████  ████
█   █                   █           █   █                   █   █       █   █                                             █                       █                                 █   █ ██  █         █   █    
████                    ████        █   █                   █   █       █                                                 █                       █                                 █   █ █ █ █         █    ███ 
█  █                    █           █   █                   █   █       █   █                                             █                       █                                 █   █ █  ██         █       █
█   █                   █████       ████                     ███         ███                                              █                     █████                                ███  █   █       █████ ████ 

████  █████ ████  █   █  ███        █████                   █████        ███                                            █   █                         █████  ████ █   █             ████        █████       ████ 
█   █ █     █   █ █   █ █   █         █                       █         █   █                                           ██  █                           █   █     ██ ██             █   █       █           █   █
████  ████  █   █ █   █ █             █                       █         █   █                                           █ █ █                           █    ███  █ █ █             ████        ████        █   █
█  █  █     █   █ █   █ █   █         █                       █         █   █                                           █  ██                           █       █ █   █             █  █        █           █   █
█   █ █████ ████   ███   ███          █                     █████        ███                                            █   █                         █████ ████  █   █             █   █       █████       ████ 

████                    █████       ████                    █   █        ███                                            █████                                           █████        ███                    █   █
█   █                   █           █   █                   █   █       █   █                                             █                                               █         █   █                   ██  █
████                    ████        █   █                   █   █       █                                                 █                                               █         █   █                   █ █ █
█  █                    █           █   █                   █   █       █   █                                             █                                               █         █   █                   █  ██
█   █                   █████       ████                     ███         ███                                              █                                             █████        ███                    █   █

████                    █████             ████  █   █  ███              █████ █████  ███  █   █ █████        ████ █   █ ████  █████ ████        █   █  ███  █████ █████              ███                    █   █
█   █                   █                 █   █ █   █ █   █               █     █   █   █ ██  █   █         █     ██ ██ █   █ █     █   █       █   █ █   █   █     █               █   █                   ██  █
████                    ████              █   █ █   █ █                   █     █   █   █ █ █ █   █          ███  █ █ █ ████  ████  █   █       █   █ █       █     █               █   █                   █ █ █
█  █                    █                 █   █ █   █ █   █               █     █   █   █ █  ██   █             █ █   █ █  █  █     █   █       █   █ █   █   █     █               █   █                   █  ██
█   █                   █████             ████   ███   ███                █   █████  ███  █   █ █████       ████  █   █ █   █ █████ ████         ███   ███    █   █████              ███                    █   █

설명

먼저, 문자 모양에 대한 조회 테이블을 다음 위치에 저장합니다 L.

"Á  :½A%õ­Íú£à˪ë8!Õ*j4¶fVËa¡ùÔ¯{+ÛyéâõKn#@?
9Ôia)(Ñç;~LÒª"257b2bYYb" █"er5/5/:L;

첫 번째 문자열은 압축 된 숫자입니다. 코드 포인트를 밑이 257 인 숫자로 취급 한 다음 결과 숫자를 이진수로 변환합니다. YYbis 2는 밑이 2이므로 [1 0]. 우리는 요소 대체를 사용 " █"하여 숫자를 공백으로 바꾸고 문자를 차단합니다. 마지막으로 문자열을 5 문자 행으로, 다시 5 행 블록으로 분할합니다. 결과는L 스택에 스택에서 삭제됩니다.

이제 일반적인 아이디어는 가장 큰 단어 길이의 한 줄로 시작하는 것 입니다. 그런 다음 각 단어에 대해 기존 그리드를 통과하고 다음 블록에서 모든 블록을 해당 문자로 확장합니다 (분리를 위해 빈 행과 열을 삽입하는 동안). 입력 준비는 다음과 같습니다.

lS/_0=,'█*a\
lS/          "Read input, split on spaces.";
   _0=       "Duplicate and get first word.";
      ,'█*   "Get length repeat █ that many times.";
          a  "Wrap in array, to make the grid two-dimensional.";
           \ "Swap with word list.";

나머지 프로그램의 가장 바깥 쪽 구조를 먼저 살펴 보자. 다음 블록 {...}/은 모든 단어에 대해 실행되며 각 블록 문자를 확장합니다.

{f{...}Sa*}/N*
{         }/   "Process each word in the input.";
 f{...}        "Map this block onto each line of the grid, passing in the current word as well.";
       Sa*     "Since each original line will be turned into 5 lines, the grid is still grouped
                into blocks of 5 lines. We join them together with empty lines as required.";
            N* "Join all lines together with newlines.";

마지막으로, 한 줄이 어떻게 확장되는지 봅시다 :

W:T;\{' ={S5*a5*}{T):T1$='A-L=}?\}%
W:T;                                "Store -1 in T.";
    \                               "Swap word with line.";
     {                           }% "Map this block onto each character.";
      ' =                           "Check if the character is a space.";
         {      }{            }?    "If it is, run the first block, otherwise the second.";
          S5*                       "Create a string of five spaces.";
             a5*                    "Create an array of five such strings.";
                  T):T              "Push T, increment, store in T.";
                      1$=           "Copy the word and access the T'th character, cyclically.";
                         'A-        "Subtract A from the letter.";
                            L=      "Use the result to get the character shape from L.";
                                \   "Swap resulting block with word.";

"At this point each character is replaced with a 5x5 array of new characters.
 So we actually have a 3D array right now. Since we used a map operation, the
 current word will also be at the end of the array, which we need to get rid off.";

W<zSf*
W<     "Discard last array element - the current word.";
  z    "Zip or transpose the top two levels of the array.";
   Sf* "Join each line together with spaces.";

프로그램이 끝나면 결과가 자동으로 인쇄됩니다.

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