解析文字书写的Millitext字体


56

读取毫文本字体的文本

这里有一种字体,可以将每个字符放入单个1x5像素块中。它通过使用每个像素的RGB通道将一个像素扩展为三个子列(每个通道一个)来做到这一点(假设您使用的是LCD屏幕)。您的任务是接收以这种字体编码的文本字符串,然后对其进行“解码”。

密文字母

CHARACTER: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
ENCODING:  WYWBMRRMMMWYWYWWWMWBMRMYGYGYCWMMMMMW
           MGBWMRRMMMMMRMRRRMGBMRWMMMMMRGMMMMMB
           MGWWWWWBWWWYRMWWMWGBYRWMMYMYGGMMWGGG
           MGRBBBMBMBMMRMRRMMGBMRMMMRWMBGMCWMGR
           WWWWBWWBWWMYWYWRWMWWMWMMGRCMYGWBMMGW

我已将每种颜色缩写为一个字符符号(R =红色,G =绿色,B =蓝色,C =青色,Y =黄色,M =洋红色,W =白色)。

输入格式

输入格式是相当开放的。您可以让输入是包含每一列的数组,包含每一行的数组,a char[][]或类似的东西。您还可以选择使用全字“ red”,“ green”,“ blue”,并选择大写/小写(但是每个单词必须一致!您不能使用“ RED”,也要使用“ green”或“蓝色”)。

如果您的语言恰好支持它,那么您也可以输入颜色(但是可能有用,我不知道该如何使用)。

您可以假设输入将仅包含上面字母中的编码字符(特别是,您的输出中将没有空格或标点符号)。

输出格式

您可以输出字符串或某种字符数组。您可以选择字母是大写还是小写,但是它们都必须具有相同的大小写。

MWRRGMGYRY
MRRRMMMMRM
WWRRMWMYRM -> HELLOWORLD
MRRRMWMMRM
MWWWGMGMWY

规则

这是,所以最短的答案会成功!

测试集

WMWGMWWMYYGMYWGMBMMYWYGMWYWMWRWWMYGW
GMRMMGRMMMMMMRMMBMWMRMMMRMGMRRMBMMMR
GWWMMGRYYYMWMWMGBMWYWMMMWYGWWRWGGMMM -> THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG
GMRWMGRMMMMWMRMMBMMRRMMCRMGMRRMRGMMM
GMWCWWWMYMGMMRGMWWMRWYGBWMGMWWMWGYGW

15
我觉得您要么对所有字母进行硬编码,要么使用此处内置的Mathematica。
某人

7
不错,第一个挑战,顺便说一句!
Arnauld

6
这是固定字体(其他几个字符错误)。
Arnauld

7
我不知道,如果你想你的测试设置为只包括英文字母或不是所有的信件,但如果这就是所谓的一个儿子全字母短句和“THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG”不是一个作为其缺少一个“S”,如果你想让它应该是“ THEQUICKBROWNFOXJUMPESOVERTHELAZYDOG”
MindSwipe

5
@JonofAllTrades JUMPS是possibility.And你可以通过改变THES之一A.失去两个大字
安德鲁·利奇

Answers:


16

JavaScript(ES6), 103 100 93 92  90字节

@ShieruAsakoto节省了9个字节

将输入作为列数组。返回一个字符数组。

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

在线尝试!


1
@ShieruAsakoto谢谢!乘法不是一个好主意。我用3个mod节省了1个字节。
Arnauld

1
这些是那边的一些大模数...也许您可以进一步改善它们,以使-s消失!:D
暴民埃里克

的蛮力了整整一个晚上后,我得到了一个90与4 MODS: a=>a.map(s=>"H-L-D--VGQ87MR6TZ-KJ9WC05BUXF1YI2EON3S-A-P4"[parseInt(s,35)%1161%219%152%43])
浅草雅人

@ShieruAsakoto不幸的是,挑战中描述的字体是错误的。等待来自OP的可能更新。
Arnauld

@Arnauld对于固定的人,我现在的进步是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

果冻,50个字节

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

在线尝试!

单子链接,接受输入作为列列表并输出翻译的Jelly字符串。后面有完整的解释,但要依靠以下事实:转换为代码点,从base-256转换回十进制然后再转换为211时,每个可能的5个字母的集合都是唯一的。

使用Arnauld的固定字体(49字节,使用相同的原理)的替代方法

说明

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


6

05AB1E45 44字节

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

在线尝试!

将输入作为列数组,并输出字符数组。

说明:

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

R143128字节

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

在线尝试!

以字符串向量(对应于列)为输入的函数,例如:

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

说明:

对每个编码的字符串(例如'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'每个字符对应的字符串'0123456789ABCDEFGHIJKLMNOPQR'

因此,代码对输入字符串执行了描述的操作,然后在'#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'获取string中的位置的内部搜索它们的对应关系'0123456789ABCDEFGHIJKLMNOPQR'


这看起来很聪明,但是尚不清楚如何使用代码:我应该向函数传递什么?字符向量列表和纯向量都以“不一致的参数”失败。字符矩阵也是如此。
Konrad Rudolph

@KonradRudolph:添加了对输入的最少说明(并更改了TIO以使其更加明确)。只要我能,我会添加代码的解释,我确信可以通过找出字符串在ASCII范围,而不是统一返回值的其他“散列”功能来提高...
digEmAll

@digEmAll是的,我一直在尝试将数字修改为更合理的范围内的不同字符,但至今没有
Giuseppe

@digEmAll可行(我的数据是col-major而不是row-major),但是您的示例显示的是“ HEKKN”,而不是“ HELLO”。我很困惑,它似乎适用于TIO。我猜是不同的(非UTF-8)编码。
Konrad Rudolph

1
@KonradRudolph:添加了简短的解释(并找到了一个较短的代码);)
digEmAll

3

木炭,66字节

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

在线尝试!链接是详细版本的代码。将输入作为以空行结尾的列的列表。说明:

WS

输入字符串,直到一个为空。

§”*&_⟲⎇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(后缀空格)为56个字符。

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

使用字母执行base-7转换WMYCBGR,然后通过循环索引隐式地依次减少模数360、113、71和56。

我的base 7方法使用@Arnauld的固定字体效果非常差;经过一些搜索后,我仍然是73个字节。使用@Grimy的方法将其减少到67个字节。但是我最终找到了一个66字节的解决方案:

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

在线尝试!链接是详细版本的代码。说明:

WS

输入字符串,直到一个为空。

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

循环索引ID HAM178 VS4F 3R EP6CQ Z UB O 0 X 9 G 5TNJKL2Y W长度为63个字符的字符串。

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

使用字母执行base-47转换0-9A-Za-k,然后通过循环索引隐式地依次减少237、73、67和63的模数。


2

CJam(63字节)

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

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

这是一个匿名块(函数),期望输入为列列表。在线演示

与其他许多答案一样,这会进行基本转换,后跟%链以获取简短的查询表。在这种情况下,我使用基数为16和%chain [245 225 214 197 159 123 97 40]


2

果冻,48 个字节

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

单子链接接受一个大写字符列表(每个都是一列)的列表,该列表产生一个字符列表。

在线尝试!

怎么样?

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 个字节

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

运行并调试

每列均解码为base-36。依次使用8273和95的连续模量。这将产生一个唯一的数字,并在固定的字符串中查找。

它完全按照示例中指定的格式接受输入,并且必须转置它们以获取列。我可以通过使用某些不同的输入格式来保存一些字节,这在某些时候可以做到。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.