Riempi i buchi in lettere


18

A volte, quando sono annoiato, prendo un po 'di testo e riempio i "buchi" nelle lettere. Ma riempire i buchi non è la cosa più noiosa che puoi fare? Penso che dovremmo automatizzarlo , in modo da poter usare meglio il nostro tempo.

Si applicano le regole standard del .

Ingresso

Una stringa contenente una sequenza di caratteri alfanumerici (az, AZ, 0-9) e spazi.

Produzione

Immagine contenente stringa resa e buchi su di essa riempiti. È possibile utilizzare qualsiasi tipo di carattere leggibile dall'uomo, purché sia ​​ancora necessario riempire i buchi. Puoi salvare l'immagine su file i.png(in formato png) o semplicemente visualizzare l'immagine.

Proprietà dell'immagine:

  • Testo nero
  • Sfondo bianco o trasparente
  • Imbottitura:
    • Le dimensioni dell'immagine possono essere al massimo due volte le dimensioni del testo
    • L'imbottitura deve essere dello stesso colore dello sfondo, bianco o trasparente

Esempio

Ingresso: Example text

Produzione: Esempio di output


2
Relazionato. (stessa sfida, punteggio diverso.)
Martin Ender,

Esiste una dimensione minima del carattere per le lettere (in pixel)?
Martin Ender,

Sì, diciamo che è 12px
Hannes Karppila,

Risposte:


18

Bash, 135 byte

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

Utilizza ImageMagick ( convert).

Uscita campione:

campione

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

È richiesta la disabilitazione dell'antialias perché le parti interne delle lettere altrimenti antialias non si riempirebbero. L'impostazione del carattere su una dimensione grande è necessaria anche perché alcuni caratteri hanno "spazi" nelle lettere che dovrebbero avere "buchi" in loro con caratteri piccoli (nei miei test, il carattere anon era riempito con il carattere piccolo predefinito).


8

Mathematica, 83 byte

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

inserisci qui la descrizione dell'immagine

Una funzione senza nome che accetta una stringa come input e restituisce un oggetto immagine. L'idea è di usare DeleteBorderComponentsper mantenere solo i buchi e quindi sottrarli dall'immagine originale.


3
La cosa divertente è che Mathematica vince spesso anche con nomi lunghi come ImageSubtracte DeleteBorderComponents.
J Atkin,

Questo perché Mathematica ha nomi predefiniti per molte cose: non è necessario creare spesso le proprie funzioni.
ASCII,

4

SmileBASIC, 38 byte

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

Disegna il testo nero * sullo sfondo nero, quindi utilizza la funzione "secchio di vernice" incorporata per riempire di bianco tutto il testo esterno al testo.
* (in realtà l'ho usato 00000008, che sembra identico al trasparente, ma è trattato come un colore diverso)

inserisci qui la descrizione dell'immagine


2

Mangia un po 'il testo, ma c'è anche una soluzione basata su tela:

JS, 610 byte

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)

inserisci qui la descrizione dell'immagine


2

Postscript 273

[originariamente pubblicato per la relativa sfida , ma non ho mai implementato il conteggio.]

Rende ogni personaggio normalmente, per far avanzare la spaziatura corretta, quindi prende tutte le curve che descrivono il glifo e riempie ognuna. Normalmente le curve interne ed esterne sono descritte con orientamenti diversi, quindi un riempimento lascia vuoto l'interno, indipendentemente dal fatto che stia usando la regola di avvolgimento diversa da zero o la regola pari-dispari. Riempiendo separatamente, tutto viene riempito.

/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

rientrato:

/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

Uso. L'oggetto stringa dovrebbe essere nello stack all'avvio del programma. Ridimensionamento extra solo per renderlo visibile.

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

tagliare dall'output

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.