Analizowanie tekstu napisanego czcionką millitext

56

Czytanie tekstu czcionki millitext

Jest tutaj czcionka , która pasuje do każdego znaku w jednym bloku 1x5 pikseli. Robi to (zakładając, że używasz ekranu LCD), wykorzystując kanały RGB każdego piksela do rozwinięcia jednego piksela do trzech subkolumn, po jednym dla każdego kanału. Twoim zadaniem jest pobranie ciągu tekstowego zakodowanego tą czcionką i „odkodowanie”.

Alfabet Millitext

CHARACTER: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
ENCODING:  WYWBMRRMMMWYWYWWWMWBMRMYGYGYCWMMMMMW
           MGBWMRRMMMMMRMRRRMGBMRWMMMMMRGMMMMMB
           MGWWWWWBWWWYRMWWMWGBYRWMMYMYGGMMWGGG
           MGRBBBMBMBMMRMRRMMGBMRMMMRWMBGMCWMGR
           WWWWBWWBWWMYWYWRWMWWMWMMGRCMYGWBMMGW

Skróciłem każdy kolor do symbolu jednoznakowego (R = czerwony, G = zielony, B = niebieski, C = cyjan, Y = żółty, M = magenta, W = biały).

Format wejściowy

Format wejściowy do tego jest dość otwarty. Dane wejściowe mogą być tablicą zawierającą każdą kolumnę, tablicą zawierającą każdy wiersz, a char[][]lub czymkolwiek podobnym. Możesz także użyć pełnych słów „czerwony”, „zielony”, „niebieski” z wybranymi dużymi / małymi literami (ale muszą być spójne dla każdego słowa! Nie możesz użyć „CZERWONEGO”, a także „zielonego” lub „niebieski”).

Jeśli Twój język go obsługuje, możesz również wprowadzić kolory (jednak może to działać, nie wiem, jak to zrobić z ręki).

Możesz założyć, że dane wejściowe będą zawierać TYLKO zakodowane znaki w powyższym alfabecie (w szczególności nie będzie spacji ani interpunkcji).

Format wyjściowy

Możesz wyprowadzić ciąg znaków lub tablicę znaków. Możesz wybrać, czy litery mają być wielkie czy małe, ale wszystkie muszą mieć tę samą wielkość liter.

Przykład

MWRRGMGYRY
MRRRMMMMRM
WWRRMWMYRM -> HELLOWORLD
MRRRMWMMRM
MWWWGMGMWY

Zasady

To jest , więc wygrywa najkrótsza odpowiedź!

Zestaw testowy

WMWGMWWMYYGMYWGMBMMYWYGMWYWMWRWWMYGW
GMRMMGRMMMMMMRMMBMWMRMMMRMGMRRMBMMMR
GWWMMGRYYYMWMWMGBMWYWMMMWYGWWRWGGMMM -> THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG
GMRWMGRMMMMWMRMMBMMRRMMCRMGMRRMRGMMM
GMWCWWWMYMGMMRGMWWMRWYGBWMGMWWMWGYGW
Calvin Godfrey
źródło
15
Wydaje mi się, że albo na stałe wpisujesz wszystkie litery, albo używasz wbudowanej tutaj Mathematiki.
ktoś
7
Ładne pierwsze wyzwanie, BTW!
Arnauld
6
Oto stała czcionka (kilka innych znaków jest niepoprawnych).
Arnauld
7
Nie wiem, czy chciałeś, aby twój zestaw testowy zawierał wszystkie litery alfabetu angielskiego, czy nie, ale jeśli syn, który nazywa się pangram, a „THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG”, nie jest jednym z jego brakujących liter „S”, jeśli chcesz niech tak powinno być „THEQUICKBROWNFOXJUMPESOVERTHELAZYDOG”
MindSwipe
5
@JonofAllTrades JUMPS to możliwość. Możesz stracić dwie postacie, zmieniając jedną z THE dla A.
Andrew Leach

Odpowiedzi:

16

JavaScript (ES6),  103 100 93 92  90 bajtów

Zaoszczędź 9 bajtów dzięki @ShieruAsakoto

Pobiera dane wejściowe jako tablicę kolumn. Zwraca tablicę znaków.

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

Wypróbuj online!

Arnauld
źródło
1
@ShieruAsakoto Thanks! Mnożenie nie było dobrym pomysłem. Zapisałem jeszcze 1 bajt dzięki 3 modom.
Arnauld
1
Tam są jakieś duże moduły ... może uda ci się je ulepszyć, żeby -zniknęły! : D
Erik the Outgolfer
Po całej nocy brute-force mam 90 z 4 modów: a=>a.map(s=>"H-L-D--VGQ87MR6TZ-KJ9WC05BUXF1YI2EON3S-A-P4"[parseInt(s,35)%1161%219%152%43]).
Shieru Asakoto
@ShieruAsakoto Niestety czcionka opisana w wyzwaniu jest nieprawidłowa. Oczekiwanie na możliwą aktualizację z PO.
Arnauld
@Arnauld Dla poprawionego mój postęp wynosi teraz 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

Galaretka , 50 bajtów

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

Wypróbuj online!

Monadyczny link akceptujący dane wejściowe jako listę kolumn i generujący ciąg galaretki tłumaczenia. Pełne wyjaśnienie do naśladowania, ale opiera się na fakcie, że każdy możliwy zestaw 5 liter jest unikalny, gdy jest konwertowany na punkty kodowe, konwertowany z podstawowej-256 na dziesiętną, a następnie mod 211.

Alternatywnie przy użyciu stałej czcionki Arnauld (49 bajtów i przy użyciu tej samej zasady).

Wyjaśnienie

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
źródło
7

dzaima / APL, 80 79 73 72 71 bajtów

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

Wypróbuj online!

dzaima
źródło
1
jakie specjalne funkcje ma twój APL?
Jonah
2
@Jonah Tutaj jedyną używaną rzeczą jest (podobnie do {⍵[⍺]}), poza tym, te dwa pliki zawierają informacje na jej temat
dzaima
6

05AB1E , 45 44 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako tablicę kolumn i wyświetla tablicę znaków.

Wyjaśnienie:

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
Ponury
źródło
6

R , 143 128 bajtów

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

Wypróbuj online!

Funkcja pobierająca na wejściu wektor ciągów (odpowiadających kolumnom), np .:

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

Objaśnienie:

Wykonanie następującej operacji dla każdego zakodowanego ciągu (np. „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  /

otrzymujemy następujący ciąg, w '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'którym odpowiada każdy znak '0123456789ABCDEFGHIJKLMNOPQR'.

Zatem kod wykonuje opisane operacje na łańcuchach wejściowych, a następnie przeszukuje ich korespondencję w celu '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'uzyskania pozycji w łańcuchu '0123456789ABCDEFGHIJKLMNOPQR'.

digEmAll
źródło
Wygląda to sprytnie, ale nie jest jasne, jak używać kodu: Co mam przekazać do funkcji? Zarówno lista wektorów znaków, jak i prosty wektor zawodzą z „niezgodnym argumentem”. Podobnie matryca znaków.
Konrad Rudolph
@KonradRudolph: dodano minimalne objaśnienie danych wejściowych (i zmieniono TIO, aby być bardziej wyraźnym). Jak tylko będę mógł, dodam objaśnienie kodu, które z pewnością można ulepszyć, znajdując inną funkcję „mieszającą” dla ciągów zwracających wartości w zakresie ASCII zamiast Unicode ...
digEmAll
@digEmAll tak, bawiłem się, zmieniając cyfry na bardziej rozsądny zakres wyraźnych postaci, ale jeszcze nic
Giuseppe
@digEmAll Ah to działa (miałem dane jako col-dur zamiast major-row), ale twój przykład daje „HEKKN”, a nie „CZEŚĆ”. Jestem bardzo zdezorientowany, że wydaje się działać na TIO. Chyba inne kodowanie (inne niż UTF-8).
Konrad Rudolph
1
@KonradRudolph: dodał krótkie wyjaśnienie (i znalazł krótszy kod);)
digEmAll
3

Węgiel drzewny , 66 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe jako listę kolumn zakończonych pustą linią. Wyjaśnienie:

WS

Wprowadź ciągi znaków, aż jeden będzie pusty.

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

Cyklicznie indeksuj do łańcucha, OV EX8HSCF5IA L TG 17 M P9RB 4 K ZY2 0JW 63Q ND Uktóry (z końcową spacją) ma 56 znaków.

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

Wykonaj konwersję base-7 za pomocą alfabetu, WMYCBGRa następnie zmniejszaj kolejno modulo 360, 113, 71 i 56 niejawnie poprzez cykliczne indeksowanie.

Moje podejście bazowe 7 wypadło naprawdę źle ze stałą czcionką @ Arnauld; po kilku poszukiwaniach wciąż miałem 73 bajty. Używając podejścia @ Grimy, zmniejsz to do 67 bajtów. Jednak w końcu wytropiłem 66-bajtowe rozwiązanie:

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

WS

Wprowadź ciągi znaków, aż jeden będzie pusty.

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

Cyklicznie indeksuj do łańcucha o ID HAM178 VS4F 3R EP6CQ Z UB O 0 X 9 G 5TNJKL2Y Wdługości 63 znaków.

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

Wykonaj konwersję base-47 za pomocą alfabetu, 0-9A-Za-ka następnie zmniejszaj sukcesywnie modulo 237, 73, 67 i 63 pośrednio przez cykliczne indeksowanie.

Neil
źródło
2

CJam (63 bajty)

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

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

Jest to anonimowy blok (funkcja), który oczekuje danych wejściowych jako listy kolumn. Demo online .

Jak wiele innych odpowiedzi, wykonuje to konwersję podstawową, po której następuje łańcuch%, aby uzyskać krótką tabelę wyszukiwania. W tym przypadku używam podstawy 16 i% łańcucha [245 225 214 197 159 123 97 40].

Peter Taylor
źródło
2

Galaretka , 48 bajtów

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

Monadyczny link akceptujący listę list wielkich liter (każda z nich jest kolumną), która daje listę znaków.

Wypróbuj online!

W jaki sposó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"
Jonathan Allan
źródło
1

Rubin , 109 bajtów

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

Wypróbuj online!

Level River St
źródło
1

Stax , 46 bajtów

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

Uruchom i debuguj

Każda kolumna jest dekodowana jako baza-36. Stosuje się kolejno moduł 8273, a następnie 95. Daje to unikalną liczbę, sprawdzoną w stałym ciągu.

Pobiera dane wejściowe dokładnie w formacie określonym w przykładach i musi je transponować, aby uzyskać kolumny. Będę mógł zapisać niektóre bajty, używając innego formatu wejściowego, co w pewnym momencie mogę zrobić.

rekurencyjny
źródło