Code Golf: Briefannahme

15

Die Herausforderung:

Für eine Eingabe von einem Buchstaben X (Groß- oder Kleinschreibung von A bis Z) und einer Ziffer N (0-9) drucken Sie den entsprechenden Buchstaben X aus N * X.

Der Brief muss aus dieser Liste stammen:

 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

Beispiele:

Eingabe: a 1

Ausgabe:

 AAA
A   A
AAAAA
A   A
A   A

Eingabe: A 0

Ausgabe: A


Eingabe: A 2

Ausgabe:

      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

Eingabe: A -1

Ausgabe: was auch immer: es spielt keine Rolle


Zusätzliche Regeln:

  • Die Eingabeparameter können durch beliebige Zeichen getrennt werden.
  • Jeder Buchstabe muss sein eigenes Großbuchstaben als ASCII-Zeichen verwenden, um ihn zu zeichnen.
  • Nachgestellte Leerzeichen, neue Zeilen usw. sind erlaubt
  • Anstelle eines Programms können Sie eine Funktion schreiben, die die Ziffernfolge als Argument verwendet. Die Ausgabe sollte normal gedruckt werden.
  • Stdout / Stderr spielt keine Rolle, wählen Sie einfach eine aus. Ob Sachen auf den anderen gedruckt werden, spielt ebenfalls keine Rolle.
  • Mögliche Ausgabeformate können auf STDOUT gedruckt, als Liste von Zeichenfolgen zurückgegeben, als Zeichenmatrix zurückgegeben usw. werden, sofern das Ergebnis einfach mit der Standarddruckmethode der Sprache gedruckt werden kann. *

*: Wie die Funktion f (a, 1) die Zeichenfolge zurückgibt und man einfach sagen kann, print (f (a, 1)) macht den print () -Aufruf nicht zu einem Teil der Antwort. (Darauf haben Kevin Cruijssen und Arnauld hingewiesen).

Gewinnen:

Dies ist Code-Golf, die niedrigste Anzahl an Bytes gewinnt. Habe Spaß!


Bearbeiten : Diese Frage scheint sehr identisch zu dieser, aber ich würde sagen, es ist nicht, da es nicht nur für H, sondern für jeden Buchstaben aus dem Alphabet funktionieren sollte. Schätze, Sie entscheiden, eher oder nicht, es ist ein Duplikat.

Nicolas Brauer
quelle
3
Sehr eng verwandt .
AdmBorkBork
3
@ ElPedro Vielen Dank! Ich wusste noch nichts über den Sandkasten, vielen Dank, ich werde es mir genauer ansehen!
Nicolas Brauer
2
Schöne erste Herausforderung! Ihre Frage deutet jedoch derzeit darauf hin, dass wir möglicherweise nur das Ergebnis drucken . Die Standardregel lautet, dass Funktionen es nur zurückgeben dürfen. Generell sind E / A-Formate sehr flexibel. Vielleicht möchten Sie sich diesen Beitrag in Meta ansehen, in dem erklärt wird, warum.
Arnauld
2
@Arnauld, da es sich um ASCII-Kunst handelt Ich würde sagen, dass das Drucken des Ergebnisses für die Aufgabe etwas entscheidend ist, aber ich denke, wenn Ihr Code das Ergebnis zurückgibt und der zurückgegebene String einfach mit der Standarddruckmethode der Sprache gedruckt werden kann (wie Ihre Funktion f (a, 1) Gib den String zurück und ich kann nur sagen, print (f (a, 1)) der print () -Aufruf muss nicht Teil des Antwortcodes sein. Wenn dies etwas verständlich ist und du zustimmst, kann ich dies hinzufügen die Beschreibung der Herausforderung
Nicolas Brauer
2
@ KevinCruijssen Ich habe die Frage leicht aktualisiert, bitte sagen Sie mir, ob es verständlich ist, wie ich es geschrieben habe :)
Nicolas Brauer

Antworten:

6

JavaScript (ES8), 281 Byte

Übernimmt die Eingabe als (letter)(N). Gibt eine Zeichenfolge zurück.

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)

Probieren Sie es online!

Wie?

Schriftkodierung

Die Buchstaben sind , was bedeutet, dass jede Zeile als 5-stelliger Binärwert codiert werden kann, dh bis in Dezimalzahl. Diese Werte können bequem als einzelne Ziffer in Base36 gespeichert werden.5×5031

Das gespeicherte Muster wird horizontal und vertikal gespiegelt.

Beispiel für 'F':

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

Die gesamte Schriftart wird als einzelne Zeichenfolge mit Zeichen gespeichert .26×5=130

Um das 'Pixel' bei auf den Buchstaben zu testen, gehen Sie wie folgt vor :(x,y)nth

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

Hauptalgorithmus

Bei definieren wir , was die Breite der endgültigen Ausgabe ist.nw=5n

Für und möchten wir wissen, ob das Ausgabepixel bei gesetzt ist oder nicht. Wir verwenden die rekursive Funktion , die das Buchstabenpixel testet, das sich befindet bei:0x<w0y<w(x,y)h

(x5kmod5,y5kmod5)

für alle in .k[0n1]

Die Funktion gibt ein Leerzeichen zurück, sobald ein leeres Pixel in einer bestimmten Tiefe erkannt wurde, oder das Zeichen, das dem eingegebenen Buchstaben entspricht, wenn alle Iterationen erfolgreich waren.

Arnauld
quelle
Es funktioniert wirklich gut, Glückwunsch! Können Sie bitte versuchen, den Code ein wenig zu erklären?
Nicolas Brauer
Warum muss das gespeicherte Muster horizontal und vertikal gespiegelt werden? würde es mehr Bytes dauern, um es überhaupt nicht zum Speichern zu spiegeln? Und tyvm für die Erklärung *. *
Nicolas Brauer
1
@NicolasBrauer Es wird vertikal gespiegelt, da von auf abnimmt . Und es wird horizontal gespiegelt, weil das am weitesten links stehende Pixel dem niedrigstwertigen Bit zugeordnet ist (dh rechts von der Zahl, der es zugeordnet ist). Die Dekodierung wäre etwas länger, wenn sie überhaupt nicht gespiegelt würde. w - 1 0yw10
Arnauld
1
(Obwohl ich denke, wir könnten den vertikalen Spiegel
Arnauld
6

R , 348 Bytes

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

Probieren Sie es online!

Verwendet eine Kodierung, die fast mit der von Ouros identisch ist . Die Bits werden jedoch nicht umgekehrt, sondern direkt verwendet.

Anschließend wird eine 5x5-Bitmatrix erstellt und die Kronecker Power- Matrix erstellt, um das erforderliche Muster zu generieren und die Ergebnisse in stdout zu schreiben.

Giuseppe
quelle
Dies ist eine großartige Verwendung von Kronecker!
digEmAll
@digEmAll das Herzstück dieser Herausforderung ist die Komprimierungsmethode (aus der Code-Golf-Perspektive sowieso). Warum postest du es nicht als Antwort, damit du es auch erklären kannst?
Giuseppe
Ok, gut, danke!
digEmAll
5

Sauber , 436 372 Bytes

Deutlich kürzer mit neuem IO-Format.

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

Probieren Sie es online!

Komprimiert die Buchstabenmuster in Bits ganzzahliger Literale, um ~ 700 Bytes zu sparen. Zum Beispiel A:

  1. Ebnen [[' AAA '],['A A'],['AAAAA'],['A A'],['A A']]
  2. Umkehren [' AAA A AAAAAAA AA A']
  3. Schalten Sie ['A AA AAAAAAA A AAA ']in binäre ( 'A' = 1, ' ' = 0)
  4. Drehen Sie 0b1000110001111111000101110in dezimal
  5. Bekommen 18415150
Οurous
quelle
4

R , 259 Bytes

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

Probieren Sie es online!

Haftungsausschluss:
Diese Lösung wurde anhand erhalten worden @ Giuseppe Antwort und Ersetzen der Matrix Kompression mit einem anderen Ansatz sehr , sehr ähnlich der , die in @ Arnaulds Antwort , so in erster Linie gehen upvote sie :)

Die Idee ist die folgende:

Ausgehend von dieser 5 x 26*5Matrix von 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   

Jede Spalte wird als Binärzahl betrachtet und in eine Ganzzahl umgewandelt. Diese Ganzzahlen werden dann in nicht druckbares ASCII im Bereich 1 ... 31 konvertiert:

zB für die Spalten "B"der endgültigen Zeichenfolge werden "\017\021\017\021\017"(nicht druckbare Zeichen in oktaler Darstellung geschrieben):

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

          (transposed                  bin to int   int to ASCII
         for reability)    

Ausgehend von der endgültigen Zeichenfolge 5*26 = 130konvertieren wir diese Zeichenfolge zurück in die folgende Matrix 0/1:

sapply(utf8ToInt(STRING),intToBits)

dann unterteilen wir einfach die Matrix, indem wir nur die ersten 5 Zeilen auswählen (intToBits liefert 32 Bits) und nur die Spalten, die dem als Eingabe übergebenen Buchstaben entsprechen, und wenden schließlich kronecker an, wie in @ Giuseppes Antwort erläutert .

digEmAll
quelle
Sie können auch Unprintables verwenden, um das -48Stück zu rasieren , und !anstelle von U: versuchen Sie es online
Giuseppe
@ Giuseppe: großartig! Ich habe die Antwort zu einem Community-Wiki gemacht, da es das Ergebnis einer Zusammenarbeit ist :) Fühlen Sie sich frei, mein schlechtes Englisch zu bearbeiten: D
digEmAll