Code Golf: Letter-Ception

15

Wyzwanie:

Dla wprowadzenia jednej litery X (wielka lub mała litera od A do Z) i jednej cyfry N (0-9) wydrukuj odpowiednią literę X wykonaną z N * X.

List musi pochodzić z tej listy:

 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

Przykłady:

wejście: a 1

wynik:

 AAA
A   A
AAAAA
A   A
A   A

wejście: A 0

wynik: A


wejście: A 2

wynik:

      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

wejście: A -1

wyjście: co kiedykolwiek: to nie ma znaczenia


Dodatkowe zasady:

  • Parametry wejściowe można rozdzielić według dowolnych znaków.
  • Każda litera musi użyć stolicy samej siebie jako znaku ascii, aby ją narysować.
  • Dopuszczalne są spacje końcowe, nowe linie itp
  • Zamiast programu możesz napisać funkcję, która przyjmuje ciąg cyfr jako argument. Dane wyjściowe powinny być drukowane normalnie.
  • Stdout / Stderr nie ma znaczenia, po prostu wybierz jeden. Jeśli coś wydrukuje się na drugim, to też nie ma znaczenia.
  • Możliwe formaty wyjściowe można wydrukować do STDOUT, zwrócić jako listę ciągów, zwrócić jako matrycę znaków itp., O ile wynik można po prostu wydrukować przy użyciu domyślnej metody drukowania w języku *.

*: podobnie jak funkcja f (a, 1) zwraca ciąg znaków i można po prostu powiedzieć, że print (f (a, 1)) nie powoduje, że wywołanie print () jest częścią odpowiedzi. (Wskazali na to Kevin Cruijssen i Arnauld).

Zwycięski:

To jest golf golfowy, najniższe wygrane bajtów. Baw się dobrze!


Edycja : to pytanie wydaje się bardzo identyczne z tym, ale powiedziałbym, że tak nie jest, ponieważ nie powinno działać tylko dla H, ale dla każdej litery z alfabetu. Chyba zdecydujesz, czy nie, jest to duplikat.

Nicolas Brauer
źródło
3
Bardzo blisko spokrewniony .
AdmBorkBork,
3
@ElPedro Dziękujemy! Nie wiedziałem jeszcze o piaskownicy, dziękuję, przyjrzę się jej bliżej!
Nicolas Brauer,
2
Ładne pierwsze wyzwanie! Jednak twoje pytanie obecnie sugeruje, że możemy wydrukować tylko wynik. Domyślna reguła mówi, że funkcje mogą po prostu ją zwrócić. Ogólnie mówiąc, formaty we / wy są bardzo elastyczne. Możesz rzucić okiem na ten post w meta, który wyjaśnia dlaczego.
Arnauld,
2
@Arnauld, ponieważ chodzi o sztukę ASCII Powiedziałbym, że wydrukowanie wyniku jest nieco kluczowe dla zadania, ale myślę, że jeśli twój kod zwróci wynik, a zwrócony ciąg może być po prostu wydrukowany przy użyciu domyślnej metody drukowania w językach (jak twoja funkcja f (a, 1) zwraca ciąg znaków i mogę po prostu powiedzieć, że print (f (a, 1)) wywołanie print () nie musi być częścią kodu odpowiedzi. Jeśli jest to nieco zrozumiałe i zgadzasz się, mogę to dodać do opis wyzwania
Nicolas Brauer,
2
@KevinCruijssen Lekko zaktualizowałem pytanie, proszę powiedz, czy jest zrozumiałe, jak to napisałem :)
Nicolas Brauer,

Odpowiedzi:

6

JavaScript (ES8), 281 bajtów

Pobiera dane wejściowe jako (letter)(N). Zwraca ciąg.

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)

Wypróbuj online!

W jaki sposób?

Kodowanie czcionek

5×5031

Zapisany wzór jest dublowany zarówno w poziomie, jak i w pionie.

Przykład dla „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

Główny algorytm

nw=5n

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

(x5kmod5,y5kmod5)

k[0n-1]

Funkcja zwraca spację natychmiast po wykryciu pustego piksela na pewnej głębokości lub znak odpowiadający literze wejściowej, jeśli wszystkie iteracje się powiodły.

Arnauld
źródło
Działa naprawdę dobrze, gratulacje! Czy możesz spróbować wyjaśnić kod?
Nicolas Brauer,
Dlaczego przechowywany wzór ma być dublowany w poziomie i w pionie? czy zajęłoby więcej bajtów, aby nie odzwierciedlać go w ogóle do przechowywania? I tyvm za wyjaśnienie *. *
Nicolas Brauer,
1
yw-10
1
(Chociaż myślę, że moglibyśmy upuścić lustro pionowe bez żadnych kosztów.)
Arnauld,
6

R , 348 bajtów

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

Wypróbuj online!

Wykorzystuje kodowanie prawie identyczne jak Ouros ' ; jednak nie odwraca bitów, zamiast tego decyduje się na ich bezpośrednie użycie.

Następnie tworzy macierz 5x5 bitów i buduje macierz Mocy Kronecker , aby wygenerować potrzebny wzorzec, zapisując wyniki na standardowe wyjście.

Giuseppe
źródło
To świetne wykorzystanie Kronecker!
digEmAll
@digEm Sercem tego wyzwania jest metoda kompresji (w każdym razie z perspektywy golfa kodowego). Dlaczego nie opublikujesz go jako odpowiedzi, abyś również mógł to wyjaśnić?
Giuseppe,
Ok, dobrze dzięki!
digEmAll
5

Czysty , 436 372 bajtów

Znacząco krótszy dzięki nowemu formatowi 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]]

Wypróbuj online!

Kompresuje wzory liter do bitów literałów całkowitych, aby zaoszczędzić ~ 700 bajtów. Na przykład A:

  1. Spłaszczyć [[' AAA '],['A A'],['AAAAA'],['A A'],['A A']]
  2. Rewers [' AAA A AAAAAAA AA A']
  3. Zmień ['A AA AAAAAAA A AAA ']w binarne ( 'A' = 1, ' ' = 0)
  4. Zamień 0b1000110001111111000101110na dziesiętny
  5. Otrzymać 18415150
Obrzydliwe
źródło
4

R , 259 bajtów

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

Wypróbuj online!

Zastrzeżenie:
to rozwiązanie zostało uzyskane poprzez wzięcie odpowiedzi @ Giuseppe i zastąpienie kompresji macierzy innym podejściem bardzo podobnym do tego zastosowanego w odpowiedzi @ Arnauld , więc przede wszystkim należy je głosować :)

Pomysł jest następujący:

Biorąc pod uwagę tę 5 x 26*5macierz 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   

każda kolumna jest traktowana jako liczba binarna i konwertowana na liczbę całkowitą. Te liczby całkowite są następnie konwertowane na niedrukowalne ASCII w zakresie 1 ... 31:

np. dla kolumn "B"końcowego ciągu będą "\017\021\017\021\017"(znaki niedrukowalne zapisane w postaci ósemkowej):

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

          (transposed                  bin to int   int to ASCII
         for reability)    

W związku z tym, biorąc pod uwagę końcowy ciąg 5*26 = 130znaków, przekształcamy ten ciąg z powrotem do macierzy 0/1przy użyciu:

sapply(utf8ToInt(STRING),intToBits)

następnie po prostu dzielimy macierz, wybierając tylko pierwsze 5 wierszy (intToBits zwraca 32 bity) i tylko kolumny odpowiadające literze są przekazywane jako dane wejściowe, a na koniec stosujemy kronecker, jak wyjaśniono w odpowiedzi @ Giuseppe .

digEmAll
źródło
możesz również użyć materiałów niedrukowalnych, aby zgolić -48kawałek i użyć !zamiast U: spróbuj online
Giuseppe,
@Giuseppe: świetnie! Odpowiedziałem na wiki społeczności, ponieważ jest to wynik współpracy :) Zapraszam do edycji mojego słabego angielskiego: D
digEmAll