コードゴルフ:レターセプション


15

チャレンジ:

1文字X(AからZまでの大文字または小文字)と1桁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は問題ではなく、1つを選択します。他のものに印刷されたものも問題になりません。
  • 言語のデフォルトの印刷方法を使用して結果を簡単に印刷できる限り、可能な出力形式をSTDOUTに印刷したり、文字列のリストとして返したり、文字マトリックスとして返したりできます。

*:関数f(a、1)が文字列を返すように、単にprint(f(a、1))がprint()呼び出しを答えの一部にしないと言うことができます。(これはKevin CruijssenとArnauldによって指摘されました)。

受賞:

これはコードゴルフであり、バイト数が最も少なくなります。楽しんで!


編集:この質問は思わ非常に同じ、このことはHのためではなく、アルファベットから各文字のためだけでなく、仕事..推測する必要があるとして、あなたはそれが重複しているというか、いないかを決定、しかし私はそれがないと言うでしょう。



3
@ElPedroありがとうございます!サンドボックスについてはまだ知りませんでしたが、詳しく見ていきます。
ニコラスブラウアー

2
素敵な最初の挑戦!しかし、あなたの質問は、現在、我々は唯一のことを示唆している印刷結果を。デフォルトのルールは、関数がそれを返すだけでよいというものです。一般的に、I / O形式は非常に柔軟です。あなたは見ていたいかもしれメタでこのポスト理由を説明します。
アーナルド

2
@ArnauldはASCIIアートに関するものなので、結果を印刷することはタスクにとってある程度重要ですが、コードが結果を返し、返された文字列が言語のデフォルトの印刷方法(関数fのような(a、1)文字列を返すので、print(f(a、1))とだけ言うことができますprint()呼び出しは応答コードの一部である必要はありません。チャレンジの説明
Nicolas Brauer

2
@KevinCruijssen私は質問を少し更新しました、私がそれを書いた方法を理解できるかどうか教えてください:)
ニコラス・ブラウアー

回答:


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進では。これらの値は、Base36に1桁として便利に保存できます。

保存されるパターンは、水平および垂直の両方にミラーリングされます。

「F」の例:

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

フォント全体が単一の文字列として保存されます26×5=130文字のます。

(x,y)nth

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

メインアルゴリズム

与えられた nw=5n

0x<w0y<w(x,y)h

(x5kmod5,y5kmod5)

k[0n1]

この関数は、ある深さで空白ピクセルが検出されるとすぐにスペースを返します。すべての反復が成功した場合は、入力文字に対応する文字を返します。


おめでとうございます!コードを少し説明してみてください。
ニコラスブラウアー

保存されているパターンが、水平および垂直の両方にミラーリングされるのはなぜですか?それを格納するためにそれをまったくミラーリングしないために、より多くのバイトが必要ですか?そして、説明のためのtyvm *。*
Nicolas Brauer

1
@NicolasBrauerため、垂直にミラーリングされていますyw10

1
(無料で垂直ミラーを落とすことができると思いますが)
アーナルド

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マトリックスを作成して必要なパターンを生成し、結果をstdoutに書き込みます。


これはクロネッカーの素晴らしい使い方です!
digEmAll


@digEmAllこの課題の核心は圧縮方法です(とにかくコードゴルフの観点から)。回答として投稿して、説明してもらえませんか?
ジュゼッペ

わかった、ありがとう!
digEmAll

5

きれいな 436バイト

新しい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   

各列は2進数と見なされ、整数に変換されます。これらの整数は、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 の回答で説明されているようにkroneckerを適用します。


印刷できないものを使用して-48作品を削り!、代わりに使用することもできますUオンラインで試してください
ジュゼッペ

@ジュゼッペ:すごい!コラボレーションの結果であるため、回答をコミュニティwikiにしました:)貧しい英語を自由に編集してください:D
digEmAll
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.