Remplissez les trous en lettres

18

Parfois, quand je m'ennuie, je prends du texte et remplis les "trous" dans les lettres. Mais combler les trous n'est-il pas la chose la plus ennuyeuse que vous puissiez faire? Je pense que nous devrions l' automatiser , afin que nous puissions mieux utiliser notre temps.

la norme règles de s'appliquent.

Contribution

Une chaîne contenant une séquence de caractères alphanumériques (az, AZ, 0-9) et des espaces.

Production

Image contenant une chaîne rendue et des trous remplis. Vous pouvez utiliser n'importe quelle police lisible par l'homme tant qu'elle nécessite de remplir les trous. Vous pouvez soit enregistrer l'image dans un fichieri.png (au format png), soit simplement afficher l'image.

Propriétés de l'image:

  • Texte noir
  • Fond blanc ou transparent
  • Rembourrage:
    • Les dimensions de l'image peuvent être au maximum deux fois supérieures aux dimensions du texte
    • Le rembourrage doit être de la même couleur que l'arrière-plan, blanc ou transparent

Exemple

Contribution: Example text

Production: Exemple de sortie

Hannes Karppila
la source
2
En relation. (même défi, score différent.)
Martin Ender
Existe-t-il une taille de police minimale pour les lettres (en pixels)?
Martin Ender
Oui, disons que c'est 12px
Hannes Karppila

Réponses:

18

Bash, 135 octets

convert +antialias -pointsize 99 label:$1 -fill red -draw 'color 0,0 floodfill' -fill black -opaque white -fill white -opaque red i.png

Utilise ImageMagick ( convert).

Exemple de sortie:

échantillon

convert
  +antialias                              # disable antialiasing
  -pointsize 99                           # annoyingly necessary (see below)
  label:$1                                # draw input text
  -fill red -draw 'color 0,0 floodfill'   # flood fill from (0,0) with red
  -fill black -opaque white               # replace all white with black
  -fill white -opaque red                 # replace all red with white
  i.png

La désactivation de l'anticrénelage est nécessaire car sinon les parties intérieures anticrénelées des lettres ne se rempliraient pas. Il est également nécessaire de définir la police sur une grande taille car certaines polices ont des "lacunes" dans les lettres qui devraient avoir des "trous" dans les petites tailles de police (dans mes tests, elles an'étaient pas remplies à la petite taille de police par défaut).

Poignée de porte
la source
8

Mathematica, 83 octets

ImageSubtract[s=Binarize@Rasterize@Style[#,FontSize->99],DeleteBorderComponents@s]&

entrez la description de l'image ici

Une fonction sans nom qui prend une chaîne en entrée et renvoie un objet image. L'idée est d'utiliser DeleteBorderComponentspour ne conserver que les trous puis soustraire ceux de l'image d'origine.

Martin Ender
la source
3
Le plus drôle, c'est que Mathematica gagne souvent même avec de longs noms intégrés comme ImageSubtractet DeleteBorderComponents.
J Atkin
C'est parce que Mathematica a des noms intégrés pour beaucoup de choses - vous n'avez pas besoin de créer souvent vos propres fonctions.
ASCII uniquement le
4

SmileBASIC, 38 octets

??INPUT S$GPUTCHR.,2,S$,2,2,8GPAINT.,0

Dessine du texte noir * sur le fond noir, puis utilise la fonction intégrée "pot de peinture" pour remplir tout ce qui se trouve en dehors du texte avec du blanc.
* (en fait, j'ai utilisé 00000008, qui ressemble à transparent, mais est traité comme une couleur différente)

entrez la description de l'image ici

12Me21
la source
2

Ronge un peu le texte, mais il existe également une solution basée sur le canevas:

JS, 610 octets

function o(a,b){return a[b]+a[b+1]+a[b+2]}x=prompt();l=x.length;c=document.createElement("canvas");document.body.appendChild(c);h=33;w=18*l;c.height=h;c.width=w;n=255;m=764;t=c.getContext("2d");t.fillStyle="white";t.fillRect(0,0,w,h);t.fillStyle="red";t.fillRect(0,2,w,h);t.font="900 30px Courier";t.fillStyle="black";t.fillText(x,0,25);d=t.getImageData(0,0,w,h);f=0;q=d.data.length;for(i=0;i<20;i++){for(j=0;j<q;j+=4){f=d.data;if(o(f,j)>0&&(o(f,j-w*4)>m||o(f,j+w*4)>m||o(f,j-4)>m||o(f,j+4)>m)){f[j]=n;f[j+1]=n;f[j+2]=n}}}for(k=0;k<q;k+=4){f=d.data;if(f[k+1]<1){f[k]=0;f[k+1]=0;f[k+2]=0}}t.putImageData(d,0,0)

entrez la description de l'image ici

Nautile
la source
2

Postscript 273

[a été initialement publié pour le défi associé , mais je n'ai jamais implémenté le comptage.]

Rend chaque caractère normalement, pour obtenir l'espacement correct pour avancer, puis prend toutes les courbes qui décrivent le glyphe et remplit chacun. Normalement, les courbes intérieures et extérieures sont décrites avec des orientations différentes, de sorte qu'un remplissage laissera l'intérieur vide, qu'il utilise la règle d'enroulement non nul ou la règle paire-impaire. Remplissant séparément, tout est rempli.

/Courier 9 selectfont
9 9 moveto{( ) dup 0 4 3 roll put currentpoint 3 2 roll
dup show currentpoint 3 2 roll 5 3 roll moveto
true charpath[[{/moveto
cvx}{/lineto cvx}{/curveto cvx}{/closepath cvx]cvx[}pathforall
pop]]{exec currentpoint fill moveto}forall pop moveto}forall

Dentelé:

/Courier 9 selectfont
9 9 moveto
{
    ( ) dup 0 4 3 roll put
    currentpoint 3 2 roll
    dup show
    currentpoint 3 2 roll
    5 3 roll moveto
    true charpath
    [ [{/moveto cvx}{/lineto cvx}{/curveto cvx}{/closepath cvx]cvx[}
       pathforall pop] ]
    { exec currentpoint fill moveto } forall
    pop moveto
} forall

Usage. On s'attend à ce que l'objet chaîne soit sur la pile au démarrage du programme. Mise à l'échelle supplémentaire juste pour la rendre visible.

$ gs -c '7 7 scale(Example Text)' -f courier.ps

couper la sortie

luser droog
la source