Заповніть отвори літерами


18

Іноді, коли мені нудно, я беру якийсь текст і заповнюю «дірки» в листах. Але чи не заповнення отворів є найбільш нудною справою, яку ви можете зробити? Я думаю, що ми повинні автоматизувати це , щоб ми могли краще використовувати свій час.

Діють стандартні правила .

Вхідні дані

Рядок, що містить послідовність буквено-цифрових символів (az, AZ, 0-9) та пробіли.

Вихід

Зображення, що містить виведене рядок і заповнені отвори. Ви можете використовувати будь-який читабельний людський шрифт до тих пір, поки він ще потребує заповнення отворів. Ви можете зберегти зображення у файл i.png(у форматі png) або просто показати зображення.

Властивості зображення:

  • Чорний текст
  • Білий або прозорий фон
  • Набивання:
    • Розміри зображення можуть бути максимум у два рази більше розмірів тексту
    • Підкладка повинна бути того ж кольору, що і фон, або біла, або прозора

Приклад

Вхід: Example text

Вихід: Приклад виведення


2
Пов'язані. (той самий виклик, різний бал.)
Мартін Ендер

Чи є мінімальний розмір шрифту для літер (у пікселях)?
Мартін Ендер

Відповіді:


18

Баш, 135 байт

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

Використовує ImageMagick ( convert).

Вибірка зразка:

зразок

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

Вимкнути антиаліазінг потрібно, оскільки в іншому випадку антиаліасизовані внутрішні частини листів не заповняться Налаштування шрифту великого розміру також необхідне, оскільки деякі шрифти мають "прогалини" в літерах, які повинні мати "дірки" в них при невеликих розмірах шрифту (у моїх тестах, aза замовчуванням невеликий розмір шрифту не заповнювався).


8

Математика, 83 байти

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

введіть тут опис зображення

Неназвана функція, яка приймає рядок як вхідний і повертає об’єкт зображення. Ідея полягає у використанні, DeleteBorderComponentsщоб зберегти лише отвори, а потім відняти ті, які були у вихідного зображення.


3
Найсмішніше, що Mathematica часто виграє навіть з довгими вбудованими іменами типу ImageSubtractі DeleteBorderComponents.
J Atkin

Це тому, що Mathematica має вбудовані імена для багатьох речей - вам не потрібно часто створювати власні функції.
Лише ASCII

4

SmileBASIC, 38 байт

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

Малює чорний * текст на чорному тлі, а потім використовує вбудовану функцію "відро фарби", щоб заповнити все поза текстом білим кольором.
* (насправді я використовував 00000008, який виглядає ідентично прозорому, але трактується як інший колір)

введіть тут опис зображення


2

Трохи з'їдає текст, але є також рішення на основі полотна:

JS, 610 байт

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)

введіть тут опис зображення


2

Постскрипт 273

[Спочатку було розміщено відповідне завдання , але я ніколи не здійснював підрахунок.]

Здійснює кожен символ нормально, щоб отримати правильний інтервал для просування вперед, потім бере всі криві, які описують гліф, і заповнює кожен. Зазвичай внутрішні та зовнішні криві описуються з різною орієнтацією, тому заливка залишає порожній інтер'єр, незалежно від того, використовує воно правило, яке не має нульового або непарне правило. Заповнюючи окремо, все це заповнюється.

/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

Відступ:

/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

Використання. Очікується, що струнний об'єкт буде знаходитися в стеці під час запуску програми. Додаткове масштабування лише для того, щоб зробити його видимим.

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

сніп з виводу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.