Kode Golf: Surat-Ception

15

Tantangan:

Untuk input satu huruf X (huruf besar atau kecil dari A ke Z) dan satu digit N (0-9) cetak huruf X yang sesuai terbuat dari N * X.

Surat itu harus dari daftar ini:

 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

Contoh:

input: a 1

keluaran:

 AAA
A   A
AAAAA
A   A
A   A

input: A 0

keluaran: A


input: A 2

keluaran:

      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

input: A -1

output: apa pun: tidak masalah


Aturan tambahan:

  • Parameter input dapat dipisahkan oleh karakter apa pun yang Anda inginkan.
  • Setiap huruf harus menggunakan modal sendiri sebagai karakter ascii untuk menggambarnya.
  • Ruang tambahan, garis baru dll. Diizinkan
  • Alih-alih sebuah program, Anda dapat menulis fungsi yang menggunakan string digit sebagai argumen. Outputnya harus dicetak secara normal.
  • Stdout / Stderr tidak masalah, pilih saja. Jika barang-barang dicetak pada yang lain tidak masalah juga.
  • Kemungkinan format keluaran dapat dicetak ke STDOUT, dikembalikan sebagai daftar string, dikembalikan sebagai matriks karakter, dll. Asalkan hasilnya dapat dicetak dengan menggunakan metode cetak standar bahasa. *

*: seperti fungsi f (a, 1) mengembalikan string dan seseorang dapat dengan mudah mengatakan print (f (a, 1)) jangan membuat print () memanggil bagian dari jawabannya. (Ini ditunjukkan oleh Kevin Cruijssen dan Arnauld).

Kemenangan:

Ini adalah kode-golf, kemenangan byte-count terendah. Selamat bersenang-senang!


Sunting : pertanyaan ini tampaknya sangat identik dengan ini namun saya akan mengatakan itu tidak, karena seharusnya tidak hanya bekerja untuk H tetapi untuk setiap huruf dari alfabet .. Tebak Anda memutuskan lebih tepatnya atau tidak itu adalah duplikat.

Nicolas Brauer
sumber
3
Sangat terkait erat .
AdmBorkBork
3
@ ElPedro Terima kasih! Saya belum tahu tentang kotak pasir, terima kasih banyak, saya akan melihat lebih dekat!
Nicolas Brauer
2
Tantangan pertama yang bagus! Namun, pertanyaan Anda saat ini menunjukkan bahwa kami hanya dapat mencetak hasilnya. Aturan default adalah bahwa fungsi diizinkan untuk mengembalikannya. Secara umum, format I / O sangat fleksibel. Anda mungkin ingin melihat posting ini dalam meta yang menjelaskan alasannya.
Arnauld
2
@Arnauld karena tentang seni ASCII saya akan mengatakan untuk mencetak hasilnya agak penting untuk tugas, tapi saya kira jika kode Anda mengembalikan hasilnya dan string yang dikembalikan hanya dapat dicetak menggunakan metode cetak standar bahasa (seperti fungsi Anda f (a, 1) mengembalikan string dan saya hanya bisa mengatakan print (f (a, 1)) panggilan print () belum menjadi bagian dari kode jawaban. Jika ini agak dimengerti dan Anda setuju saya dapat menambahkan ini ke deskripsi tantangannya
Nicolas Brauer
2
@KevinCruijssen Saya sedikit memperbarui pertanyaan, tolong beri tahu saya jika ini bisa dimengerti seperti yang saya tulis :)
Nicolas Brauer

Jawaban:

6

JavaScript (ES8), 281 byte

Mengambil input sebagai (letter)(N). Mengembalikan string.

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)

Cobalah online!

Bagaimana?

Pengkodean font

5×5031

Pola yang disimpan dicerminkan secara horizontal dan vertikal.

Contoh untuk '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

Algoritma utama

nw=5n

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

(x5kmod5,y5kmod5)

k[0n1]

Fungsi mengembalikan ruang segera setelah piksel kosong terdeteksi pada kedalaman tertentu, atau karakter yang sesuai dengan huruf input jika semua iterasi berhasil.

Arnauld
sumber
Ini bekerja dengan sangat baik, selamat! Bisakah Anda mencoba menjelaskan kodenya sedikit?
Nicolas Brauer
Mengapa pola yang disimpan harus dicerminkan secara horizontal dan vertikal? akankah dibutuhkan lebih banyak byte untuk tidak mencerminkannya sama sekali untuk disimpan? Dan tyvm untuk penjelasan *. *
Nicolas Brauer
1
yw-10 . Dan itu dicerminkan secara horizontal karena 'pixel' paling kiri dipetakan ke bit paling signifikan (yaitu di sebelah kanan nomor itu dipetakan ke). Penguraian kode akan sedikit lebih lama jika tidak dicerminkan sama sekali.
Arnauld
1
(Meskipun saya pikir kita bisa menjatuhkan cermin vertikal tanpa biaya.)
Arnauld
6

R , 348 byte

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,,"")}

Cobalah online!

Menggunakan penyandian yang hampir identik dengan Ouros ' ; Namun, itu tidak membalikkan bit, sebaliknya memilih untuk menggunakannya secara langsung.

Ini kemudian menciptakan matriks bit 5x5 dan membangun matriks Kronecker Power untuk menghasilkan pola yang diperlukan, menulis hasilnya ke stdout.

Giuseppe
sumber
Ini adalah penggunaan yang bagus dari Kronecker!
digEmAll
@digEm. Inti dari tantangan ini adalah metode kompresi (dari sudut pandang kode-golf). Mengapa Anda tidak mempostingnya sebagai jawaban sehingga Anda dapat menjelaskannya juga?
Giuseppe
Baiklah terima kasih!
digEmAll
5

Bersih , 436 372 byte

Secara signifikan lebih singkat dengan format IO baru.

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]]

Cobalah online!

Kompres pola huruf ke dalam bit literal integer untuk menghemat ~ 700 byte. Sebagai contoh,A :

  1. Meratakan [[' AAA '],['A A'],['AAAAA'],['A A'],['A A']]
  2. Membalikkan [' AAA A AAAAAAA AA A']
  3. Belok ['A AA AAAAAAA A AAA '] menjadi biner ( 'A' = 1, ' ' = 0)
  4. Belok 0b1000110001111111000101110 menjadi desimal
  5. Dapatkan 18415150
Suram
sumber
4

R , 259 byte

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,,"")}

Cobalah online!

Penafian:
solusi ini telah diperoleh dengan mengambil jawaban @ Giuseppe dan mengganti kompresi matriks dengan pendekatan lain yang sangat mirip dengan yang digunakan dalam jawaban @ Arnauld , jadi pertama-tama pilih-pilih mereka :)

Idenya adalah sebagai berikut:

Diberikan 5 x 26*5matriks ini dari 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   

setiap kolom dianggap sebagai angka biner dan dikonversi menjadi bilangan bulat. Bilangan bulat ini kemudian dikonversi ke ASCII yang tidak dapat dicetak dalam kisaran 1 ... 31:

misalnya untuk kolom dari "B"string akhir akan "\017\021\017\021\017"(karakter yang tidak dapat ditulis ditulis dalam representasi oktal):

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

          (transposed                  bin to int   int to ASCII
         for reability)    

Oleh karena itu, mengingat string 5*26 = 130karakter terakhir, kami mengonversi string itu kembali ke matriks 0/1menggunakan:

sapply(utf8ToInt(STRING),intToBits)

maka kita cukup subsect matriks memilih hanya 5 baris pertama (intToBits mengembalikan 32 bit) dan hanya kolom yang sesuai dengan surat yang diteruskan sebagai input dan akhirnya kita menerapkan kronecker seperti yang dijelaskan dalam jawaban @ Giuseppe .

digEmAll
sumber
Anda juga dapat menggunakan bahan yang tidak diinginkan untuk mencukur -48potongan, dan gunakan !sebagai pengganti U: coba online
Giuseppe
@Giuseppe: bagus! Saya membuat jawaban sebagai wiki komunitas karena ini merupakan hasil kolaborasi :) Jangan ragu untuk mengedit bahasa Inggris saya yang buruk: D
digEmAll