Millitext fontuyla yazılmış metni ayrıştırma


56

Millitext fontunun metnini okuma

Burada her karakteri tek, 1x5 piksel blokta sığdıran bir font var . Bunu (bir LCD ekran kullandığınızı varsayarsak), bir pikseli her bir kanal için bir tane olmak üzere üç alt sütun içine genişletmek için her pikselin RGB kanallarını kullanarak yapar. Görevin bu yazı tipinde kodlanmış bir metin dizisi almak ve 'kodunu çözmek'.

Millitext Alfabe

CHARACTER: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
ENCODING:  WYWBMRRMMMWYWYWWWMWBMRMYGYGYCWMMMMMW
           MGBWMRRMMMMMRMRRRMGBMRWMMMMMRGMMMMMB
           MGWWWWWBWWWYRMWWMWGBYRWMMYMYGGMMWGGG
           MGRBBBMBMBMMRMRRMMGBMRMMMRWMBGMCWMGR
           WWWWBWWBWWMYWYWRWMWWMWMMGRCMYGWBMMGW

Her bir rengi bir karakter sembolüyle kısaltdım (R = kırmızı, G = yeşil, B = mavi, C = camgöbeği, Y = sarı, M = macenta, W = beyaz).

Giriş biçimi

Bunun için giriş formatı oldukça açık. Girişin her sütunu içeren bir dizi, her satırı içeren bir dizi, a char[][]veya benzeri bir şey olabilir. Ayrıca, "kırmızı", "yeşil", "mavi" kelimelerinin tamamını, büyük / küçük harf seçerek kullanmayı da seçebilirsiniz (ancak her kelime için tutarlı olmalıdır! "KIRMIZI" kullanamazsınız ve "yeşil" de yapabilirsiniz. veya "Mavi").

Diliniz onu destekliyorsa, girişin renkleri de olabilir (ancak işe yarayabilir, elimde değil).

Girişin SADECE yukarıdaki alfabedeki kodlanmış karakterleri içereceğini varsayabilirsiniz (özellikle çıktınızda boşluk veya noktalama olmaz).

Çıkış formatı

Bir dize veya bir tür karakter dizisi çıktısı alabilirsiniz. Harflerin büyük veya küçük harf olup olmadığını seçebilirsiniz, ancak hepsinin aynı durumda olması gerekir.

Örnek

MWRRGMGYRY
MRRRMMMMRM
WWRRMWMYRM -> HELLOWORLD
MRRRMWMMRM
MWWWGMGMWY

kurallar

Bu , bu yüzden en kısa cevap kazanır!

Deneme seti

WMWGMWWMYYGMYWGMBMMYWYGMWYWMWRWWMYGW
GMRMMGRMMMMMMRMMBMWMRMMMRMGMRRMBMMMR
GWWMMGRYYYMWMWMGBMWYWMMMWYGWWRWGGMMM -> THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG
GMRWMGRMMMMWMRMMBMMRRMMCRMGMRRMRGMMM
GMWCWWWMYMGMMRGMWWMRWYGBWMGMWWMWGYGW

15
Tüm harfleri kodladığınızı veya burada bir Mathematica yerleşikini kullandığınızı hissediyorum.
Birisi

7
Güzel ilk meydan okuma, BTW!
Arnauld

6
İşte sabit yazı tipi (diğer bazı karakterler yanlış).
Arnauld

7
Test setinizin İngilizce harflerden tüm harfleri içermesini isteyip istemediğinizi bilmiyorum, ama pangram ve "THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG" adlı bir oğul "eksik" bir "S" değil. olması gereken "THEQUICKBROWNFOXJUMPESOVERTHELAZYDOG"
MindSwipe

5
@JonofAllTrades JUMPS bir olasılıktır.Ve A'lardan birini değiştirerek iki karakteri kaybedebilirsin
Andrew Leach

Yanıtlar:


16

JavaScript (ES6),  103 100 93 92  90 bayt

@ShieruAsakoto sayesinde 9 bayt kaydedildi

Girdiyi sütun dizisi olarak alır. Bir karakter dizisi döndürür.

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

Çevrimiçi deneyin!


1
@ShieruAsakoto Teşekkürler! Çarpma iyi bir fikir değildi. 3 mod ile 1 bayt daha biriktirdim.
Arnauld

1
Şurada bazı büyük modüller var ... belki onları daha da artırabilirsin böylece -ortadan kaybolur! : D
Outgolfer Erik

Kaba kuvvet bir bütün gece sonra ben 90 4 ile mods var: a=>a.map(s=>"H-L-D--VGQ87MR6TZ-KJ9WC05BUXF1YI2EON3S-A-P4"[parseInt(s,35)%1161%219%152%43]).
Shieru Asakoto

@ShieruAsakoto Maalesef, mücadelede açıklanan yazı tipi yanlış. OP’den olası bir güncelleme bekliyorum.
Arnauld,

@Arnauld Sabit olan için şu andaki ilerlemem 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

Jöle , 50 bayt

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

Çevrimiçi deneyin!

Monadik bir bağlantı girişi bir sütun listesi olarak kabul eder ve çevirinin Jelly dizesini çıkarır. İzlenecek tam açıklama, ancak her 5 harflik kümenin, kod noktalarına dönüştürüldüğünde, temel 256'dan ondalık değerine ve daha sonra mod 211'e dönüştürüldüğünde benzersiz olmalarına dayanır.

Arnauld'un sabit fontunu kullanarak (49 bayt ve aynı prensibi kullanarak) alternatif .

açıklama

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

7

dzaima / APL, 80 79 73 72 71 bayt

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

Çevrimiçi deneyin!


1
APL'nizin hangi özellikleri var?
Jonah

2
@Jonah Burada kullanılan tek şey (buna benzer {⍵[⍺]}), bunun dışında, bu iki dosya onun hakkında bilgi içeriyor
dzaima

6

05AB1E , 45 44 bayt

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

Çevrimiçi deneyin!

Girdiyi sütun dizisi olarak alır ve bir karakter dizisi çıkarır.

Açıklama:

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

6

R , 1431 bayt

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)]

Çevrimiçi deneyin!

Girdi olarak bir dizi vektör (sütunlara karşılık gelen) alarak işlev;

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

Açıklama:

Her kodlanmış dize için aşağıdaki işlemi gerçekleştirin (örn. '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  /

'#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'Her karakterin karşılık geldiği aşağıdaki dizgiyi elde ediyoruz '0123456789ABCDEFGHIJKLMNOPQR'.

Böylece, kod giriş işlemlerinde açıklanan işlemleri gerçekleştirir, daha sonra dizideki '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'pozisyonları elde etmek için onların yazışmalarını arar '0123456789ABCDEFGHIJKLMNOPQR'.


Bu akıllıca görünüyor ancak kodun nasıl kullanılacağı açık değil: İşleve ne geçmeliyim? Hem karakter vektörlerinin listesi hem de düz bir vektör “uygun olmayan argüman” ile başarısız olur. Bir karakter matrisi de öyle.
Konrad Rudolph

@KonradRudolph: girişe minimal bir açıklama eklendi (ve daha açık olması için TIO'yu değiştirdi).
Yapabildiğim

@digEmAll evet Rakamları daha makul ve belirgin bir karakter aralığına indirgeyerek oynuyorum
Giuseppe

İşe yarar @digEmAll Ah (verilere satır majöründen çok büyük-ana verilerim vardı) ancak örneğiniz “HEKKN” değil “HELLO” ile sonuçlanır. TIO'da çalıştığı anlaşılıyor. Farklı (UTF-8 olmayan) kodlama sanırım.
Konrad Rudolph

1
@KonradRudolph: kısa bir açıklama ekledi (ve daha kısa bir kod buldu);)
digEmAll

3

Kömür , 66 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Boş bir satırla sonlandırılan sütunların listesi olarak girdi alır. Açıklama:

WS

Biri boş kalana kadar giriş dizeleri.

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

OV EX8HSCF5IA L TG 17 M P9RB 4 K ZY2 0JW 63Q ND U(Sondaki boşlukla birlikte) 56 karakter uzunluğunda olan dizgeye döngüsel olarak indeksleyin .

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

Alfabeyi kullanarak base-7 dönüşümü gerçekleştirin WMYCBGRve ardından art arda modül 360, 113, 71 ve 56'yı döngüsel indeksleme yoluyla dolaylı olarak azaltın.

Temel 7 yaklaşımım @ Arnauld'un sabit yazı tipiyle çok kötü sonuçlandı; Bazı aramalardan sonra hala 73 byte idi. @ Grimy'nin yaklaşımını kullanmak bunu 67 byte'a indirdi. Ancak sonunda 66 baytlık bir çözüm buldum:

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

WS

Biri boş kalana kadar giriş dizeleri.

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

ID HAM178 VS4F 3R EP6CQ Z UB O 0 X 9 G 5TNJKL2Y W63 karakter uzunluğundaki dizgeye döngüsel olarak indeksleyin .

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

Alfabeyi kullanarak base-47 dönüşümü gerçekleştirin 0-9A-Za-kve ardından art arda modulo 237, 73, 67 ve 63 döngüsel indeksleme yoluyla dolaylı olarak azaltın.


2

CJam (63 bayt)

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

veya xxd formatında

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+=}%}

Bu, girişi bir sütun listesi olarak bekleyen anonim bir bloktur (fonksiyon). Çevrimiçi demo .

Diğer cevapların çoğunda olduğu gibi, bu kısa bir arama tablosu elde etmek için% zincirinden sonra bir baz dönüşümü yapar. Bu durumda taban 16 ve% zincir kullanıyorum [245 225 214 197 159 123 97 40].


2

Jöle , 48 bayt

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

Tek karakterli bir bağlantı, karakter listesini veren büyük harfli listelerden oluşan bir listeyi (her biri sütun olarak) kabul eder.

Çevrimiçi deneyin!

Nasıl?

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"


1

Stax , 46 bayt

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

Koş ve hata ayıkla

Her sütun baz-36 olarak çözülür. Ardışık 8273 modülü, ardından 95 uygulanır. Bu, sabit bir dize baktı, benzersiz bir sayı verir.

Tam olarak örneklerde belirtilen formatta girdi alır ve sütunları almak için bunları dönüştürmek zorundadır. Bir noktada yapabileceğim farklı giriş formatlarını kullanarak bazı baytları kaydedebileceğim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.