Verschönern Sie Ihre Eingabe

19

Dies ist ein bisschen ähnlich wie bei diesem staubbedeckten Einstieg, aber ich hoffe, dass mein Dreh es einzigartig genug macht. Ich konnte nichts finden, was mich davon abhält, dies zu veröffentlichen, aber da draußen ist ziemlich viel Meer.

Sowieso! Die Herausforderung:

Ihr Code erhält eine Zeichenfolge. Es konvertiert dies in eine ASCII-artige Version des gleichen Strings, jedoch mit einem Haken.

Eingabetransformation

  • Die einzigen unterstützten Zeichen sind AZ und 0-9
  • Kleinbuchstaben werden in Großbuchstaben umgewandelt
  • Alles andere wird stillschweigend entfernt

Charakterzeichnung

  • Jedes "Pixel" der vergrößerten Schrift wird aus der Eingabezeichenfolge gezeichnet
  • Das n-te Pixel entspricht dem n-ten Zeichen in der Eingabezeichenfolge. Wenn n größer als die Länge der Eingabezeichenfolge ist, setzen Sie den Zeilenumbruch auf den Anfang zurück
  • Einzelne Buchstaben werden von links nach rechts und von oben nach unten gezeichnet
  • Nachfolgende Buchstaben nehmen ihren "Pixelzeichen" -Index dort auf, wo der letzte Buchstabe aufgehört hat (z. B. bei einer Eingabelänge von 10, wenn der erste Buchstabe 9 Pixel hatte, wird das erste Pixel des zweiten Buchstabens mit dem 10. Eingabezeichen, dem zweiten, gezeichnet Pixel wird mit dem 1. eingegebenen Zeichen gezeichnet)
  • Jeder Buchstabe wird in einem 5x5-Raster gezeichnet, das vollständig mit Leerzeichen aufgefüllt ist. Die Schriftart, die Sie verwenden möchten, finden Sie in diesem Pastebin oder etwas weiter unten in diesem Beitrag
  • Jeder Buchstabe wird in derselben Zeile gezeichnet, sodass die Gesamtzahl der Zeilenumbrüche in Ihrer Ausgabe 4 beträgt
  • Jeder Buchstabe wird durch 2 Spalten mit Leerzeichen getrennt

Die Schriftart

 000 
0  00
0 0 0
00  0
 000 

111  
  1  
  1  
  1  
11111

2222 
    2
 222 
2    
22222

3333 
    3
  333
    3
3333 

  44 
 4 4 
44444
   4 
   4 

55555
5    
5555 
    5
5555 

 6666
6    
6666 
6   6
 666 

77777
    7
   7 
  7  
 7   

 888 
8   8
 888 
8   8
 888 

 999 
9   9
 9999
    9
9999 

 AAA 
A   A
AAAAA
A   A
A   A

BBBB 
B   B
BBBB 
B   B
BBBB 

 CCCC
C    
C    
C    
 CCCC

DDDD 
D   D
D   D
D   D
DDDD 

EEEEE
E    
EEE  
E    
EEEEE

FFFFF
F    
FFF  
F    
F    

 GGGG
G    
G  GG
G   G
 GGGG

H   H
H   H
HHHHH
H   H
H   H

IIIII
  I  
  I  
  I  
IIIII

JJJJJ
  J  
  J  
  J  
JJ   

K   K
K  K 
KKK  
K  K 
K   K

L    
L    
L    
L    
LLLLL

M   M
MM MM
M M M
M   M
M   M

N   N
NN  N
N N N
N  NN
N   N

 OOO 
O   O
O   O
O   O
 OOO 

PPPP 
P   P
PPPP 
P    
P    

 QQ  
Q  Q 
Q QQ 
Q  Q 
 QQ Q

RRRR 
R   R
RRRR 
R  R 
R   R

 SSSS
S    
 SSS 
    S
SSSS 

TTTTT
  T  
  T  
  T  
  T  

U   U
U   U
U   U
U   U
 UUU 

V   V
V   V
 V V 
 V V 
  V  

W   W
W   W
W W W
WW WW
W   W

X   X
 X X 
  X  
 X X 
X   X

Y   Y
 Y Y 
  Y  
  Y  
  Y  

ZZZZZ
   Z 
  Z  
 Z   
ZZZZZ

Ja, ich weiß, dass die 4 und Q hässlich sind

Ein Beispiel

Eingang

0123456789

Ausgabe

 012   567    6789   0123     34   45678   9012  34567   234    567 
3  45    8        0      4   5 6   9      3          8  5   6  8   9
6 7 8    9     123     567  78901  0123   4567      9    789    0123
90  1    0    4          8     2       4  8   9    0    0   1      4
 234   12345  56789  9012      3   5678    012    1      234   5678 

Ein anderes Beispiel

Eingang

a3 B'2

Ausgabe

 A3B   B2A3   2A3B   2A3B 
2   A      B  2   A      2
3B2A3    2A3  3B2A    A3B 
B   2      B  3   B  2    
A   3  2A3B   2A3B   A3B2A

Standardlücken sind verboten. Code Golf, damit kein grünes Häkchen gegeben wird.

Scoots
quelle
17
Ich würde vorschlagen, sicherzustellen, dass die Eingabe nur enthält [A-Z\d]- ich glaube nicht, dass das Filtern ungültiger Zeichen der Herausforderung etwas hinzufügt.
Shaggy
3
@ Shaggy Vielleicht. Aber aus dem gleichen
Grund
1
Related
Laikoni
1
Verbunden.
Dom Hastings
2
Was ist mit DREI führenden Räumen? Das wirst du doch nicht zulassen!
Magic Octopus Urn

Antworten:

16

Python 2 , 413 411 373 364 352 345 Bytes

-1 Byte dank Kevin Cruijssen .
-9 Bytes dank Jo King .
-1 Byte danke an Lynn .

Der Datenstring enthält nicht druckbare, maskierte Versionen.

k=list(filter(str.isalnum,input()))
q=range(5);o=['']*5;r=k*25;d=0
for c in'uM<LxSe#ye>El4NpD@$	gh>I,m]aB>e,]?kFLyglxV!%w832wGj%uT{Hr*K,*[P\n6.&ED#T}^DLI&p7f\d`*lG!FacG\rz?!A':d*=126;d+=ord(c)-1
for c in k:
 for i in q:
	for y in q+[999]*2:o[i]+=d>>int(c,36)*25+i*5+y&1and r.pop(0)or' '
print'\n'.join(o).upper()

Probieren Sie es online!

Da jedes Zeichen 25 Pixel hat, kann es leicht in 25 Bit codiert werden. Die Zahl der Basis 126 'uM\x04<L\x10x\x14Se#ye\x0f>El4NpD@$\tgh>\x1d\x10\x15I,\x0em]a\x0e\x03B>e\x15,\x0c]\x03?kFL\x01\x0byglxV!\x18\x16\x0c\x0b\x10\x0b%w832wGj%uT{Hr*K,*[P\n6.&ED#T\x0c}^\x1c\x0fD\x17LI&p7\x17f\\d`*\x01l\x1bG\x12!Fac\x05\x08\x0eG\rz?!\x1aA'codiert alle Zeichen, die 0von den niedrigstwertigen 25 Bits, 1den nächsten 25 Bits und Zden 25 höchstwertigen Bits codiert werden. Ein einzelnes Zeichen wird in der folgenden Reihenfolge codiert:

00 01 02 03 04
05 06 07 08 09
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24

( 00ist das niedrigstwertige Bit, 25das höchstwertige)

Leerzeichen werden durch eine Null codiert, Nicht-Leerzeichen durch eine Eins. Beispiel :

77777      11111
    7      00001
   7   =>  00010  => (0001000100010001000011111)
  7        00100
 7         01000

Ungolfed

k = list(filter(str.isalnum,input()))  # keep only alphanumeric characters of the input
o = ['']*5   # this list contains the output, initially 5 empty lines
r = k * 25   # make a copy of the input 25-times the length, these chars will be used for the pixels
data = 0
#  data encoded in base 126
b92d = 'uM<LxSe#ye>El4NpD@$	gh>I,m]aB>e,]?kFLyglxV!%w832wGj%uT{Hr*K,*[P\n6.&ED#T}^DLI&p7f\d`*lG!FacG\rz?!A'
for c in b92d:          # convert base 92 to base 10
  d*=126;d+=ord(c)-1

for c in k:             # iterate over the filtered input
  a_index = int(c, 36)  # the index of the current char in '0..9A..Z' / '0..9a..z'
  for i in range(5):    # for each row of the output
    for y in range(5)+[999]*2:  # for each pixel in the row, th two 999's are used for spaces
      is_set = data >> (a_index*25 + i*5 + y) & 1  # We shift the to the right to have ...
                                                   # the current pixels value at the LSB:
                                                   # 25 bits for each char that came before
                                                   # 5 bits for each previous row and 1 bit
                                                   # for every pixel in the same row
      o[i] += is_set and r.pop(0) or ' '           # If the current pixel is set, append ...
                                                   # ... a character from the input to the current row
print '\n'.join(o).upper()  # print the output

Probieren Sie es online!

ovs
quelle
Buchstaben sollten durch zwei Leerzeichen getrennt sein, das +' 'sollte auch so sein +' '. Trotzdem nette Antwort, also +1 von mir.
Kevin Cruijssen
du brauchst das aber .upper()irgendwo, sonst werden die inneren Buchstaben klein geschrieben
Jo King
@JoKing Du hast Recht, das wurde behoben.
Ovs
Ich liebe diesen Codierungstrick. Haben Sie sich für Base 92 entschieden, weil dies die größte Standardcodierung ist, die aus druckbaren ASCII-Dateien besteht? Könntest du höher gehen? Ich habe auch gegoogelt, konnte aber keine genauen Informationen zu Base 92 erhalten. Haben Sie einen Link?
Jonah,
@Jonah Es gibt keinen Standard für die Basis 92-Codierung. Deshalb habe ich meine eigene Decodierungslogik implementiert. Solange Sie genügend verschiedene Ziffern haben, können Sie eine beliebige Basis verwenden >1.
Ovs
10

APL (Dyalog Unicode) , 228 225 224 214 Bytes

Volles Programm. Fordert stdin zur Eingabe eines Strings auf. Druckt nach Standard. Etwa die Hälfte des Codes entschlüsselt nur das verschlüsselte Alphabet.

⍉↓(⍴t)⍴r\i⍴⍨+/r←,t←(⊂ai←(1(819⌶)⍞)∩a←⎕D,⎕A)⌷0(220⌶)¯1(219⌶)¯125+⎕AV_________________________________________________________________________________________________________________________________________________

__Repräsentiert den folgenden 143-Byte-LZ4-codierten String in Anführungszeichen:"⊥\u0004pæ€}€\\⊃⌿Æ€â<Å€∧€ÀÆ€Ð┬:Ëcü\u0000≥ðè⊤õ⍨¢∧·èý\u0005þÐÕ\u001EÐ :\u001Eè⌊×ßi[B⊂ɫoãà oéìÐ⍙⊃Ý∣à)≥èB⊃\u001B\u001F⊥ä{⌿⍨ G⍺\u001B⌿Æ\u001F∇x└îR`:└è→⊂\u0000ê∧⍒\u0003ɫqè$$ÛD⊥â∊\u001B\u001Eéu|\u001B@4A|⍪┌nàkááЀ€€€€€€"

Probieren Sie es online!

__ 143-Byte-LZ4-codierte Zeichenfolge in Anführungszeichen

⎕AV⍳Hinweise dazu im A tomic V ector (der Zeichensatz)

¯125+ addiere -125 dazu (um signierte 8-Bit-Ganzzahlen zu erhalten)

¯1(219⌶) LZ4 dekomprimieren

0(220⌶) Deserialisieren in ein boolesches Array mit 36 ​​Layern, 5 Zeilen und 5 Spalten

()⌷ Indizieren Sie dies mit den folgenden Indizes:

⎕A Großbuchstabe A Lphabet

⎕D, vorangestellt wird, die D igits

a← Laden in a(für ein Lphabet)

()∩ Schnittpunkt von Folgendem und dem (entfernt ungültige Eingaben):

 Eingabeaufforderung für Texteingabe über stdin (Konsole)

  1(819⌶) Falte in Großbuchstaben ( 819sieht aus wie Big, 1 ist für ja groß im Gegensatz zu klein)

i← store in i(für i Nput)

a⍳Hinweise dazu ina

 einschließen (um zu indizieren, dass jede die führende Koordinate darstellt)

t← Speichern in t(für t ext)

, Ravel (Abflachen)

r← speichern in r(für r avelled)

+/ Summe (dh Anzahl der Zeichen, die zum Malen des Kunstwerks benötigt werden)

i⍴⍨zyklisch r die Eingabe zu dieser Länge eshape

r\ erweitern Sie das; füge ein Leerzeichen bei 0s ein, verbrauche Buchstaben bei 1s

(…) ⍴` zu folgender Form umformen:

⍴t die Form des Textes

 Teilen Sie das N-mal-5-mal-5-Array in eine N-mal-5-Matrix von Kunstlinien auf

In eine 5-mal-N-Matrix von Kunstzeilen transponieren (dies richtet die entsprechenden Zeilen der Zeichen aus)

Standardmäßig trennt APL einfache Elemente eines verschachtelten Arrays mit zwei Leerzeichen.

Adam
quelle
Nicht ganz! Zwischen jedem Buchstaben müssen 2 Leerzeichen stehen
Scoots
1
@Scoots OK, behoben.
Adám
@ Adám mit C und D
stimmt
9

Python 2 , 428 Bytes

s=filter(str.isalnum,input().upper());x=s
R=['']*5
for c in s:
 i=0;exec"n=int('RAAAOQQ2RBAQBQRRBDRRDCDDAQ8QBRDDDDDRXDDF0XX6CCDDCDCCCD00ECNLDDEDC0DDD66YYABH0A3RQQRQCDOOFR00OCHHDQIQA0D6H0000DXL0CXYXDDDCDCCDD00ECDFDCEEX0D6N6044AQARRQYQADQBQRCBDRKDRDDAC9DQ0A0DD0R'[i*36+ord(c)%55%45],36);R[i]+=bin(n+36*(n<30)<<2)[3:].replace(*'0 ').replace(*'1.');i+=1;"*5
 while'.'in`R`:R=eval(`R`.replace('.',x[0],1));x=x[1:]+s
print'\n'.join(R)

Probieren Sie es online!


Die Buchstaben sind wie folgt codiert:

Jeder eindeutige Teil (es gibt 23) wird in Binärdaten konvertiert, und eine 1 wird davor hinzugefügt. Dann wird es zur Basis 36 konvertiert.

  part      bin      1+bin     int     base36
'  ...' -> 00111 -> 100111 ->   39  ->   13

Die resultierenden Basis-36-Zahlen sind:

[10,12,13,14,16,18,19,1A,1B,1C,1D,1E,1F,1H,1I,1K,1L,1N,1O,1Q,1R,X,Y]

Die Initiale 1wird entfernt, so dass wir ein einzelnes Zeichen haben:

[0,2,3,4,6,8,9,A,B,C,D,E,F,H,I,K,L,N,O,Q,R,X,Y]

Jeder Buchstabe ( A-Z0-9) wird dann in fünf dieser neuen Zeichen codiert.

0 = ' ... ','.  ..','. . .','..  .',' ... ' -> A,F,H,L,A
1 = '...  ','  .  ','  .  ','  .  ','.....' -> O,0,0,0,R
etc.

In fünf Listen:

'AOQQ2RBRAAAQBQRRBDRRDCDDAQ8QBRDDDDDR'
'F0XX6CCXDDDDCDCCCD00ECNLDDEDC0DDD66Y'
'H0A3RQQYABRQCDOOFR00OCHHDQIQA0D6H000'
'L0CXYXD0DXDDCDCCDD00ECDFDCEEX0D6N604'
'ARRQYQA4AQDQBQRCBDRKDRDDAC9DQ0A0DD0R'

Um die Eingabe einem Index in diesen Listen zuzuordnen, wird die Ordnungszahl geändert:

'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
ord(c) = [48-57, 65-90]
ord(c)%55%45 = [3-9, 0-2, 10-35]

Da die Ordnungszahlen nicht 0-35, sondern leicht gemischt sind, werden die 5 Listen neu angeordnet und verkettet:

'RAAAOQQ2RBAQBQRRBDRRDCDDAQ8QBRDDDDDR'
'XDDF0XX6CCDDCDCCCD00ECNLDDEDC0DDD66Y'
'YABH0A3RQQRQCDOOFR00OCHHDQIQA0D6H000'
'0DXL0CXYXDDDCDCCDD00ECDFDCEEX0D6N604'
'4AQARRQYQADQBQRCBDRKDRDDAC9DQ0A0DD0R'
->
'RAAAOQQ2RBAQBQRRBDRRDCDDAQ8QBRDDDDDRXDDF0XX6CCDDCDCCCD00ECNLDDEDC0DDD66YYABH0A3RQQRQCDOOFR00OCHHDQIQA0D6H0000DXL0CXYXDDDCDCCDD00ECDFDCEEX0D6N6044AQARRQYQADQBQRCBDRKDRDDAC9DQ0A0DD0R'

Für jedes Zeichen in der Eingabe werden 5 Buchstaben gefunden und in Ints (base36) umgewandelt:

n=int('RAAA...D0R'[i*36+ord(c)%55%45],36)
                   i*36                    #get row i
                        ord(c)%55%45       #n -> 0..35
  int(                               ,36)  #convert to int

Wenn die Nummer darunter ist 30, 36wird hinzugefügt (die fehlenden haben 1wir früher entfernt)

n+36*(n<30)

Dann wird die Zahl wieder in binär umgewandelt und 0s und 1s werden in und umgewandelt .. Am Ende der Konvertierung werden zwei Leerzeichen hinzugefügt.

bin(n+36*(n<30)<<2)[3:].replace(*'0 ').replace(*'1.')

    n+36*(n<30)                                       #add leading base36 '1'
               <<2                                    #add 2 0's to end
bin(              )                                   #convert to binary string
                   [3:]                               #remove '0b1' from front
                       .replace(*'0 ').replace(*'1.') #replace 0 and 1

Z.B.

C    base36    int     <<2       bin-str        str
3 ->   13   ->  39  ->  156 -> 0b10011100 -> '  ...  '

Für jedes .im Ergebnis wird es durch das nächste Zeichen aus der Eingabe ersetzt (iteriert von x).

while'.'in`R`:R=eval(`R`.replace('.',x[0],1));x=x[1:]+s
TFeld
quelle
Nett! Könnte ich Sie um eine Erklärung bitten, wie das funktioniert? Im Moment ist dies eine Zauberei für meine Augen.
Scoots
@Scoots Darauf! :)
TFeld
3
Vielen Dank, dass Sie das hinzugefügt haben :) Die Cleverness, die ich in den Antworten auf dieser Website sehe, beeindruckt mich immer wieder
Scoots
Da es sich bei den Teilen um 5 Bits handelt, warum nicht stattdessen Basis 32 verwenden?
Neil
6

Java 8, 917 907 Bytes

int i,l;String[]S;s->{String q=" ",t="",r[]={t,t,t,t,t};S=s.toUpperCase().replaceAll("[^A-Z0-9]",t).split(t);i=-1;l=S.length;for(String c:S){r[0]+=s("12357BDEFHIJKLMNPRTUVWXYZ",c)+s("012356789ABCDEFGIJOPQRSTZ",c)+s("0123456789ABCDEFGIJOPQRSTZ",c)+s("023456789ABCDEFGIJOPRSTZ",c)+s("567CEFGHIJKMNSTUVWXYZ",c)+q;r[1]+=s("05689ABCDEFGHKLMNOPQRSUVW",c)+s("4MNXY",c)+s("1IJT",c)+s("04KMQXYZ",c)+s("023789ABDHMNOPRUVW",c)+q;r[2]+=s("0456ABCDEFGHKLMNOPQRUW",c)+s("245689ABEFHKPRSV",c)+s("012345689ABEFHIJKMNPQRSTWXYZ",c)+s("23456789ABGHPQRSV",c)+s("0349ADGHMNOUW",c)+q;r[3]+=s("0268ABCDEFGHKLMNOPQRUW",c)+s("0VWXZ",c)+s("17IJTY",c)+s("4KNQRVWX",c)+s("035689ABDGHMNOSUW",c)+q;r[4]+=s("12359ABDEFHIJKLMNPRSWXZ",c)+s("012356789BCDEGIJLOQSUZ",c)+s("01235689BCDEGILOQSTUVYZ",c)+s("012345689BCDEGILOSUZ",c)+s("12ACEGHIKLMNQRWXZ",c)+q;}return"".join("\n",r);}String s(String...s){return s[0].contains(s[1])?S[++i%l]:" ";}

Wird es von hier aus Golf spielen, um die aktuelle Byteanzahl hoffentlich mindestens zu halbieren.

Probieren Sie es online aus.

Erläuterung:

int i,                         // Index-integer on class-level
    l;                         // Length-integer on class-level
String[]S;                     // String-array of characters on class-level

s->{                           // Method with String as both parameter and return-type
  String q="  ",               //  Temp String containing two spaces to reduce bytes
         t="",                 //  Temp Empty String to reduce bytes
         r[]={t,t,t,t,t};      //  Start with five empty rows
  S=s.toUpperCase()            //  Transform the input-String to uppercase
     .replaceAll("[^A-Z0-9]",t)//  Remove all non alphanumeric characters
     .split(t);                //  And transform it into a String-array of characters
  i=-1;                        //  Set the index-integer on -1 to start with
  l=S.length;                  //  Set the length of the modified input
  for(String c:S){             //  Loop over the characters of the modified input:
    r[0]+=                     //   Append to the first row:
          s("12357BDEFHIJKLMNPRTUVWXYZ",c)      // The first pixel
          +s("012356789ABCDEFGIJOPQRSTZ",c)     // The second pixel
          +s("0123456789ABCDEFGIJOPQRSTZ",c)    // The third pixel
          +s("023456789ABCDEFGIJOPRSTZ",c)      // The fourth pixel
          +s("567CEFGHIJKMNSTUVWXYZ",c)         // The fifth pixel
          +q;                                   // Two trailing spaces
    r[1]+=                     //   Append to the second row:
          s("05689ABCDEFGHKLMNOPQRSUVW",c)      // The first pixel
          +s("4MNXY",c)                         // The second pixel
          +s("1IJT",c)                          // The third pixel
          +s("04KMQXYZ",c)                      // The fourth pixel
          +s("023789ABDHMNOPRUVW",c)            // The fifth pixel
          +q;                                   // Two trailing spaces
    r[2]+=                     //   Append to the third row:
          s("0456ABCDEFGHKLMNOPQRUW",c)         // The first pixel
          +s("245689ABEFHKPRSV",c)              // The second pixel
          +s("012345689ABEFHIJKMNPQRSTWXYZ",c)  // The third pixel
          +s("23456789ABGHPQRSV",c)             // The fourth pixel
          +s("0349ADGHMNOUW",c)                 // The fifth pixel
          +q;                                   // Two trailing spaces
    r[3]+=                     //   Append to the fourth row:
          s("0268ABCDEFGHKLMNOPQRUW",c)         // The first pixel
          +s("0VWXZ",c)                         // The second pixel
          +s("17IJTY",c)                        // The third pixel
          +s("4KNQRVWX",c)                      // The fourth pixel
          +s("035689ABDGHMNOSUW",c)             // The fifth pixel
          +q;                                   // Two trailing spaces
    r[4]+=                     //   Append to the fifth row:
          s("12359ABDEFHIJKLMNPRSWXZ",c)        // The first pixel
          +s("012356789BCDEGIJLOQSUZ",c)        // The second pixel
          +s("01235689BCDEGILOQSTUVYZ",c)       // The third pixel
          +s("012345689BCDEGILOSUZ",c)          // The fourth pixel
          +s("12ACEGHIKLMNQRWXZ",c)             // The fifth pixel
          +q;}                                  // Two trailing spaces
  return"".join("\n",r);}      //  Return the rows joined with new-lines

//  Separated method with String-varargs parameter and String return-type
String s(String...s){          
  return s[0].contains(s[1])?  //  If the String contains the character-String:
                               //   Increase `i` by 1 first with `++i`
    S[++i%l]                   //   Then return the i'th character of the modified input
                               //   with wraparound by using modulo-`l`
   :                           //  Else:
    " ";}                      //   Return a space
Kevin Cruijssen
quelle
Sie scheinen kein in sich geschlossenes Beispiel zu haben. Klassenfelder, Methoden und Lambdas. Ich habe +1 gegeben, weil ich mir die Zeit dafür genommen habe, wie erwartet, aber die Art und Weise hier scheint ein bisschen ungültig zu sein.
Olivier Grégoire
@ OlivierGrégoire Hmm, ich dachte, Felder auf Klassenebene wären erlaubt, solange Sie sie nicht auf Klassenebene setzen (die Funktion muss mehrmals ausgeführt werden, ohne etwas zurückzusetzen, um in sich geschlossen zu sein). Welches ist, warum ich das i=-1Innere des Lambda habe. Aber vielleicht irre ich mich und es ist laut Meta nicht erlaubt? BEARBEITEN: Ähnliches geschieht ziemlich oft in C-Antworten.
Kevin Cruijssen
Ich weiß es nicht. Deshalb habe ich das Wort "scheint" verwendet. Aber das wäre eine abgeleitete Methode, um die primitiven Werte auf ihre Standardwerte zurückzusetzen, was erhebliche Auswirkungen auf viele Golf-Antworten hat. Zum Beispiel: int i;f->{for(;i++<10;)print(i);}ist 1 Byte kürzer als f->{for(int i=0;i++<10;)print(i);}.
Olivier Grégoire
@ OlivierGrégoire Deswegen habe ich angegeben, dass sich das i=-1in der Lambda-Funktion befindet. Ihr Beispiel funktioniert nicht, wenn Sie dasselbe Lambda zweimal ausführen, meins, was hier der Hauptunterschied ist. int i;f->{for(i=0;i++<10;)print(i);}wäre zum Beispiel erlaubt (wenn auch nicht wirklich kürzer).
Kevin Cruijssen
5

Japt v2.0a0 -R, 213 211 210 209 206 193 191 190 Bytes

Beinhaltet ein Leerzeichen in jeder Zeile.

uf \ w
£ `...` ò4 gXn36) nLõd) ¤r0S r1 @ gT ° ò5n) ù6Ãy m¸

Probieren Sie es aus oder testen Sie alle Zeichen (die zusätzlichen Bytes sind darauf zurückzuführen, dass TIO Japt v2 noch nicht unterstützt).


Erläuterung

Nachschlagwerk

Jede Gruppe von 4 Zeichen in der Zeichenfolge ( ...hier dargestellt, um Platz zu sparen und weil sie eine Reihe von nicht druckbaren Zeichen enthält) ist die binäre Darstellung jedes Zeichens ( 0für Leerzeichen, 1für Zeichen), wobei die Zeilenumbrüche entfernt und in die Basis 100 konvertiert werden.

Beispiel

ZZZZZ -> 11111
   Z  -> 00010
  Z   -> 00100 -> 1111100010001000100011111 -> 32575775 -> !::L
 Z    -> 01000
ZZZZZ -> 11111

Der Code

                                                :Implicit input of string U
u                                               :Uppercase
  f                                             :Get the array of characters matching
   \w                                           : /[a-z0-9]/gi
\n                                              :Reassign to U
£                                               :Map each character as X
 `...`                                          :  The string described above
      ò4                                        :  Split into strings of length 4
          Xn36                                  :  Convert X from base-36 to decimal
         g    )                                 :  Get the element in the array at that index
                Lõ                              :  Range [1,100]
                  d                             :  Get characters at those codepoints
               n   )                            :  Convert from that base to decimal
                    ¤                           :  Convert to binary
                     r0S                        :  Replace all 0s with spaces
                         r1                     :  Replace all 1s
                           @                    :  By passing each match through a function
                             T°                 :    Postfix increment T (initially 0)
                            g                   :    Get the character in U at that index (Yay, index wrapping!)
                               Ã                :  End replacement
                                ò5n)            :  Split into strings of length 5, weighted towards the end
                                    ù6          :  Left pad each with spaces to length 6
                                      Ã         :End mapping
                                       y        :Transpose
                                         m      :Map
                                          ¸     :  Join with spaces
                                                :Implicitly join with newlines and output
Zottelig
quelle
4

Ruby , 366 Bytes

->s{s.tr!('^0-9A-Za-z','');b=([s]*s.size).map(&:chars);%w(esuu6vfveeeufuvvfhvvhghheucufvhhhhhv j411agg1hhhhghgggh44igrphhihg4hhhaa2 l4e7vuu2efvughssjv44sgllhumue4hal444 p4g121h4h1hhghgghh44ighjhgii14hara48 evvu2ue8euhufuvgfhvohvhhegdhu4e4hh4v).map{|x|w=t='';s.chars{|c|c=~/\w/&&w+="%5b  "%x[c.to_i 36].to_i(36)};w.size.times{|i|t+=w[i]>?0?b[i/7].rotate![-1]:' '};t}}

Probieren Sie es online!

Dies kann viel Golf gespielt werden, aber jetzt sind mir die Zeit und die Ideen ausgegangen. Es war schwieriger als ich zuerst dachte, nur um es zum Laufen zu bringen.

Wie es funktioniert:

Es ist nicht so schwer zu verstehen, ich erkläre nur, wie das Alphabet mit einem Beispiel codiert ist. Jede Zeile jedes Zeichens wird in binär und dann in base-36 konvertiert.

 AAA   -> 01110 -> E
A   A  -> 10001 -> H
AAAAA  -> 11111 -> V
A   A  -> 10001 -> H
A   A  -> 10001 -> H

Im ersten Schritt werden alle nicht alphanumerischen Zeichen aus der Eingabezeichenfolge entfernt.

Dann erstelle ich eine Nachschlagetabelle für das endgültige Rendering, weil ich Zeile für Zeile drucken möchte.

Danach erstelle ich in der alphabetischen Zeile das binäre Muster der Buchstaben.

Schließlich ersetze ich 0 durch Leerzeichen und 1 durch Zeichen aus der Nachschlagetabelle.

Fühlen Sie sich frei, weiter Golf zu spielen. Ich weiß, dass dies 20 bis 30 Byte kürzer sein könnte (mit gsub anstelle von tr usw.), aber ich bin jetzt nicht daran interessiert, es sei denn, ich kann die Alphabet-Tabelle drastisch verkleinern.

GB
quelle
4

Kohle , 172 164 Bytes

≔⁺⭆χιαα≔Φ↥S№αιθFθ«E⁵⭆§⪪”)∧%"<⁰ETV´el⟧2[◧À&η²p.±‹§K×GR←∨�X¶⌈hF)ξυ9DUuqε↘Z)s⎚H⊙←<¿.&]~b≧✂⪪XïJ61%ZWm/ειK⮌λ﹪▷(σΠNc←º✳Fb⌕⊘¹ÞEpM&➙δl◨α↑j≕ςL¡ρG⁰/y”⁵⁺κ×⁵⌕αι⎇Iμ§θ⊖L⊞Oυω M⁷±⁵

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

≔⁺⭆χιαα

Stellen Sie die Ziffern dem vordefinierten Großbuchstaben voran.

≔Φ↥S№αιθ

Großschreibung der Eingabe und Herausfiltern aller nicht unterstützten Zeichen.

Fθ«

Schleife über die restlichen Zeichen.

E⁵

Durchlaufen Sie jede Zeile und drucken Sie implizit jedes Ergebnis in einer eigenen Zeile.

⭆§⪪”...”⁵⁺κ×⁵⌕αι

Die komprimierte Zeichenfolge ist die große Ganzzahlkonstante von @ ovs, die in binäre Werte umgewandelt und umgekehrt wird. Es wird dann in 180 Teilzeichenfolgen mit 5 Zeichen aufgeteilt, und die relevante Teilzeichenfolge für das aktuelle Zeichen und die aktuelle Zeile wird dann durchgeschleift.

⎇Iμ§θ⊖L⊞Oυω 

Wenn das Bit gesetzt wurde, wird das nächste Zeichen der gefilterten Eingabe zyklisch gedruckt, andernfalls wird ein Leerzeichen gedruckt.

M⁷±⁵

Positionieren Sie den Cursor so, dass das nächste Zeichen gedruckt werden kann.

Neil
quelle
3

Perl 5 mit -nlaF/[^A-Za-z0-9]+|/247 Bytes

@l{0..9,A..Z}=unpack("b*",q&....!.?.......G...../.......\....c|...C......'..N.>..c.1~B......I1..~.5.8k....^|!...}.......BH.1..."1..."*FE.....&)=~/.{25}/g;eval'$;[$j%5].=($l{+uc}=~/.{5}/g)[$j++%5]=~s/./$&?uc$F[$i++%@F]:$"/ger.$"x2;'x5for@F;say for@

Probieren Sie es online!


Erläuterung

Zuerst wird eine Nachschlagetabelle unter %lVerwendung der packed-Daten erstellt. Diese Daten sind eine 900-Bit-Binärzeichenfolge jedes Zeichens, gepackt als 25-Bit-Binärzeichenfolge (gespeichert als 113 Byte - nur 1 Byte mehr als Kohle!), Ähnlich wie bei einigen anderen Antworten A:

 AAA 
A   A
AAAAA
A   A
A   A

was 0für Raum und 1für Aist:

01110
10001
11111
10001
10001

und ohne die Zeilenumbrüche ist:

0111010001111111000110001

Sobald die Suche initialisiert ist, iterieren wir über jedes gültige Zeichen in @F(das mit Perls -autosplit-Option aufgefüllt wird), das an jedes der 5 Elemente der Liste @;für jede Zeile im Array aus der Suche angehängt wird, und ersetzen alle 1s durch uc$F[$i++%@F]das $ith Zeichen (Modulo, @Fdas die Länge von ist @F) konvertiert in upper case, und alle 0s mit$" denen standardmäßig Leerzeichen verwendet werden. Sobald jeder Index in @;für jedes Zeichen in ausgefüllt ist @F, wird sayjede Zeile mit einer nachfolgenden neuen Zeile gedruckt.

Hinweis : Die Zeichenfolge danach unpackenthält nicht druckbare Elemente, die mit der \xXXNotation maskiert werden . Überprüfung für die Punktzahl von 247 .

Dom Hastings
quelle
3

SOGL V0.12 , 165 164 163 Bytes

⁰CīøDs8↓3‛⁸⁷ω8<t↑\≈⅓dPb¦l═│ƹč<⁷i3ζ°@Ο≠ΖηKπ⁴Φd←⅔Ωī$∞ΧΗf▼xƧqWƨ∑ģpc!ƨ@┐Γ<§5ΛMn«Ιq;⁾№╔1xdψBN≤⁴ζ8□\b╗³╤>↔²Μ±}H}≤╬bφIæ7“2─{rƧ- W}⁰∑M¼nEU{SUZ+;W:?ew;cF+C}X}⁰┌cŗā;{√┼@L*┼

Probieren Sie es hier aus!

Erläuterung:

...“                 big long number of the character data
    2─               convert to a base 2 string
      {r    }        for each number in it
        Ƨ- W           get it's index in "- ": space for 0, dash for 1
             ⁰∑      join up the results
               M¼n   split into groups of 25 - the letters
                  E  save that in variable E

U{                 }⁰ map over the input uppercased
  SUZ+                  push 1234567890 + the alphabet
      ;W                get the current characters index in that string
        :?       }      duplicate, if not 0 (aka if found)
          e               push the variable E
           w              get in it the duplicated number'th item
                            this leavesleaving the array below the item
            ;             get the array ontop
             cF+C         append the character to the array C
                  X     and remove the top item - either the duplicate or the array

┌             push "-"
 c            load the variable C
  ŗ           cycically replace "-" in maps result with the characters of C
   ā          push an empty array - the output
    ;{        for each item in the result of the replacement
      √         squareify it
       ┼        and append that to the output array
        @L*┼    top-to-bottom, left-to-right add 10 spaces to the array
dzaima
quelle
2

JavaScript (Node.js) , 365 347 Byte

Dank @Scoots 1 Byte gespeichert

Gibt ein Array mit 5 Zeichenfolgen zurück. Enthält ein führendes Leerzeichen in jeder Zeile.

37 36 Bytes gehen verloren, wenn alles in Großbuchstaben umgewandelt und abgeglichen wird [A-Z0-9]: - /

a=>(a=a.toUpperCase(s=[...'     ']).match(/[A-Z\d]/g)).map(x=c=>(g=n=>n<35&&g(n+1,s[n<25?n/5|0:n%5]+=Buffer("mJ*Z?<^#?.&+o@V+`L7ho=Jkm?`:Tm)Km?ZZo@p*#MmjoCZ[=('ZoC#;?-g[RZW[>.cJ#Mmm?<^;Vp5[#p*]?,iM#KAm$$:Mm?0*R[#;-46B#qC;o==*X$(km?0-XDc=$.Mm#%]=X$*-?1M[".slice(parseInt(c,36)*(i=v=4))).map(c=>v+=c%80*80**--i)|v>>n&n<25?a[++x]||a[x=0]:' '))(0))&&s

Probieren Sie es online!

Zeichenkodierung

Zeichen werden verkehrt herum codiert und unter Verwendung des ASCII-Bereichs [35..114] in eine benutzerdefinierte Basis 80 mit einem Versatz von 4 konvertiert .

Die Werte 35 bis 79 werden direkt dem entsprechenden ASCII-Zeichen zugeordnet, während die Werte 0 bis 34 den Zeichen 80 bis 114 zugeordnet werden . Dies ermöglicht die Dekodierung mit dem ASCII-Code modulo 80 .

Zum Beispiel wird 'F' wie folgt codiert "RZW[":

....#     00001
....#     00001
..### --> 00111 --> 0000100001001110000111111 --[decimal]--> 1088575 --[-4]--> 1088571
....#     00001
#####     11111

floor(1088571 / 80**3)        = 2    --> (( 2 + 45) mod 80) + 35 = 82  --> 'R'
floor(1088571 / 80**2) mod 80 = 10   --> ((10 + 45) mod 80) + 35 = 90  --> 'Z'
floor(1088571 / 80)    mod 80 = 7    --> (( 7 + 45) mod 80) + 35 = 87  --> 'W'
1088571                mod 80 = 11   --> ((11 + 45) mod 80) + 35 = 91  --> '['

Ausgehend von i = v = 4 wird es wie folgt in eine 25-Bit-Ganzzahl zurückdecodiert:

Buffer("RZW[").map(c => v += c % 80 * 80 ** --i)

Im vollständigen Code verarbeiten wir tatsächlich ein unbeschränktes Stück () des codierten Streams, was bedeutet, dass wir wahrscheinlich mehr als vier Mal wiederholt werden . Dies ist kein Problem, da alle Iterationen mit i <0 nur den Dezimalteil des Ergebnisses betreffen, der von den unmittelbar folgenden bitweisen Operationen ohnehin ignoriert wird.

Probieren Sie es online!

Arnauld
quelle
Können Sie toUpperCasemit der iFlagge in der RegEx ersetzen ?
Shaggy
@Shaggy Das würde die Kleinbuchstaben in der Ausgabe unverändert lassen, was meiner Meinung nach nicht erlaubt ist.
Arnauld
Ah, es sieht so aus, als hättest du recht, das habe ich verpasst. Am besten meine eigene Lösung updaten!
Shaggy
1
Könnten Sie ein Byte speichern, indem Sie [A-Z\d]stattdessen übereinstimmen [A-Z0-9]?
Scoots
1

C (gcc) , 792 690 Bytes

#define S strlen
#define V v[1][i]
#define A putchar(32);
#define F(x)(((G(x,0)*92+G(x,1))*92+G(x,2))*92+G(x,3))*92+G(x,4))
#define G(x,y)(f[(x-(x<58?48:55))*5+y]-35)
i,j,l;main(c,v)char**v;{l=S(v[c=1]);char*x[l],t[l+1],*p=t,*f="$dKqK&>%Q3&R`ms&RYXg#gAB/&b_R/$n>Pw&]?vO$cbu+$ccG#$csC+&X7sS$n0w[&X+={&b^%s&b^$W$n3qS%(4\\_&^Bjg&^Bj/%(Pec$xx%S%+L`/%*jjw$cel7&X7oS$NWLO&X7u3$n.U+&^BhG%(')k%'|*/%(+:'%%UO;%%U=K&]`{+";*x=t;for(;i<l;i++){V>96?V-=32:V;(V>47)&(V<58)|(V>64)&(V<91)?*(p++)=V:V;}*p=0;for(;c<S(t);)x[c++]=((__builtin_popcount(F(t[c-1])+x[c-1]-t)%S(t))+t;for(c=6;--c;){for(i=0;i<S(t);i++){for(j=5,l=1<<c*5+3;j--;)if((l>>=1)&F(t[i]){putchar(*x[i]++);!*x[i]?x[i]=t:x;}else A A A}puts(p);}}

Probieren Sie es online!

Schaffte es, diese unter 800 mit einer variablen Wiederverwendung zu drücken. Sie haben sich dafür entschieden, die Schriftart als Array von ints zu speichern , da das Speichern als eine lange Zeichenfolge eine attraktive Idee war. Viele der 8-Bit-Blöcke der Schriftart waren also keine nützlichen ASCII-Zeichen, die die Escape-Codes in Anspruch nahmen mehr Zeichen als das intArray.

Bearbeiten: Wurde unter 700, nachdem ich schließlich zu einer Zeichenfolgencodierung gewechselt hatte - etwas inspiriert von vielen der anderen Antworten hier. Ich habe eine Base-92-Darstellung unter Verwendung (der meisten) der druckbaren ASCII-Zeichen zusammengeschustert. Die Darstellung enthält Backslashes, bei denen ein zusätzlicher Escape-Punkt erforderlich ist, der jedoch nur einmal in der Schriftart vorkommt.

Abgesehen davon ist nicht viel zu auffällig - die Eingabe (bestehend aus dem ersten Befehlszeilenargument) wird in ein Stack-Array kopiert, abzüglich aller Zeichen, die nicht in der Schriftart enthalten sind, und wobei Kleinbuchstaben durch deren ersetzt werden In Großbuchstaben wird das "Pixel" -Zeichen berechnet, mit dem jeder vollständige Buchstabe beginnt (die Verwendung __builtin_popcounthat einen schmerzhaft langen Namen, war aber immer noch besser als jede andere Methode, mit Bits zu rechnen, die ich mir vorstellen konnte), und dann wird zeilenweise gedruckt. Der Compiler gibt in Warnungen natürlich ein Mehrfaches der Programmlänge aus.

Unten etwas entgolfet für Ihr Sehvergnügen:

//The defines are listed here for reference. Some are replaced in the below code but I still use F() because it's long.
#define S strlen
#define V v[1][i]
#define A putchar(32);
#define F(x)(((G(x,0)*92+G(x,1))*92+G(x,2))*92+G(x,3))*92+G(x,4))  //How to lookup a font character given an input char x
#define G(x,y)(f[(x-(x<58?48:55))*5+y]-35)                         //Used for looking up the individual parts of a character font
i, j, l;                                           // Declaring some int variables for later use.
main(c,v) char**v; {                               // Declaring afterwards lets us have the int arg default without declaring it
  l = strlen(v[c=1]);                              // Using l as a local variable to shorten S(v[1]) and also giving c an initial value here where there was a spare 1, saving a character over writing the full c=1 init in a later for loop.
  char t[l+1], *p=t, *x[l];                        // Declaring char arrays and char*s and char* arrays. t is oversized if there are any invalid characters in the input, but that's not important for golfing.
  char *f="$dKqK&>%Q3&R`ms&RYXg#gAB/&b_R/$n>Pw&]?vO$cbu+$ccG#$csC+&X7sS$n0w[&X+={&b^%s&b^$W$n3qS%(4\\_&^Bjg&^Bj/%(Pec$xx%S%+L`/%*jjw$cel7&X7oS$NWLO&X7u3$n.U+&^BhG%(')k%'|*/%(+:'%%UO;%%U=K&]`{+";      // The font, encoded base-92 with 5 characters to a letter in the order 0123456789ABCDEF... etc.
  *x=t;                                            // The first character's "pixels" will start at the beginning of the valid input.
  for(; i<strlen(l); i++){                         // Speaking of which, now validate the input.
    v[1][i] > 96 ? v[1][i] -= 32 : v[1][i];        // Change lowercase characters to uppercase. If they aren't actually lowercase characters but have ascii value >96, they won't end up valid after this either and will be edited out on the next line. The false case does nothing, but since with the macro it is one character using the ternary operator saves a character over an if statement even though that case ends up redundant.
    (v[1][i]>47)&(v[1][i]<58)|(v[1][i]>64)&(v[1][i]<91)?*(p++)=v[1][i]:v[1][i];        // If the character is now either a numeral or an uppercase letter, set the next spot in the t array by way of the pointer p and then increment said pointer. 
  }
  *p=0;                                            // Add the null terminator to the t array, our validated input string.
  for(;c<strlen(t);) {                             // Now find out at what index each letter should start getting "pixels" from.
    x[c++] = ((__builtin_popcount(F(t[c-1])+x[c-1]-t)%strlen(t))+t;          // Use the builtin to get the number of on bits/pixels in the previous letter, then add that to the previous letter's starting pixel and take the modulus strlen() of the valid string.
  }
  for(c=6; --c;){                                  // Now start the actual printing. For each line...
    for(i=0; i<strlen(t); i++){                    // For each letter...
      for(j=5, l=1<<c*5+3; j--;) {                 // For each pixel of the 5 on this line...
        if((l>>=1) & F(t[i]) {                     // If it is on...
          putchar(*x[i]++);                        // Print it and increment the pixel-fetching pointer for this letter.
          !*x[i]?x[i]=t:x;                         // If said pointer hit the end of the valid input go back to the beginning.
        } else {
          putchar(32);                             // If it is an off pixel, print a space.
        }
      }
      putchar(32);                                 // After a letter, print two spaces.
      putchar(32);
    }
    puts(p);                                       // This is the cheapest way in character count I could come up with to output a newline. p currently points to the end of t, so it is an empty string and puts just adds a newline.
  }
}
SevenStarConstellation
quelle
652 Bytes
Ceilingcat
1

Excel VBA, 816 Bytes

Eine anonyme VBE-Direktfensterfunktion, die Eingaben aus dem Bereich entgegennimmt [A1] und Ausgaben an die Konsole weiterleitet.

Soweit mir bekannt ist, ist dies die erste VBA-Antwort, die die base64Komprimierung verwendet.

For i=1To[Len(A1)]:c=Mid(UCase([A1]),i,1):y=y &IIf(c Like"[0-9A-Z]",c,""):Next:l=Len(y):Set d=New MSXML2.DOMDocument:Set d=d.createElement("b64"):d.DataType="bin.base64":d.Text="HxHxCSEqRkVUjLvGSJSK0cUYIyGEfB8cfFH66Ju0kkHoo3cxRhdnzTHGuuOHEMIouYyYEPI/IeTH+GN8ccIHIYf/Qw6/jzH6ByF8PvroY/zR+fCic9FFh4gI30UPnw8efiG+Mj6c4D90wX9CCHe5Tgc=":b=d.nodeTypedValue:For i=0To 112:k=Right("00000" &Evaluate("=Dec2Bin("&b(i)&")"),8)&k:Next:For i=1To 5:For j=1To l:c=UCase(Mid(y,j,1)):Z=c Like"[0-9]":s=s &IIf(c Like"[A-Z]",Mid(k,IIf(Z,1,25*(Asc(c)-55)+5*i),5)&" ",IIf(Z,Mid(k,25*(Asc(c)-48)+5*i,5)&" ","")):Next:s=Replace(Replace(s,0," "),1,"#") &vbLf:Next:Do:i=InStr(1+(g*l+h)*6+g,s,"#"):p=(p-e)Mod l:e=i<(g*l+h+1)*6+g:s=IIf(e,Left(s,i-1)&Replace(s,"#",Mid(y,p+1,1),i,1),s):g=g-(0=e):h=h-(g>4):g=g Mod 5:Loop While InStr(1,s,"#"):?s

Hinweis: Diese Antwort ist abhängig von der Microsoft XML, v3.0 VBA-Referenz ab

Beispiel I / O

[A1]="'0123456789"
For i=1To[Len(A1)]:c=Mid(UCase([A1]),i,1):y=y &IIf(c Like"[0-9A-Z]",c,""):Next:l=Len(y):Set d=New MSXML2.DOMDocument:Set d=d.createElement("b64"):d.DataType="bin.base64":d.Text="HxHxCSEqRkVUjLvGSJSK0cUYIyGEfB8cfFH66Ju0kkHoo3cxRhdnzTHGuuOHEMIouYyYEPI/IeTH+GN8ccIHIYf/Qw6/jzH6ByF8PvroY/zR+fCic9FFh4gI30UPnw8efiG+Mj6c4D90wX9CCHe5Tgc=":b=d.nodeTypedValue:For i=0To 112:k=Right("00000" &Evaluate("=Dec2Bin("&b(i)&")"),8)&k:Next:For i=1To 5:For j=1To l:c=UCase(Mid(y,j,1)):Z=c Like"[0-9]":s=s &IIf(c Like"[A-Z]",Mid(k,IIf(Z,1,25*(Asc(c)-55)+5*i),5)&" ",IIf(Z,Mid(k,25*(Asc(c)-48)+5*i,5)&" ","")):Next:s=Replace(Replace(s,0," "),1,"#") &vbLf:Next:Do:i=InStr(1+(g*l+h)*6+g,s,"#"):p=(p-e)Mod l:e=i<(g*l+h+1)*6+g:s=IIf(e,Left(s,i-1)&Replace(s,"#",Mid(y,p+1,1),i,1),s):g=g-(0=e):h=h-(g>4):g=g Mod 5:Loop While i<InStrRev(s,"#"):?s
 012  567   6789  0123    34  45678  9012 34567  234   567  
3  45   8       0     4  5 6  9     3         8 5   6 8   9 
6 7 8   9    123    567 78901 0123  4567     9   789   0123 
90  1   0   4         8    2      4 8   9   0   0   1     4 
 234  12345 56789 9012     3  5678   012   1     234  5678

Ungolfed und erklärt

Der größte Teil dieser Lösung speichert die große Schrift als 64er Basiszeichenfolge. Dies geschieht, indem zuerst die Schrift in eine Binärschrift umgewandelt wird, wobei 1ein Ein-Pixel und 0ein Aus-Pixel dargestellt werden. Beispielsweise 0wird dies als dargestellt

      ###     01110
     #  ##    10011
0 -> # # # -> 10101 --> 0111010011101011100101110
     ##  #    11001
      ###     01110

Mit diesem Ansatz kann die alphanumerische Zeichenfolge dann als dargestellt werden

0: 0111010011101011100101110    1: 1110000100001000010011111
2: 1111000001011101000011111    3: 1111000001001110000111110
4: 0011001010111110001000010    5: 1111110000111100000111110
6: 0111110000111101000101110    7: 1111100001000100010001000
8: 0111010001011101000101110    9: 0111010001011110000111110
A: 0111010001111111000110001    B: 1111010001111101000111110
C: 0111110000100001000001111    D: 1111010001100011000111110
E: 1111110000111001000011111    F: 1111110000111001000010000
G: 0111110000100111000101111    H: 1000110001111111000110001
I: 1111100100001000010011111    J: 1111100100001000010011000
K: 1000110010111001001010001    L: 1000010000100001000011111
M: 1000111011101011000110001    N: 1000111001101011001110001
O: 0111010001100011000101110    P: 1111010001111101000010000
Q: 0110010010101101001001101    R: 1111010001111101001010001
S: 0111110000011100000111110    T: 1111100100001000010000100
U: 1000110001100011000101110    V: 1000110001010100101000100
W: 1000110001101011101110001    X: 1000101010001000101010001
Y: 1000101010001000010000100    Z: 1111100010001000100011111

Diese Segmente wurden verkettet und in MSXML Base 64 (Rendering) konvertiert

HxHxCSEqRkVUjLvGSJSK0cUYIyGEfB8cfFH66Ju0kkHoo3cxRhdnzTHGuuOHEMIouYyYEPI/IeTH+GN8ccIHIYf/Qw6/jzH6ByF8PvroY/zR+fCic9FFh4gI30UPnw8efiG+Mj6c4D90wX9CCHe5Tgc=

Die folgende Unterroutine nimmt dies, konvertiert zurück in binär und verwendet diese Referenz, um eine Ausgabezeichenfolge Zeile für Zeile zu erstellen, wobei zuerst die oberen 5 Pixel jedes Zeichens, dann die zweite Zeile usw. abgerufen werden, bis die Zeichenfolge erstellt ist .

Das Unterprogramm durchläuft dann die Ausgabezeichenfolge und ersetzt die Ein-Pixel durch Zeichen aus der Eingabezeichenfolge.

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''
''  Embiggen Function
''
''  @Title  :   Embiggen
''  @Author :   Taylor Scott
''  @Date   :   15 June 2018
''  @Desc   :   Function that takes input, value, and outputs a string in which
''              value has been filtered to alphnumerics only, each char is then
''              scaled up to a 5x5 ASCII art, and each 'pixel' is replaced with
''              a char from value. Replacement occurs letter by letter, line by
''              line
''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function EMBIGGEN(ByVal value As String) As String

    Dim DOM         As New MSXML2.DOMDocument, _
        bytes()     As Byte

    Dim isNum       As Boolean, _
        found       As Boolean, _
        index       As Integer, _
        length      As Integer, _
        line        As Integer, _
        letter      As Integer, _
        pos         As Integer, _
        alphanum    As String, _
        char        As String, _
        filValue    As String, _
        outValue    As String

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''
    ''  Filter input
    ''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    For letter = 1 To Len(value) Step 1             ''  Iterate Accross `Value`
        Let char = Mid$(UCase(value), letter, 1)    ''  Take the nth char
        ''  If the char is alphnumeric, append it to a filtered input string
        Let filValue = filValue & IIf(char Like "[0-9A-Z]", char, "")
    Next letter
    Let length = Len(filValue)                      ''  store length of filValue

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''
    ''  Convert Constant from Base 64 to Byte Array
    ''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    With DOM.createElement("b64")           ''  Construct b64 DOM object
        Let .DataType = "bin.base64"        ''  define type of object`
        ''  Input constructed constant string shown above
        Let .Text = "HxHxCSEqRkVUjLvGSJSK0cUYIyGEfB8cfFH66Ju0kkHoo3cxRhdnz" & _
                     "THGuuOHEMIouYyYEPI/IeTH+GN8ccIHIYf/Qw6/jzH6ByF8PvroY/" & _
                     "zR+fCic9FFh4gI30UPnw8efiG+Mj6c4D90wX9CCHe5Tgc="
        Let bytes = .nodeTypedValue         ''  Pass resulting bytes to array
    End With

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''
    ''  Convert Byte Array to Byte String
    ''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    For index = 0 To 112 Step 1
        '' convert each byte to binary, fill left with `0`s and prepend
        Let alphanum = _
            Right("00000" & Evaluate("=Dec2Bin(" & bytes(index) & ")"), 8) & _
            alphanum
    Next index

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''
    ''  Construct Embiggened Binary String of Input Value
    ''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    For line = 1 To 5 Step 1                ''  iterate across lines
        For letter = 1 To length Step 1     ''  iterate across letters
            ''  take the corresponding letter from
            Let char = UCase(Mid(filValue, letter, 1))
            If char Like "[0-9]" Then       '' if it is a number,
                ''  Add the 5 bit corresponding to number at line
                Let outValue = outValue & _
                    Mid$(alphanum, 25 * Val(char) + 5 * line, 5) & " "
            ElseIf char Like "[A-Z]" Then   '' if it is a letter,
                ''  Add the 5 bits corresponding to letter at line
                Let outValue = outValue & _
                    Mid$(alphanum, 25 * (Asc(char) - 55) + 5 * line, 5) & " "
            End If
            Next letter
        Let outValue = outValue & IIf(line < 5, vbLf, "")
    Next line
    Let outValue = Replace(Replace(outValue, 0, " "), 1, "#")

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''
    ''  Replace #s with Input Value
    ''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Let pos = 0                             ''  Reset position in filValue
    Let line = 0                            ''  Reset line index
    Let letter = 0                          ''  Reset letter index
    Do
        ''  Find the index of the first `#` starting at line and letter
        Let index = _
            InStr(1 + (line * length + letter) * 6 + line, outValue, "#")
        ''  Iterate position in filValue if a `#` is found in that letter & line
        Let pos = (pos - found) Mod length
        ''  check to see if found index is in the correct letter
        Let found = index < (line * length + letter + 1) * 6 + line
        ''  iff so, replace that # with letter in filValue corresponding to pos
        Let outValue = IIf(found, _
            Left(outValue, index - 1) & _
                Replace(outValue, "#", Mid(filValue, pos + 1, 1), index, 1), _
            outValue)
        ''  if not found, them iterate line
        Let line = line - (found = False)
        ''  iterate letter every five iterations of line
        Let letter = letter - (line > 4)
        ''  Ensure that line between 0 and 4 (inc)
        Let line = line Mod 5
    ''  Loop while there are '#'s in outValue
    Loop While InStr(1, outValue, "#")

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''
    ''  Output
    ''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Let EMBIGGEN = outValue

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''
    ''  Clean Up
    ''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Set DOM = Nothoing
End Function
Taylor Scott
quelle
1

K (ngn / k) , 230 231 Bytes

(+1 Byte nach einem Sprachwechsel impl)

f:{{x,'"  ",/:y}/(#s;5;5)#@[(#c)#"";i;:;(#i:&c:,/(36 25#4_,/+2\a)s)#`c$b s:((b:(48+!10),65+!26)?x-32*(96<x)&x<123)^0N]}

Probieren Sie es online!

Dabei ahandelt es sich um ein Zeichenfolgenliteral in Anführungszeichen, das die Schriftart codiert. K sieht Strings als Sequenzen von Bytes, daher ist ein Programm, das ein solches Literal enthält, gültig, kann aber nicht auf TIO ausgeführt werden, da sein HTML-Formular versucht, es als UTF-8 zu interpretieren und es durcheinander zu bringen.

Die Byteanzahl wird wie folgt berechnet:

  • 119 berichtet von TIO

  • -2 zum Benennen der Funktion f:

  • -1 für den Platzhalter a

  • 2 für ein paar Anführungszeichen ""

  • 113 für die Länge des Zeichenfolgenliteral, adas keine Zeichen enthält, die ein Escapezeichen erfordern

ngn
quelle