Русское сообщество по скриптингу

Новогодний конкурс #3 (до 27.01.12)

Новости проекта amx-x.ru
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

Новогодний конкурс #3 (до 27.01.12)

Сообщение DJ_WEST » 18 янв 2012, 10:31

Описание:
Данный конкурс посвящен выполнению задания по работе со строками в AMXX.
Необходимо написать функцию:
[pawn]
  1. bool str_pad(source[], len, pad_length, pad_string[], pad_type)
[/pawn]
Которая будет дополнять указанную строку другой строкой до указанной длины.
Функция должна возвращать true, если выполнено успешно и false, если нет.
source[] - исходная строка, которую нужно добавить другой.
len - длина исходной строки source.
pad_length - максимальная длина новой строки.
pad_string[] - строка, которой надо добавить исходную строку source.
pad_type - тип добавления строки:
STR_PAD_LEFT - добавление строки к исходной слева (начало строки)
STR_PAD_RIGHT - добавление строки к исходной строке справа (конец строки)


Пример:
[pawn]
  1. new s_Text[] = "Hello, amx-x.ru!"

  2. str_pad(s_Text, charsmax(s_Text), 20, ":D", STR_PAD_RIGHT)
[/pawn]

Результат:
В строке s_Text мы должны получить "Hello, amx-x.ru!:D:D".


Не забывайте добавлять необходимые проверки в функцию, делать оптимизацию. Победителем является тот, кто написал функцию лучше остальных. Оцениваться будет - правильность работы функции, оптимизация кода, эффективность, стиль написания (название переменных, отступы и т.д.). Используйте тег [pawn] или [code].

Список модулей, которые разрешено использовать:
amxmodx
fakemeta
engine
hamsandwich
fun

Призы:
[align=center]Steam-купон со скидкой 50% на игру The Ball*
theball_50.png

Steam-купон со скидкой 50% на игру Sam and Max Complete Pack *
samandmax_50.png

Steam-купон со скидкой 50% на игру Demolition Inc.*
demolition_50.png
[/align]

1 место - выбирает один любой купон.
2 место - выбирает один любой купон из двух оставшихся.
3 место - получает оставшийся купон.

* Для получения приза необходим аккаунт в системе Steam. Приз отсылается по почте.
Активировать купон необходимо до 1 марта 2012 года.



Выкладывать ответы с кодом необходимо под тегом [hide]. Содержимое ответа будет видно только администратору и модератору. Один пользователь имеет право ответить в теме - только один раз, все повторные ответы не засчитываются. Поэтому заранее нужно максимально ответить лучшим вариантом. Ответы после указанного ниже времени не засчитываются. Принять участие может любой зарегистрированный пользователь форума, кроме администраторов и модераторов.

Использовать фейк-аккаунты и клоны запрещено - бан.

Флудить запрещено, только ответы по теме. Для вопросов и обсуждения есть тема:
Вы должны зарегистрироваться, чтобы видеть ссылки.

Конкурс продлится до 27.01.2012 21:00.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Новогодний конкурс #3 (до 27.01.12)

Сообщение quckly » 19 янв 2012, 14:27

[pawn]
  1. enum PAD_TYPE

  2. {

  3.         STR_PAD_RIGHT = 0,

  4.         STR_PAD_LEFT

  5. }

  6.  

  7. bool:str_pad(source[], len, pad_length, pad_string[], PAD_TYPE:pad_type)

  8. {

  9.         new source_len=0;

  10.         while(source[source_len] != 0)

  11.                 ++source_len;

  12.                

  13.         if(source_len >= pad_length)

  14.                 return false;

  15.                

  16.         //pad_length = pad_length < len ? pad_length : len;

  17.         //new pad_sumb = pad_length - source_len;

  18.         new pad_sumb = min(pad_length - source_len, len - source_len);

  19.        

  20.         new sindex = 0, new_len = source_len + pad_sumb;

  21.        

  22.         if(pad_type == STR_PAD_RIGHT)

  23.         {

  24.                 sindex = source_len;

  25.                 for(new i = 0; sindex < new_len; ++sindex, ++i)

  26.                 {

  27.                         source[sindex] = pad_string[i] > 0 ? pad_string[i] : pad_string[i = 0];

  28.                 }

  29.                 source[new_len] = 0;

  30.         }

  31.         else

  32.         {

  33.                 for(new uper = source_len; uper >= 0; --uper)

  34.                 {

  35.                         source[uper+pad_sumb] = source[uper];

  36.                 }

  37.                

  38.                 for(new i = 0; sindex < pad_sumb; ++sindex, ++i)

  39.                 {

  40.                         source[sindex] = pad_string[i] > 0 ? pad_string[i] : pad_string[i = 0];

  41.                 }

  42.         }

  43.        

  44.         return true;

  45. }
[/pawn]
Аватара пользователя
quckly
Скриптер
 
Сообщения: 403
Зарегистрирован: 20 ноя 2009, 10:03
Благодарил (а): 41 раз.
Поблагодарили: 243 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Новогодний конкурс #3 (до 27.01.12)

Сообщение ejik » 23 янв 2012, 22:49

[pawn]
  1. #include <amxmodx>

  2. #include <amxmisc>

  3.  

  4. #define STR_PAD_LEFT  0

  5. #define STR_PAD_RIGHT 1

  6.  

  7. #define MAX_SOURCE_LENGTH 64 // максимальная входная длина source

  8.  

  9. stock bool:str_pad ( source[], len, pad_length, const pad_string[], pad_type )

  10. {

  11.         static iPadStringLen;

  12.        

  13.         if ( !( iPadStringLen = strlen ( pad_string ) ) ) //нечего добавлять

  14.         {

  15.                 return false; // ничего не выполнено, возвращаем false?

  16.         }

  17.  

  18.         new iMinLen = min ( len, pad_length ); // фиксируем длину выходной строки

  19.        

  20.         new iMaxPadStringLen = max ( iMinLen - strlen ( source ), 0 ); // сколько осталось места для вставляемой строки

  21.        

  22.         if ( !iMaxPadStringLen ) // нету места для вставляемой строки

  23.         {

  24.                 return false;

  25.         }

  26.        

  27.         new i = ( iMaxPadStringLen - 1 ) / iPadStringLen + 1; // сколько раз влезет pad_string

  28.        

  29.         new szSourceString[ MAX_SOURCE_LENGTH + 1]; // создаем массив для source

  30.        

  31.         copy ( szSourceString, MAX_SOURCE_LENGTH, source ); // копируем source в szSourceString

  32.        

  33.         source[ 0 ] = EOS; // делаем source "пустой" строкой

  34.        

  35.         // заполняем строку pad_string'ами

  36.         while ( i-- )

  37.         {

  38.                 format ( source, iMaxPadStringLen, "%s%s", source, pad_string );

  39.         }

  40.        

  41.         // сформировали вставляемую строку, теперь осталось вставить ее куда надо 

  42.         format

  43.         (

  44.                 source,

  45.                 iMinLen,

  46.                 "%s%s",

  47.                 pad_type == STR_PAD_LEFT ? source : szSourceString,

  48.                 pad_type == STR_PAD_RIGHT ? source : szSourceString

  49.         );

  50.        

  51.         return true; // работа выполнена

  52. }
[/pawn]
Аватара пользователя
ejik
 
Сообщения: 249
Зарегистрирован: 01 июл 2010, 14:07
Благодарил (а): 83 раз.
Поблагодарили: 83 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

Re: Новогодний конкурс #3 (до 27.01.12)

Сообщение creator_52 » 27 янв 2012, 15:07

[pawn]
  1. #include <amxmodx>

  2.  

  3. #define STR_PAD_LEFT 0

  4. #define STR_PAD_RIGHT 1

  5.  

  6. public plugin_init() {

  7.         new s_Buffer[]="My lovely string";

  8.         server_print(s_Buffer);

  9.         str_pad(s_Buffer,charsmax(s_Buffer),30,":D",STR_PAD_LEFT);

  10.         server_print(s_Buffer);

  11. }

  12.  

  13. bool: str_pad(s_Source[],i_Len,i_PadLength,s_SubString[],i_PadType) {

  14.         if(!i_Len || !i_PadLength || i_Len>=i_PadLength || (i_PadType!=STR_PAD_LEFT && i_PadType!=STR_PAD_RIGHT) || !s_SubString[0] || !s_Source[0]) {

  15.                 return false;

  16.         }

  17.         new a,b;

  18.         new i_SubLength=strlen(s_SubString);

  19.         switch(i_PadType) {

  20.                 case STR_PAD_RIGHT: {

  21.                         for(a=i_Len;a<i_PadLength;a++,b++) {

  22.                                 if(b==i_SubLength) {

  23.                                         b=0;

  24.                                 }

  25.                                 s_Source[a]=s_SubString[b];

  26.                         }

  27.                 }

  28.                 case STR_PAD_LEFT: {

  29.                         new i_Dif=i_PadLength-i_Len;

  30.                         for(a=i_PadLength-1,b=i_Len-1;b>=0;a--,b--) {

  31.                                 s_Source[a]=s_Source[b];

  32.                         }

  33.                         for(a=0,b=0;a<i_Dif;a++,b++) {

  34.                                 if(b==i_SubLength) {

  35.                                         b=0;

  36.                                 }

  37.                                 s_Source[a]=s_SubString[b];

  38.                         }

  39.                 }

  40.         }

  41.         return true;

  42. }
[/pawn]
Аватара пользователя
creator_52
 
Сообщения: 513
Зарегистрирован: 02 мар 2011, 15:45
Откуда: Нижний Новгород
Благодарил (а): 116 раз.
Поблагодарили: 207 раз.
Опыт программирования: Больше трех лет

Re: Новогодний конкурс #3 (до 27.01.12)

Сообщение DJ_WEST » 30 янв 2012, 11:54

Итак, подведем итоги конкурса. Начнем по порядку.

Просьба победителям написать мне в ЛС свой аккаунт Steam, на который нужно выслать приз. А также участнику, кто занял 1 место, указать приз, который он хочет. Дальше выберет участник, который занял 2 место.

Рассмотрим код ejik:
[pawn]
  1. new iMinLen = min ( len, pad_length );

  2. new iMaxPadStringLen = max ( iMinLen - strlen ( source ), 0 );

  3.  
[/pawn]
Учитывая, что len < pad_length, то получаем в iMinLen = len.
Затем учитывая, что strlen(source) = len, если строка source имеет 0 в конце строки, то iMaxPadStringLen будет 0. В результате чего произойдет выход из функции потом.
А также непонятно зачем нужен MAX_SOURCE_LENGTH, ведь у нас длина новой строки задается через аргумент функции pad_length.

Код от quckly и creator_52 дали желаемый результат. Но у quckly есть доп. проверки, а код creator_52 может вызвать ошибку с memory access при неверном размере массива.

[align=center]1 место:
Вы должны зарегистрироваться, чтобы видеть ссылки.[/align]

[align=center]2 место:
Вы должны зарегистрироваться, чтобы видеть ссылки.[/align]

[align=center]3 место:
Вы должны зарегистрироваться, чтобы видеть ссылки.[/align]
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2


Вернуться в Новости

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9