Le texte d'analyse écrit la police millitext

56

Lecture du texte de la police millitext

Il y a ici une police qui adapte chaque caractère à un seul bloc de 1x5 pixels. Pour ce faire (en supposant que vous utilisiez un écran LCD), utilisez les canaux RVB de chaque pixel pour développer le pixel en trois sous-colonnes, une pour chaque canal. Votre tâche consiste à récupérer une chaîne de texte codée dans cette police et à la "décoder".

Alphabet Millitext

CHARACTER: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
ENCODING:  WYWBMRRMMMWYWYWWWMWBMRMYGYGYCWMMMMMW
           MGBWMRRMMMMMRMRRRMGBMRWMMMMMRGMMMMMB
           MGWWWWWBWWWYRMWWMWGBYRWMMYMYGGMMWGGG
           MGRBBBMBMBMMRMRRMMGBMRMMMRWMBGMCWMGR
           WWWWBWWBWWMYWYWRWMWWMWMMGRCMYGWBMMGW

J'ai abrégé chaque couleur en un symbole d'un caractère (R = rouge, G = vert, B = bleu, C = cyan, Y = jaune, M = magenta, W = blanc).

Format d'entrée

Le format d'entrée pour cela est assez ouvert. Vous pouvez avoir l’entrée sous la forme d’un tableau contenant chaque colonne, d’un tableau contenant chaque ligne, d’un char[][]élément ou d’un élément similaire. Vous pouvez également choisir d'utiliser les mots entiers "rouge", "vert", "bleu", avec des majuscules / minuscules de votre choix (mais cela doit être cohérent pour chaque mot! Vous ne pouvez pas utiliser "ROUGE", mais aussi "vert" ou "bleu").

Si votre langue le prend en charge, vous pouvez également avoir des couleurs d'entrée (toutefois, cela peut fonctionner, je ne sais pas tout de suite).

Vous pouvez supposer que l'entrée contiendra UNIQUEMENT des caractères codés dans l'alphabet ci-dessus (en particulier, il n'y aura pas d'espaces ni de ponctuation dans votre sortie).

Format de sortie

Vous pouvez générer une chaîne ou une sorte de tableau de caractères. Vous pouvez choisir si les lettres sont majuscules ou minuscules, mais elles doivent toutes avoir la même casse.

Exemple

MWRRGMGYRY
MRRRMMMMRM
WWRRMWMYRM -> HELLOWORLD
MRRRMWMMRM
MWWWGMGMWY

Règles

C'est du , alors la réponse la plus courte gagne!

Ensemble d'essai

WMWGMWWMYYGMYWGMBMMYWYGMWYWMWRWWMYGW
GMRMMGRMMMMMMRMMBMWMRMMMRMGMRRMBMMMR
GWWMMGRYYYMWMWMGBMWYWMMMWYGWWRWGGMMM -> THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG
GMRWMGRMMMMWMRMMBMMRRMMCRMGMRRMRGMMM
GMWCWWWMYMGMMRGMWWMRWYGBWMGMWWMWGYGW
Calvin Godfrey
la source
15
J'ai l'impression que vous avez soit codé en dur toutes les lettres, soit utilisé un mathematica intégré ici.
quelqu'un
7
Bon premier défi, BTW!
Arnauld
6
Voici la police fixe (plusieurs autres caractères sont faux).
Arnauld
7
Je ne sais pas si vous vouliez que votre ensemble de test comprenne ou non toutes les lettres de l'alphabet anglais, mais si un fils s'appelle un pangram et que "THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG" n'en est pas un, il manque un "S", si vous le vouliez que ce soit "THEQUICKBROWNFOXJUMPESOVERTHELAZYDOG"
MindSwipe
5
@JonofAllTrades JUMPS est une possibilité. Et vous pouvez perdre deux personnages en changeant l’UN pour A.
Andrew Leach

Réponses:

16

JavaScript (ES6),  103 100 93 92  90 octets

Enregistrement de 9 octets grâce à @ShieruAsakoto

Prend les entrées sous forme de tableau de colonnes. Retourne un tableau de caractères.

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

Essayez-le en ligne!

Arnauld
la source
1
@ShieruAsakoto Merci! La multiplication n'était pas une bonne idée. J'ai sauvegardé 1 octet supplémentaire avec 3 mod's.
Arnauld le
1
Ce sont là quelques gros modulos ... peut-être que vous pouvez les améliorer davantage pour que les -s disparaissent! : D
Erik the Outgolfer
Après une nuit entière de la force brute je suis arrivé 90 avec 4 mods: a=>a.map(s=>"H-L-D--VGQ87MR6TZ-KJ9WC05BUXF1YI2EON3S-A-P4"[parseInt(s,35)%1161%219%152%43]).
Shieru Asakoto
@ShieruAsakoto Malheureusement, la police décrite dans le défi est fausse. En attente d'une éventuelle mise à jour de l'OP.
Arnauld
@Arnauld Pour le fixe, ma progression est maintenant de 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ée , 50 octets

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

Essayez-le en ligne!

Un lien monadique acceptant l’entrée sous forme de liste de colonnes et produisant une chaîne Jelly de la traduction. Explication complète à suivre, mais repose sur le fait que chaque ensemble possible de 5 lettres est unique lorsqu’il est converti en points de code, reconverti de la base 256 en décimal, puis du mod 211.

Alternative utilisant la police fixe d'Arnauld (49 octets et utilisant le même principe.)

Explication

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
la source
7

dzaima / APL, 80 79 73 72 71 octets

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

Essayez-le en ligne!

dzaima
la source
1
Quelles sont les particularités de votre APL?
Jonah
2
@Jonah Ici, la seule chose utilisée est (similaire à {⍵[⍺]}), mis à part cela, ces deux fichiers contiennent des informations à son sujet
dzaima
6

05AB1E , 45 44 octets

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

Essayez-le en ligne!

Prend l'entrée en tant que tableau de colonnes et génère un tableau de caractères.

Explication:

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
Grimmy
la source
6

R , 143 128 octets

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

Essayez-le en ligne!

Fonction prenant un vecteur de chaînes (correspondant aux colonnes) en entrée, par exemple:

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

Explication:

Effectuer l'opération suivante pour chaque chaîne codée (par exemple, '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  /

on obtient la chaîne suivante à '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'laquelle correspond chaque caractère '0123456789ABCDEFGHIJKLMNOPQR'.

Ainsi, le code effectue les opérations décrites sur les chaînes d'entrée, puis recherche leurs correspondances dans l' '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'obtention des positions dans la chaîne '0123456789ABCDEFGHIJKLMNOPQR'.

digEmAll
la source
Cela semble intelligent, mais comment utiliser le code n'est pas clair: que dois-je transmettre à la fonction? Une liste de vecteurs de caractères et un vecteur simple échouent avec un «argument non conforme». Il en va de même pour une matrice de caractères.
Konrad Rudolph
@ KonradRudolph: ajout d'une explication minimale de l'entrée (et modification du TIO afin d'être plus explicite). Dès que je pourrai, j'ajouterai une explication du code, qui, je suis sûr, peut être améliorée en trouvant une autre fonction de "hachage" pour les chaînes renvoyant des valeurs dans la plage ASCII au lieu d'unicode ...
digEmAll
@ digEmAll ouais j'ai joué avec la modification des chiffres vers un nombre plus raisonnable de caractères distincts mais rien pour l'instant
Giuseppe
@digEmAll Ah ça marche (j'avais les données en col-majeur plutôt qu'en ligne), mais votre exemple donne "HEKKN", pas "HELLO". Je suis très confus que cela semble fonctionner sur TIO. Encodage différent (non UTF-8), je suppose.
Konrad Rudolph
1
@ KonradRudolph: ajout d'une brève explication (et un code plus court trouvé);)
digEmAll
3

Charbon de bois , 66 octets

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

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Prend les entrées sous forme de liste de colonnes terminées par une ligne vide. Explication:

WS

Entrer des chaînes jusqu'à ce qu'une soit vide.

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

Index cycliquement dans la chaîne OV EX8HSCF5IA L TG 17 M P9RB 4 K ZY2 0JW 63Q ND Uqui (avec l'espace de fin) contient 56 caractères.

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

Effectuez une conversion en base 7 à l'aide de l'alphabet WMYCBGR, puis réduisez-la successivement modulo 360, 113, 71 et 56 implicitement via l'indexation cyclique.

Mon approche de base 7 a vraiment mal fonctionné avec la police fixe de @ Arnauld; après quelques recherches, j'étais encore à 73 octets. En utilisant l'approche de @ Grimy, réduisez ce nombre à 67 octets. Cependant, j'ai finalement trouvé une solution de 66 octets:

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

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:

WS

Entrer des chaînes jusqu'à ce qu'une soit vide.

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

Indexer cycliquement dans la chaîne de ID HAM178 VS4F 3R EP6CQ Z UB O 0 X 9 G 5TNJKL2Y W63 caractères.

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

Effectuez une conversion en base 47 en utilisant l’alphabet 0-9A-Za-k, puis réduisez-la successivement modulo 237, 73, 67 et 63 de manière implicite via l’indexation cyclique.

Neil
la source
2

CJam (63 octets)

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

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

Il s'agit d'un bloc anonyme (fonction) qui attend une entrée sous forme de liste de colonnes. Démo en ligne .

Comme beaucoup d’autres réponses, il s’agit d’une conversion de base suivie d’une chaîne de% pour obtenir une table de correspondance courte. Dans ce cas, j'utilise la base 16 et la chaîne% [245 225 214 197 159 123 97 40].

Peter Taylor
la source
2

Gelée , 48 octets

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

Un lien monadique acceptant une liste de listes de caractères majuscules (chacun étant une colonne) qui produit une liste de caractères.

Essayez-le en ligne!

Comment?

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
la source
1

Ruby , 109 octets

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

Essayez-le en ligne!

Level River St
la source
1

Stax , 46 octets

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

Exécuter et déboguer

Chaque colonne est décodée en base 36. Des modules successifs de 8273, puis 95 sont appliqués. Cela donne un nombre unique, recherché dans une chaîne fixe.

Il prend les entrées exactement dans le format spécifié dans les exemples et doit les transposer pour obtenir des colonnes. Je pourrai sauvegarder des octets en utilisant différents formats d’entrée, ce que je pourrai faire à un moment donné.

récursif
la source