Jouez-moi un alphabet ASCII

13

Ne trouvez-vous pas que la lecture d'un texte simple n'est pas assez attrayante? Essayez notre

#####  ###   ###  ##### #####       ##### ##### #   # #####   #
#   # #     #   #   #     #           #   #      # #    #     #
#####  ###  #       #     #           #   ####    #     #     #
#   #     # #   #   #     #           #   #      # #    #      
#   #  ###   ###  ##### #####         #   ##### #   #   #     #

Beaucoup plus chic, non? Mais c'est assez long pour écrire à la main, ce serait merveilleux si quelqu'un faisait un programme qui le faisait pour moi!

Votre tâche , si vous vous portez volontaire pour m'aider, sera d'écrire un programme ou une fonction qui prend une chaîne contenant[a-zA-Z\s\n] uniquement, et de produire (ou de retourner) l'écriture ascii de celle-ci!

Vous devez utiliser l'alphabet suivant pour formater votre sortie:

##### ####   ###  ####  ##### #####  ###  #   # ##### ##### #   # #     #   #
#   # #   # #   # #   # #     #     #     #   #   #     #   #  #  #     ## ##
##### ####  #     #   # ####  ####  #  ## #####   #     #   ###   #     # # #
#   # #   # #   # #   # #     #     #   # #   #   #   # #   # #   #     #   #
#   # ####   ###  ####  ##### #      ###  #   # ##### ###   #  #  ##### #   #

#   #  ###  ####   ###  ####   ###  ##### #   # #   # #   # #   # #   # #####
##  # #   # #   # #   # #   # #       #   #   # #   # #   #  # #   # #     #
# # # #   # ####  #   # ####   ###    #   #   #  # #  # # #   #     #     #
#  ## #   # #     #  ## ##        #   #   #   #  # #  ## ##  # #    #    #
#   #  ###  #      #### # #    ###    #    ###    #   #   # #   #   #   #####

L'espace:

     |
     | it's a 5x5 square of spaces
     | but had to pad it with |s to make it appear in this post
     |
     |

Comme il s'agit d'une police à largeur fixe, le caractère d'espace est également entouré d'espaces, ce qui entraîne un espace de 7 largeurs entre les deux lettres.

a b
     1234567       -- these numbers are just for the example, you don't have to output them
#####       #### 
#   #       #   #
#####       ####
#   #       #   #
#   #       ####

a  b
     1234567890123
#####             #### 
#   #             #   #
#####             ####
#   #             #   #
#   #             ####

Lorsque vous rencontrez une nouvelle ligne, comme dans l'entrée

ascii
text

Assurez-vous simplement de séparer les deux blocs de texte par au moins une ligne vide

#####  ###   ###  ##### ##### 
#   # #     #   #   #     #   
#####  ###  #       #     #    
#   #     # #   #   #     #   
#   #  ###   ###  ##### ##### 

##### ##### #   # #####
  #   #      # #    #  
  #   ####    #     #  
  #   #      # #    #  
  #   ##### #   #   #  

En outre, vous êtes autorisé à remplacer le #s par tout autre caractère tant qu'il se trouve dans la plage ASCII imprimable et qu'il ne s'agit pas d'espaces. Vous pouvez par exemple utiliser As pour la lettre A, Bpour la lettre B et ainsi de suite.

Comme il s'agit de (et de plus ), la soumission gagnante sera celle qui résoudra ce défi dans le moins d'octets possible, amusez-vous!

Katenkyo
la source
L'espace à 5 caractères doit-il également être entouré d'espaces simples ou s'agit-il d'une police à largeur variable?
2016
@ Adám tu as raison, il est censé être entouré d'espaces, je mettrai à jour ce point
Katenkyo
Pouvons-nous en quelque sorte récupérer l'alphabet pixel en entrée ou devons-nous construire ces caractères à l'intérieur de notre extrait de code évalué?
Byte Commander
@ByteCommander Une (grande) partie de ce défi concerne la compression de chaînes, vous devez trouver la meilleure façon de compresser cet alphabet dans votre code, tout en étant capable de le récupérer et de l'utiliser :). Alors oui, il est inclus dans votre code golf et ne peut pas être entré dans votre programme
Katenkyo
@Katenkyo Aha, d'accord. Merci pour la clarification.
Byte Commander

Réponses:

6

Python 3, 375 octets

f=lambda i:"\n\n".join("\n".join(map(" ".join,zip(*[[x.replace("0"," ")[a*5:a*5+5]for a in range(5)]for x in[["{:025b}".format(int(c,36))for c in'0 JPCFL J2UKE 92Y3Y J2KAM JOMCF JOMC0 92B72 AYP81 JFM3J JFMHO AZC7M AB6ZJ B5I5T B43N5 92YWE J2UJ4 92YY7 J2UQC 926UM JFM2S AYE5Q AY8G4 AYHKH AT6Q9 AT6KK AWU7'.split()][x!=" "and ord(x)-64]for x in j.upper()]])))for j in i.split("\n"))

Voir ce code en cours d'exécution sur ideone.com.

Le même code, mais en quelque sorte bien indenté, formaté et commenté:

f = lambda i: \

    # join multiline strings together using an empty line as separator:
    "\n\n".join(

        # join the string lines of one big output line together: 
        "\n".join(

            # join the corresponding rows of the letters together using " ":
            map(" ".join, zip(*

                # make a list (output line) of list (output characters) 
                # of strings (single character's rows):
                [

                    # replace 0s with spaces and split the bit strings into
                    # chunks of 5 characters - the rows of each letter:
                    [x.replace("0", " ")[a*5 : a*5+5] for a in range(5)]

                    for x in [

                        # split the space separated character codes and
                        # convert them from base 36 to 
                        # base 2 strings of length 25:
                        ["{:025b}".format(int(c, 36)) for c in

                         # the encoded font data (reformatted):
                         '0 JPCFL J2UKE 92Y3Y J2KAM JOMCF JOMC0 92B72 '
                         'AYP81 JFM3J JFMHO AZC7M AB6ZJ B5I5T B43N5 92YWE '
                         'J2UJ4 92YY7 J2UQC 926UM JFM2S AYE5Q AY8G4 AYHKH '
                         'AT6Q9 AT6KK AWU7'.split()]

                        # select element 0 if we want a space, else find
                        # out the index from the ASCII code of the letter:
                        [x != " " and ord(x) - 64] 

                        # repeat for every character in the input line:
                        for x in j.upper()
                    ]
                ]
            ))

        # repeat for every line in the input
        ) for j in i.split("\n")
    )

J'ai également décidé d'opter pour le codage en base 36, car c'est le int()support natif intégré le plus élevé de Python . Voici un court script Python 3 que j'ai écrit (non golfé) qui convertit les définitions de police comme dans la question en codes de base 36: Mon convertisseur sur ideone.com

Le résultat se compose du caractère en 1tant que pixel activé et d'un espace en tant que pixel désactivé. Voici un seul exemple d'exécution:

Entrée (saut de ligne comme \n):

Hello World
Python rocks

Production:

1   1 11111 1     1      111        1   1  111  1111  1     1111 
1   1 1     1     1     1   1       1   1 1   1 1   1 1     1   1
11111 1111  1     1     1   1       1 1 1 1   1 1111  1     1   1
1   1 1     1     1     1   1       11 11 1   1 11    1     1   1
1   1 11111 11111 11111  111        1   1  111  1 1   11111 1111 

1111  1   1 11111 1   1  111  1   1       1111   111   111  1   1  111 
1   1  1 1    1   1   1 1   1 11  1       1   1 1   1 1   1 1  1  1    
1111    1     1   11111 1   1 1 1 1       1111  1   1 1     111    111 
1       1     1   1   1 1   1 1  11       11    1   1 1   1 1 1       1
1       1     1   1   1  111  1   1       1 1    111   111  1  1   111 
Byte Commander
la source
4

Clojure, 552 octets

(defn t[s](print(reduce #(str %1"\n"%2)(map #(apply str %)(let[a[:jpcfl :j2uke :92y3y :j2kam :jomcf :jomc0 :92b72 :ayp81 :jfm3j :jfmho :azc7m :ab6zj :b5i5t :b43n5 :92ywe :j2uj4 :92yy7 :j2uqc :926um :jfm2s :aye5q :ay8g4 :ayhkh :at6q9 :at6kk :je7mn :0]](map(fn[o](map #(str(.replace %"0"" ")"\n")(map(fn[w](reduce #(str %1(.substring %2 w(+ w 5))"0")""(map #(str(apply str(repeat(- 25(count %))"0"))%)(map #(Integer/toString(Integer/valueOf(name %)36)2)(map a(map #(if(= % \space)26(-(int %)97))(.toLowerCase o)))))))(range 0 25 5))))(.split s"\n")))))))

Chaque lettre en ascii est représentée comme une chaîne binaire avec # - 1, espace - 0. Ensuite, elle est convertie en base 36 de sorte qu'il ne faut que 5 caractères pour stocker + ":" pour permettre à Clojure de savoir qu'elle doit être traitée comme symbole. Ensuite, l'entrée est divisée par un symbole de nouvelle ligne et pour chaque ligne, nous convertissons une lettre en base 36 en base binaire et obtenons les premiers symboles [0: 5] ajoutez des symboles de nouvelle ligne, obtenez les symboles [5:10] suivants et ainsi de suite.

Vous pouvez le voir fonctionner ici - https://ideone.com/y99ST5

cliffroot
la source
1

SOGL , 137 octets (non concurrent)

 °f`7-π⅛χ%sΤ↕ņLRΕ⅓9׀b∫rr(¶æKGTΧ3;■ΦΤg¼⁰¡Νg‽}○eΧ²Y∫Οαν⌡l′}¾(8╔ <%╤∙i.d↔ū∫Æo┌jyŗ▲δ⁶=╗$↑yōΛ3h¼╔◄┼)‘’«n.{5{ø}¹,uR{8+:Ahwha’#=?X’«@*}┼L@*┼}pøO

Explication:

...‘’«n.{5{ø}¹,uR{8+:Ahwha’#=?X’«@*}┼L@*┼}pøO
...‘                                           push a string with the letter data                            ["..."]
    ’«n                                        split in lengths of 25                                        [[".", ".", ".",...]]
       .{                                      repeat input times                                            [[".", ".", ".",...]]
         5{ø}                                  push 5 empty strings                                          [[".", ".", ".",...], "", "", "", "", ""]
             ¹                                 wrap those in an array                                        [[".", ".", ".",...], ["", "", "", "", ""]]
              ,                                get a string input                                            [[".", ".", ".",...], ["", "", "", "", ""], "Hello World"]
               u                               lowercase it                                                  [[".", ".", ".",...], ["", "", "", "", ""], "hello world"]
                R{                       }     itirate over the ordinals of the string                       [[".", ".", ".",...], ["", "", "", "", ""], 104]
                  8+                           add 8 to the ordinal                                          [[".", ".", ".",...], ["", "", "", "", ""], 112]
                    :A                         save on variable A                                            [[".", ".", ".",...], ["", "", "", "", ""], 112]
                      h                        swap 2 items one below the stack                              [["", "", "", "", ""], [".", ".", ".",...], 112]
                       w                       get the ord+8th item of the letter data array (modulo length) [["", "", "", "", ""], [".", ".", ".",...], "-----  -    -    -  -----"]
                        h                      swap 2 items one below the stack                              [[".", ".", ".",...], ["", "", "", "", ""], "-----  -    -    -  -----"]
                         a                     load the variable A                                           [[".", ".", ".",...], ["", "", "", "", ""], "-----  -    -    -  -----", 112]
                          ’#=?     }           if equals to 40 then                                          [[".", ".", ".",...], ["", "", "", "", ""], "----- -     -     - -----"] (temporalily switching to space case; it incorrectly picks "N" for space) 
                              X                delete the string                                             [[".", ".", ".",...], ["", "", "", "", ""]]
                               ’«@*            push a string with 25 spaces                                  [[".", ".", ".",...], ["", "", "", "", ""], "                         "]
                                    ┼          add the string vertically-then-horizontally to the array      [[".", ".", ".",...], ["", "", "", "", ""], ["-   -", "-   -", "-----", "-   -", "-   -"]] (back to "H")
                                     L@*       push a string with 10 spaces                                  [[".", ".", ".",...], ["", "", "", "", ""], ["-   -", "-   -", "-----", "-   -", "-   -"], "          "]
                                        ┼      add the string vertically-then-horizontally to the array      [[".", ".", ".",...], ["", "", "", "", ""], ["-   -  ", "-   -  ", "-----  ", "-   -  ", "-   -  "]]
                                          p    output the resulted line                                      [[".", ".", ".",...], ["", "", "", "", ""]]
                                           øO  append to output an empty line                                

Remarque: actuellement, cette langue ne peut pas vraiment accepter la chaîne d'entrée multiligne, je lui ai donc demandé un nombre et lu les lignes x suivantes comme entrée.

La première chaîne est

"------ -  - -  - -  ----------- - -- - -- - - - -  --- -   --   --   - - - ------   --   --   - --- ------ - -- - -- - --   ------- -  - -  - -  -     --- -   --   -- - -  -- -----  -    -    -  ------   --   -------   --   --  ---   -------    -    -----  -    --  -  --    -----    -    -    -    ------ -     -   -   ---------- -     -     - ----- --- -   --   --   - --- ------ -  - -  - -   -    --- -   --   --  -- ---------- -- - - -- -   -    -   - - -- - -- - -   - -    -    ------    -    ----     -    -    ----- --     --     -  -- --   -----   -   -     - ------   - - -   -   - - -   --     -     --- -   -    -   --  --- - ---  --   -"

compressé à l'aide d'un dictionnaire personnalisé qui utilise "" et "-" (la compression a un mode spécial avec "\ n - | / _" disponible donc encore plus de compression!)
Il contient 25 caractères par caractère ascii dans l'ordre de l'alphabet. ils sont commandés de haut en bas puis de droite.
les caractères vont comme

16b
27c
38d . . .
49e
5af

et c'est de la même manière que ajoute à un tableau.

dzaima
la source
Je vais définitivement vérifier comment cela se passe! Au lieu d'exiger une autre entrée, la chose la plus proche que vous pourriez faire des règles d'origine serait d'exiger une entrée dans le formulaire foo\nbarpour les entrées multilignes
Katenkyo
1

Powershell, 261 253 octets

$args-split'
'|%{$s=$_
0..5|%{$l=$_
-join($s|% *per|% t*y|%{$c='_ONO__NQ__QAQQNONON_QQQQQ?QQQQAAAQDDIA[SQQQQADQQQJJ(_OAQOOY_DDGAUUQOQONDQJUDD$QQQQAAQQDEEAQYQAYCPDQJ[JD"QONO_ANQ_GI_QQNA^ENDNDQQD?'[$l*26+$_-65+222*!($_-32)]
0..5|%{' #'[(+$c-shr$_)%2]}})}}

Script de test:

$f = {

$args-split'
'|%{$s=$_
0..5|%{$l=$_
-join($s|% *per|% t*y|%{$c='_ONO__NQ__QAQQNONON_QQQQQ?QQQQAAAQDDIA[SQQQQADQQQJJ(_OAQOOY_DDGAUUQOQONDQJUDD$QQQQAAQQDEEAQYQAYCPDQJ[JD"QONO_ANQ_GI_QQNA^ENDNDQQD?'[$l*26+$_-65+222*!($_-32)]
0..5|%{' #'[(+$c-shr$_)%2]}})}}

}

&$f "ascii art
text"

Production:

#####  ###   ###  ##### #####       ##### ####  #####
#   # #     #   #   #     #         #   # #   #   #
#####  ###  #       #     #         ##### ####    #
#   #     # #   #   #     #         #   # ##      #
#   #  ###   ###  ##### #####       #   # # #     #

##### ##### #   # #####
  #   #      # #    #
  #   ####    #     #
  #   #      # #    #
  #   ##### #   #   #

Remarque:

$s|% *per|% t*y est un raccourci pour$s|% toUpper|% toCharArray

À propos de l'espace:

Pour chaque caractère de la chaîne source, le script prend un symbole (masque de bits) de la chaîne magique '_ONO__NQ...' . Cependant, l'index va au-delà de la chaîne magique d'un espace. Dans ce cas, le masque de bits $cdevient vide. Cela signifie zéro pour tous les bits.

À propos de la ligne vierge:

Le script affiche 6 lignes pour chaque symbole au lieu de 5. L'index dépasse également la chaîne magique pour une ligne vierge. Ainsi, la ligne 6 contient uniquement des espaces.

Il est préférable de voir si vous imprimez un autre caractère au lieu d'un espace. Par exemple ·.

#####··###···###··#####·#####·······#####·####··#####·
#···#·#·····#···#···#·····#·········#···#·#···#···#···
#####··###··#·······#·····#·········#####·####····#···
#···#·····#·#···#···#·····#·········#···#·##······#···
#···#··###···###··#####·#####·······#···#·#·#·····#···
······················································
#####·#####·#···#·#####·
··#···#······#·#····#···
··#···####····#·····#···
··#···#······#·#····#···
··#···#####·#···#···#···
························
mazzy
la source
0

C (gcc) , 326 octets

Un premier coup de couteau. Dû inclure stdio.h et string.h sur TIO, mais pas nécessaire avec MinGW.

char*p=0,*q;(*X)()=putchar;i,j;f(char*s){for(;p=strtok(p?0:strdup(s),"\n");X(10))for(i=0;i<5;i++,X(10))for(q=p;*q;q++,X(32))for(j=0;j<5;j++)X(((*q==32?0:"OAOAA?A?A?>A1A>?AAA?O1?1OO1?11>1IA>AAOAAO444OO4457A97591111OAKEAAACCIA>AAA>?A?11>AAIN?A?35>1>@>O4444AAAA>AA::4AAEKAA:4:AA:444O842O"[(toupper(*q)-65)*5+i]-48)>>j)&1?35:32);}

Essayez-le en ligne!

gastropner
la source
0

JavaScript (ES6), 292 287 278 octets

s=>s.split`
`.map(s=>`vfefvvehvvh1hhefefevhhhhhv
hhhh111h4491rjhhhh14hhhaa8
vf1hffpv4471llhfhfe4hal444
hhhh11hh4551hph1p3g4hara42
hfefv1ehv79vhhe1u5e4e4hh4v`.replace(/.{26}/g,S=>s.replace(/./g,c=>'012345'.replace(/./g,x=>' #'[(P=parseInt)(S[P(c,36)-10]||0,36)>>x&1])))).join`

`

Démo

Arnauld
la source