LINUX.ORG.RU

Вышла первая версия вопросника

 ,


1

1

questions - задавай вопросы считывая их из файла.
Нужно подготовить файл, первый символ обозначает какая это строка
Также можно в строке написать символ '\n', он в выводе отобразится как новая строка.

  • `#` - символ комментария ( после этого символа можно оставить комментарий )
  • `?` - символ вопроса ( после этого символа можно задать вопрос )
  • `>` - символ ответа ( с этой строкой будет сравниваться ваш ответ )
  • `<` - символ ошибки ( строка отобразиться при неправильном ответе )
  • `!` - символ восклицания ( сообщение при правильном ответе )
  • `$` - символ доллара ( какое нибудь информационное сообщение )
  • `@` - символ собачка ( служит завершением над заданием )

Подробности

Перемещено maxcom из opensource

Ответ на: комментарий от Deleted

Мне абсолютно всё равно из каких времён какие инструменты. В возрасте 2-х лет я изучил буквы русского языка. В точно таком же виде они присутствуют и в KOI8-R. И для моих задач это как раз то, что нужно.

К железу у меня аналогичный подход - взять и юзать пока работает.

saahriktu ★★★★★
()
Ответ на: комментарий от anonymous

Как здорово, что @saahriktu добавил поддержку koi-8. По факту это единственная нормальная кодировка для русскоязычных пользователей ЭВМ.

anonymous
()
Ответ на: комментарий от i-rinat

Художника каждый, конечно, обидеть может. Но когда тебе понадобится, то ты ещё вспомнишь про эту программу. Скучно ему.

Ладно, вот тебе биндинги, если они тебе так нужны:

#   
#   true bindings to https://github.com/xverizex/questions
#   v. 0.0 alpha NOT TESTED!!!     Dec 2, 2016
#   
#   question - вопросник. задавай вопросы считывая их из файла.
#   
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 3, or (at your option)
#   any later version.
#   
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY of FITNESS for A PARTICULAR PURPOSE. See the
#   GNU General Public License for more details.
#   
#   You should have received a copy of the GNU General Public License
#   along with this program. If not, see <http://www.gnu.org/licenses/>.
#   
from ctypes import CDLL
proc = lambda n: CDLL('/lib/questions.so').proc(bytes(n))

Пока тоже альфа. Ещё даже не тестировал, времени нет. Только пересобери оригинальную программу с -shared -fPIC -o questions.so, а то не забиндится.

anonymous
()
Ответ на: комментарий от anonymous

Какой диск? Локально ничего перекодировать не нужно. В том и смысл чтобы при локали KOI8-R держать файлы в KOI8-R.

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

Ну вот ты сейчас прогу переделал, потом скачаешь текст какой-нибудь - перекодировать надо, большинство же в utf-8.

anonymous
()
Ответ на: комментарий от saahriktu

Я понимаю, но реально же, лишний гемор с околонулевым профитом. Купи диск, если места не хватает и забудь уже о кодировках, как все нормальные люди.

anonymous
()

Бардак в code-style и самом коде, игнор стандартов, комментарии на русском.

Мммм...

reprimand ★★★★★
()
Ответ на: комментарий от anonymous

Каждый сам решает где у него есть профиты, а где - нет. Суть в простоте однобайтной кодировки, а не, якобы, нехватке дискового пространства. У меня внешний жёсткий диск на 5 маркетологических терабайт. А для переноса своей коллекции текстовых файлов на Raspberry Pi я недавно приобрёл флэшку на 256 маркетологических гигабайт за 6 тыс. р.

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

А что толку с этой простоты? Ты эти тексты обрабатывать собираешься? При хранении в архивах там еще меньше разница с utf-8, 1.5 емнип примерно.

anonymous
()
Ответ на: комментарий от anonymous

Как «что толку»? Здесь другая связь. Не локаль KOI8-R для текстов в KOI8-R, а тексты в KOI8-R потому, что локаль KOI8-R.

saahriktu ★★★★★
()
Ответ на: комментарий от anonymous

У меня вышло 1.13. Это если весь текст кириллицей. Но, думаю, у saahriktu кириллицы в его коллекции текстовых файлов не 100%.

anonymous
()
Ответ на: комментарий от saahriktu

только не говори, что локаль тебе труднее сменить, чем проги переписывать да тексты перекодировать

anonymous
()
Ответ на: комментарий от anonymous

ну тем более... фанатизм чистой воды...

anonymous
()
Ответ на: комментарий от anonymous

Но зачем? Тем более когда в шрифте всего 256 символов. Ограничения ядра Linux, про которые впервые было явно написано в исходниках ядра в ядре 2.5.36 (сентябрь 2002-го года). С тех пор разработчики ядра ничего не хотят менять. А пока они не поменяют и я ничего менять не собираюсь.

saahriktu ★★★★★
()
Ответ на: комментарий от EXL

Если тебе не сложно, то, пажалуйста, напеши пач, добавлю в кодовую базу. Мне пока некогда, надо песать коментарии на лоре. Спасибо.

anonymous
()
Ответ на: комментарий от Deleted

Это встроенный транслит, кириллические символы превращаются в латинские при обнулении старшего бита

anonymous
()
Ответ на: комментарий от Deleted

Нет никаких проблем с сортировкой:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// карта символов
int mycharorder[] = { 64, 33, 34, 56, 37, 38, 54, 36, 55, 42, 43, 44, 45, 46,
        47, 48, 49, 65, 50, 51, 52, 53, 40, 35, 62, 61, 41, 58, 63, 59, 57, 60,
        31, 0, 1, 23, 4, 5, 21, 3, 22, 9, 10, 11, 12, 13, 14, 15, 16, 32, 17,
        18, 19, 20, 7, 2, 29, 28, 8, 25, 30, 26, 24, 27
};

// получение веса символов из карты
int getcwght(int mc)
{
        if (mc > -65 && mc < 0) {
                return mycharorder[mc + 64];
        } else
                // сортируем только кириллицу
                return -1;
}

int main(int argc, char **argv)
{
        if (argc < 3)
                // одну строку и меньше не сортируем
                return 1;
        int *sordr,             // массив указателей (индексов) на сортируемые строки
        *cwlist,                // массив "веса" сортируемых символов
        i, j, k,                // переменные циклов
        s,                      // swap
        eoas,                   // End Of A Strings (как EOF, но для строк)
        cci = -1,               // Current Char Index - индекс текущих сортируемых символов
        pccf;                   // флаг несовпадения предыдущих символов в строках
        // создание динамических массивов
        sordr = (int *)malloc(sizeof(int) * (argc - 1));
        cwlist = (int *)malloc(sizeof(int) * (argc - 1));
        // бесконечный цикл
        for (;;) {
                // переход к следующим символам
                cci++;
                // поднимаем флаг конца строк
                eoas = 1;
                // проверяем строки
                for (i = 1; i < argc; i++) {
                        if (cci < (strlen(argv[i]) + 1)) {
                                // если текущий индекс символов меньше чем символов в строке, то опускаем флаг
                                eoas = 0;
                                break;
                        }
                }
                // если строки закончились, то выходим из бесконечного цикла
                if (eoas)
                        break;
                // заполняем массивы данными для сортировки
                for (i = 0; i < argc - 1; i++) {
                        // при первом проходе заполняем по полной
                        if (cci == 0) {
                                sordr[i] = i + 1;
                                if (cci < (strlen(argv[i + 1]) + 1))
                                        cwlist[i] = getcwght(argv[i + 1][cci]);
                                else
                                        cwlist[i] = -2;
                        } else {
                                // при последующих проходах трогаем только массив веса символов
                                if (cci < (strlen(argv[sordr[i]]) + 1))
                                        cwlist[i] =
                                            getcwght(argv[sordr[i]][cci]);
                                else
                                        // при достижении конца строки не просто не сортируем, но совсем не сортируем
                                        cwlist[i] = -2;
                       }
                }
                // циклы сортировки
                // начинаем двигаться с конца массива к началу
                for (i = argc - 2; i > 0; i--)
                        // и одновременно от начала
                        for (j = 0; j < i; j++) {
                                // если хотя бы один из 2-х символов совсем несортируем, то
                                // ничего не трогаем и идём к следующей итерации
                                if (cwlist[i] == -2 || cwlist[j] == -2)
                                        continue;
                                // а вот если символы сортируемы и они не начальные, то
                                // проверяем совпадают ли в строках символы до них
                                if (cci > 0) {
                                        pccf = 0;
                                        for (k = 0; k < cci; k++)
                                                if (argv[sordr[i]][k] !=
                                                    argv[sordr[j]][k])
                                                        pccf = 1;
                                        // не совпадают - к следующей итерации
                                        if (pccf)
                                                continue;
                                }
                                // если всё в порядке и вес символа левее больше
                                if (cwlist[i] < cwlist[j]) {
                                        // переставляем местами элементы массивов с соответствующими индексами
                                        // переставляем строки
                                        s = sordr[i];
                                        sordr[i] = sordr[j];
                                        sordr[j] = s;
                                        // а вес сортируемых символов теперь не соответствует
                                        // новому расположению строк, исправляем
                                        s = cwlist[i];
                                        cwlist[i] = cwlist[j];
                                        cwlist[j] = s;
                                        continue;
                                }
                        }
        }
        // после бесконечного цикла выводим результат сортировки
        for (i = 0; i < argc - 1; i++) {
                puts(argv[sordr[i]]);
        }
        // и освобождаем память
        free(sordr);
        free(cwlist);
        // сообщаем шеллу что всё ок и выходим
        return 0;
}
> ./ffsort2 Шевцов Петров Сыромякин Иванов Пятаков Абрамов Ершов Сидоров Ершин Кузнецов Абдулов
Абдулов
Абрамов
Ершин
Ершов
Иванов
Кузнецов
Петров
Пятаков
Сидоров
Сыромякин
Шевцов

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

Ну ты увлёкся. Раз уж так, мог просто напомнить про карты символов, получение нового сдвига по старому и заюзать strcmp. Хотя карта потребовалась бы на все символы, да.

Тьфу, я извращенец. Забыл, что в strcmp не передаётся компаратор.

Deleted
()
Последнее исправление: merhalak (всего исправлений: 3)

Функции на 350+ строк, куча копипасты, о DRY не слышали, goto для логики.
Жесть.

mersinvald ★★★★★
()
Ответ на: комментарий от saahriktu

Для локального хранения и обработки информации стандартизованные кодировки не нужны. Нужна локальная, которая удобна пользователю. И KOI8-R в этом смысле — где-то так хуже всех остальных известных, поддерживающих кириллицу. (Ой, что это я? Только русский язык же.)

Другие юниксы, конечно же, есть. Но их в сумме с линуксом тот же один процент. Ну и в «других юниксах» KOI8-R используется уже крайне редко как основная кодировка. Потому что бессмысленно это в 2016 году. Постоянные издержки по перекодированию всего и вся туда-обратно.

Там в коде выводимые сообщения кириллицей, а не в ASCII. Можно перекодировать только в конкретную однобайтную кодировку.

Так помоги автору — сделай по-человечески, с локалью, переводом интерфейса. Ты предлагаешь все программы с поддержкой кириллицы писать в пяти вариантах, для каждой кодировки отдельно?

Только на ЛОРе нас не менее чем 3.

Не каждый пользователь с локалью в KOI8-R немедленно бросается на любую софтину, на которой написано KOI8-R. Или каждый?

TeopeTuK ★★★★
()
Ответ на: комментарий от Deleted

Какой ещё курсовой? Это в школе пишется, классе в 7-ом на уроке информатики.

peregrine ★★★★★
()
Ответ на: комментарий от TeopeTuK

бессмысленно это в 2016 году

Некорректное обобщение. Для кого бессмысленно, а для кого - нет.

Так помоги автору — сделай по-человечески

Делать мне больше нечего. Это его проект, а не мой.

Ты предлагаешь все программы с поддержкой кириллицы писать в пяти вариантах, для каждой кодировки отдельно?

Достаточно в 2-х: для KOI8-R и UTF-8. Но, чаще всего достаточно делать просто англоязычный интерфейс в ASCII.

Не каждый пользователь с локалью в KOI8-R немедленно бросается на любую софтину, на которой написано KOI8-R.

И? Можно же и молча скачать.

saahriktu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.