Code Golf:Letter-Ception


15

挑战:

输入一个字母X(从A到Z的大写或小写)和一位数字N(0-9)时,打印由N * X组成的相应字母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

输出:曾经发生过:没关系


附加规则:

  • 输入参数可以由所需的字符分隔。
  • 每个字母都必须使用自身的大写字母作为字母来绘制。
  • 允许尾随空格,换行等
  • 您可以编写一个以数字字符串作为参数的函数,而不是程序。输出应正常打印。
  • Stdout / Stderr无关紧要,只需选择一个即可。如果东西被印在另一个上也没关系。
  • 可以将可能的输出格式打印到STDOUT,以字符串列表形式返回,以字符矩阵形式返回等,只要可以使用语言默认的打印方法简单地打印结果即可。*

*:就像函数f(a,1)返回字符串一样,您可以简单地说print(f(a,1))不要使print()调用成为答案的一部分。(这是Kevin Cruijssen和Arnauld指出的)。

获奖情况:

这是代码高尔夫,最低字节数获胜。玩得开心!


编辑:这个问题似乎完全相同,但是我会说不是,因为它不仅适用于H,而且适用于字母表中的每个字母。猜想您决定是否重复。



3
@ElPedro谢谢!我还不知道沙盒,非常感谢,我将仔细研究它!
Nicolas Brauer

2
不错的第一个挑战!但是,您的问题目前建议我们仅打印结果。默认规则是允许函数仅返回它。一般来说,I / O格式非常灵活。您可能想看看meta中的这篇文章,它解释了原因。
Arnauld

2
@Arnauld是关于ASCII艺术的,我会说打印结果对于该任务有些关键,但是我想您的代码是否返回结果并且返回的字符串可以简单地使用语言默认的打印方法(例如函数f (a,1)返回字符串,我可以说print(f(a,1))print()调用不必是答案代码的一部分。如果这是可以理解的,并且您同意我可以将其添加到挑战说明
Nicolas Brauer

2
@KevinCruijssen我对问题做了些微更新,请告诉我它的书写方式是否可以理解:)
Nicolas Brauer

Answers:


6

JavaScript(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

Xÿñ

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

主要算法

ñw=5ñ

0X<w0ÿ<wXÿH

X5ķ5ÿ5ķ5

ķ[0ñ-1个]

一旦在某个深度检测到空白像素,该函数将返回一个空格;如果所有迭代都成功,则该函数将返回与输入字母相对应的字符。


效果很好,恭喜!您可以尝试解释一下代码吗?
Nicolas Brauer

为什么要存储的图案水平和垂直镜像?是否需要更多字节才能完全不镜像存储?以及tyvm的解释*。*
Nicolas Brauer

1
ÿw-1个0

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功率矩阵以生成必要的模式,并将结果写入stdout。


这对Kronecker很有用!
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"(以八进制表示形式编写的不可打印字符):

#####                   ####.     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/1using 矩阵:

sapply(utf8ToInt(STRING),intToBits)

然后,我们仅对矩阵进行细分,仅选择前5行(intToBits返回32位),并且仅选择与作为输入传递的字母相对应的列,最后按@Giuseppe 的答案所述应用kronecker 。


您还可以使用无法打印的物品刮掉-48碎片,并!代替以下用途U在线尝试
Giuseppe

@Giuseppe:太好了!我回答了社区维基,因为这是合作的结果:)随时编辑我可怜的英语:D
digEmAll
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.