Kurierska recepcja

13

Kurierska recepcja

Program musi zaakceptować dowolny ciąg wejściowy i wyjściowy obraz pikselowy, który pokazuje ciąg wejściowy w Courier. Wszystkie litery zawierające „dziurę” (jak abdegopqABDPQRitp.) Otoczoną czarnymi pikselami również muszą być wypełnione na czarno.

Wejście

Program musi być w stanie zaakceptować dowolny ciąg ASCII jako dane wejściowe. Dane wejściowe mogą być dowolne, o ile sam kod programu nie musi się zmieniać, aby zaakceptować inne dane wejściowe. (Z wyjątkiem np. Nazwy pliku, który ma zostać odczytany.) Brak standardowych luk. Możesz założyć, że każde wejście zawiera co najmniej jedną literę do wydrukowania.

Wynik

Wyjście musi być czarno-białą (bez szarej) pikselową grafiką, która pokazuje ciąg napisany kurierem (w kolorze czarnym, białe tło), z wypełnionymi określonymi „dziurami”. Rozmiar czcionki całego łańcucha musi być stały (co oznacza, że ​​nie ma innego skalowania dla każdej innej litery), aby litery w pełnym rozmiarze (np. ABCDEFGHIJKLMNOPRSTUVWXYZJ i Q były większe) muszą mieć co najmniej 10 pikseli wysokości. (Nie musisz zapisywać go do pliku, każdy rodzaj wyświetlania jest w porządku, o ile jest generowany jako pixelgraphics, np. Płótno w JavaScript.) Prześlij tę grafikę z odpowiedzią.

Dostęp do bibliotek czcionek courier.ttf / font jest dozwolony.

Program musi również policzyć liczbę czarnych pikseli i zapisać je na konsoli lub jakiejkolwiek metodzie wyjściowej preferowanej na końcu.

Wynik

Wynik jest oceniany w następujący sposób: Pełny kod programu musi być użyty jako ciąg wejściowy do programu. Liczba czarnych pikseli będzie twoim wynikiem. Kod programu, który zawiera litery niedrukowalne lub inne niż ASCII, jest niedozwolony. (Jak również standardowe luki.) Im niższy wynik, tym lepiej.

wada
źródło
Dane wyjściowe są określone jako czarno-białe, więc nie są dozwolone szare piksele. I dziękuję za pytanie o kodowanie, będzie to ograniczone do ASCII ze względu na czcionkę.
flawr
1
Istnieją co najmniej dwa poważne problemy, które wymagają wyjaśnienia. Po pierwsze, nie jest jasne, czy program ma dostęp do Courier.ttf i bibliotek czcionek, które mogą z niego korzystać. Po drugie, czy poważnie zamierzasz zakazać programów, które nie zawierają znaków spoza ASCII?
Peter Taylor
Tak, dostęp do Courier.ttf i bibliotek czcionek jest dozwolony - inaczej nie miałoby sensu, dziękuję. Nie byłem w stanie wymyślić żadnego większego języka, który opierałby się na znakach spoza ASCII - czy znasz jakieś języki, które wymagają znaków spoza ASCII?
flawr
1
@flawr APL. A w Mathematica można skrócić kilka rzeczy przy użyciu znaków Unicode.
Martin Ender
Czy ImageMagick jest dozwolone?
Cyfrowa trauma

Odpowiedzi:

12

Mathematica, 4864 piksele

l = ImageData[Binarize[Rasterize[Style[j, FontSize -> 15]], .71]]
i = {{1, 1}}
While[Length[i] > 1 - 1,
 {r, c} = j = i[[1]]; l[[r, c]] = 2; i = i[[2 ;; -1]];
 If[FreeQ[i, {r, c} = J = j + #] && l[[r, c]] == 1, 
    i = i~Join~{J}] & /@
  {{1, 1 - 1}, {1 - 1, 1}, {-1, 1 - 1}, {1 - 1, -1}}
 ]
Image[l = l /. 1 -> 1 - 1 /. 2 -> 1]
Count[l, 1 - 1, {2}]

Oto zdjęcie:

wprowadź opis zdjęcia tutaj

W Mathematica, gdy piszesz „program”, po prostu piszesz fragment kodu. Oczekuje to, że dane wejściowe zostaną zapisane, ja ostatnią rzeczą, którą zwróci, jest obraz i liczba. To także wyrzuca wiele błędów, ponieważ nie sprawdzam granic l, ale i tak daje pożądany rezultat.

gdzie %odnosi się do wspomnianego ostatniego wyjścia.

Dzięki Geobits za pomysł na algorytm. Wypełniam obraz z lewego górnego rogu niepoprawną intensywnością, a następnie zastępuję wszystkie pozostałe białe piksele czarnymi pikselami, a niepoprawne piksele białymi.

Pamiętaj, że FreeQsprawdzenie nie jest faktycznie konieczne do poprawnego działania programu, ale do zakończenia go w rozsądnym czasie. Gdybym to pominął, zdobyłbym około 300 pikseli mniej.

Martin Ender
źródło
Liczenie powinno być częścią samego programu! Poza tym jest to dobre rozwiązanie, czy obliczyłeś, które litery (jako nazwy zmiennych) używają najmniejszej liczby pikseli?
flawr
@flawr yes :) (teraz dla wszystkich) (ustalanie liczenia w sekundę)
Martin Ender