Вызов
Распознать ASCII арт номера. Чтобы сделать вещи интересными, три случайных точки на изображении могут быть перевернуты. Например:
*****
* **
**
**
**
**
вход
Художественный номер 7x7 ASCII, сгенерированный приведенным ниже скриптом Python.
Выход
Цифра
Скрипт тестирования
Вот скрипт Python (2.6+) для генерации тестовых случаев:
import random
digits = '''\
***
** **
** **
** **
** **
** **
***
*
***
*
*
*
*
*****
***
* **
*
**
**
**
******
***
* **
*
***
*
* **
***
**
***
* **
* **
******
**
**
*****
**
****
*
*
* *
***
****
**
*****
* *
** **
** *
****
*****
**
**
**
**
**
**
****
** **
** **
****
** **
** **
****
***
** **
** **
** *
****
**
**** '''.split('\n\n')
def speckle(image, num_speckles):
grid = [list(row) for row in image.split('\n')]
for i in range(num_speckles):
row = random.choice(grid)
row[random.randint(0, 6)] = random.choice([' ', '*'])
return '\n'.join([''.join(row) for row in grid])
digit = random.choice(digits)
print(speckle(digit, 3))
code-golf
ascii-art
image-processing
смеситель
источник
источник
Ответы:
APL (
8785)Объяснение:
Каждый возможный номер ASCII кодируется в 48 битах. (49-й бит всегда равен нулю). Строка
嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢
имеет три символа на номер ASCII, каждый из которых кодирует 16 бит.↓10 3⍴
: разбить строку данных на 10 трехзначных групп, каждая из которых кодирует число.{
...}¨
: для каждой из групп:(16/2)⊤⎕UCS⍵
: получить первые 16 бит каждого из трех символов,
: объединить битовые массивы в один массив49↑
: возьмите первые 49 элементов. Их всего 48, так что это эквивалентно добавлению0
в конце.,↑{7↑'*'=⍞}¨⍳7
: прочитайте 7 строк по 7 символов с клавиатуры, создайте битовый массив для каждой строки, где1
означает, что символ был a*
, и соедините их вместе.(+.=)¨
: для каждой возможной цифры вычислите, сколько битов было общего с входом.⍒
: получить индексы для сортировки списка вниз, так что первый элемент в результате - это индекс наибольшего числа в предыдущем списке.⊃
: взять первый элемент, который является индексом цифры1-⍨
: вычесть единицу, потому что индексы APL основаны на 1.источник
⎕IO←0
, молчаливо, верхний левый всегда 0; 80:⊃⍒(,↑{7↑'*'=⍞}¨⍳7)∘(+.=)¨(49⍴(16/2)⊤⎕UCS)¨↓10 3⍴'嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢'
питон
Я уверен, что будут решения OCR, но вероятность моей точности намного выше.
Введите одну строку текста за раз.
Не уверен в лучшем способе справиться со звездочками без увеличения количества символов.
источник
JavaScript (ES6), 89
Использование:
Версия без гольфа:
источник
Bash + ImageMagick + тессеракт, 316 символов
Вот пример решения OCR. Это не очень точно, хотя, даже говоря tesseract, что у нас есть только один символ, и это цифра. Умеренно в гольфе, но все же несколько читабельно:
Скрипт принимает входные данные из stdin, поэтому мы можем передать из тестового скрипта.
Обратите внимание, что я поместил
tee >( cat 1>&2 )
в конвейер только для того, чтобы мы могли видеть, что на самом деле генерируется тестовый скриптПример вывода (Это был довольно хороший прогон только с 1 неправильным символом из 6):
источник
LÖVE2D, 560 байт
Сначала рисуется блочное представление входного текста, затем для каждого числа от 0 до 9 накладывает число, проверяет, сколько есть похожих пикселей, и печатает число, которое получилось ближе всего. Очень простой OCR. Он соответствует всем тестовым сценариям и достаточно хорошо работает с мутациями.
Звоните с:
источник