Embiggen votre entrée

19

C'est un peu similaire à cette entrée couverte de poussière, mais j'espère que ma rotation le rendra assez unique. Pas pu trouver quoi que ce soit qui me dissuade de poster ceci mais il y a tout à fait la mer là-bas.

En tous cas! Le défi:

Votre code reçoit une chaîne de caractères; Il le convertit en une version de style ASCII de la même chaîne, mais avec un hic.

Transformation d'entrée

  • Les seuls caractères à prendre en charge sont AZ et 0-9
  • Les lettres minuscules sont transformées en majuscules
  • Tout le reste est supprimé en silence

Dessin de personnages

  • Chaque "pixel" de la police agrandie est tiré de la chaîne d'entrée
  • Le nième pixel est égal au nième caractère de la chaîne d'entrée. Si n est supérieur à la longueur de la chaîne d'entrée, retournez au début
  • Les lettres individuelles sont dessinées de gauche à droite, de haut en bas
  • Les lettres suivantes récupèrent leur index de "caractère pixel" d'où la dernière lettre s'est arrêtée (par exemple avec une longueur d'entrée de 10, si la première lettre avait 9 pixels, le premier pixel de la deuxième lettre sera tracé avec le 10ème caractère d'entrée, le second pixel sera dessiné avec le 1er caractère saisi)
  • Chaque lettre est dessinée dans une grille 5x5, entièrement rembourrée avec des espaces. Vous pouvez trouver la police que vous devez utiliser pré-rendue pour vous dans cette boîte à pâte ou un peu plus bas dans ce post
  • Chaque lettre est dessinée sur la même ligne, donc le nombre total de sauts de ligne dans votre sortie sera de 4
  • Chaque lettre est séparée par 2 colonnes d'espaces

La police

 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

Oui je sais que les 4 et Q sont moches

Un exemple

Contribution

0123456789

Production

 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 

Un autre exemple

Contribution

a3 B'2

Production

 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

Les failles standard sont interdites. Code golf donc aucune coche verte ne sera donnée.

Scoots
la source
17
Je suggère de garantir que l'entrée ne contiendra que [A-Z\d]- je ne pense pas que le filtrage des caractères invalides ajoute quoi que ce soit au défi.
Shaggy
3
@Shaggy Peut-être. Mais du même coup, je ne pense pas que cela enlève quoi que ce soit du défi
Scoots
1
en relation
Laikoni
1
En relation.
Dom Hastings
2
Qu'en est-il des TROIS principaux espaces? Vous ne permettrez sûrement pas cela!
Magic Octopus Urn

Réponses:

16

Python 2 , 413 411 373 364 352 345 octets

-1 octet merci à Kevin Cruijssen .
-9 octets grâce à Jo King .
-1 octet grâce à Lynn .

La chaîne de données contient la version d'échappement non imprimable ci-dessous.

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()

Essayez-le en ligne!

Comme chaque caractère a 25 pixels, il peut être facilement encodé en 25 bits. Le nombre de base 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'code tous les caractères, le 0est codé par les 25 bits les moins significatifs, le 1par les 25 bits suivants et le Zest codé par les 25 bits les plus significatifs. Un seul caractère est codé dans l'ordre suivant:

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

( 00est le bit le moins significatif, 25le plus significatif)

Les espaces sont codés par un zéro, les non-espaces par un. Exemple :

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

Non golfé

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

Essayez-le en ligne!

ovs
la source
Les lettres doivent être séparées par deux espaces, ce qui +' 'devrait être le cas +' '. Bonne réponse malgré tout, alors +1 de ma part.
Kevin Cruijssen
vous avez besoin du .upper()quelque part cependant, sinon les lettres intérieures finissent en minuscules
Jo King
@JoKing Vous avez raison, corrigez-le.
ovs
J'adore ce truc d'encodage. Avez-vous choisi la base 92 parce que c'est le plus grand encodage standard composé d'ascii imprimables? auriez-vous pu aller plus haut? aussi j'ai googlé mais je n'ai pas pu affiner les informations sur la base 92 - avez-vous un lien?
Jonah
@Jonah Il n'y a pas de standard comme le codage de base 92, c'est pourquoi j'ai implémenté ma propre logique de décodage. Tant que vous avez suffisamment de chiffres distincts, vous pouvez utiliser n'importe quelle base >1.
ovs
10

APL (Dyalog Unicode) , 228 225 224 214 octets

Programme complet. Demande stdin pour la chaîne. Imprime à la sortie standard. Environ la moitié du code décode simplement l'alphabet codé.

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

__Représente la chaîne codée LZ4 de 143 octets entre guillemets:"⊥\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ááЀ€€€€€€"

Essayez-le en ligne!

__ Chaîne codée LZ4 de 143 octets entre guillemets

⎕AV⍳ɩ ndices de celle de la A tomic V ecteur (le jeu de caractères)

¯125+ ajoutez -125 à cela (pour obtenir des entiers 8 bits signés)

¯1(219⌶) Décompression LZ4

0(220⌶) désérialiser en un tableau booléen de 36 couches, 5 lignes et 5 colonnes

()⌷ Indexez-le en utilisant les indices suivants:

⎕A majuscule A lphabet

⎕D, préfixer les D igits

a← stocker a(pour un alphabet)

()∩ Intersection des éléments suivants et qui (supprime une entrée non valide):

 invite pour la saisie de texte depuis stdin (console)

  1(819⌶) plier en majuscules ( 819ressemble Big, 1 est pour oui grand par opposition à petit)

i← stocker dans i(pour i nput)

a⍳ɩ ndices de cela dansa

 entourer (pour indexer avec chacun représentant la coordonnée principale)

t← stocker dans t(pour t ext)

, défiler (aplatir)

r← stocker dans r(pour r avelled)

+/ somme cela (c.-à-d. nombre de caractères nécessaires pour peindre l'œuvre d'art)

i⍴⍨cyclique r Eshape l'entrée à cette longueur

r\ développer cela; insérer un espace à 0s, consommer des lettres à 1s

(…) ⍴` remodeler à la forme suivante:

⍴t la forme du texte

 diviser le réseau N-by-5-by5 en une matrice N-by-5 ​​de lignes artistiques

transposer en une matrice 5 par N de lignes artistiques (cela aligne les lignes correspondantes des personnages)

Par défaut, APL sépare les éléments simples d'un tableau imbriqué avec 2 espaces.

Adam
la source
Pas assez! Il doit y avoir 2 espaces entre chaque lettre
Scoots
1
@Scoots OK, corrigé.
Adám
@ Adám quelque chose ne va pas avec C et D
ngn
9

Python 2 , 428 octets

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)

Essayez-le en ligne!


Les lettres sont codées comme suit:

Chaque partie unique (il y en a 23) est convertie en binaire et un 1 est ajouté devant. Il est ensuite converti en base 36.

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

Les nombres de base 36 résultants sont:

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

L'initiale 1est supprimée, nous avons donc un seul caractère:

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

Chaque lettre ( A-Z0-9) est ensuite encodée en cinq de ces nouveaux caractères.

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

En cinq listes:

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

Pour mapper l'entrée à un index dans ces listes, l'ordinal est modifié:

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

Parce que les ordinaux ne sont pas 0-35, mais légèrement mélangés, les 5 listes sont réorganisées et concaténées:

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

Pour chaque caractère dans l'entrée, ses 5 lettres sont trouvées et converties en entiers (base36):

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

Si le nombre est inférieur 30, 36est ajouté (le manquant que 1nous avons supprimé plus tôt)

n+36*(n<30)

Ensuite, le nombre est reconverti en binaire, et 0s et 1s sont convertis en et .. Deux espaces sont ajoutés à la fin lors de la conversion.

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

Par exemple.

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

Pour chacun .dans le résultat, il est remplacé par le caractère suivant de l'entrée (itéré par x)

while'.'in`R`:R=eval(`R`.replace('.',x[0],1));x=x[1:]+s
TFeld
la source
Agréable! Puis-je vous déranger pour une explication de la façon dont cela fonctionne? Pour le moment, c'est de la magie à mes yeux.
Scoots
@Scoots dessus! :)
TFeld
3
Merci d'avoir ajouté ça :) L'intelligence que je vois dans les réponses sur ce site ne manque jamais de m'impressionner
Scoots
Puisque les pièces sont de 5 bits, pourquoi ne pas utiliser la base 32 à la place?
Neil
6

Java 8, 917 907 octets

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]:" ";}

Est-ce que je vais jouer au golf d'ici au moins pour diviser par deux le nombre d'octets actuel, espérons

Essayez-le en ligne.

Explication:

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
la source
Vous ne semblez pas avoir un exemple autonome. Champs de classe, méthodes et lambdas. J'ai +1 pour avoir pris le temps de le faire comme prévu, mais la manière ici semble un peu invalide.
Olivier Grégoire
@ OlivierGrégoire Hmm, je pensais que les champs au niveau de la classe étaient autorisés, tant que vous ne les définissez pas au niveau de la classe (la fonction doit être exécutée plusieurs fois sans réinitialiser quoi que ce soit pour être autonome). C'est pourquoi j'ai l' i=-1intérieur du lambda. Mais peut-être que je me trompe et que ce n'est pas autorisé selon la méta? EDIT: Quelque chose de similaire se fait assez souvent dans les réponses C.
Kevin Cruijssen
Je ne sais pas. C'est pourquoi j'ai utilisé le mot "semble". Mais ce serait une façon dérivée d'instancier des valeurs primitives à leur valeur par défaut, ce qui aurait un impact significatif pour beaucoup de réponses au golf. Par exemple: int i;f->{for(;i++<10;)print(i);}est 1 octet plus court que f->{for(int i=0;i++<10;)print(i);}.
Olivier Grégoire
@ OlivierGrégoire C'est pourquoi j'ai déclaré que l' i=-1intérieur est dans la fonction lambda. Votre exemple ne fonctionne pas si vous exécutez le même lambda deux fois, le mien le fait, ce qui est la principale différence ici. int i;f->{for(i=0;i++<10;)print(i);}serait autorisé par exemple (mais pas vraiment plus court).
Kevin Cruijssen
5

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

Comprend un espace de tête sur chaque ligne.

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

Essayez-le ou testez tous les caractères (les octets supplémentaires sont dus au fait que TIO ne prend pas encore en charge Japt v2)


Explication

Table de recherche

Chaque groupe de 4 caractères dans la chaîne (représenté par ...ici pour économiser de l'espace et parce qu'il contient un tas d'imprimables) est la représentation binaire de chaque caractère ( 0pour les espaces, 1pour les caractères) avec les retours à la ligne supprimés et convertis en base-100.

Exemple

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

Le 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
Hirsute
la source
4

Rubis , 366 octets

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

Essayez-le en ligne!

Cela peut être beaucoup joué au golf, mais maintenant je n'ai plus de temps et d'idées. Cela a été plus difficile que je ne le pensais pour la faire fonctionner.

Comment ça fonctionne:

Ce n'est pas si difficile à comprendre, je vais juste expliquer comment l'alphabet est codé avec un exemple. Chaque ligne de chaque caractère est convertie en binaire puis en base-36.

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

La première étape consiste à supprimer tous les caractères non alphanumériques de la chaîne d'entrée.

Ensuite, je génère une table de recherche pour le rendu final, car je veux imprimer ligne par ligne.

Après cela, en itérant sur la ligne de l'alphabet, je crée le motif binaire des lettres.

Enfin, je remplace 0 par des espaces et 1 par des caractères de la table de recherche.

N'hésitez pas à jouer au golf plus loin, je sais que cela pourrait être de 20 à 30 octets plus court (en utilisant gsub au lieu de tr, etc.), mais je ne suis pas intéressé maintenant, à moins que je puisse rendre la table alphabétique drastiquement plus petite.

GB
la source
4

Charbon de bois , 172 164 octets

≔⁺⭆χιαα≔Φ↥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⁷±⁵

Essayez-le en ligne!Le lien est vers la version détaillée du code. Explication:

≔⁺⭆χιαα

Faites précéder les chiffres de l'alphabet majuscule prédéfini.

≔Φ↥S№αιθ

Mettez en majuscule l'entrée et filtrez tous les caractères non pris en charge.

Fθ«

Faites une boucle sur les caractères restants.

E⁵

Boucle sur chaque ligne, imprimant implicitement chaque résultat sur sa propre ligne.

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

La chaîne compressée est la grande constante entière de @ ovs, convertie en binaire et inversée. Il est ensuite découpé en 180 sous-chaînes de 5 caractères, et la sous-chaîne appropriée pour le caractère et la ligne actuels est ensuite bouclée.

⎇Iμ§θ⊖L⊞Oυω 

Si le bit a été défini, imprimez cycliquement le caractère suivant de l'entrée filtrée, sinon imprimez un espace.

M⁷±⁵

Positionnez le curseur prêt à imprimer le caractère suivant.

Neil
la source
3

Perl 5 avec -nlaF/[^A-Za-z0-9]+|/, 247 octets

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

Essayez-le en ligne!


Explication

Tout d'abord, une table de recherche est créée en %lutilisant les packdonnées ed. Ces données sont une chaîne binaire de 900 bits de chaque caractère compressée sous forme de chaîne binaire de 25 bits (stockée sous forme de 113 octets - seulement 1 octet de plus que le charbon de bois!), Semblable à certaines autres réponses, tout Acomme:

 AAA 
A   A
AAAAA
A   A
A   A

qui, en utilisant 0pour l'espace et 1pour Aest:

01110
10001
11111
10001
10001

et sans les sauts de ligne c'est:

0111010001111111000110001

Une fois la recherche initialisée, nous itérons sur chaque caractère valide dans @F(qui est -arempli à l' aide de l'option utosplit de Perl ) en ajoutant à chacun des 5 éléments de la liste @;pour chaque ligne du tableau de la recherche, en remplaçant tous les 1s par uc$F[$i++%@F]lesquels est le $ith caractère (modulo @Fqui est la longueur de @F) converti en upper case, et tous les 0s avec $"lesquels par défaut l'espace. Une fois que chaque index @;est rempli pour chaque caractère @F, sayimprime chaque ligne avec une nouvelle ligne de fin.

Remarque : la chaîne suivante unpackcontient des caractères non imprimables qui sont échappés à l'aide de la \xXXnotation. Vérification pour un score de 247 .

Dom Hastings
la source
3

SOGL v0.12 , 165 164 163 octets

⁰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*┼

Essayez-le ici!

Explication:

...“                 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
la source
2

JavaScript (Node.js) , 365 347 octets

1 octet enregistré grâce à @Scoots

Renvoie un tableau de 5 chaînes. Comprend un espace de tête sur chaque ligne.

37 36 octets sont perdus lors de la conversion de tout en majuscules et de la correspondance [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

Essayez-le en ligne!

Encodage de caractère

Les caractères sont encodés à l'envers et convertis en une base-80 personnalisée avec un décalage de 4 , en utilisant la plage ASCII [35..114] .

Les valeurs 35 à 79 sont directement mappées au caractère ASCII correspondant, tandis que les valeurs 0 à 34 sont mappées aux caractères 80 à 114 . Cela permet de décoder en prenant simplement le code ASCII modulo 80 .

Par exemple, «F» est codé comme suit "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  --> '['

En commençant par i = v = 4 , il est décodé en un entier de 25 bits en faisant:

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

Dans le code complet, nous traitons en fait une tranche illimitée () du flux codé, ce qui signifie que nous sommes susceptibles d'itérer beaucoup plus de 4 fois. Ce n'est pas un problème car toutes les itérations avec i <0 n'affecteront que la partie décimale du résultat, qui est de toute façon ignorée par les opérations au niveau du bit qui suivent immédiatement.

Essayez-le en ligne!

Arnauld
la source
Pouvez-vous remplacer toUpperCasepar le idrapeau dans le RegEx?
Shaggy
@Shaggy Cela laisserait les caractères minuscules inchangés dans la sortie, ce qui, je pense, n'est pas autorisé.
Arnauld
Ah, on dirait que tu as raison, ça m'avait manqué. Mieux mettre à jour ma propre solution!
Shaggy
1
Pourriez-vous enregistrer un octet en faisant correspondre [A-Z\d]au lieu de [A-Z0-9]?
Scoots
1

C (gcc) , 792 690 octets

#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);}}

Essayez-le en ligne!

A réussi à presser ce chiffre sous 800 avec une réutilisation variable. Vous avez choisi de stocker la police sous la forme d'un tableau de ints, comme si le stockage en une longue chaîne ressemblait à une idée attrayante, de nombreux morceaux de 8 bits de la police n'étaient pas un joli caractère ASCII pratique que les codes d'échappement prenaient plus de caractères que le inttableau.

Edit: obtenu moins de 700 en passant à un codage de chaîne après tout - quelque peu inspiré par de nombreuses autres réponses ici, j'ai bricolé une représentation en base 92 en utilisant (la plupart) des caractères ASCII imprimables. La représentation inclut des barres obliques inverses qui nécessitent un extra pour être échappées mais cela ne se produit qu'une seule fois dans la police.

En dehors de cela, il n'y a pas grand-chose de trop flashy - l'entrée (constituée du premier argument de ligne de commande) est copiée dans un tableau de pile, moins tous les caractères qui ne sont pas dans la police et avec des lettres minuscules remplacées par leur les versions majuscules, quel caractère "pixel" commence chaque lettre complète (en utilisant __builtin_popcounta un nom douloureusement long mais était toujours meilleur que n'importe quelle méthode de comptage sur les bits auxquels je pouvais penser), puis l'impression passe ligne par ligne. Le compilateur génère bien sûr plusieurs fois la longueur du programme dans les avertissements.

Un peu dégouliné ci-dessous pour votre plaisir visuel:

//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
la source
652 octets
plafond
1

Excel VBA, 816 octets

Une fonction de fenêtre immédiate VBE anonyme qui prend les entrées de la plage [A1]et les sorties vers la console.

Pour autant que je sache, c'est la première réponse VBA à utiliser la base64compression.

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

Remarque: Cette réponse dépend de la Microsoft XML, v3.0référence VBA

Exemple d'E / S

[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

Non golfé et expliqué

La majeure partie de cette solution stocke la grande police en tant que chaîne de base 64. Cela se fait en convertissant d'abord la police en binaire, où 1représente un pixel actif et 0représente un pixel désactivé. Par exemple, pour 0, cela est représenté par

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

Avec cette approche, les alphanumériques peuvent alors être représentés comme

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

Ces segments ont été concaténés et convertis en MSXML base 64, rendant

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

Le sous-programme ci-dessous prend cela, convertit en arrière en binaire et utilise ceci une référence à partir de laquelle construire une chaîne de sortie, ligne par ligne, en saisissant d'abord les 5 premiers pixels de chaque caractère, puis la deuxième ligne et ainsi de suite jusqu'à ce que la chaîne soit construite .

Le sous-programme parcourt ensuite la chaîne de sortie et remplace les pixels «activés» par des caractères de la chaîne d'entrée.

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''
''  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
la source
1

K (ngn / k) , 230 231 octets

(+1 octet après un changement de langue 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]}

Essayez-le en ligne!

a est un littéral de chaîne entre guillemets qui code la police. K considère les chaînes comme des séquences d'octets, donc un programme contenant un tel littéral est valide, mais il ne peut pas être exécuté sur TIO, car sa forme HTML essaie de l'interpréter comme UTF-8 et le gâche.

Le nombre d'octets est calculé comme suit:

  • 119 signalés par TIO

  • -2 pour nommer la fonction f:

  • -1 pour l'espace réservé a

  • 2 pour une paire de citations ""

  • 113 pour la longueur du littéral de chaîne aqui ne contient aucun caractère nécessitant un échappement

ngn
la source