1. C# / Говнокод #6958

    +129

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    public void ReadFromFile()
    {
    	LoadIntervals = new TimeIntervals(Color.Black);
    	StreamReader tReader = null;
    	tReader = File.OpenText("DefaultIntervals");
    	string income = null;
    	while ((income = tReader.ReadLine()) != null)
    	{
    		// string income = tReader.ReadLine();
    		string colorR = null; string colorG = null; string colorB = null; string colorA = null; string interval = null;
    		int i = 0;
    		for (i = 4; i < income.Length; i++)
    		{
    			if (income[i] != ',')
    			{
    
    				interval += income[i];
    			}
    			else { break; }
    		}
    
    		for (int a = i + 10; a < income.Length; a++)
    		{
    			if (income[a] != ',')
    			{
    				colorA += income[a];
    			}
    			else
    			{
    
    				for (int r = a + 4; r < income.Length; r++)
    				{
    					if (income[r] != ',')
    					{
    						colorR += income[r];
    					}
    					else
    					{
    						for (int g = r + 4; g < income.Length; g++)
    							if (income[g] != ',')
    							{
    								colorG += income[g];
    							}
    							else
    							{
    								for (int b = g + 4; b < income.Length; b++)
    									if (income[b] != ',')
    									{
    										if (income[b] != ']')
    											colorB += income[b];
    									}
    									else
    									{
    										break;
    									}
    								break;
    							}
    						break;
    					}
    				}
    				break;
    			}
    		}
    		TimePoint tp = new TimePoint(Convert.ToDouble(interval), Color.FromArgb(Convert.ToInt32(colorA), Color.FromArgb(Convert.ToInt32(colorR), Convert.ToInt32(colorG), Convert.ToInt32(colorB))));
    		LoadIntervals.Add(tp);
    	}
    
    	tReader.Close();
    	Intervals = LoadIntervals;
    }

    Так мы парсим файл конфигов вида. (Формат придуман автором кода)
    Int=3,Color [A=223, R=253, G=4, B=38]
    Int=10,Color [A=255, R=86, G=86, B=185]
    Int=20,Color [A=200, R=255, G=215, B=0]
    Int=50,Color [A=200, R=255, G=165, B=0]

    Запостил: lomomike, 15 Июня 2011

    Комментарии (49) RSS

    • А в чем говнокод????
      Ответить
      • Я бы юзал совсем другой подход
        Ответить
        • Разве может быть другой подход???
          Ответить
          • прям стихоплеты
            Ответить
            • на этот говнокод
              даже мой кот
              нашел бы подход
              совсем наоборот.
              вот.
              Ответить
              • Вот это поворот!
                Твой кот не идиот!
                Он знает наперёд,
                Чем плох тот говнокод!
                Вот.
                Ответить
                • ты знаешь, что кот
                  читает мануал задом-наперед.
                  Это и есть котячий подход.
                  Вот.
                  Ответить
      • я хз, есть же xml. Даже парсить не нужно.
        Ответить
        • или хотя бы csv, объем даже меньше будет, чем на данный момент. А еще можно применить 16сс для записи цветов - моментально экономия по 1-2 (1-2-4 байта на одном цвете). Короче - выгоните наф его.
          Ответить
    • 3\t223\t253\t4\t38\n
      Кот К.О.
      Ответить
      • ^Int=(\d+),Color \[A=(\d+), R=(\d+), ?G=(\d+), B=(\d+)\]$
        http://www.rubular.com/r/fZJqkh9dRE
        Ваш О.К.
        Ответить
        • Уважаемый Кэп, соизмерь размеры файлов, только в варианте автора не забывай добавлять в каждой строке к размеру полезной информации len("Int=,Color[A=,R=,G=,B=]") байт, а в предложенной len('\t')*5 + len('\n') байт. А если в перспективе хранение в БД и/или передача по сети?
          Ответить
          • Вы оба правы. Для этой конкретной задачи вероятно достаточно было бы DSV (delimiter separated values), но формат-то уже задан извне и его нужно парсить (независимо от тараканов в голове автора формата). Парсить регэкспами нетривиальные строки проще всего (для DSV и регэкспы не нужны).
            Ответить
      • Почитайте про Huffman'а и про алгоритмы определяющие ненужность, префиксные деревья и что с ними связано. Исходя из записи формата придуманной автором тяжело сказать, что именно имлось в виду под int=\d+ сколько именно дейсятичных (и десятичных ли) знаков собирался автор парсить. Но вообще, вполне можно было обойтись более традиционной записью вида: /[A-F\d]{8}\d+/i для того, чтобы описать во вполне удобном для человеческого восприятия формате. 9 случаев из 256, когда ведущий ноль будет не нужен или 1 случай из 256, когда оба ведущие нули будут не нужны - значительно меньшее "зло", чем дописывать "разделители" между всеми "префиксами".
        Ответить
        • >во вполне удобном для человеческого восприятия формате

          Int-----A-----R------G-----B
          3------223---253----4------38
          10-----255---86-----86----185
          20-----200---255----215---0
          ...
          /* "-" -- вместо табов, местные в курсе*/

          >сколько именно дейсятичных
          все, от текущей позиции, до первого разделителя(К.О.)
          Ответить
          • Вы все-таки прочитайте, там интерсно, честно :)
            И это, как вы собираетесь обрабатывать 9034582340980958342309883945703498752304 58732094587230458237049587 числа, капитан?
            Ответить
            • Прочитаю обязательно, тем более такую литературу.

              >903458234098095834230988394570349875230 4 58732094587230458237049587
              http://en.wikipedia.org/wiki/Integer_(computer_science)
              Значения «на пример» взято _из_математики_ не связанной с конкретной платформой?
              Или что-то не до понял?

              P.S. '\t' — табуляция, если чё. Выполняет роль разделителя значений и визуального разграничителя при редактировании в рукопашную. Ваш К.О.
              Ответить
              • В том то все и дело, что разделители - лишние, и я как бы это и пытаюсь сказать :)
                Ответить
                • >разделители - лишние
                  Вон оно чё, Кэп. Это ты хитро задумал.
                  А так: 0x30xE90xFD0x40x26
                  читать поток порциями по 4-ре.
                  Ответить
                • Не лишние. А Хаффмана нам обеспечит gzip, если надо.
                  Ответить
                  • Я думаю, вы со мной согласитесь, что версталщики веб страниц - люди высокоинтеллигентные и поэтому ориентироваться на них не стоит. Или может не согласитесь? Но вот их не смущает, что цвет записывается как, например, #a85c22. А если они немного работали с форматами, где цвет может указываться как ARGB (например Flash), то и такая запись их не поставит в тупик: #ffa85c22. Хаффманa вам нужно было прочитать, и понять теорию. Теория она одинакова, как для компьютеров, так и для людей. Людям ровно на столько же не нужна избыточная информация, как и компьютерам. И от того, что вы добавите в файл несколько ненужных знаков, а потом его заархивируете - ну, не знаю. Если файл маленький, то, скорее всего, вы просто зря потеряете время т.как файл только увеличится в размере (таблицу соответсвий алфавитов тоже надо где-то хранить)... Если большой, то, опять же, использовав более короткую запись вы, особенно в данном случае, получите меньший алфавит, что приведет к лучшему уровню сжатия. Так что, блин, теорию нужно знать, а не только уметь использовать доступные инструменты...
                    Ответить
                    • К чему всё это?
                      Ответить
                      • Вы говорите, что разделители не лишние. В сообщении выше, я говорю, что вы ошибаетесь.
                        Если аргументы были не понятны, или недостаточно убедительны, то, можно упростить. Ни один человек, сколько бы он художественных академий ни закончил не в состоянии предствить цвет записаный в виде R=\d+, G=\d+, B=\d+ потому, что в отличие, скажем, от нот, эти значения не соответствуют каким-то реальным цветам / не представляют полный видимый спектр. Это условности компьютерной графики, и они всегда относительны, т.е. зависят от устройства вывода. Таким образом, записав "цвет" в таком виде вы оказываете медвежью услугу пользователю, которому прийдется несколько раз скопировать числа, чтобы в программе, которая может показать цвет, эти числа приобрели какое-то значение. Если бы это было одно число, тогда операций нужно было бы делать меньше. С другой стороны, очень многие программы работающие с графикой предпочитают получать цвета, как одно число, а не набор из чисел (так их удобнее складывать, например).
                        С еще одной стороны, если вы будете использовать разделители, которые, по моему мнению избыточны, вы увеличите количество слов в алфавите ввода (т.как сейчас у нас есть ограниченный алфавит ввода, и в нем отсутсвуют символы-разделители) таким образом добавив ничем не мотивированые излишества. Это не может позитивно отразится на работе программы-компрессора, т.как чем больше символов в исходном алфавите, тем хуже будет степень сжатия...
                        Ответить
                        • > как чем больше символов в исходном алфавите
                          именно над этим и работал Хаффман.
                          Ответить
                          • Покажите пример на практике, когда картинка закрашенная одним цветом после сжатия будет больше сжатой картинки такого же размера покрашенной во все цвета радуги? Естественно предполагается использовать один и тот же алгоритм.
                            Ответить
                            • разделитель по определению будет иметь самую высокую частоту. следовательно, будет закодирован по Хаффману самой короткой последовательностью бит, а именно 1 шт
                              Ответить
                              • Ну и что? А если бы его не было, то не был бы закодирован никак, т.е. 0 бит. Вы не понимаете разницу - если он работал над проблемой, это не значит, что он ее решил так, что обратное стало правильным. Идея была в том, чтобы обнаружить избыточную информацию и ее минимизировать, но если вы добавите избыточную информацию, вы не сделаете работу алгоритма эффективнее. Пожалуйста, не будте голословны, это и к gegMOPO4 обращение. Приведите пример, о котором я говорил в предыдущем сообщении, и я признаюсь, что был не прав.
                                Ответить
                                • запрос был глупый и направлен на то, чтобы довести до абсурда.
                                  мне лень читать стены текста выше, поэтому отмечу, что битоёбство по Хаффману является экстремальной формой байтоёбства, а байтоёбы в 95% случаев не правы.
                                  Ответить
                                  • Круто :) Все не правы потому что не осилил.
                                    Ответить
                                    • кто-то слишком развёрнуто излагает :-Р
                                      Ответить
                                      • >кто-то слишком развёрнуто излагает :-Р
                                        а тема, между прочим, про сжатие
                                        Ответить
                                • код Хаффмана является оптимальным префиксным.
                                  префиксным (p-code) - значит, разделители не нужны
                                  оптимальным - значит, что количество закодированной информации = энтропии, иначе говоря, не является избыточным
                                  Ответить
                        • Слишком много слов. Попробуйте тезисно.

                          Пассажи насчёт цветов и нот опускаю (хотя они и не совсем верны, мягко говоря, но зачем нам флейм?).

                          Вы зачем-то используете «мусорный» префикс #. Да ещё и алфавит увеличиваете буквами от A до F. Это по Хаффману?

                          Если вы прочитаете следующие главы после Хаффмана, то увидите, что алгоритмы сжатия не ограничиваются Хаффманом уже более 30 лет. Рулят словарные, марковские и т.п. алгоритмы, основанные на предсказании более крупных, чем один символ, последовательностей (а код Хаффмана или арифметическое кодирование потом просто сглаживают углы). Также прочитайте про избыточность и зачем она нужна. Ну и ещё про сложность по Чебышеву.

                          P.S. К слову сказать, я предпочитаю в конфигурационном файле хранить цвета в формате #XXXXXX. Но совсем не по тем причинам, и это не имеет никакого отношения к данной теме.
                          Ответить
                  • > А Хаффмана нам обеспечит gzip, если надо.
                    Это ж уэб-приматы. Науке неизвестно почему, но они не признают фич протокола HTTP и всегда стремятся изобрести что-то своё.
                    Ответить
            • map( int,  in.readline().trim().split() )
              Ответить
              • А с чего вы взяли, что это допустимое значение? Я бы например сигналил ошибку, если число не вписывается в машинное слово. И вы меня не убедите, что тихо прочитать, практически наверняка неверно заданое значение лучше. Ну не с точки зрения пользователя этой программы, который по описанию является человеком, и который, следовательно, будет допускать ошибки в файлах настроек.
                Ответить
                • Я ни с чего не взял, поскольку не знаю, какие значения допустимы. Проверка входных данных на допустимость и адекватное реагирование на это — отдельная история, это уровнем выше.
                  Ответить
    • >(Формат придуман автором кода)
      А корешок проблемы-то - вот он.
      Ответить
    • Ну вы и говнокодеры.
      Ответить
    • Почитал обсуждение. Вспомнил форматы конфигов, которые изобретал сам когда-то. Покраснел... -_-"
      Ответить
      • Правильнее говорить: по-
        Int=50,Color [A=0, R=255, G=0, B=0]
        Ответить
    • Regexp юзать можно же, нет?
      Ответить
      • Юзать можно все что угодно) Условие никак не оговаривает процесс решения)
        Ответить
        • я вон там выше написал http://govnokod.ru/6958#comment98110
          Ответить
          • Да-да, уже прочитал)
            Вы правы: и xml, и csv намного лучше.
            На самом деле код уже давно переписан и потерял свою говнистость)
            Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий