코드 골프 : Letter-Ception


15

도전 과제 :

하나의 문자 X (A에서 Z까지 대문자 또는 소문자)와 하나의 숫자 N (0-9)을 입력하려면 해당 문자 X를 N * X로 인쇄하십시오.

편지는이 목록에 있어야합니다.

 AAA      BBBB       CCCC     DDDD      EEEEE     FFFFF      GGG      H   H
A   A     B   B     C         D   D     E         F         G         H   H
AAAAA     BBBB      C         D   D     EEEE      FFFF      G  GG     HHHHH
A   A     B   B     C         D   D     E         F         G   G     H   H
A   A     BBBB       CCCC     DDDD      EEEEE     F          GGG      H   H


IIIII         J     K   K     L         M   M     N   N      OOO 
  I           J     K  K      L         MM MM     NN  N     O   O
  I           J     KKK       L         M M M     N N N     O   O
  I       J   J     K  K      L         M   M     N  NN     O   O
IIIII      JJJ      K   K     LLLLL     M   M     N   N      OOO 


PPPP       QQQ      RRRR       SSSS     TTTTT     U   U     V   V     W   W
P   P     Q   Q     R   R     S           T       U   U     V   V     W   W
PPPP      Q   Q     RRRR       SSS        T       U   U     V   V     W   W
P         Q  QQ     R  R          S       T       U   U      V V      W W W
P          QQQQ     R   R     SSSS        T        UUU        V        W W 


X   X     Y   Y     ZZZZZ
 X X       Y Y         Z 
  X         Y         Z  
 X X        Y        Z   
X   X       Y       ZZZZZ

예 :

입력 : 1

산출:

 AAA
A   A
AAAAA
A   A
A   A

입력 : A 0

산출: A


입력 : A 2

산출:

      AAA  AAA  AAA
     A   AA   AA   A
     AAAAAAAAAAAAAAA
     A   AA   AA   A
     A   AA   AA   A
 AAA                 AAA
A   A               A   A
AAAAA               AAAAA
A   A               A   A
A   A               A   A
 AAA  AAA  AAA  AAA  AAA
A   AA   AA   AA   AA   A
AAAAAAAAAAAAAAAAAAAAAAAAA
A   AA   AA   AA   AA   A
A   AA   AA   AA   AA   A
 AAA                 AAA
A   A               A   A
AAAAA               AAAAA
A   A               A   A
A   A               A   A
 AAA                 AAA
A   A               A   A
AAAAA               AAAAA
A   A               A   A
A   A               A   A

입력 : A-1

출력 : 무엇이든 : 그것은 중요하지 않습니다


추가 규칙 :

  • 입력 매개 변수는 원하는 문자로 구분할 수 있습니다.
  • 각 문자는 자기 자신의 수도를 ASCII 문자로 사용하여 그립니다.
  • 후행 공백, 줄 바꿈 등이 허용됩니다.
  • 프로그램 대신 숫자 문자열을 인수로 사용하는 함수를 작성할 수 있습니다. 출력은 정상적으로 인쇄되어야합니다.
  • Stdout / Stderr는 중요하지 않습니다. 하나만 선택하십시오. 다른 것에 인쇄 된 것이라도 중요하지 않습니다.
  • 언어 기본 인쇄 방법을 사용하여 결과를 간단히 인쇄 할 수있는 한 가능한 출력 형식을 STDOUT에 인쇄하고 문자열 목록으로 반환하거나 문자 매트릭스로 반환 할 수 있습니다. *

* : 함수 f (a, 1)처럼 문자열을 반환하고 print (f (a, 1))라고 말할 수 있습니다. print () 호출을 응답의 일부로 만들지 마십시오. (Kevin Cruijssen과 Arnauld가 지적했습니다).

승리:

이것은 코드 골프, 가장 적은 바이트 수의 승리입니다. 즐기세요!


편집 :이 질문에 보인다 매우 동일한 은 H뿐만 알파벳의 각 문자뿐만 아니라 작업 .. 추측한다 당신은 중복 오히려 여부를 결정하지만 나는 그렇지 말할 것입니다.



3
@ElPedro 감사합니다! 아직 샌드 박스에 대해 몰랐습니다. 자세히 살펴보면 대단히 감사합니다.
니콜라스 브라우어

2
좋은 첫 도전! 그러나 귀하의 질문에 따르면 현재 결과 만 인쇄 할 수 있습니다. 기본 규칙은 함수가 함수를 반환 할 수 있다는 것입니다. 일반적으로 I / O 형식은 매우 유연합니다. 당신은 한 번 봐 가지고 할 수 있습니다 메타에서이 포스트 이유를 설명.
Arnauld

2
@Arnauld는 ASCII 아트에 관한 것이므로 결과 를 인쇄 하는 것이 다소 중요하지만 코드에서 결과를 반환하고 반환 된 문자열을 언어 기본 인쇄 방법을 사용하여 간단하게 인쇄 할 수 있다고 생각합니다 (f 함수와 같은) (a, 1) 문자열을 반환하고 print (f (a, 1))라고 말할 수 있습니다. print () 호출은 응답 코드의 일부가 아닙니다. 이것이 다소 이해 가능하고 동의하면 도전 설명
니콜라스 브라우어

2
@KevinCruijssen 질문을 약간 업데이트했습니다. 이해할 수있는 방식인지 알려주세요. :)
Nicolas Brauer

답변:


6

자바 스크립트 (ES8), 281 바이트

로 입력을 (letter)(N)받습니다. 문자열을 반환합니다.

c=>n=>(g=y=>y--?''.padEnd(w).replace(/./g,(_,x)=>(h=d=>~~(d/=5)?(P=parseInt)('hhvhefhfhfu111ufhhhfv1f1v11f1vehp1ehhvhhv444vehgggh979hv1111hhlrhhpljhehhhe11fhfuphheh9fhffge1u4444vehhhh4ahhhalhhhha4ah444ahv248v'[y/d%5+5*P(c,36)-50|0],36)>>x/d%5&1?h(d):' ':c)(w))+`
`+g(y):'')(w=5**n)

온라인으로 사용해보십시오!

어떻게?

폰트 인코딩

5×5031

저장된 패턴은 수평 및 수직으로 미러링됩니다.

'F'의 예 :

#####     ....#     00001      1     '1'
#....     ....#     00001      1     '1'
####. --> .#### --> 01111 --> 15 --> 'f' --> '11f1v'
#....     ....#     00001      1     '1'
#....     #####     11111     31     'v'

26×5=130

에서 '픽셀'을 테스트하려면(엑스,와이)

parseInt('hhvhefhfh...'[y + 5 * n], 36) >> x & 1

주요 알고리즘

주어진 =5

0엑스<0와이<(엑스,와이)h

(엑스5케이모드5,와이5케이모드5)

모든 위해케이[01]

이 함수는 빈 픽셀이 어느 깊이에서 감지 되 자마자 공백을 반환하거나 모든 반복이 성공하면 입력 문자에 해당하는 문자를 반환합니다.


축하합니다! 코드를 조금 설명해 주시겠습니까?
니콜라스 브라우어

저장된 패턴이 수평 및 수직으로 미러링되는 이유는 무엇입니까? 저장을 위해 전혀 미러링하지 않으려면 더 많은 바이트가 필요합니까? 그리고 설명 *에 대한 tyvm *.
니콜라스 브라우어

1
와이10

1
(나는 우리가 무료로 수직 거울을 떨어 뜨릴 수 있다고 생각하지만)
Arnauld

6

R , 348 바이트

function(K,N){if(N)for(i in 1:N)T=T%x%matrix(c(15269425,32045630,16269839,32032318,33061407,33061392,15224366,18415153,32641183,1082926,18444881,17318431,18732593,18667121,15255086,32045584,15255151,32045649,16267326,32641156,18400814,18400580,18400938,18157905,18157700,32575775)[utf8ToInt(K)-64]%/%2^(24:0)%%2,5,5)
write(c(" ",K)[T+1],1,5^N,,"")}

온라인으로 사용해보십시오!

Ouros와 거의 동일한 인코딩을 사용합니다 . 그러나 비트를 반전시키지 않고 직접 사용하도록 선택합니다.

그런 다음 5x5 비트 매트릭스를 생성하고 Kronecker Power 매트릭스를 빌드 하여 필요한 패턴을 생성하고 결과를 표준 출력에 기록합니다.


이것은 크로네 커의 큰 사용입니다!
digEmAll


@digEm이 과제의 핵심은 압축 방법입니다 (어쨌든 코드 골프 관점에서). 설명 할 수 있도록 답변으로 게시하지 않겠습니까?
주세페

알았어, 고마워!
digEmAll

5

클린 , 436 372 바이트

새로운 IO 형식으로 훨씬 짧습니다.

import StdEnv,StdLib
t=transpose
f=flatten
$0c=[[c]]
$n c=f[t(f[t($(n-1)if(isOdd({#18415150,16301615,31491134,16303663,32554047,1096767,15262766,18415153,32641183,15254032,18128177,32539681,18405233,18667121,15255086,1097263,32294446,18136623,16267326,4329631,15255089,4539953,11191857,18157905,4329809,32575775}.[toInt(max'A'c)-65]>>p))c' ')\\p<-[i..i+4]])\\i<-[0,5..20]]

온라인으로 사용해보십시오!

문자 패턴을 정수 리터럴의 비트로 압축하여 ~ 700 바이트를 절약합니다. 예를 들면 다음과 A같습니다.

  1. 반음 낮추다 [[' AAA '],['A A'],['AAAAA'],['A A'],['A A']]
  2. [' AAA A AAAAAAA AA A']
  3. 십시오 ['A AA AAAAAAA A AAA '](바이너리로 'A' = 1, ' ' = 0)
  4. 돌려 0b1000110001111111000101110진수로
  5. 가져 오기 18415150

4

R , 259 바이트

function(K,N,`!`=utf8ToInt){if(N)for(i in 1:N)T=T%x%(sapply(!"			




",intToBits)[1:5,5*(-64+!K)-4:0]>0)
write(c(" ",K)[T+1],1,5^N,,"")}

온라인으로 사용해보십시오!

면책 조항 :
이 솔루션은 @Giuseppe의 답변 을 취하고 @Arnauld의 답변에 사용 된 것과 매우 유사한 다른 접근법으로 행렬 압축을 대체하여 얻었 습니다. :)

아이디어는 다음과 같습니다.

5 x 26*5행렬을 감안할 때 0/1:

(1 replaced by '#', 0 replaced by '.' and '|' added for readability)

.####|#####|.###.|#####|#####|#####|.###.|#####|#...#|...#.|#####|#####|#####|
#.#..|#.#.#|#...#|#...#|#.#.#|#.#..|#...#|..#..|#...#|....#|..#..|....#|.#...|
#.#..|#.#.#|#...#|#...#|#.#.#|#.#..|#...#|..#..|#####|....#|..#..|....#|..#..|
#.#..|#.#.#|#...#|#...#|#.#.#|#.#..|#.#.#|..#..|#...#|....#|.#.#.|....#|.#...|
.####|.#.#.|#...#|.###.|#...#|#....|..##.|#####|#...#|####.|#...#|....#|#####| ...
  ^     ^     ^     ^     ^     ^     ^     ^     ^     ^     ^     ^     ^   
  |     |     |     |     |     |     |     |     |     |     |     |     |   
  A     B     C     D     E     F     G     H     I     J     K     L     M   

각 열은 이진수로 간주되며 정수로 변환됩니다. 그런 다음이 정수는 1 ... 31 범위에서 인쇄 할 수없는 ASCII로 변환됩니다.

예를 들어 "B"최종 문자열 의 열은 다음 "\017\021\017\021\017"과 같습니다 (8 진수로 작성된 인쇄 할 수없는 문자).

#####                   ####.     11110          15            '\017'
#.#.#                   #...#     10001          17            '\021'
#.#.#      ------->     ####. --> 11110  ------> 15   ------>  '\017'
#.#.#                   #...#     10001          17            '\021'
.#.#.                   ####.     11110          15            '\017'

          (transposed                  bin to int   int to ASCII
         for reability)    

따라서 최종 문자열이 주어지면 5*26 = 130해당 문자열을 다음을 0/1사용 하는 행렬로 다시 변환합니다 .

sapply(utf8ToInt(STRING),intToBits)

그런 다음 첫 5 행 (intToBits는 32 비트를 반환합니다)과 문자에 해당하는 열만 입력으로 전달하여 @ Giuseppe 's answer 에서 설명한대로 크로네 커를 적용 합니다.


당신은 또한 면도에 unprintables을 사용할 수 있습니다 -48조각, 사용 !대신에 U: 온라인으로 시도
주세페

@ 주세페 : 좋아요! D : 나는 불쌍한 내 영어 편집 무료 답이 협력의 결과이기 때문에 커뮤니티 위키 : 느낌을했다
digEmAll
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.