Tantangan
Kenali nomor seni ASCII. Untuk membuat hal-hal menarik, tiga titik acak dalam gambar mungkin terbalik. Sebagai contoh:
*****
* **
**
**
**
**
Memasukkan
Nomor seni ASCII 7x7 dihasilkan oleh skrip Python di bawah ini.
Keluaran
Digit.
Skrip pengujian
Berikut skrip Python (2.6+) untuk menghasilkan kasus uji:
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
Blender
sumber
sumber
Jawaban:
APL (
8785)Penjelasan:
Setiap nomor ASCII yang mungkin dikodekan dalam 48 bit. (Bit 49 selalu nol). String
嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢
memiliki tiga karakter per nomor ASCII, yang masing-masing mengkodekan 16 bit.↓10 3⍴
: pisahkan string data menjadi 10 grup 3-char, yang masing-masing mengkodekan angka.{
...}¨
: untuk masing-masing grup:(16/2)⊤⎕UCS⍵
: dapatkan 16 bit pertama dari masing-masing tiga karakter,
: menyatukan bit array menjadi satu array49↑
: ambil 49 elemen pertama. Hanya ada 48, jadi ini setara dengan menambahkan0
di akhir.,↑{7↑'*'=⍞}¨⍳7
: baca 7 baris 7 karakter dari keyboard, buatlah bit array untuk setiap baris yang1
berarti karakter itu a*
, dan gabungkan bersama.(+.=)¨
: untuk setiap digit yang mungkin, hitung berapa banyak bit input yang memiliki kesamaan dengan digit tersebut.⍒
: dapatkan indeks untuk daftar urutan ke bawah, sehingga item pertama dalam hasilnya adalah indeks jumlah terbesar di daftar sebelumnya.⊃
: ambil item pertama, yang merupakan indeks digit1-⍨
: kurangi satu, karena indeks APL berbasis 1.sumber
⎕IO←0
, diam-diam, kiri atas selalu 0; 80:⊃⍒(,↑{7↑'*'=⍞}¨⍳7)∘(+.=)¨(49⍴(16/2)⊤⎕UCS)¨↓10 3⍴'嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢'
Python
Saya yakin akan ada solusi OCR, tetapi probabilitas saya akurat jauh lebih tinggi.
Masukkan satu baris teks pada satu waktu.
Tidak yakin cara yang lebih baik untuk berurusan dengan tanda bintang tanpa menambah jumlah karakter.
sumber
JavaScript (ES6), 89
Pemakaian:
Versi tidak golf:
sumber
Bash + ImageMagick + tesseract, 316 karakter
Berikut adalah bacokan pada solusi OCR. Ini tidak terlalu akurat, bahkan ketika mengatakan pada tesseract bahwa kita hanya punya satu char dan itu digit. Golf sedang, tapi masih bisa dibaca:
Script mengambil input dari stdin, jadi kita bisa mem-pipe dari script tes.
Catatan Saya telah memasukkan
tee >( cat 1>&2 )
pipeline supaya kita bisa melihat apa script tes yang sebenarnya dihasilkan.Contoh output (Ini adalah proses yang cukup bagus dengan hanya 1 karakter yang salah dari 6):
sumber
LÖVE2D, 560 Bytes
Pertama, gambarkan representasi gumpal dari teks input, lalu, untuk setiap angka 0 - 9, tumpang tindih satu angka, periksa berapa banyak piksel serupa yang ada, dan cetak angka yang paling dekat. OCR yang sangat mendasar. Ini cocok dengan semua Uji Kasus, dan berkinerja cukup baik dengan mutasi.
Telepon dengan:
sumber