Analisando texto escrito a fonte millitext


56

Lendo o texto da fonte millitext

Há uma fonte aqui que encaixa cada caractere em um único bloco de 1x5 pixel. Isso é feito (supondo que você esteja usando uma tela LCD) usando os canais RGB de cada pixel para expandir o pixel em três subcolunas, uma para cada canal. Sua tarefa é coletar uma sequência de texto codificada nessa fonte e 'decodificá-la'.

Millitext Alphabet

CHARACTER: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
ENCODING:  WYWBMRRMMMWYWYWWWMWBMRMYGYGYCWMMMMMW
           MGBWMRRMMMMMRMRRRMGBMRWMMMMMRGMMMMMB
           MGWWWWWBWWWYRMWWMWGBYRWMMYMYGGMMWGGG
           MGRBBBMBMBMMRMRRMMGBMRMMMRWMBGMCWMGR
           WWWWBWWBWWMYWYWRWMWWMWMMGRCMYGWBMMGW

Abreviei cada cor para um símbolo de um caractere (R = vermelho, G = verde, B = azul, C = ciano, Y = amarelo, M = magenta, W = branco).

Formato de entrada

O formato de entrada para isso é bastante aberto. Você pode ter a entrada como uma matriz contendo cada coluna, uma matriz contendo cada linha, a char[][]ou algo assim. Você também pode optar por usar as palavras completas "vermelho", "verde", "azul", com maiúsculas / minúsculas à sua escolha (mas deve ser consistente para cada palavra! Você não pode usar "VERMELHO" e também "verde" ou "azul").

Se o seu idioma o suportar, você também poderá inserir cores (no entanto, isso pode funcionar, eu não sei de antemão).

Você pode supor que a entrada SÓ conterá caracteres codificados no alfabeto acima (em particular, não haverá espaços ou pontuação na sua saída).

Formato de saída

Você pode gerar uma string ou algum tipo de matriz de caracteres. Você pode escolher se as letras são maiúsculas ou minúsculas, mas todas devem ter o mesmo caso.

Exemplo

MWRRGMGYRY
MRRRMMMMRM
WWRRMWMYRM -> HELLOWORLD
MRRRMWMMRM
MWWWGMGMWY

Regras

Isso é , então a resposta mais curta vence!

Conjunto de teste

WMWGMWWMYYGMYWGMBMMYWYGMWYWMWRWWMYGW
GMRMMGRMMMMMMRMMBMWMRMMMRMGMRRMBMMMR
GWWMMGRYYYMWMWMGBMWYWMMMWYGWWRWGGMMM -> THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG
GMRWMGRMMMMWMRMMBMMRRMMCRMGMRRMRGMMM
GMWCWWWMYMGMMRGMWWMRWYGBWMGMWWMWGYGW

15
Sinto que você codifica todas as letras ou usa um Mathematica incorporado aqui.
alguém

7
Bom primeiro desafio, BTW!
Arnauld

6
Aqui está a fonte fixa (vários outros caracteres estão errados).
Arnauld

7
Eu não sei se você queria que seu conjunto de testes incluísse todas as letras do alfabeto inglês ou não, mas se o filho chamado pangram e "THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG" não estiver faltando um "S", se você quiser deve ser "THEQUICKBROWNFOXJUMPESOVERTHELAZYDOG"
MindSwipe

5
@JonofAllTrades JUMPS é uma possibilidade. E você pode perder dois personagens alterando um dos THEs para A.
Andrew Leach

Respostas:


16

JavaScript (ES6),  103 100 93 92  90 bytes

Guardado 9 bytes graças a @ShieruAsakoto

Recebe entrada como uma matriz de colunas. Retorna uma matriz de caracteres.

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

Experimente online!


11
@ShieruAsakoto Thanks! A multiplicação não foi uma boa ideia. Salvei mais 1 byte com 3 mods.
Arnauld

11
Esses são alguns grandes módulos por lá ... talvez você possa melhorá-los ainda mais para que -desapareçam! : D
Erik the Outgolfer

Depois de uma noite inteira de-força bruta Eu tenho um 90 com 4 mods: a=>a.map(s=>"H-L-D--VGQ87MR6TZ-KJ9WC05BUXF1YI2EON3S-A-P4"[parseInt(s,35)%1161%219%152%43]).
Shieru Asakoto 10/06

@ShieruAsakoto Infelizmente, a fonte descrita no desafio está errada. Aguardando uma possível atualização do OP.
Arnauld

@Arnauld Para o fixo, meu progresso agora é 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

Geléia , 50 bytes

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

Experimente online!

Um link monádico que aceita a entrada como uma lista de colunas e gera uma sequência Jelly da tradução. Explicação completa a seguir, mas se baseia no fato de que cada conjunto possível de 5 letras é único quando convertido em pontos de código, convertido novamente da base-256 para o decimal e, em seguida, no mod 211.

Alternativa usando a fonte fixa de Arnauld (49 bytes e usando o mesmo princípio).

Explicação

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

7

dzaima / APL, 80 79 73 72 71 bytes

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

Experimente online!


11
quais recursos especiais seu APL possui?
Jonah

2
@Jonah Aqui, a única coisa usada é (semelhante a {⍵[⍺]}), além disso, esses dois arquivos contêm informações sobre isso
dzaima

6

05AB1E , 45 44 bytes

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

Experimente online!

Recebe a entrada como matriz de colunas e gera uma matriz de caracteres.

Explicação:

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

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

Experimente online!

Função que recebe um vetor de strings (correspondente às colunas) como entrada, por exemplo:

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

Explicação:

Executando a seguinte operação para cada sequência codificada (por exemplo, '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  /

obtemos a seguinte string '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'onde cada caractere corresponde '0123456789ABCDEFGHIJKLMNOPQR'.

Portanto, o código executa as operações descritas nas sequências de entrada e, em seguida, pesquisa suas correspondências dentro da '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'obtenção das posições na sequência '0123456789ABCDEFGHIJKLMNOPQR'.


Isso parece inteligente, mas não está claro como usar o código: O que devo passar para a função? Tanto uma lista de vetores de caracteres quanto um vetor comum falham com o "argumento não conformável". O mesmo acontece com uma matriz de caracteres.
Konrad Rudolph

@KonradRudolph: adicionada uma explicação mínima da entrada (e alterado o TIO para ser mais explícito). Assim que eu puder eu vou adicionar uma explicação do código, que eu tenho certeza que pode ser melhorado por encontrar uma outra função "hash" para as cordas que retornam valores no intervalo ASCII em vez de unicode ...
digEmAll

@digEmAll Sim, eu tenho brincado modificando os dígitos para uma variedade mais razoável de caracteres distintos, mas nada ainda
Giuseppe

@digEmAll Ah, isso funciona (eu tinha os dados como col-major em vez de row-major), mas seu exemplo resulta em "HEKKN", não em "OLÁ!". Estou muito confuso que parece funcionar no TIO. Codificação diferente (não UTF-8), eu acho.
Konrad Rudolph

11
@KonradRudolph: adicionada uma breve explicação (e encontrado um código mais curto);)
digEmAll 16/06

3

Carvão , 66 bytes

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

Experimente online! Link é a versão detalhada do código. Recebe a entrada como uma lista de colunas terminadas com uma linha em branco. Explicação:

WS

Insira as strings até que uma fique em branco.

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

Indique ciclicamente a sequência OV EX8HSCF5IA L TG 17 M P9RB 4 K ZY2 0JW 63Q ND Uque (com espaço à direita) tem 56 caracteres.

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

Execute a conversão de base 7 usando o alfabeto WMYCBGRe reduza sucessivamente os módulos 360, 113, 71 e 56 implicitamente através da indexação cíclica.

Minha abordagem de base 7 se saiu muito mal com a fonte fixa do @ Arnauld; depois de algumas pesquisas, eu ainda estava em 73 bytes. Usando a abordagem do @ Grimy, reduza para 67 bytes. No entanto, finalmente localizei uma solução de 66 bytes:

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

Experimente online! Link é a versão detalhada do código. Explicação:

WS

Insira as strings até que uma fique em branco.

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

Indexe ciclicamente a string ID HAM178 VS4F 3R EP6CQ Z UB O 0 X 9 G 5TNJKL2Y Wcom 63 caracteres.

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

Realize a conversão da base 47 usando o alfabeto 0-9A-Za-ke reduza sucessivamente os módulos 237, 73, 67 e 63 implicitamente através da indexação cíclica.


2

CJam (63 bytes)

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

ou no 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 é um bloco anônimo (função) que espera entrada como uma lista de colunas. Demonstração online .

Como muitas das outras respostas, isso faz uma conversão base seguida por uma cadeia de% para obter uma tabela de pesquisa curta. Neste caso, uso a base 16 e a corrente% [245 225 214 197 159 123 97 40].


2

Gelatina , 48 bytes

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

Um link monádico que aceita uma lista de listas de caracteres maiúsculos (cada um sendo uma coluna) que gera uma lista de caracteres.

Experimente online!

Quão?

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 bytes

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

Execute e depure

Cada coluna é decodificada como base-36. Módulo sucessivo de 8273 e, em seguida, 95 são aplicados. Isso gera um número único, procurado em uma sequência fixa.

Ele recebe a entrada exatamente no formato especificado nos exemplos e precisa transpor para obter colunas. Conseguirei salvar alguns bytes usando um formato de entrada diferente, o que posso fazer em algum momento.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.