Wyzwanie
Rozpoznaj numery sztuki ASCII. Aby uczynić rzeczy interesującymi, trzy losowe punkty na obrazie mogą zostać odwrócone. Na przykład:
*****
* **
**
**
**
**
Wejście
Numer sztuki 7x7 ASCII wygenerowany przez poniższy skrypt Pythona.
Wynik
Cyfra
Skrypt testowy
Oto skrypt w języku Python (2.6+) do generowania przypadków testowych:
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
Mikser
źródło
źródło
Odpowiedzi:
APL (
8785)Wyjaśnienie:
Każdy możliwy numer ASCII jest zakodowany w 48 bitach. (49-ty bit zawsze jest równy zero). Ciąg
嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢
ma trzy znaki na liczbę ASCII, z których każdy koduje 16 bitów.↓10 3⍴
: podziel ciąg danych na 10 3-znakowych grup, z których każda koduje liczbę.{
...}¨
: dla każdej grupy:(16/2)⊤⎕UCS⍵
: zdobądź pierwsze 16 bitów każdego z trzech znaków,
: połącz tablice bitów w jedną tablicę49↑
: weź 49 pierwszych elementów. Jest tylko 48, więc jest to równoważne z dodaniem0
na końcu.,↑{7↑'*'=⍞}¨⍳7
: odczytaj 7 linii po 7 znaków z klawiatury, utwórz bitową tablicę dla każdej linii, co1
oznacza, że znak był a*
, i połącz je razem.(+.=)¨
: dla każdej możliwej cyfry oblicz, ile bitów dane wejściowe miały wspólnego z cyfrą.⍒
: pobierz indeksy tej listy w dół, tak aby pierwszym elementem w wyniku był indeks największej liczby z poprzedniej listy.⊃
: weź pierwszy element, który jest indeksem cyfry1-⍨
: odejmij jeden, ponieważ indeksy APL są oparte na 1.źródło
⎕IO←0
, milczący, lewy górny to zawsze 0; 80:⊃⍒(,↑{7↑'*'=⍞}¨⍳7)∘(+.=)¨(49⍴(16/2)⊤⎕UCS)¨↓10 3⍴'嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢'
Pyton
Jestem pewien, że będą rozwiązania OCR, ale prawdopodobieństwo mojej dokładności jest znacznie wyższe.
Wprowadź po jednym wierszu tekstu na raz.
Nie jestem pewien lepszego sposobu radzenia sobie z gwiazdkami bez zwiększania liczby postaci.
źródło
JavaScript (ES6), 89
Stosowanie:
Wersja bez gry w golfa:
źródło
Bash + ImageMagick + tesseract, 316 znaków
Oto dźgnięcie w rozwiązanie OCR. Nie jest to jednak zbyt dokładne, nawet gdy mówi się tesseract, że mamy tylko jeden znak i jest to cyfra. Średnio golfowy, ale wciąż nieco czytelny:
Skrypt pobiera dane wejściowe ze standardowego wejścia, więc możemy przesyłać dane ze skryptu testowego.
Uwaga: Umieściłem
tee >( cat 1>&2 )
w potoku, abyśmy mogli zobaczyć, co skrypt testowy faktycznie wygenerował.Przykładowe dane wyjściowe (był to całkiem niezły przebieg z tylko 1 nieprawidłowym char na 6):
źródło
LÖVE2D, 560 bajtów
Najpierw rysuje blokową reprezentację tekstu wejściowego, a następnie dla każdej liczby 0–9 nakłada liczbę, sprawdza liczbę podobnych pikseli i drukuje liczbę, która uzyskała najbliższą wartość. Bardzo podstawowy OCR. Pasuje do wszystkich przypadków testowych i radzi sobie całkiem dobrze z mutacjami.
Zadzwoń z:
źródło