Wypełnij dziury literami

18

Czasami, gdy się nudzę, biorę trochę tekstu i wypełniam „dziury” w literach. Ale czy wypełnianie dziur nie jest najbardziej nudną rzeczą, jaką możesz zrobić? Myślę, że powinniśmy to zautomatyzować , abyśmy mogli lepiej wykorzystać nasz czas.

Obowiązują standardowe zasady .

Wejście

Ciąg zawierający sekwencję znaków alfanumerycznych (az, AZ, 0-9) i spacje.

Wynik

Obraz zawierający wyrenderowany ciąg i wypełnione dziury. Możesz użyć dowolnej czcionki czytelnej dla człowieka, o ile nadal wymaga wypełnienia dziur. Możesz zapisać obraz do pliku i.png(w formacie png) lub po prostu wyświetlić obraz.

Właściwości obrazu:

  • Czarny tekst
  • Białe lub przezroczyste tło
  • Wyściółka:
    • Wymiary obrazu mogą być maksymalnie dwa razy większe niż wymiary tekstu
    • Wypełnienie powinno być tego samego koloru co tło, białe lub przezroczyste

Przykład

Wejście: Example text

Wynik: Przykładowe dane wyjściowe

Hannes Karppila
źródło
2
Związane z. (to samo wyzwanie, inna ocena).
Martin Ender,
Czy istnieje minimalny rozmiar czcionki dla liter (w pikselach)?
Martin Ender
Tak, powiedzmy, że jest 12 pikseli
Hannes Karppila

Odpowiedzi:

18

Bash, 135 bajtów

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

Używa ImageMagick (convert ).

Przykładowe dane wyjściowe:

próba

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

Wyłączenie antyaliasingu jest wymagane, ponieważ w przeciwnym razie antyaliasingowe części wewnętrzne liter nie wypełniłyby się wodą. Wymagane jest także ustawienie czcionki na duży rozmiar, ponieważ niektóre czcionki mają „luki” w literach, które powinny mieć „dziury” przy małych rozmiarach czcionek (w moich testach anie były wypełnione przy domyślnym małym rozmiarze czcionki).

Klamka
źródło
8

Mathematica, 83 bajty

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

wprowadź opis zdjęcia tutaj

Funkcja bez nazwy, która pobiera ciąg znaków jako dane wejściowe i zwraca obiekt obrazu. Chodzi o to, aby DeleteBorderComponentszachować tylko dziury, a następnie odjąć je od oryginalnego obrazu.

Martin Ender
źródło
3
Zabawne jest to, że Mathematica często wygrywa nawet z długimi wbudowanymi nazwami, takimi jak ImageSubtracti DeleteBorderComponents.
J Atkin,
To dlatego, że Mathematica ma wbudowane nazwy wielu rzeczy - nie trzeba często tworzyć własnych funkcji.
Tylko ASCII
4

SmileBASIC, 38 bajtów

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

Rysuje czarny * tekst na czarnym tle, a następnie używa wbudowanej funkcji „wiadro z farbą”, aby wypełnić wszystko poza tekstem białym.
* (faktycznie użyłem 00000008, który wygląda identycznie jak przezroczysty, ale jest traktowany jako inny kolor)

wprowadź opis zdjęcia tutaj

12Me21
źródło
2

Trochę zjada tekst, ale jest też rozwiązanie oparte na płótnie:

JS, 610 bajtów

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)

wprowadź opis zdjęcia tutaj

Łodzik
źródło
2

Postscript 273

[został pierwotnie opublikowany w powiązanym wyzwaniu , ale nigdy nie wdrożyłem liczenia.]

Renderuje każdą postać normalnie, aby uzyskać prawidłowe odstępy, aby przejść dalej, a następnie bierze wszystkie krzywe opisujące glif i wypełnia każdą z nich. Zazwyczaj krzywe wewnętrzne i zewnętrzne są opisywane w różnych orientacjach, więc wypełnienie sprawi, że wnętrze pozostanie puste, niezależnie od tego, czy używa się niezerowej reguły uzwojenia, czy reguły parzystej nieparzystej. Wypełniając osobno, wszystko się zapełni.

/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

Zębaty:

/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

Stosowanie. Obiekt string powinien znajdować się na stosie podczas uruchamiania programu. Dodatkowe skalowanie tylko po to, aby było widoczne.

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

wyciąć z wyjścia

luser droog
źródło