Code Golf: Mektup Ception


15

Meydan okuma:

Bir X harfi (A'dan Z'ye büyük veya küçük harf) ve bir N (0-9) rakamı girmek için, N * X'dan yapılmış X harfini yazdırın.

Mektup şu listeden olmalıdır:

 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

Örnekler:

giriş: a 1

çıktı:

 AAA
A   A
AAAAA
A   A
A   A

giriş: A 0

çıktı: A


giriş: A 2

çıktı:

      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

giriş: A -1

çıktı: ne olursa olsun: önemli değil


Ek Kurallar:

  • Giriş parametreleri istediğiniz karakterle ayrılabilir.
  • Her harf, onu çizmek için başkentini ascii karakter olarak kullanmalıdır.
  • Sondaki boşluklara, yeni hatlara vb. İzin verilir.
  • Program yerine, basamak dizesini bağımsız değişken olarak alan bir işlev yazabilirsiniz. Çıktı normal şekilde yazdırılmalıdır.
  • Stdout / Stderr önemli değil, sadece birini seç. Diğer tarafa yazdırılan şeyler de önemli değilse.
  • Olası çıktı formatları, STDOUT'a basılabilir, karakter listesi olarak döndürülebilir, karakter matrisi olarak döndürülebilir, vb. Sonucun diller varsayılan yazdırma yöntemi kullanılarak basılabildiği sürece. *

*: f (a, 1) işlevi dizeyi döndürür ve biri print (f (a, 1)) 'nin print () çağrısını yanıtın parçası yapmadığını söyleyebilir. (Bu Kevin Cruijssen ve Arnauld tarafından belirtildi).

Kazanan:

Bu kod golf, en düşük bayt sayısı kazanır. İyi eğlenceler!


Düzenleme : Bu soru gibi görünüyor çok özdeş için bu o H ama alfabeden her harf için sadece iş .. Bil gerektiği gibi bunu bir kopyası yerine olmadığına karar ancak ben değil söyleyebilirim.



3
@ElPedro Teşekkürler! Sandbox'ı henüz bilmiyordum, çok teşekkür ederim, daha yakından bakacağım!
Nicolas Brauer

2
Güzel ilk meydan okuma! Ancak, sorunuz şu anda yalnızca sonucu yazdırabileceğimizi gösteriyor . Varsayılan kural, işlevlerin yalnızca döndürmesine izin verilmesidir. Genel olarak, I / O formatları çok esnektir. Bunun nedenini açıklayan bu yazıya meta olarak bakmak isteyebilirsiniz .
Arnauld

2
@ ASCII sanatı ile ilgili olarak sonucu yazdırmak için görev için biraz önemli olduğunu söyleyebilirim , ancak kodunuzun sonucu döndürüp dönmediğini ve döndürülen dizenin yalnızca varsayılan yazdırma yöntemi (işleviniz f gibi) kullanılarak yazdırılabileceğini tahmin ediyorum. (a, 1) dizeyi döndürün ve sadece print (f (a, 1)) diyebilirim, print () çağrısı cevap kodunun bir parçası olmak zorunda değildir.Bu biraz anlaşılırsa ve bunu meydan okuma açıklaması
Nicolas Brauer

2
@KevinCruijssen Soruyu biraz güncelledim, lütfen yazdığım şekilde anlaşılabilir olup olmadığını söyle :)
Nicolas Brauer

Yanıtlar:


6

JavaScript (ES8), 281 bayt

Girişi alır (letter)(N). Bir dize döndürür.

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)

Çevrimiçi deneyin!

Nasıl?

Yazı tipi kodlaması

5×5031

Saklanan desen hem yatay hem de dikey olarak yansıtılır.

'F' için örnek:

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

26×5=130

(x,y)ninci

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

Ana algoritma

nw=5n

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

(x5kmod5,y5kmod5)

k[0n1]

İşlev, belirli bir derinlikte boş bir piksel tespit edilir edilmez bir boşluk veya tüm yinelemeler başarılı olursa giriş harfine karşılık gelen karakter döndürür.


Gerçekten iyi çalışıyor, tebrikler! Kodu biraz açıklamaya çalışabilir misiniz lütfen?
Nicolas Brauer

Saklanan desen neden hem yatay hem de dikey olarak yansıtılacak? depolamak için hiç yansıtmamak daha fazla bayt alır mı? Ve açıklama için tyvm *. *
Nicolas Brauer

1
yw10

1
(Dikey aynayı ücretsiz olarak düşürebileceğimizi düşünsem de.)
Arnauld

6

R , 348 bayt

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

Çevrimiçi deneyin!

Ouros ile neredeyse aynı olan bir kodlama kullanır ; ancak, bitleri tersine çevirmez, bunun yerine doğrudan kullanmayı tercih eder.

Daha sonra 5x5 bitlik bir matris oluşturur ve sonuçları stdout'a yazarak gerekli deseni oluşturmak için Kronecker Power matrisini oluşturur.


Bu Kronecker'ın harika bir kullanımı!
digEmTüm


Bu zorluğun kalbi sıkıştırma yöntemidir (yine de bir kod golf perspektifinden). Bunu da açıklayabilmeniz için neden cevap olarak göndermiyorsunuz?
Giuseppe

Tamam, teşekkürler!
digEmTüm

5

Temiz , 436372 bayt

Yeni IO formatı ile önemli ölçüde daha kısa.

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

Çevrimiçi deneyin!

~ 700 bayt tasarruf etmek için harf desenlerini tamsayı değişmezlerinin bitlerine sıkıştırır. Örneğin A:

  1. Düzleştirmek [[' AAA '],['A A'],['AAAAA'],['A A'],['A A']]
  2. Ters [' AAA A AAAAAAA AA A']
  3. İkiliye ['A AA AAAAAAA A AAA ']dönüştür ( 'A' = 1, ' ' = 0)
  4. Çevirin 0b1000110001111111000101110ondalık içine
  5. Almak 18415150

4

R , 259 bayt

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

Çevrimiçi deneyin!

Feragatname:
Bu çözüm @ Giuseppe'nin cevabını alarak ve matris sıkıştırmasını @ Arnauld'un cevabında kullanılana çok benzeyen başka bir yaklaşımla değiştirerek elde edildi , bu yüzden her şeyden önce onları oylayın :)

Fikir şudur :

Şu 5 x 26*5matris göz önüne alındığında 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   

her sütun ikili sayı olarak kabul edilir ve bir tam sayıya dönüştürülür. Bu tamsayı daha sonra 1 ... 31 aralığında yazdırılamaz ASCII'ye dönüştürülür:

örneğin "B", son dizginin sütunları için "\017\021\017\021\017"(sekizli gösterimle yazılan yazdırılamaz karakterler):

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

          (transposed                  bin to int   int to ASCII
         for reability)    

Bu nedenle, son 5*26 = 130karakter dizesi göz önüne alındığında, bu dizgeyi aşağıdaki kullanım matrisine dönüştürürüz 0/1:

sapply(utf8ToInt(STRING),intToBits)

daha sonra sadece ilk 5 satırı (intToBits 32 bit döndürür) ve yalnızca girdi olarak geçirilen harfe karşılık gelen sütunları seçerek matrisi alt bölümlere ayırırız ve son olarak @ Giuseppe'nın cevabında açıklandığı gibi kronecker uygularız .


Ayrıca kapalı tıraş için unprintables kullanabilirsiniz -48parça ve kullanım !yerine U: Online denemek
Giuseppe

@Giuseppe: harika! Bir işbirliğinin sonucu olduğu için cevabı bir topluluk
wiki'si
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.