Análisis de texto escrito con la fuente millitext

56

Leer el texto de la fuente millitext

Hay un tipo de letra aquí que se adapte a cada personaje en un único bloque de píxeles 1x5. Lo hace (suponiendo que esté utilizando una pantalla LCD) mediante el uso de los canales RGB de cada píxel para expandir el píxel en tres subcolumnas, una para cada canal. Su tarea es tomar una cadena de texto codificada en esta fuente y 'decodificarla'.

Millitext Alphabet

CHARACTER: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
ENCODING:  WYWBMRRMMMWYWYWWWMWBMRMYGYGYCWMMMMMW
           MGBWMRRMMMMMRMRRRMGBMRWMMMMMRGMMMMMB
           MGWWWWWBWWWYRMWWMWGBYRWMMYMYGGMMWGGG
           MGRBBBMBMBMMRMRRMMGBMRMMMRWMBGMCWMGR
           WWWWBWWBWWMYWYWRWMWWMWMMGRCMYGWBMMGW

He abreviado cada color a un símbolo de un carácter (R = rojo, G = verde, B = azul, C = cian, Y = amarillo, M = magenta, W = blanco).

Formato de entrada

El formato de entrada para esto es bastante abierto. Puede hacer que la entrada sea una matriz que contenga cada columna, una matriz que contenga cada fila, una char[][]o algo así. También puede elegir usar las palabras completas "rojo", "verde", "azul", con mayúsculas / minúsculas de su elección (¡pero debe ser coherente para cada palabra! No puede usar "ROJO" y tampoco "verde" o "azul").

Si su idioma lo admite, también puede hacer que la entrada sea en colores (sin embargo, eso podría funcionar, no lo sé de manera inmediata).

Puede suponer que la entrada SOLO contendrá caracteres codificados en el alfabeto anterior (en particular, no habrá espacios ni signos de puntuación en su salida).

Formato de salida

Puede generar una cadena o algún tipo de matriz de caracteres. Puede elegir si las letras son mayúsculas o minúsculas, pero todas deben tener el mismo caso.

Ejemplo

MWRRGMGYRY
MRRRMMMMRM
WWRRMWMYRM -> HELLOWORLD
MRRRMWMMRM
MWWWGMGMWY

Reglas

Este es el , por lo que gana la respuesta más corta.

Equipo de prueba

WMWGMWWMYYGMYWGMBMMYWYGMWYWMWRWWMYGW
GMRMMGRMMMMMMRMMBMWMRMMMRMGMRRMBMMMR
GWWMMGRYYYMWMWMGBMWYWMMMWYGWWRWGGMMM -> THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG
GMRWMGRMMMMWMRMMBMMRRMMCRMGMRRMRGMMM
GMWCWWWMYMGMMRGMWWMRWYGBWMGMWWMWGYGW
Calvin Godfrey
fuente
15
Siento que codificas todas las letras o usas un Mathematica incorporado aquí.
alguien
77
Bonito primer desafío, por cierto!
Arnauld
66
Aquí está la fuente fija (varios otros caracteres están equivocados).
Arnauld
77
No sé si quería que su conjunto de pruebas incluyera todas las letras del alfabeto inglés o no, pero si hijo se llama pangrama y "THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG" no es uno ya que le falta una "S", si lo desea sea ​​"THEQUICKBROWNFOXJUMPESOVERTHELAZYDOG"
MindSwipe
55
@JonofAllTrades JUMPS es una posibilidad. Y puedes perder dos personajes cambiando uno de los THE por A.
Andrew Leach

Respuestas:

16

JavaScript (ES6),  103100 93 92  90 bytes

Guardado 9 bytes gracias a @ShieruAsakoto

Toma datos como una matriz de columnas. Devuelve una matriz de caracteres.

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

Pruébalo en línea!

Arnauld
fuente
1
@ShieruAsakoto ¡Gracias! La multiplicación no fue una buena idea. Ahorré 1 byte más con 3 mod's.
Arnauld
1
Esos son algunos módulos grandes por ahí ... ¡tal vez puedas mejorarlos más para que -desaparezcan! : D
Erik the Outgolfer
Después de toda una noche de fuerza bruta Tengo una 90 con 4 mods: a=>a.map(s=>"H-L-D--VGQ87MR6TZ-KJ9WC05BUXF1YI2EON3S-A-P4"[parseInt(s,35)%1161%219%152%43]).
Shieru Asakoto
@ShieruAsakoto Desafortunadamente, la fuente descrita en el desafío es incorrecta. Esperando una posible actualización del OP.
Arnauld
@Arnauld Para el fijo, mi progreso ahora es 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

Jalea , 50 bytes

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

Pruébalo en línea!

Un enlace monádico que acepta la entrada como una lista de columnas y genera una cadena Jelly de la traducción. La explicación completa a seguir, pero se basa en el hecho de que cada posible conjunto de 5 letras es único cuando se convierte en puntos de código, se convierte de nuevo desde base-256 a decimal y luego mod 211.

Alternativa usando la fuente fija de Arnauld (49 bytes y usando el mismo principio).

Explicación

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

dzaima / APL, 80 79 73 72 71 bytes

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

Pruébalo en línea!

dzaima
fuente
1
¿Qué características especiales tiene su APL?
Jonás
2
@ Jonás Aquí lo único que se usa es (similar a {⍵[⍺]}), aparte de eso, estos dos archivos contienen información al respecto
dzaima
6

05AB1E , 45 44 bytes

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

Pruébalo en línea!

Toma la entrada como una matriz de columnas y genera una matriz de caracteres.

Explicación:

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
Mugriento
fuente
6

R , 143128 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)]

Pruébalo en línea!

Función que toma un vector de cadenas (correspondientes a las columnas) como entrada, por ejemplo:

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

Explicacion:

Realizando la siguiente operación para cada cadena codificada (por ejemplo, '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  /

obtenemos la siguiente cadena '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'donde corresponde cada carácter '0123456789ABCDEFGHIJKLMNOPQR'.

Entonces, el código realiza las operaciones descritas en las cadenas de entrada, luego busca sus correspondencias dentro de la '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'obtención de las posiciones en cadena '0123456789ABCDEFGHIJKLMNOPQR'.

digEmAll
fuente
Esto parece inteligente, pero no está claro cómo usar el código: ¿qué debo pasar a la función? Tanto una lista de vectores de caracteres como un vector simple fallan con el "argumento no conforme". También lo hace una matriz de caracteres.
Konrad Rudolph
@KonradRudolph: agregó una explicación mínima de la entrada (y cambió el TIO para ser más explícito). Tan pronto como pueda, agregaré una explicación del código, que estoy seguro se puede mejorar al encontrar otra función de "hashing" para las cadenas que devuelven valores en el rango ASCII en lugar de Unicode ...
digEmAll
@digEmAll sí, he estado jugando con la modificación de los dígitos a un rango más razonable de caracteres distintos, pero nada todavía
Giuseppe
@digEmAll Ah, eso funciona (tenía los datos como col-major en lugar de row-major) pero su ejemplo da como resultado "HEKKN", no "HELLO". Estoy muy confundido de que parece funcionar en TIO. Supongo que codificación diferente (no UTF-8).
Konrad Rudolph
1
@KonradRudolph: agregó una breve explicación (y encontró un código más corto);)
digEmAll
3

Carbón , 66 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Toma la entrada como una lista de columnas terminadas con una línea en blanco. Explicación:

WS

Introduzca cadenas hasta que una esté en blanco.

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

Indice cíclicamente en la cadena OV EX8HSCF5IA L TG 17 M P9RB 4 K ZY2 0JW 63Q ND Uque (con espacio final) tiene 56 caracteres de longitud.

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

Realice la conversión de base-7 usando el alfabeto WMYCBGRy luego reduzca sucesivamente los módulos 360, 113, 71 y 56 implícitamente a través de la indexación cíclica.

Mi enfoque de base 7 fue realmente malo con la fuente fija de @ Arnauld; Después de algunas búsquedas todavía estaba en 73 bytes. Usando el enfoque de @ Grimy, reduzca esto a 67 bytes. Sin embargo, finalmente rastreé una solución de 66 bytes:

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

WS

Introduzca cadenas hasta que una esté en blanco.

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

Indice cíclicamente en la cadena ID HAM178 VS4F 3R EP6CQ Z UB O 0 X 9 G 5TNJKL2Y Wque tiene 63 caracteres de longitud.

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

Realice la conversión de base 47 usando el alfabeto 0-9A-Za-ky luego reduzca sucesivamente los módulos 237, 73, 67 y 63 implícitamente a través de la indexación cíclica.

Neil
fuente
2

CJam (63 bytes)

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

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

Este es un bloque anónimo (función) que espera entrada como una lista de columnas. Demo en línea .

Como muchas de las otras respuestas, esto hace una conversión de base seguida de una cadena de% para obtener una tabla de búsqueda corta. En este caso uso base 16 y% chain [245 225 214 197 159 123 97 40].

Peter Taylor
fuente
2

Jalea , 48 bytes

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

Un enlace monádico que acepta una lista de listas de caracteres en mayúsculas (cada una es una columna) que produce una lista de caracteres.

Pruébalo en línea!

¿Cómo?

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

Pruébalo en línea!

Level River St
fuente
1

Stax , 46 bytes

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

Ejecutar y depurarlo

Cada columna se decodifica como base-36. Módulo sucesivo de 8273, luego se aplican 95. Esto produce un número único, buscado en una cadena fija.

Toma datos exactamente en el formato especificado en los ejemplos, y tiene que transponerlos para obtener columnas. Podré guardar algunos bytes usando un formato de entrada diferente, lo que puedo hacer en algún momento.

recursivo
fuente