Разбор текста написан миллитекстовым шрифтом


56

Чтение текста миллитекстового шрифта

Существует шрифт здесь , что соответствует каждый символ в один 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
Хороший первый вызов, кстати!
Арно

6
Вот фиксированный шрифт (некоторые другие символы неверны).
Арно

7
Я не знаю, хотели ли вы, чтобы ваш тестовый набор включал в себя все буквы из английского алфавита или нет, но если сын, который называется панграммой и "THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOG", не является тем, что в нем отсутствует буква "S", если вы хотите, чтобы он будь то «THE QUICKBROWNFOXJUMPESOVERTHELAZYDOG»
MindSwipe

5
@JonofAllTrades JUMPS - это возможность. И вы можете потерять два символа, изменив один из них на A.
Эндрю Лич,

Ответы:


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
Эрик Outgolfer

После целой ночи грубой силы я получил 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.

Альтернатива с использованием фиксированного шрифта Арно (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

7

dzaima / APL, 80 79 73 72 71 байт

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

Попробуйте онлайн!


1
какие особенности есть в вашем APL?
Иона

2
@Jonah Здесь единственная используемая вещь (похожая {⍵[⍺]}), кроме этого, эти два файла содержат информацию об этом
dzaima

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 вместо юникода ...
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³⁶⁰¦¹¹³¦⁷¹

Выполните преобразование base-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

Stax , 46 байт

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

Запустите и отладьте его

Каждый столбец декодируется как base-36. Последовательный модуль 8273, затем применяется 95. Это дает уникальный номер, ищется в фиксированной строке.

Он принимает данные точно в формате, указанном в примерах, и должен транспонировать их, чтобы получить столбцы. Я смогу сохранить несколько байтов, используя другой формат ввода, что я могу сделать в какой-то момент.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.