millitextフォントで書かれたテキストの解析


56

millitextフォントのテキストを読む

フォントがあり、ここで、単一の、1×5画素ブロックに各文字に適合します。これは、各ピクセルのRGBチャンネルを使用して1つのピクセルを各チャンネルに1つずつ、3つのサブカラムに拡張することにより(LCD画面を使用している場合)行います。あなたの仕事は、このフォントでエンコードされたテキスト文字列を取り込み、それを「デコード」することです。

ミリテキストアルファベット

CHARACTER: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
ENCODING:  WYWBMRRMMMWYWYWWWMWBMRMYGYGYCWMMMMMW
           MGBWMRRMMMMMRMRRRMGBMRWMMMMMRGMMMMMB
           MGWWWWWBWWWYRMWWMWGBYRWMMYMYGGMMWGGG
           MGRBBBMBMBMMRMRRMMGBMRMMMRWMBGMCWMGR
           WWWWBWWBWWMYWYWRWMWWMWMMGRCMYGWBMMGW

各色を1文字の記号に短縮しました(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
素敵な最初の挑戦、ところで!
アーナルド

6
これが固定フォントです(他のいくつかの文字が間違っています)。
アーナルド

7
テストセットに英語のアルファベットのすべての文字を含めるかどうかはわかりませんが、息子がパングラムと呼ばれ、"THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG"が "S"が欠落しているので、それが必要な場合は、 「THEQUICKBROWNFOXJUMPESOVERTHELAZYDOG」である必要があります
MindSwipe

5
あなたはAのTHESのいずれかを変更することにより、2つの文字を失う可能性がpossibility.And @JonofAllTradesジャンプをある
アンドリュー・リーチ

回答:


16

JavaScript(ES6)、103100  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バイト節約しました。
アーナルド

1
それらはそこにあるいくつかの大きなモジュールです...多分あなたはそれらを改善することができるので、それらは-消えます!:D
エリック・ザ・アウトゴルファー

一晩の総当たり攻撃の後、4つのmodで90を得ましたa=>a.map(s=>"H-L-D--VGQ87MR6TZ-KJ9WC05BUXF1YI2EON3S-A-P4"[parseInt(s,35)%1161%219%152%43])
麻琴しえる

@ShieruAsakoto残念ながら、チャレンジで説明されているフォントは間違っています。OPからの更新の可能性を待っています。
アーナルド

固定された1については@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

オンラインでお試しください!

入力を列のリストとして受け入れ、翻訳のジェリー文字列を出力するモナドリンク。詳細な説明は次のとおりですが、コードポイントに変換され、256を基数から10進数に、次にmod 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

R143 128バイト

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'


これは賢いように見えますが、コードの使用方法が明確ではありません。関数に何を渡すべきでしょうか 文字ベクトルのリストとプレーンなベクトルの両方が「適合しない引数」で失敗します。文字マトリックスも同様です。
コンラッドルドルフ

@KonradRudolph:入力の最小限の説明を追加しました(さらに明確にするためにTIOを変更しました)。コードの説明を追加したらすぐに、ユニコードの代わりにASCII範囲の値を返す文字列の他の「ハッシュ」関数を見つけることで改善できるはずです...
digEmAll

@digEmAllええ、私は数字をより合理的な範囲の個別の文字に改造して遊んでいますが、まだ何もありません
ジュゼッペ

@digEmAll Ahは動作します(行優先ではなく列優先としてデータを取得しました)が、例では「HELLO」ではなく「HEKKN」になります。TIOで機能しているように見えるのは非常に混乱しています。異なる(非UTF-8)エンコーディング、と思います。
コンラッドルドルフ

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³⁶⁰¦¹¹³¦⁷¹

アルファベットWMYCBGRを使用してベース7変換を実行し、循環インデックスを使用して暗黙的に暗黙的に360、113、71、および56を法として減らします。

私のベース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 W63文字の文字列に周期的にインデックスを付けます。

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

アルファベット0-9A-Za-kを使用してbase-47変換を実行し、サイクリックインデックスを介して暗黙的に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

スタックス、46 バイト

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

実行してデバッグする

各列はbase-36としてデコードされます。8273の連続モジュラス、その後95が適用されます。これにより、固定文字列で検索された一意の番号が生成されます。

例で指定された形式で正確に入力を受け取り、列を取得するためにそれらを転置する必要があります。いくつかの異なる入力形式を使用して、いくつかのバイトを保存することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.