Parsing teks menulis font millitext

56

Membaca teks font millitext

Ada font di sini yang menyesuaikan setiap karakter menjadi satu blok, piksel 1x5. Ini melakukan ini (dengan asumsi Anda menggunakan layar LCD) dengan menggunakan saluran RGB dari setiap piksel untuk memperluas satu piksel menjadi tiga subkolom, satu untuk setiap saluran. Tugas Anda adalah mengambil string teks yang disandikan dalam font ini dan 'mendekodekannya'.

Abjad Millitext

CHARACTER: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
ENCODING:  WYWBMRRMMMWYWYWWWMWBMRMYGYGYCWMMMMMW
           MGBWMRRMMMMMRMRRRMGBMRWMMMMMRGMMMMMB
           MGWWWWWBWWWYRMWWMWGBYRWMMYMYGGMMWGGG
           MGRBBBMBMBMMRMRRMMGBMRMMMRWMBGMCWMGR
           WWWWBWWBWWMYWYWRWMWWMWMMGRCMYGWBMMGW

Saya telah menyingkat setiap warna menjadi simbol satu karakter (R = merah, G = hijau, B = biru, C = cyan, Y = kuning, M = magenta, W = putih).

Masukkan format

Format input untuk ini cukup terbuka. Anda dapat meminta input berupa array yang berisi setiap kolom, array yang berisi setiap baris, a char[][], atau semacamnya. Anda juga dapat memilih untuk menggunakan kata-kata penuh "merah", "hijau", "biru", dengan huruf besar / huruf kecil pilihan Anda (tetapi harus konsisten untuk setiap kata! Anda tidak dapat menggunakan "RED" dan juga melakukan "hijau" atau "Biru").

Jika bahasa Anda mendukungnya, Anda juga dapat memiliki warna input (namun itu mungkin berhasil, saya tidak tahu apa-apa).

Anda dapat mengasumsikan bahwa input HANYA akan berisi karakter yang disandikan dalam alfabet di atas (khususnya, tidak akan ada spasi atau tanda baca pada output Anda).

Format output

Anda dapat menampilkan string atau semacam array karakter. Anda dapat memilih apakah huruf besar atau kecil, tetapi semuanya harus memiliki huruf yang sama.

Contoh

MWRRGMGYRY
MRRRMMMMRM
WWRRMWMYRM -> HELLOWORLD
MRRRMWMMRM
MWWWGMGMWY

Aturan

Ini , jadi jawaban tersingkat menang!

Set tes

WMWGMWWMYYGMYWGMBMMYWYGMWYWMWRWWMYGW
GMRMMGRMMMMMMRMMBMWMRMMMRMGMRRMBMMMR
GWWMMGRYYYMWMWMGBMWYWMMMWYGWWRWGGMMM -> THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG
GMRWMGRMMMMWMRMMBMMRRMMCRMGMRRMRGMMM
GMWCWWWMYMGMMRGMWWMRWYGBWMGMWWMWGYGW
Calvin Godfrey
sumber
15
Saya merasa Anda bisa membuat hardcode semua huruf atau menggunakan Mathematica bawaan di sini.
seseorang
7
Tantangan pertama yang bagus, BTW!
Arnauld
6
Ini adalah font yang diperbaiki (beberapa karakter lain salah).
Arnauld
7
Saya tidak tahu apakah Anda ingin set tes Anda menyertakan semua huruf dari alfabet bahasa Inggris atau tidak, tetapi jika anak lelaki yang disebut pangram dan "THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG" bukan salah satu dari yang hilang dengan huruf "S", jika Anda ingin baik itu harus "THEQUICKBROWNFOXJUMPESOVERTHELAZYDOG"
MindSwipe
5
@JonofAllTrades JUMPS adalah sebuah kemungkinan. Dan Anda dapat kehilangan dua karakter dengan mengubah salah satu THE untuk A.
Andrew Leach

Jawaban:

16

JavaScript (ES6),  103 100 93 92  90 byte

Disimpan 9 byte berkat @ShieruAsakoto

Mengambil input sebagai array kolom. Mengembalikan array karakter.

a=>a.map(s=>"H-L-D--VGQ87MR6TZ-KJ9WC05BUXF1YI2EON3S-A-P4"[parseInt(s,35)%1161%219%152%43])

Cobalah online!

Arnauld
sumber
1
@ShieruAsakoto Terima kasih! Penggandaan itu bukan ide yang baik. Saya menyimpan 1 byte lebih banyak dengan 3 mod.
Arnauld
1
Itu adalah beberapa modulos besar di sana ... mungkin Anda dapat memperbaikinya lebih lagi sehingga -hilang! : D
Erik the Outgolfer
Setelah sepanjang malam dari brute-force aku punya 90 dengan 4 mods: a=>a.map(s=>"H-L-D--VGQ87MR6TZ-KJ9WC05BUXF1YI2EON3S-A-P4"[parseInt(s,35)%1161%219%152%43]).
Shieru Asakoto
@ShieruAsakoto Sayangnya, font yang dijelaskan dalam tantangan salah. Menunggu kemungkinan pembaruan dari OP.
Arnauld
@Arnauld Untuk yang sudah diperbaiki, kemajuan saya sekarang adalah 93:a=>a.map(s=>"UIR-L68N--W-X7B-FH-D-EZ--902-S4M5GJCQT3PKV-A1-YO"[parseInt(s,35)%464%107%99%52])
Shieru Asakoto
9

Jelly , 50 byte

Oḅ⁹%211“ẎP\7ßɱðvs*Ḋ⁹UfRMJiẒVƑ).Z½Ƈ"}~ḌyH⁵Ŀ⁶Ṿ‘iⱮịØB

Cobalah online!

Tautan monadik yang menerima input sebagai daftar kolom dan menghasilkan string Jelly terjemahan. Penjelasan lengkap untuk diikuti, tetapi bergantung pada kenyataan bahwa setiap set 5 huruf mungkin unik ketika dikonversi ke titik kode, dikonversi kembali dari basis-256 ke desimal dan kemudian mod 211.

Alternatif menggunakan font tetap Arnauld (49 byte dan menggunakan prinsip yang sama.)

Penjelasan

O                   | Convert to code points
 ḅ⁹                 | Convert from base 256 to decimal
   %211             | Mod 211
       “Ẏ...Ṿ‘iⱮ    | Find indices in [209,80,92,55,21,162,24,118,115,42,193,137,85,102,82,77,74,105,189,86,146,41,46,90,10,144,34,125,126,173,121,72,133,199,134,186]
                ịØB | Index into 01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ
Nick Kennedy
sumber
7

dzaima / APL, 80 79 73 72 71 byte

' P  FL6BDEZQA SY574H TVOK J 08  M  U IC92XW 3G1RN'⊇⍨52|8965|2411⊥¨⎕ucs

Cobalah online!

dzaima
sumber
1
fitur khusus apa yang dimiliki APL Anda?
Jonah
2
@Jonah Berikut hal-satunya yang digunakan adalah (mirip dengan {⍵[⍺]}), selain itu, ini dua file berisi info tentang hal itu
dzaima
6

05AB1E , 45 44 byte

40ö98%•Wþ@»Ý¢a:µ@,–çòßuÒ¹₃©6µć‚FVÝ∊J?•2ôžLR‡

Cobalah online!

Mengambil input sebagai array kolom, dan menghasilkan array karakter.

Penjelasan:

40ö                       # convert each column from base 40
   98%                    # modulo 98
      •...•2ô             # compressed array: [20, 32, 82, 30, 27, 28, 76, 89, 46, 96, 36, 4, 18, 12, 80, 75, 50, 86, 42, 2, 52, 92, 48, 0, 84, 1, 88, 90, 10, 26, 70, 41, 94, 64, 14, 60]
             žLR          # built-in array 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
                ‡         # transliterate
Grimmy
sumber
6

R , 143 128 byte

function(v)c(0:9,LETTERS)[match(colSums((sapply(v,U<-utf8ToInt)*194:198)%%45:41),U("#</Eb=,n9J.M4Z+%*V N[Hd\\B?1Oj>KgRYT2")+34)]

Cobalah online!

Berfungsi mengambil vektor string (sesuai dengan kolom) sebagai input misalnya:

MWRRG
MRRRM
WWRRM -> c('MMWMM','WRWRW','RRRRW','RRRRW','GMMMG') -> HELLO
MRRRM
MWWWG

Penjelasan:

Melakukan operasi berikut untuk setiap string yang disandikan (mis. 'CRGBY' = 'S'):

        TO ASCII      MULTIPLICATION             MODULO              SUM &              TO
        CODEPOINT                                                    OFFSET             ASCII
---------------------------------------------------------------------------------------------

'C'        67        67 * 194 = 12998       12998 %% 45 = 38  \
'R'        82        82 * 195 = 15990       15990 %% 44 = 18  |
'G'  --->  71  --->  71 * 196 = 13916  ---> 13916 %% 43 = 27  |---> (140 - 34) = 106 ---> 'j'
'B'        66        66 * 197 = 13002       13002 %% 42 = 24  |
'Y'        89        89 * 198 = 17622       17622 %% 41 = 33  /

kami mendapatkan string berikut di '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'mana masing-masing karakter sesuai '0123456789ABCDEFGHIJKLMNOPQR'.

Jadi, kode melakukan operasi yang dijelaskan pada string input, kemudian mencari korespondensi mereka di dalam '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'mendapatkan posisi dalam string '0123456789ABCDEFGHIJKLMNOPQR'.

menggali semua
sumber
Ini terlihat pintar tetapi tidak jelas cara menggunakan kode: Apa yang harus saya sampaikan ke fungsi? Baik daftar vektor karakter dan vektor polos gagal dengan "argumen tidak sesuai". Begitu juga matriks karakter.
Konrad Rudolph
@KonradRudolph: menambahkan penjelasan minimal input (dan mengubah TIO agar lebih eksplisit). Segera setelah saya dapat, saya akan menambahkan penjelasan kode, yang saya yakin dapat ditingkatkan dengan menemukan fungsi "hashing" lainnya untuk string yang mengembalikan nilai dalam rentang ASCII alih-alih unicode ...
digEmAll
@digEmAll ya saya sudah bermain dengan menurunkan angka ke berbagai karakter berbeda yang lebih masuk akal tapi belum ada
Giuseppe
@digEmAll Ah yang berfungsi (saya memiliki data sebagai col-major daripada row-major) tetapi contoh Anda menghasilkan "HEKKN", bukan "HELLO". Saya sangat bingung karena tampaknya berfungsi pada TIO. Pengkodean yang berbeda (non-UTF-8), saya kira.
Konrad Rudolph
1
@KonradRudolph: menambahkan penjelasan singkat (dan menemukan kode yang lebih pendek);)
digEmAll
3

Arang , 66 byte

WS§”*&_⟲⎇4>υ≧Y⪪ml^π≕t.A;p↶⧴q⊗Hε‖r¡¡ºÞd⸿σC⁺⮌”﹪﹪﹪⍘ιWMYCBGR³⁶⁰¦¹¹³¦⁷¹

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input sebagai daftar kolom yang diakhiri dengan baris kosong. Penjelasan:

WS

Masukkan string sampai kosong.

§”*&_⟲⎇4>υ≧Y⪪ml^π≕t.A;p↶⧴q⊗Hε‖r¡¡ºÞd⸿σC⁺⮌”

Mengindeks secara siklis ke string OV EX8HSCF5IA L TG 17 M P9RB 4 K ZY2 0JW 63Q ND Uyang (dengan spasi tambahan) sepanjang 56 karakter.

﹪﹪﹪⍘ιWMYCBGR³⁶⁰¦¹¹³¦⁷¹

Lakukan konversi basis-7 menggunakan alfabet WMYCBGRdan kemudian kurangi secara berturut-turut modulo 360, 113, 71, dan 56 secara implisit melalui pengindeksan siklik.

Pendekatan basis 7 saya bernasib sangat buruk dengan font tetap @ Arnauld; setelah beberapa pencarian saya masih di 73 byte. Menggunakan pendekatan @ Grimy, potong ini menjadi 67 byte. Namun saya akhirnya melacak solusi 66 byte:

WS§”*&″ÀM↔↓<J;×⊟ςF,Gηe↖ητγ´WIY³﹪▶⟧9?δc⁶AxDê↷hPiψ”﹪﹪﹪⍘ι⁴⁷¦²³⁷¦⁷³¦⁶⁷

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

WS

Masukkan string sampai kosong.

§”*&″ÀM↔↓<J;×⊟ςF,Gηe↖ητγ´WIY³﹪▶⟧9?δc⁶AxDê↷hPiψ”

Mengindeks secara siklis ke string ID HAM178 VS4F 3R EP6CQ Z UB O 0 X 9 G 5TNJKL2Y Wyang panjangnya 63 karakter.

﹪﹪﹪⍘ι⁴⁷¦²³⁷¦⁷³¦⁶⁷

Lakukan konversi basis-47 menggunakan alfabet 0-9A-Za-kdan kemudian secara berturut-turut kurangi modulo 237, 73, 67, dan 63 secara implisit melalui pengindeksan siklik.

Neil
sumber
2

CJam (63 byte)

{{Gb"õáÖÅ{a("{i%}/"@/Ö´çýß}yùÜÅ©GôÉç¢"256b43b'0f+=}%}

atau dalam format xxd

0000000: 7b7b 4762 22f5 e1d6 c59f 7b61 2822 7b69  {{Gb".....{a("{i
0000010: 257d 2f22 0b8a 8340 982f d6b4 e793 fddf  %}/"...@./......
0000020: 7d79 f9dc c519 17a9 0e47 0ef4 c9e7 a222  }y.......G....."
0000030: 3235 3662 3433 6227 3066 2b3d 7d25 7d    256b43b'0f+=}%}

Ini adalah blok anonim (fungsi) yang mengharapkan input sebagai daftar kolom. Demo online .

Seperti banyak jawaban lain, ini melakukan konversi basis diikuti oleh rantai% untuk mendapatkan tabel pencarian pendek. Dalam hal ini saya menggunakan basis 16 dan rantai% [245 225 214 197 159 123 97 40].

Peter Taylor
sumber
2

Jelly , 48 byte

OḌ%⁽qƥ%⁹%53“ð×⁼ẎėWWæ¤jḌṛ>÷ƭÑṙsṛḌz0Ġọµḷ’b51¤iⱮịØB

Tautan monadik yang menerima daftar daftar huruf besar (masing-masing berupa kolom) yang menghasilkan daftar karakter.

Cobalah online!

Bagaimana?

OḌ%⁽qƥ%⁹%53“...’b51¤iⱮịØB - Link: columns
O                         - ordinals
 Ḍ                        - convert from base ten
  %⁽qƥ                    - modulo 29415
      %⁹                  - modulo 256
        %53               - modulo 53
                    iⱮ    - map with first index of x in:
                   ¤      -   nilad followed by link(s) as a nilad:
           “...’          -     22270425059867513817410846141176204460122938458128124185752719
                b         -     convert to base
                 51       -       51
                          -     ... = [38,13,19,27,10,16,20,11,35,31,4,17,9,0,50,45,24,25,34,39,22,29,41,32,3,7,46,5,48,18,6,44,28,14,1,8]
                      ị   - index into
                       ØB -   "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
Jonathan Allan
sumber
1

Ruby , 109 byte

->n{n.map{|i|"6&\278$Cc\17Y9\23T\r]{v^Ox\16_+!Qj\fbH
hraD*Ap".index((i.to_i(36)%245%119+8).chr).to_s(36)}*""}

Cobalah online!

Level River St
sumber
1

Stax , 46 byte

é►^njÖ_╪»Θîq╪↨δXû=▀úæ5?ªoéV╫╫╩ßH‼╒C═e┼$⌠°JqUu⌡

Jalankan dan debug itu

Setiap kolom diterjemahkan sebagai basis-36. Modulus berturut-turut 8273, kemudian 95 diterapkan. Ini menghasilkan angka unik, tampak dalam string tetap.

Dibutuhkan input tepat dalam format yang ditentukan dalam contoh, dan harus mengubah mereka untuk mendapatkan kolom. Saya akan dapat menyimpan beberapa byte dengan menggunakan beberapa format input berbeda, yang mungkin saya lakukan di beberapa titik.

rekursif
sumber