Il testo di analisi ha scritto il carattere millitext


56

Lettura del testo del font millitext

C'è un carattere qui che adatta ogni personaggio in un singolo blocco di pixel 1x5. Lo fa (supponendo che tu stia utilizzando uno schermo LCD) utilizzando i canali RGB di ciascun pixel per espandere un pixel in tre colonne secondarie, una per ciascun canale. Il tuo compito è prendere una stringa di testo codificata in questo carattere e "decodificarlo".

Alfabeto Millitext

CHARACTER: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
ENCODING:  WYWBMRRMMMWYWYWWWMWBMRMYGYGYCWMMMMMW
           MGBWMRRMMMMMRMRRRMGBMRWMMMMMRGMMMMMB
           MGWWWWWBWWWYRMWWMWGBYRWMMYMYGGMMWGGG
           MGRBBBMBMBMMRMRRMMGBMRMMMRWMBGMCWMGR
           WWWWBWWBWWMYWYWRWMWWMWMMGRCMYGWBMMGW

Ho abbreviato ogni colore in un simbolo di un carattere (R = rosso, G = verde, B = blu, C = ciano, Y = giallo, M = magenta, W = bianco).

Formato di input

Il formato di input per questo è piuttosto aperto. Puoi avere l'input come un array contenente ogni colonna, un array contenente ogni riga, a char[][]o qualcosa del genere. Puoi anche scegliere di usare le parole complete "rosso", "verde", "blu", con maiuscole / minuscole di tua scelta (ma deve essere coerente per ogni parola! Non puoi usare "ROSSO" e fare anche "verde" o "Blu").

Se la tua lingua sembra supportarla, puoi anche avere input in colori (tuttavia ciò potrebbe funzionare, non lo so a mano).

Puoi presumere che l'input conterrà SOLO caratteri codificati nell'alfabeto sopra (in particolare, non ci saranno spazi o punteggiatura nell'output).

Formato di output

Puoi generare una stringa o una sorta di array di caratteri. Puoi scegliere se le lettere sono maiuscole o minuscole, ma devono avere tutte lo stesso caso.

Esempio

MWRRGMGYRY
MRRRMMMMRM
WWRRMWMYRM -> HELLOWORLD
MRRRMWMMRM
MWWWGMGMWY

Regole

Questo è , quindi vince la risposta più breve!

Set di test

WMWGMWWMYYGMYWGMBMMYWYGMWYWMWRWWMYGW
GMRMMGRMMMMMMRMMBMWMRMMMRMGMRRMBMMMR
GWWMMGRYYYMWMWMGBMWYWMMMWYGWWRWGGMMM -> THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG
GMRWMGRMMMMWMRMMBMMRRMMCRMGMRRMRGMMM
GMWCWWWMYMGMMRGMWWMRWYGBWMGMWWMWGYGW

15
Mi sento come se decodificassi tutte le lettere o usi un Mathematica incorporato qui.
qualcuno il

7
Bella prima sfida, BTW!
Arnauld,

6
Ecco il carattere fisso (molti altri caratteri sono sbagliati).
Arnauld,

7
Non so se si voleva il set di prova per includere tutte le lettere dell'alfabeto inglese o no, ma se il figlio che si chiama un pangramma e "THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG" non è uno come il suo manca una "S", se si voleva che dovrebbe essere "THEQUICKBROWNFOXJUMPESOVERTHELAZYDOG"
MindSwipe l'

5
@JonofAllTrades JUMPS è una possibilità e puoi perdere due personaggi cambiando uno dei THE per A.
Andrew Leach l'

Risposte:


16

JavaScript (ES6),  103 100 93 92  90 byte

Salvataggio di 9 byte grazie a @ShieruAsakoto

Accetta input come una matrice di colonne. Restituisce una matrice di caratteri.

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

Provalo online!


1
@ShieruAsakoto Grazie! La moltiplicazione non è stata una buona idea. Ho salvato un altro byte con 3 mod.
Arnauld,

1
Quelli sono alcuni grandi moduli laggiù ... forse puoi migliorarli di più in modo -che scompaiano! : D
Erik the Outgolfer,

Dopo una notte intera di brute-force ho ottenuto un 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 Sfortunatamente, il carattere descritto nella sfida è sbagliato. In attesa di un possibile aggiornamento dall'OP.
Arnauld,

@Arnauld Per quello fisso i miei progressi adesso sono 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 l'

9

Gelatina , 50 byte

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

Provalo online!

Un collegamento monadico che accetta l'input come un elenco di colonne e produce una stringa Jelly della traduzione. Spiegazione completa da seguire, ma si basa sul fatto che ogni possibile set di 5 lettere è unico quando convertito in punti di codice, convertito da base-256 in decimale e quindi mod 211.

Alternativa usando il carattere fisso di Arnauld (49 byte e usando lo stesso principio.)

Spiegazione

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 byte

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

Provalo online!


1
quali funzioni speciali ha il tuo APL?
Giona,

2
@Jonah Qui l'unica cosa usata è (simile a {⍵[⍺]}), a parte questo, questi due file contengono informazioni al riguardo
dzaima

6

05AB1E , 45 44 byte

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

Provalo online!

Prende l'input come matrice di colonne e genera una matrice di caratteri.

Spiegazione:

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 byte

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

Provalo online!

Funzione che accetta un vettore di stringhe (corrispondente alle colonne) come input, ad esempio:

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

Spiegazione :

Eseguendo la seguente operazione per ogni stringa codificata (ad esempio '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  /

otteniamo la seguente stringa a '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'cui corrisponde ogni carattere '0123456789ABCDEFGHIJKLMNOPQR'.

Quindi, il codice esegue le operazioni descritte sulle stringhe di input, quindi cerca le loro corrispondenze all'interno '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'ottenendo le posizioni nella stringa '0123456789ABCDEFGHIJKLMNOPQR'.


Sembra intelligente ma non è chiaro come utilizzare il codice: cosa devo passare alla funzione? Sia un elenco di vettori di caratteri che un vettore semplice falliscono con "argomento non conforme". Così fa una matrice di caratteri.
Konrad Rudolph,

@KonradRudolph: aggiunta una spiegazione minima dell'input (e modificato il TIO per essere più esplicito). Appena posso aggiungerò una spiegazione del codice, che sono sicuro che può essere migliorata trovando un'altra funzione di "hashing" per le stringhe che restituiscono valori nell'intervallo ASCII anziché unicode ...
digEmAll

@digEmAll sì, ho giocato modificando le cifre in una gamma più ragionevole di personaggi distinti, ma nulla ancora
Giuseppe

@digEmAll Ah, che funziona (ho avuto i dati come col-major anziché come riga-major) ma il tuo esempio risulta in "HEKKN", non in "HELLO". Sono molto confuso che sembra funzionare su TIO. Codifica diversa (non UTF-8), immagino.
Konrad Rudolph,

1
@KonradRudolph: aggiunta una breve spiegazione (e trovato un codice più breve);)
digEmAll

3

Carbone , 66 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Accetta l'input come un elenco di colonne terminate con una riga vuota. Spiegazione:

WS

Immettere le stringhe fino a quando una è vuota.

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

Indicizza ciclicamente la stringa OV EX8HSCF5IA L TG 17 M P9RB 4 K ZY2 0JW 63Q ND Uche (con spazio finale) è lunga 56 caratteri.

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

Esegui la conversione di base 7 usando l'alfabeto WMYCBGRe quindi riduci in modo implicito modulo 360, 113, 71 e 56 implicitamente tramite l'indicizzazione ciclica.

Il mio approccio alla base 7 è andato davvero male con il font fisso di @ Arnauld; dopo alcune ricerche ero ancora a 73 byte. Usando l'approccio di @ Grimy riduci questo valore a 67 byte. Tuttavia alla fine ho rintracciato una soluzione a 66 byte:

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

WS

Immettere le stringhe fino a quando una è vuota.

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

Indice ciclicamente nella stringa di ID HAM178 VS4F 3R EP6CQ Z UB O 0 X 9 G 5TNJKL2Y W63 caratteri.

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

Eseguire la conversione base-47 usando l'alfabeto 0-9A-Za-ke quindi ridurre in modo implicito modulo 237, 73, 67 e 63 in modo implicito tramite l'indicizzazione ciclica.


2

CJam (63 byte)

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

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

Questo è un blocco (funzione) anonimo che prevede input come un elenco di colonne. Demo online .

Come molte altre risposte, questa esegue una conversione di base seguita da una catena di% per ottenere una breve tabella di ricerca. In questo caso uso base 16 e% chain [245 225 214 197 159 123 97 40].


2

Gelatina , 48 byte

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

Un collegamento monadico che accetta un elenco di elenchi di caratteri maiuscoli (ciascuno dei quali è una colonna) che restituisce un elenco di caratteri.

Provalo online!

Come?

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 byte

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

Esegui ed esegui il debug

Ogni colonna è decodificata come base-36. Modulo successivo di 8273, quindi 95 applicati. Questo produce un numero univoco, cercato in una stringa fissa.

Prende input esattamente nel formato specificato negli esempi e li deve trasporre per ottenere colonne. Sarò in grado di salvare alcuni byte utilizzando un formato di input diverso, cosa che potrei fare a un certo punto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.