Розбір тексту, написаний шрифтом militext


56

Читання тексту шрифту militext

Існує шрифт тут , що відповідає кожен символ в один, 1x5 пікселів блоку. Це робиться так (припускаючи, що ви використовуєте РК-екран), використовуючи RGB-канали кожного пікселя, щоб розширити один піксель на три підколонки, по одному для кожного каналу. Ваше завдання - взяти рядок тексту, закодованого цим шрифтом, і «розшифрувати» його.

Алфавіт Мільтекст

CHARACTER: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
ENCODING:  WYWBMRRMMMWYWYWWWMWBMRMYGYGYCWMMMMMW
           MGBWMRRMMMMMRMRRRMGBMRWMMMMMRGMMMMMB
           MGWWWWWBWWWYRMWWMWGBYRWMMYMYGGMMWGGG
           MGRBBBMBMBMMRMRRMMGBMRMMMRWMBGMCWMGR
           WWWWBWWBWWMYWYWRWMWWMWMMGRCMYGWBMMGW

Я скоротив кожен колір до одного символу (R = червоний, G = зелений, B = синій, C = блакитний, Y = жовтий, M = пурпурний, W = білий).

Формат введення

Формат введення для цього досить відкритий. Ви можете мати вхідний масив, що містить кожен стовпець, масив, що містить кожен рядок, a char[][]або щось подібне. Ви також можете використовувати повноцінні слова "червоний", "зелений", "синій" з великими / малими літерами на ваш вибір (але це повинно відповідати кожному слову! Ви не можете використовувати "ЧЕРВОНІ", а також робити "зелене" або "Синій").

Якщо ваша мова підтримує її, ви також можете вказати кольори (однак це може спрацювати, я не знаю, як від руки).

Ви можете припустити, що вхід буде ВИНАГО містити закодовані символи в алфавіті вище (зокрема, у вашому висновку не буде пробілів чи розділових знаків).

Формат виводу

Ви можете вивести рядок або якийсь масив символів. Ви можете вибрати, чи букви великі чи малі, але всі вони мають однаковий регістр.

Приклад

MWRRGMGYRY
MRRRMMMMRM
WWRRMWMYRM -> HELLOWORLD
MRRRMWMMRM
MWWWGMGMWY

Правила

Це , тому найкоротша відповідь виграє!

Тестовий набір

WMWGMWWMYYGMYWGMBMMYWYGMWYWMWRWWMYGW
GMRMMGRMMMMMMRMMBMWMRMMMRMGMRRMBMMMR
GWWMMGRYYYMWMWMGBMWYWMMMWYGWWRWGGMMM -> THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG
GMRWMGRMMMMWMRMMBMMRRMMCRMGMRRMRGMMM
GMWCWWWMYMGMMRGMWWMRWYGBWMGMWWMWGYGW

15
Я відчуваю, що ви або твердо кодуєте всі літери, або використовуєте тут вбудовану Mathematica.
хтось

7
Приємний перший виклик, BTW!
Арнольд

6
Ось фіксований шрифт (кілька інших символів помиляються).
Арнольд

7
Я не знаю, чи хотіли ви, щоб ваш тестовий набір включав усі літери з англійського алфавіту чи ні, але якщо син, який називається панграмою, і "THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG" не є одним з пропусків "S", якщо ви хочете, щоб це будь це "THEQUICKBROWNFOXJUMPESOVERTHELAZYDOG"
MindSwipe

5
@JonofAllTrades JUMPS - це можливість. Ви можете втратити двох персонажів, змінивши один із ТЕ на А.
Ендрю Ліч

Відповіді:


16

JavaScript (ES6),  103 100 93 92  90 байт

Збережено 9 байт завдяки @ShieruAsakoto

Приймає введення як масив стовпців. Повертає масив символів.

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

Спробуйте в Інтернеті!


1
@ShieruAsakoto Дякую! Множення не було гарною ідеєю. Я врятував ще 1 байт з 3 модами.
Арнольд

1
Це якісь великі модулі там ... можливо, ви можете вдосконалити їх більше, щоб -зникли! : D
Ерік Аутгольфер

Після цілої ночі грубої сили я отримав 90 з 4 модов: a=>a.map(s=>"H-L-D--VGQ87MR6TZ-KJ9WC05BUXF1YI2EON3S-A-P4"[parseInt(s,35)%1161%219%152%43]).
Шиеру Асакото

@ShieruAsakoto На жаль, описаний у виклику шрифт неправильний. Чекаємо можливого оновлення від ОП.
Арнольд

@Arnauld Для фіксованого мого прогресу зараз є 93:a=>a.map(s=>"UIR-L68N--W-X7B-FH-D-EZ--902-S4M5GJCQT3PKV-A1-YO"[parseInt(s,35)%464%107%99%52])
Шиеру Асакото

9

Желе , 50 байт

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

Спробуйте в Інтернеті!

Монадична посилання, що приймає вхід як список стовпців і виводить рядок Jelly перекладу. Повне пояснення слід, але спирається на той факт, що кожен можливий набір з 5 літер є унікальним при перетворенні в кодові точки, перетвореному назад з базової-256 в десяткову, а потім мод 211.

Альтернативно, використовуючи фіксований шрифт Arnauld (49 байт і використовуючи той же принцип.)

Пояснення

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


6

05AB1E , 45 44 байт

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

Спробуйте в Інтернеті!

Приймає введення як масив стовпців і виводить масив символів.

Пояснення:

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 байт

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

Спробуйте в Інтернеті!

Функція, що приймає вектор рядків (відповідний стовпцям) як вхід, наприклад:

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

Пояснення:

Виконайте наступні операції для кожного кодованого рядка (наприклад, '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  /

ми отримуємо наступний рядок, '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'де кожному символу відповідає '0123456789ABCDEFGHIJKLMNOPQR'.

Отже, код виконує описані операції над вхідними рядками, потім здійснює пошук їх відповідностей всередині '#</Eb=,n9J.M4Z+%*V N[Hd\B?1Oj>KgRYT2'отримання позицій у рядку '0123456789ABCDEFGHIJKLMNOPQR'.


Це виглядає розумно, але незрозуміло, як користуватися кодом: Що я повинен передати функції? Як список векторів символів, так і звичайний вектор виходять з ладу з "невідповідним аргументом". Так само і матриця символів.
Конрад Рудольф

@KonradRudolph: додано мінімальне пояснення вводу (і змінив TIO, щоб бути більш явним). Щойно я можу додати пояснення коду, яке, напевне, можна покращити, знайшовши іншу функцію "хешування" для рядків, що повертають значення в діапазоні ASCII замість Unicode ...
digEmAll

@digEmAll Так, я грав із зменшенням цифр до більш розумного кола чітко виражених символів, але нічого поки
Джузеппе

@digEmAll Ах, це працює (я мав дані як кол-мажор, а не рядкові), але ваш приклад призводить до "HEKKN", а не "HELLO". Я дуже розгублений, що, здається, працює над TIO. Думаю, різні (не UTF-8) кодування.
Конрад Рудольф

1
@KonradRudolph: додав коротке пояснення (і знайшов коротший код);)
digEmAll

3

Вугілля деревне , 66 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Вводиться як список списку стовпців, що закінчується порожнім рядком. Пояснення:

WS

Введіть рядки, поки один не буде порожнім.

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

Циклічно вказуйте на рядок, OV EX8HSCF5IA L TG 17 M P9RB 4 K ZY2 0JW 63Q ND Uякий (з пробілом) становить 56 символів.

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

Виконайте перетворення бази-7, використовуючи алфавіт, WMYCBGRа потім послідовно зменшуйте модуль 360, 113, 71 та 56 неявно за допомогою циклічного індексування.

У моєму підході на базі 7 дуже погано вийшло фіксованим шрифтом @ Arnauld; після деяких пошуків я все ще був у 73 байти. Використовуючи підхід @ Grimy, скоротити це до 67 байт. Однак я врешті відшукав 66-байтне рішення:

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

Спробуйте в Інтернеті!Посилання на багатослівну версію коду. Пояснення:

WS

Введіть рядки, поки один не буде порожнім.

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

Циклічно вказують на рядок ID HAM178 VS4F 3R EP6CQ Z UB O 0 X 9 G 5TNJKL2Y W довжиною 63 символи.

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

Проведіть перетворення base-47 за допомогою алфавіту, 0-9A-Za-kа потім послідовно зменшуйте модуль 237, 73, 67 та 63 за допомогою циклічного індексування.


2

CJam (63 байти)

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

або у форматі 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+=}%}

Це анонімний блок (функція), який очікує введення у вигляді списку стовпців. Інтернет демо .

Як і багато інших відповідей, це робить базове перетворення з подальшим ланцюжком%, щоб отримати коротку таблицю пошуку. У цьому випадку я використовую основу 16 і% ланцюга [245 225 214 197 159 123 97 40].


2

Желе , 48 байт

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


1

Стакс , 46 байт

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

Запустіть і налагоджуйте його

Кожен стовпець розшифровується як база-36. Застосовуються послідовні модулі 8273, потім 95. Це дає унікальне число, підкреслене у фіксованому рядку.

Він приймає введення точно у форматі, зазначеному в прикладах, і повинен перенести їх, щоб отримати стовпці. Я зможу зберегти деякі байти, використовуючи якийсь інший формат введення, що я можу зробити в якийсь момент.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.