Тяпничный koi-8r

mayton
Дата: 24.12.2014 04:38:57
Привет.

Еще не пятница ну и ладно.

Пару лет назад я и некто Базист/Студентик спорили о хеш-арреях и пользе их применения и оптимизации.
Я предложил в шутку что для некоторых случаях (преобразования кодовых страниц) мы можем найти
функцию которая отображает некий маппинг (к примеру Win1251=>Utf16) но при этом не содержит
вообще массивов, хеш-таблиц e.t.c. Параноидальное использование switch(){..} тоже как-бе не
приветствуется. Тоесть функция должна иметь 8 булевых входов. x1....x8.
(8 бит имеет разрядность 1 символ Win1251) и 16 булевых выходов y1...y16 по количеству бит
16 разрядного символа выхода. Функция должна обеспечивать отображение Win1251=>Utf16.
Тоесть сам код функции и является данными. Или не существует чётких границ.

Далее - в соответствии с традициями булевой алгебры
следует сделать ряд преобразований и получить некую минимальную форму (минимизировать).

short getUnicode(byte win1251){
   ....
}


Вопрос эффективности предполагаемой минимизации я так до сих пор не решил. Возможно
минимизация вообще не даст результата и функция будет адской мешаниной булевых форм.

Первый сюрприз пришёл от кодировки. 1251 - оказалась скушна и неинтересна.

https://ru.wikipedia.org/wiki/Windows-1251

Интересующие меня символы кириллицы практически линейно отображаются на диапазон 'A'-'Я',
'a'-'я' в Unicode. Достаточно сделать - несколько if и несколько операций сложения. Символы
псевдографики разбросаны по диапазону Unicode достаточно репрезентативно чтобы занятся
оптимизацией но в рамках общей пользы - неинтересны. У меня - мало текстов которые
их вообще используют. Поэтому - поскипаем 1251.

А вот экзотическая и олд-скульная кодировка koi8-r это настоящее ископаемое.

https://ru.wikipedia.org/wiki/КОИ-8

Для нее простым сложением фиг получишь результат. Вобщем попробую решить этот пасьянс.
Заодно освежу свои знания в минимизациях.

Без массивов и хеш-таблиц. И без switch.

До пятницы.
White Owl
Дата: 24.12.2014 05:17:44
mayton
в соответствии с традициями булевой алгебры
следует сделать ряд преобразований и получить некую минимальную форму (минимизировать).
Ничего интересного.
Рисуешь truth table, на входе одна кодировка, на выходе другая.
Потом прогоняешь эту таблицу ну хотя бы через Quine-McCluskey, и получаешь минимальный набор and выражений.
Все.
Много ручной работы и никакой фантазии.
m_Sla
Дата: 24.12.2014 08:02:47
White Owl
...
Много ручной работы и никакой фантазии.
Это точно.
Составить таблицу истинности, потом упрощаем картой Карно.
Схемотехника, раздел Шифраторы/Дешифраторы.
m_Sla
Дата: 24.12.2014 08:17:37
mayton, тут примеры посмотри http://csd.faculty.ifmo.ru/files/karnaugh.pdf
mayton
Дата: 24.12.2014 10:17:06
О уже накидали советов. Да. Для моего варианта размер карточки Карно будет в 128 клеток.
Это с учотом того что нижняя половина кодовой таблицы 1:1 повторяет unicode. Верхняя
интересна. Итого карточка будет размером 16 на 8 клеток. Но этот старый плут Карно...
он упоминал о том что дескыть карточка имеет смысл для 5-6 аргументов. Для большего
количества делать "склейки" уже сложнее. Теряется визуальное преимущество.

Квайн-Маккласски - читаю. Это основной тренд для решения данной задачи.
Anatoly Moskovsky
Дата: 24.12.2014 15:09:33
mayton,

Таблица будет на порядки быстрее работать чем выражения.
Про читаемость кода я вообще молчу.

Тогда в чем смысл?
mayton
Дата: 24.12.2014 15:20:18
Я не ищу лёгких путей.

Кроме того Квайн ждет...
mayton
Дата: 24.12.2014 15:58:37
Вобщем вот что я имею в качестве таблиц истинности. Некоторые символы покоцаны, ну и хрен с ними.
koi8-rUnicodeCharx7..x1y14..y1
802500000000010010100000000
812502000000110010100000010
82250C000001010010100001100
832510000001110010100010000
842514000010010010100010100
852518000010110010100011000
86251C000011010010100011100
872524000011110010100100100
88252C000100010010100101100
892534000100110010100110100
8A253C000101010010100111100
8B2580000101110010110000000
8C2584000110010010110000100
8D2588000110110010110001000
8E258C000111010010110001100
8F2590000111110010110010000
902591001000010010110010001
912592001000110010110010010
922593001001010010110010011
932320001001110001100100000
9425A0001010010010110100000
952219001010110001000011001
96221A001011010001000011010
972248001011110001001001000
982264001100010001001100100
992265001100110001001100101
9A00A0 001101000000010100000
9B2321001101110001100100001
9C00B0°001110000000010110000
9D00B2²001110100000010110010
9E00B7·001111000000010110111
9F00F7÷001111100000011110111
A02550010000010010101010000
A12551010000110010101010001
A22552010001010010101010010
A30451ё010001100010001010001
A42553010010010010101010011
A52554010010110010101010100
A62555010011010010101010101
A72556010011110010101010110
A82557010100010010101010111
A92558010100110010101011000
AA2559010101010010101011001
AB255A010101110010101011010
AC255B010110010010101011011
AD255C010110110010101011100
AE255D010111010010101011101
AF255E010111110010101011110
B0255F011000010010101011111
B12560011000110010101100000
B22561011001010010101100001
B30401Ё011001100010000000001
B42562011010010010101100010
B52563011010110010101100011
B62564011011010010101100100
B72565011011110010101100101
B82566011100010010101100110
B92567011100110010101100111
BA2568011101010010101101000
BB2569011101110010101101001
BC256A011110010010101101010
BD256B011110110010101101011
BE256C011111010010101101100
BF00A9©011111100000010101001
C0044Eю100000000010001001110
C10430а100000100010000110000
C20431б100001000010000110001
C30446ц100001100010001000110
C40434д100010000010000110100
C50435е100010100010000110101
C60444ф100011000010001000100
C70433г100011100010000110011
C80445х100100000010001000101
C90438и100100100010000111000
CA0439й100101000010000111001
CB043Aк100101100010000111010
CC043Bл100110000010000111011
CD043Cм100110100010000111100
CE043Dн100111000010000111101
CF043Eо100111100010000111110
D0043Fп101000000010000111111
D1044Fя101000100010001001111
D20440р101001000010001000000
D30441с101001100010001000001
D40442т101010000010001000010
D50443у101010100010001000011
D60436ж101011000010000110110
D70432в101011100010000110010
D8044Cь101100000010001001100
D9044Bы101100100010001001011
DA0437з101101000010000110111
DB0448ш101101100010001001000
DC044Dэ101110000010001001101
DD0449щ101110100010001001001
DE0447ч101111000010001000111
DF044Aъ101111100010001001010
E0042EЮ110000000010000101110
E10410А110000100010000010000
E20411Б110001000010000010001
E30426Ц110001100010000100110
E40414Д110010000010000010100
E50415Е110010100010000010101
E60424Ф110011000010000100100
E70413Г110011100010000010011
E80425Х110100000010000100101
E90418И110100100010000011000
EA0419Й110101000010000011001
EB041AК110101100010000011010
EC041BЛ110110000010000011011
ED041CМ110110100010000011100
EE041DН110111000010000011101
EF041EО110111100010000011110
F0041FП111000000010000011111
F1042FЯ111000100010000101111
F20420Р111001000010000100000
F30421С111001100010000100001
F40422Т111010000010000100010
F50423У111010100010000100011
F60416Ж111011000010000010110
F70412В111011100010000010010
F8042CЬ111100000010000101100
F9042BЫ111100100010000101011
FA0417З111101000010000010111
FB0428Ш111101100010000101000
FC042DЭ111110000010000101101
FD0429Щ111110100010000101001
FE0427Ч111111000010000100111
FF042AЪ111111100010000101010
mayton
Дата: 24.12.2014 16:00:17
А нет норм. На preview не было видно.
mayton
Дата: 24.12.2014 18:31:10
Вобщем от Карно мозг набекрень может съехать. Тут даже проблема не в том чтобы найти клеящиеся области.
А просто правильно расставить единички в соответствии с кодом Грея. А в исходной таблице этот порядок - иной.
Вобщем шансов стрельнуть в ногу - дофигища.

С Квайном я пока сделал так. Нашёл инструмент который это уже решает. QMC Logic Minimizer.
И в диалоговом режиме загрузил туда табличку. Получил минимизацию.

Пришлось немного поколдовать с адаптацией СДНФ чтобы получить аналогию кода на "C".

Вобщем вот макет. Как-то так должно получится.
Еще не тестил. Возможно он и не работает. Но в любом случае отображение таблицы на булевы вентили
имеет ожидаемый вид.

Предикат f3 - самый компактный из всех других.
f10-f16 будут потолще раза в два.

int getUnicode(int koi8r){

  if (koi8r<128) return koi8r;

  int H=koi8r&0x1;
  koi8r>>=1;
  int G=koi8r&0x1;
  koi8r>>=1;
  int F=koi8r&0x1;
  koi8r>>=1;
  int E=koi8r&0x1;
  koi8r>>=1;
  int D=koi8r&0x1;                                                                                                           
  koi8r>>=1;
  int C=koi8r&0x1;
  koi8r>>=1;
  int B=koi8r&0x1;
  koi8r>>=1;
  int A=koi8r&0x1;

  int f1  =  0;
  int f2  =  0;
  int f3  =  A & ~B & ~F & ~G  |  A & ~B & ~E & F  |  A & ~B & C & ~G  |  A & ~B & C & ~H  |  A & ~B & ~C & ~E  |  A & ~B & ~C & ~F & H  |  A & ~B & ~D & F  |  A & ~B & E & ~F & H  |  A & ~B & ~D & E ;
  int f4  =  0;
  int f5  =  0;
  /* ........... Other f6 - f16 predicates  ............ */

  return f16<<15|f15<<14|f14<<13|f13<<12|f12<<11|f11<<10|f10<<9|f9<<8|f8<<7|f7<<6|f6<<5|f5<<4|f4<<3|f3<<2|f2<<1|f1;

}


По остальным функциям нужно еще поколдновать с заменой но мне уже лениво. Ищу новый идей и имплементаций.