Analysieren von Text in Millitext-Schrift

56

Lesen Sie den Text der Millitext-Schrift

Es gibt eine Schrift hier , dass jedes Zeichen in einen einzigen, 1x5 Pixelblock paßt. Dies geschieht (vorausgesetzt, Sie verwenden einen LCD-Bildschirm), indem Sie die RGB-Kanäle jedes Pixels verwenden, um das eine Pixel in drei Unterspalten zu erweitern, eine für jeden Kanal. Ihre Aufgabe ist es, eine in dieser Schriftart kodierte Textfolge aufzunehmen und zu "dekodieren".

Millitext-Alphabet

CHARACTER: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
ENCODING:  WYWBMRRMMMWYWYWWWMWBMRMYGYGYCWMMMMMW
           MGBWMRRMMMMMRMRRRMGBMRWMMMMMRGMMMMMB
           MGWWWWWBWWWYRMWWMWGBYRWMMYMYGGMMWGGG
           MGRBBBMBMBMMRMRRMMGBMRMMMRWMBGMCWMGR
           WWWWBWWBWWMYWYWRWMWWMWMMGRCMYGWBMMGW

Ich habe jede Farbe mit einem Ein-Zeichen-Symbol abgekürzt (R = Rot, G = Grün, B = Blau, C = Cyan, Y = Gelb, M = Magenta, W = Weiß).

Eingabeformat

Das Eingabeformat dafür ist ziemlich offen. Die Eingabe kann ein Array sein, das jede Spalte enthält, ein Array, das jede Zeile enthält, ein char[][]oder ähnliches. Sie können auch die vollständigen Wörter "rot", "grün", "blau" mit Groß- / Kleinbuchstaben Ihrer Wahl verwenden (dies muss jedoch für jedes Wort konsistent sein! Sie können nicht "rot" und auch "grün" verwenden oder "Blau").

Wenn Ihre Sprache dies unterstützt, können Sie auch Farben eingeben (was auch immer funktionieren mag, ich weiß es nicht).

Sie können davon ausgehen, dass die Eingabe NUR codierte Zeichen im obigen Alphabet enthält (insbesondere enthält Ihre Ausgabe keine Leerzeichen oder Satzzeichen).

Ausgabeformat

Sie können entweder eine Zeichenfolge oder eine Art Zeichenfeld ausgeben. Sie können wählen, ob die Buchstaben in Groß- oder Kleinbuchstaben geschrieben werden sollen, sie müssen jedoch alle die gleiche Groß- und Kleinschreibung haben.

Beispiel

MWRRGMGYRY
MRRRMMMMRM
WWRRMWMYRM -> HELLOWORLD
MRRRMWMMRM
MWWWGMGMWY

Regeln

Das ist , also gewinnt die kürzeste Antwort!

Testset

WMWGMWWMYYGMYWGMBMMYWYGMWYWMWRWWMYGW
GMRMMGRMMMMMMRMMBMWMRMMMRMGMRRMBMMMR
GWWMMGRYYYMWMWMGBMWYWMMMWYGWWRWGGMMM -> THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG
GMRWMGRMMMMWMRMMBMMRRMMCRMGMRRMRGMMM
GMWCWWWMYMGMMRGMWWMRWYGBWMGMWWMWGYGW
Calvin Godfrey
quelle
15
Ich habe das Gefühl, dass Sie entweder alle Buchstaben fest codieren oder ein hier eingebautes Mathematica verwenden.
Jemand
7
Schöne erste Herausforderung, übrigens!
Arnauld,
6
Hier ist die feste Schriftart (mehrere andere Zeichen sind falsch).
Arnauld,
7
Ich weiß nicht , ob Sie alle Buchstaben aus dem englischen Alphabet oder nicht Ihre Testset enthalten wollte, aber wenn Sohn, der ein genannt pangram und „THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG“ ist nicht ein als ein „S“ fehlt, wenn man es wollte sei es sollte "THEQUICKBROWNFOXJUMPESOVERTHELAZYDOG" sein
MindSwipe
5
@ JonofAllTrades JUMPS ist eine Möglichkeit. Und Sie können zwei Zeichen verlieren, indem Sie eines der THEs für A ändern.
Andrew Leach

Antworten:

16

JavaScript (ES6),  103 100 93 92  90 Bytes

9 Bytes dank @ShieruAsakoto eingespart

Übernimmt die Eingabe als Array von Spalten. Gibt ein Array von Zeichen zurück.

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

Probieren Sie es online!

Arnauld
quelle
1
@ShieruAsakoto Danke! Die Multiplikation war keine gute Idee. Ich habe 1 weiteres Byte mit 3 Mods gespeichert.
Arnauld,
1
Das sind ein paar große Module da drüben ... vielleicht kannst du sie noch verbessern, damit sie -verschwinden! : D
Erik der Outgolfer
Nach einer ganzen Nacht von Brute-Force habe ich ein 90 mit 4 Mods: a=>a.map(s=>"H-L-D--VGQ87MR6TZ-KJ9WC05BUXF1YI2EON3S-A-P4"[parseInt(s,35)%1161%219%152%43]).
Shieru Asakoto
@ShieruAsakoto Leider ist die in der Challenge beschriebene Schriftart falsch. Warten auf ein mögliches Update vom OP.
Arnauld,
@Arnauld Für die Feste ist mein Fortschritt jetzt eine 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

Gelee , 50 Bytes

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

Probieren Sie es online!

Ein monadischer Link, der die Eingabe als Liste von Spalten akzeptiert und eine Jelly-Zeichenfolge der Übersetzung ausgibt. Es folgt eine vollständige Erklärung, die sich jedoch auf die Tatsache stützt, dass jeder mögliche Satz von 5 Buchstaben eindeutig ist, wenn er in Codepunkte konvertiert wird, von der Basis 256 in die Dezimalzahl und dann in die Modifikation 211 zurückkonvertiert wird.

Alternative mit Arnauld's fester Schriftart (49 Bytes und nach dem gleichen Prinzip.)

Erläuterung

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
quelle
7

dzaima / APL, 80 79 73 72 71 Bytes

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

Probieren Sie es online!

dzaima
quelle
1
Welche Besonderheiten hat Ihre APL?
Jonah,
2
@Jonah Hier ist das einzige, was verwendet wird (ähnlich wie {⍵[⍺]}), abgesehen davon , dass diese beiden Dateien Informationen darüber enthalten
dzaima
6

05AB1E , 45 44 Bytes

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

Probieren Sie es online!

Nimmt Eingaben als Array von Spalten und gibt ein Array von Zeichen aus.

Erläuterung:

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
Grimmig
quelle
6

R , 143 128 Bytes

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

Probieren Sie es online!

Funktion, die einen Vektor von Strings (entsprechend den Spalten) als Eingabe verwendet, zB:

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

Erklärung:

Führen Sie für jede codierte Zeichenfolge die folgende Operation aus (z. B. '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  /

Wir erhalten die folgende Zeichenfolge, der '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'jedes Zeichen entspricht '0123456789ABCDEFGHIJKLMNOPQR'.

Der Code führt also die beschriebenen Operationen an den Eingabezeichenfolgen aus und durchsucht dann deren Entsprechungen '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2', um die Positionen in der Zeichenfolge zu erhalten '0123456789ABCDEFGHIJKLMNOPQR'.

digEmAll
quelle
Das sieht clever aus, aber es ist nicht klar, wie man den Code verwendet: Was soll ich an die Funktion übergeben? Sowohl eine Liste von Zeichenvektoren als auch ein einfacher Vektor weisen ein "nicht konformes Argument" auf. So auch eine Zeichenmatrix.
Konrad Rudolph
@KonradRudolph: Es wurde eine minimale Erklärung für die Eingabe hinzugefügt (und die TIO geändert, um genauer zu sein). Sobald ich kann, werde ich eine Erklärung des Codes hinzufügen, die ich sicher verbessern kann, indem ich eine andere "Hash" -Funktion für die Zeichenfolgen
finde, die
@digEmAll yeah Ich habe damit gespielt, die Ziffern auf einen vernünftigeren Bereich unterschiedlicher Zeichen zu reduzieren, aber noch nichts
Giuseppe,
@digEmAll Ah, das funktioniert (ich hatte die Daten als col-major und nicht als row-major), aber Ihr Beispiel ergibt "HEKKN", nicht "HELLO". Ich bin sehr verwirrt, dass es auf TIO zu funktionieren scheint. Ich denke, es gibt eine andere (nicht UTF-8) Kodierung.
Konrad Rudolph
1
@KonradRudolph: eine kurze Erklärung hinzugefügt (und einen kürzeren Code gefunden);)
digEmAll
3

Kohle , 66 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Übernimmt die Eingabe als Liste von Spalten, die mit einer Leerzeile abgeschlossen werden. Erläuterung:

WS

Geben Sie die Zeichenfolgen ein, bis eine leer ist.

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

Indizieren Sie zyklisch in den String, OV EX8HSCF5IA L TG 17 M P9RB 4 K ZY2 0JW 63Q ND Uder (mit Leerzeichen am Ende) 56 Zeichen lang ist.

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

Führen Sie eine Base-7-Konvertierung mit dem Alphabet durch WMYCBGRund reduzieren Sie dann implizit nacheinander modulo 360, 113, 71 und 56 über die zyklische Indizierung.

Mein Ansatz zur Basis 7 schnitt mit der festen Schriftart von @ Arnauld sehr schlecht ab. Nach einigem Suchen war ich immer noch bei 73 Bytes. Mit @ Grimys Ansatz können Sie dies auf 67 Bytes reduzieren. Schließlich habe ich jedoch eine 66-Byte-Lösung gefunden:

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

WS

Geben Sie die Zeichenfolgen ein, bis eine leer ist.

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

Indizieren Sie zyklisch die Zeichenfolge mit einer ID HAM178 VS4F 3R EP6CQ Z UB O 0 X 9 G 5TNJKL2Y WLänge von 63 Zeichen.

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

Führen Sie die Base-47-Konvertierung mit dem Alphabet durch 0-9A-Za-kund reduzieren Sie dann implizit nacheinander die Modulo 237, 73, 67 und 63 über die zyklische Indizierung.

Neil
quelle
2

CJam (63 Bytes)

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

oder im xxd Format

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

Dies ist ein anonymer Block (Funktion), der Eingaben als Liste von Spalten erwartet. Online-Demo .

Wie bei vielen anderen Antworten wird auch hier eine Basiskonvertierung gefolgt von einer Kette von% durchgeführt, um eine kurze Nachschlagetabelle zu erhalten. In diesem Fall verwende ich Base 16 und% chain [245 225 214 197 159 123 97 40].

Peter Taylor
quelle
2

Jelly , 48 Bytes

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

Ein monadischer Link, der eine Liste von Listen mit Großbuchstaben akzeptiert (wobei jede Spalte eine Spalte ist), die eine Liste von Zeichen ergibt.

Probieren Sie es online!

Wie?

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
quelle
1

Ruby , 109 Bytes

->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)}*""}

Probieren Sie es online!

Level River St
quelle
1

Stax , 46 Bytes

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

Führen Sie es aus und debuggen Sie es

Jede Spalte wird als base-36 dekodiert. Aufeinanderfolgender Modul von 8273, dann werden 95 angewendet. Dies ergibt eine eindeutige Zahl, die in einer festen Zeichenfolge nachgeschlagen wird.

Es nimmt Eingaben genau in dem in den Beispielen angegebenen Format vor und muss sie transponieren, um Spalten zu erhalten. Ich werde in der Lage sein, einige Bytes zu speichern, indem ich ein anderes Eingabeformat verwende, was ich möglicherweise irgendwann tun werde.

rekursiv
quelle