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.



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

0≤x<w0≤y<w(x,y)h

(⌊x5k⌋mod5,⌊y5k⌋mod5)

k[0…n-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.


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.


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

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 .


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.