LINUX.ORG.RU

Наноконкурс по Си :)

 , ,


4

2

Вдохновленный подобным запилю свой маленький топик :) В 2010, читая Седжвика, увидел такую задачу:

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

Проще некуда, ведь правда?

Для ее решения был накрапан такой быдлокод

#include <iostream>
#include <unistd.h>
#include <string.h>

using namespace std;

int main(int argc, char* argv[])
{ const int N = 255;
  const unsigned int sz = 26;
  static int l = 0;
  const char alf[sz]={'a','b','c','d','e','f','g','h','i','j','k','l','m',
						 'n','o','p','q','r','s','t','u','w','x','y','z'};
  int index[sz];
  char str[N];
   for (int i = 0; i < sz;i++)
   {index[i] = 0;
   }
   cin >> str;
   cout <<'\n';
   for ( unsigned int j = 0; j < (strlen(str));j++)
   {   if(str[j] < 0x61)
	   str[j] = _tolower(str[j]);
	 for (int k = 0; k < sz;k++){
		 if (str[j] == alf[k]) index[k]++;}  
   }
    cout <<'\t';
	for(int l = 0; l < sz;l++)
	  if (index[l]) { 
		  cout << alf[l] <<" ";
		  cout << index[l] <<'\n' <<'\t';
	  } 
	sleep(7);
   return 0;
}
Тут правда табуляции корежать линуксовый терминал, немного, но тогда дело было под оффтопом. Из того, что хотелось бы улучшить, например, чтобы программа выводила еще и позицию заданного символа от начала строки.

Короче, принимаются ваши красивые решения господа, а также коменты Царя, про мою тотальную АНскильность, хроническое НИасиляторство и даунизм. You are welcome!

★★★★★

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

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

Нет, он сам добавляет return 0 в main, если не указано иного. Серьёзно забавно, даже -Weverything не пикнет ничего.

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

Это чегой то?! Хаскель? У топика вроде же тег Си, еритик :) А Вы мне тут свою Утопику :)

вот и появилось поколение, не помнящее лавсана и не узнающее борщелисп в лицо

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

И я о том же. Но, поскольку,сам явно затупил с вводом, свою претензию снимаю. Вариант принимается. Вроде и компактный и читабельный. Спасибо.

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

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

Eddy_Em ☆☆☆☆☆
()

Э.

[ io:format("~c ~p~n", [C, N]) ||
    {C, N} <- dict:to_list(
                lists:foldl(
                  fun(C, A) -> dict:update_counter(C, 1, A) end,
                  dict:new(),
                  hd(element(2, io:fread("", "~s\n"))))) ]

lovesan ★★
()
Ответ на: комментарий от Eddy_Em
~ > echo $LANG
ru_RU.UTF-8
~ > echo 'Хрюникод? LOL 探求者は' | ./a.out
l:     2 **************
o:     1 *******

Единственная возможная проблема: переполнение int.

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

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

Такие вот хотелки :)

Twissel ★★★★★
() автор топика

на крестах принимается?

#include <iostream>
#include <map>

int main(int argc, char *argv[]) {
	std::map<char, size_t> m;

	for (auto i : std::string(argv[1]))
		++m[i];

	for (auto i : m)
		std::cout << i.first << " = " << i.second << std::endl;
}

vvviperrr ★★★★★
()
Последнее исправление: vvviperrr (всего исправлений: 1)

Что же я думаю, что условное первое место можно отдать двум людям:

  • val-amart за юникс-вей, конечно :)
  • mix_mix за читабельность и компактность;

Второе

  • Eddy_Em - за то, что решил задачу первым и реализовал хотелку с позицией символа

Третье

  • Reiner
  • qulinxao - за своеобразное решение и интересные исторические факты.

Спасибо всем, кто откликнулся и поучаствовал в этом капустнике :)

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

А это решение запишем как самое современное.

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

Да я Лисп от Хаскеля не отличаю

Очень простой способ различать:
Много непонятной пунктуации и стрелочек — это Хаскель
Чрезмерное количество круглых скобочек — это Лисп

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

Валидный хелловорлд на сишке:

main(){printf("hello world\n");}

Кому нужны эти ненужные указания типов, какие-то там необязательные инклуды и унылый return 0?

PolarFox ★★★★★
()
#include <stdio.h>

int
main(int argc, char **argv)
{
        int i, table[256] = {};
        char *s;

        while (*++argv)
                for (s = *argv; *s; s++)
                        table[*s]++;

        for (i = 0; i < 256; i++)
                if (table[i])
                        printf("letter '%c' meets %2d times\n", i, table[i]);

        return 0;
}
beastie ★★★★★
()
Ответ на: комментарий от Twissel

Таким макаром отпадают все ненужные проверки. В масив, как индекс, влазит весь char. (мало ли, что там на входе попасться может?)

beastie ★★★★★
()

Мне кажетя, что здесь не хватает элегантного решения на perl

echo "test... test... test..." | perl -pe 's<(.)>#++$~{$1};$1#ge;s[(.)]!$c=($~{$1}?sprintf("%2s|%-4d%s%s",$1,$~{$1},pack(c,0x2A)x(delete$~{$1}),$/):$\);$c!ge;;'

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

Да. Но во что оно разворачивается я потестю на виртуалке. А то мало ли - «rm -rf /» :D Читтабельность...

Twissel ★★★★★
() автор топика
Ответ на: комментарий от mix_mix
echo 'Хрюникод? LOL 探求者は' | ./1 
L meets 2 times
O meets 1 times
Х meets 1 times
д meets 1 times
и meets 1 times
к meets 1 times
н meets 1 times
о meets 1 times
р meets 1 times
ю meets 1 times
は meets 1 times
探 meets 1 times
求 meets 1 times
者 meets 1 times
import qualified Data.Map.Strict as Map
import           Data.Char
import           Data.Text (Text)
import qualified Data.Text as Text
import qualified Data.Text.IO as Text
import qualified Data.Foldable as Foldable
import           Control.Monad (void)
import Text.Printf

main = Foldable.traverse_ ( uncurry (printf "%c meets %d times\n") ) . Map.toList 
     =<< fmap (Text.foldl (\m c -> Map.insertWith (+) c (1::Int) m) Map.empty . Text.filter isAlpha)  Text.getContents
qnikst ★★★★★
()
Ответ на: комментарий от qnikst

можно короче, но через дурацкие типы данных.

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

мало ли, что там на входе попасться может?

Кстати да, специальный символы называть 'letter' как-то неправильно. 'character' политкорректней

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

Да UCHAR_MAX — это хороший патч.

0a1
> #include <sys/param.h>
6c7
< 	int i, table[256] = {};
---
> 	int i, table[UCHAR_MAX] = {};
13c14
< 	for (i = 0; i < 256; i++)
---
> 	for (i = 0; i < UCHAR_MAX; i++)
beastie ★★★★★
()
Ответ на: комментарий от beastie

тут Эдди отрицательными char (которые от utf8 «Привет"ов всяких уже потролил).

отмазыватся , что Седжвик переводной и строки латиница :)

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

:)

a. у кое-кого я отфилтрован либо бегло пролистывают , ибо так искренне выкладывают «идентичный подход».

б. сон буды ок.

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

имхо лучшее ибо " С со структурами_данных " батарейки такскасать

qulinxao ★★☆
()

Наноконкурс по Си

в решении кресты

Дальше не читал.

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

Небольшой вопрос для очищения разума:

printf("%c:\t%d\n", 'a'+i, hist[i]);
Здесь у Вас используется свойство неявного преобразования char <-> int? Просто в моем быдлокоде мне больше всего мозолил участок глаза с захардкодженным алфавитом :)

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от Twissel

Вот для кириллицы уже просто так не получится:

 32 [0x20] -  	 64 [0x40] - @	 96 [0x60] - `	128 [0x80] - ─	160 [0xa0] - ═	192 [0xc0] - ю	224 [0xe0] - Ю	
 33 [0x21] - !	 65 [0x41] - A	 97 [0x61] - a	129 [0x81] - │	161 [0xa1] - ║	193 [0xc1] - а	225 [0xe1] - А	
 34 [0x22] - "	 66 [0x42] - B	 98 [0x62] - b	130 [0x82] - ┌	162 [0xa2] - ╒	194 [0xc2] - б	226 [0xe2] - Б	
 35 [0x23] - #	 67 [0x43] - C	 99 [0x63] - c	131 [0x83] - ┐	163 [0xa3] - ё	195 [0xc3] - ц	227 [0xe3] - Ц	
 36 [0x24] - $	 68 [0x44] - D	100 [0x64] - d	132 [0x84] - └	164 [0xa4] - ╓	196 [0xc4] - д	228 [0xe4] - Д	
 37 [0x25] - %	 69 [0x45] - E	101 [0x65] - e	133 [0x85] - ┘	165 [0xa5] - ╔	197 [0xc5] - е	229 [0xe5] - Е	
 38 [0x26] - &	 70 [0x46] - F	102 [0x66] - f	134 [0x86] - ├	166 [0xa6] - ╕	198 [0xc6] - ф	230 [0xe6] - Ф	
 39 [0x27] - '	 71 [0x47] - G	103 [0x67] - g	135 [0x87] - ┤	167 [0xa7] - ╖	199 [0xc7] - г	231 [0xe7] - Г	
 40 [0x28] - (	 72 [0x48] - H	104 [0x68] - h	136 [0x88] - ┬	168 [0xa8] - ╗	200 [0xc8] - х	232 [0xe8] - Х	
 41 [0x29] - )	 73 [0x49] - I	105 [0x69] - i	137 [0x89] - ┴	169 [0xa9] - ╘	201 [0xc9] - и	233 [0xe9] - И	
 42 [0x2a] - *	 74 [0x4a] - J	106 [0x6a] - j	138 [0x8a] - ┼	170 [0xaa] - ╙	202 [0xca] - й	234 [0xea] - Й	
 43 [0x2b] - +	 75 [0x4b] - K	107 [0x6b] - k	139 [0x8b] - ▀	171 [0xab] - ╚	203 [0xcb] - к	235 [0xeb] - К	
 44 [0x2c] - ,	 76 [0x4c] - L	108 [0x6c] - l	140 [0x8c] - ▄	172 [0xac] - ╛	204 [0xcc] - л	236 [0xec] - Л	
 45 [0x2d] - -	 77 [0x4d] - M	109 [0x6d] - m	141 [0x8d] - █	173 [0xad] - ╜	205 [0xcd] - м	237 [0xed] - М	
 46 [0x2e] - .	 78 [0x4e] - N	110 [0x6e] - n	142 [0x8e] - ▌	174 [0xae] - ╝	206 [0xce] - н	238 [0xee] - Н	
 47 [0x2f] - /	 79 [0x4f] - O	111 [0x6f] - o	143 [0x8f] - ▐	175 [0xaf] - ╞	207 [0xcf] - о	239 [0xef] - О	
 48 [0x30] - 0	 80 [0x50] - P	112 [0x70] - p	144 [0x90] - ░	176 [0xb0] - ╟	208 [0xd0] - п	240 [0xf0] - П	
 49 [0x31] - 1	 81 [0x51] - Q	113 [0x71] - q	145 [0x91] - ▒	177 [0xb1] - ╠	209 [0xd1] - я	241 [0xf1] - Я	
 50 [0x32] - 2	 82 [0x52] - R	114 [0x72] - r	146 [0x92] - ▓	178 [0xb2] - ╡	210 [0xd2] - р	242 [0xf2] - Р	
 51 [0x33] - 3	 83 [0x53] - S	115 [0x73] - s	147 [0x93] - ⌠	179 [0xb3] - Ё	211 [0xd3] - с	243 [0xf3] - С	
 52 [0x34] - 4	 84 [0x54] - T	116 [0x74] - t	148 [0x94] - ■	180 [0xb4] - ╢	212 [0xd4] - т	244 [0xf4] - Т	
 53 [0x35] - 5	 85 [0x55] - U	117 [0x75] - u	149 [0x95] - ∙	181 [0xb5] - ╣	213 [0xd5] - у	245 [0xf5] - У	
 54 [0x36] - 6	 86 [0x56] - V	118 [0x76] - v	150 [0x96] - √	182 [0xb6] - ╤	214 [0xd6] - ж	246 [0xf6] - Ж	
 55 [0x37] - 7	 87 [0x57] - W	119 [0x77] - w	151 [0x97] - ≈	183 [0xb7] - ╥	215 [0xd7] - в	247 [0xf7] - В	
 56 [0x38] - 8	 88 [0x58] - X	120 [0x78] - x	152 [0x98] - ≤	184 [0xb8] - ╦	216 [0xd8] - ь	248 [0xf8] - Ь	
 57 [0x39] - 9	 89 [0x59] - Y	121 [0x79] - y	153 [0x99] - ≥	185 [0xb9] - ╧	217 [0xd9] - ы	249 [0xf9] - Ы	
 58 [0x3a] - :	 90 [0x5a] - Z	122 [0x7a] - z	154 [0x9a] -  	186 [0xba] - ╨	218 [0xda] - з	250 [0xfa] - З	
 59 [0x3b] - ;	 91 [0x5b] - [	123 [0x7b] - {	155 [0x9b] - ⌡	187 [0xbb] - ╩	219 [0xdb] - ш	251 [0xfb] - Ш	
 60 [0x3c] - <	 92 [0x5c] - \	124 [0x7c] - |	156 [0x9c] - °	188 [0xbc] - ╪	220 [0xdc] - э	252 [0xfc] - Э	
 61 [0x3d] - =	 93 [0x5d] - ]	125 [0x7d] - }	157 [0x9d] - ²	189 [0xbd] - ╫	221 [0xdd] - щ	253 [0xfd] - Щ	
 62 [0x3e] - >	 94 [0x5e] - ^	126 [0x7e] - ~	158 [0x9e] - ·	190 [0xbe] - ╬	222 [0xde] - ч	254 [0xfe] - Ч	
 63 [0x3f] - ?	 95 [0x5f] - _	127 [0x7f] - 	159 [0x9f] - ÷	191 [0xbf] - ©	223 [0xdf] - ъ	255 [0xff] - Ъ	
придется либо самому велосипедить, либо брать готовые велосипеды из glibc.

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