LINUX.ORG.RU

не могу решить простую задачу на codewars

 ,


0

1

вот задача:

https://www.codewars.com/kata/526dbd6c8c0eb53254000110/train/c

вот мои 2 решения, оба дают ошибку на 9-м тесте

bool alphanumeric(const char* strin)
{
	unsigned int i;
	unsigned char c;
	for (i = 0; (c = strin[i]); i++) {
		if (c < '0')
			return false;
		if (c > '9' && c < 'A')
			return false;
		if (c > 'Z' && c < 'a')
			return false;
		if (c > 'z')
			return false;
	}
	return true;
}

второе

bool alphanumeric(const char* strin)
{
	unsigned int i;
	unsigned char c;
	for (i = 0; (c = strin[i]); i++) {
		if (!isalnum(c))
			return false;
	}
	return true;
}

пишет, что ожидается false, а функция возвращает true, вроде ничего не должно проскочить, не пойму, почему не работает?

★★★

Скажи честно, ты работаешь или учишься? А если работаешь, то в какой отрасли/кем, если не секрет.

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

вот дерьмо, нулевая по длине строка допустима в тестах

At least one character ("" is not valid)

вроде говорит, что не может быть такой строки

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

Там сказано, что strin не будет NULL. Но strin[0] может быть 0.

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

не может быть нулевого указателя, пустая строка - это указатель на значение '\0', которое есть в любой asciz строке.

xmikex ★★★★ ()

Зачем код со странными предположениями о порядке следования символов?
Не проще явно прописать

 if(!((c>='0'&&c<='9')||(c>='a'&&c<='z')||(c>='A'&&c<='Z')))

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

Зачем код со странными предположениями о порядке следования символов?

Смешно, сам тоже написал код в предположении что символы 0-9 и прочие идут подряд

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

у него явные предположения о том, что перед '0' нет символов и о том, что после 'z' их нет.

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

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

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

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

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

руль, к слову, не работает, в винде не тестил

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

Ну из того, что я сделаю

c>='а'&& c!='я'

?
я включу в интервал небуквы? Если включу, то тогда нарушается, а если просто некоторых символов не будет, то это другое.

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

Если исключить всякие предположения за искл. однобайтовости символов, то надо (наверное) сделать развернутый список всех допустимых символов (26*2+10 – 62 символа) и каждый входной символ искать в этом списке.

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

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

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

чем-то средним, собирал прошивки для одноплатников, код писать не приходилось, редактировать приходилось

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

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

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

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

'0''9' подряд гарантируется стандартом.

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

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

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

а вообще в cp866 тоже не соблюдается для строчных, получается не такой и общий принцип.

xmikex ★★★★ ()
#include <stdbool.h>
#include <ctype.h>

bool alphanumeric(const char* strin)
{
    char c = *strin++;

    do {
        if (!isalnum(c))
            return false;
    
        c = *strin++;
    } while (c != 0);

    return true;
}
u-235 ()
Ответ на: комментарий от u-235

по идее если в задании на сайте только include stdbool сделан, то использовать можно только его, но я могу ошибаться.

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

Спасибо чувак, возможно ты мне очень помог. У меня тут депрессия настоящая судя по всему, по-хорошему к мозгоправу с таким настроением в 5 месяцев надо, тем более желудок уже привёл меня к гастроэнтерологу скорее всего из-за нервов, а самооценка ниже нуля рухнула - даже из-за такого пустяка, как у тебя, я себе нервы накручиваю при этом понимая что в твоём случае не так, из всего набора признаков депрессии пока только мысли выйти в окно не крутятся в голове, хотя сниться стали, что очень меня тревожит, так что после нового года пойду голову лечить, скорее всего. Короче ребята, математика и IT зло - от них крыша едет, особенно когда IRL всякое очень плохое происходит, да ещё не с тобой, а с близкими тебе людьми и ты бессилен им помочь.

ТС, по теме у тебя фирменный говнокод (хотя бы if-ы свои в один if переписал), но тест не работает т.к. ты не проверяешь

if (strin[0] == '\0'){
    return false;
  }

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

Я понимаю, код хороший, но зачем эта магия на указателях? Обычно же рекомендуется её не юзать никогда и нигде.

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

ну хз. там внутри функции комментарий начало для чего вообще?

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

зачем эта магия на указателях?

Ну так я не программист, хорошему стилю не обучен. Да и как в Си без указателей обойтись, через массив?

u-235 ()
Ответ на: комментарий от peregrine

Я вообще в пни хочу лечь, приходить домой на выхи и сидеть за ноутом, нажился за 40 лет, депрессии у меня нет, мне просто всё настоебало до предела, а тут ещё и сон потерял на 2 суток, лёг в больницу на месяц, не рекомендую, такой ад, особенно для курящих, выдают по 2 сиги 2 раза в день, психолог открывает служебный туалет и разрешает взять бычки, которые сотрудники накурили, я сперва не курил их, потом забил, стал курить, хочется в платный пни, однако там надо много платить, у меня денег не хватит на такой

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

вообще в интернате у тебя на содержание будут забирать большую часть пенсии. я бы очень подумал перед тем, как на такое подписываться.

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

Я знаю, а что ещё-то делать, главное сигареты, а больше ничего не надо, про финансовую помощь родителям я давно забыл, тут бы не подохнуть от бессонницы, напиться охото что-то, после больницы не пил, чувствую, что сегодня спать снова не буду, снотворное не пью, вернее, выпил 3 таблетки, эффекта никакого, если выпить больше, весь завтрашний день буду мертвым

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

Я тоже не знаю, тогда на принудку попрошусь, там тоже не меньше полутора лет лежать

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

Я это ещё тут понял

не могу решить простую задачу на codewars (комментарий)

At least one character ("" is not valid)

По моему, написано просто и ясно, как минимум один символ и в скобках, пустая строка недопустима, может я что-то не так перевёл, тут, по моему, не так перевести сложно очень

Козлы, по моему, составляли задачу

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

оно для решения регуляркой вообще, там теги же такие. наверное что-то вроде такого нужно:
/^[a-zA-Z\d]+$/

xmikex ★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.