powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хитро преобразовать строку в целое
20 сообщений из 20, страница 1 из 1
Хитро преобразовать строку в целое
    #32192330
Fendom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

Задача: имеется переменная (String, 6 символов, могут быть как цифры, так и буквы (латиница), пробелы и спецсимволы не допускаются). Необходимо разработать процедуру, которая будет формировать целое число (4 байта), однозначно соответствующее данной строке (если встречаются переменные одинаковые строковые переменные, им присваиваются одинаковые числа). Как это можно сделать?

Заранее благодарен всем ответившим
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32192593
sti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итого 26+10=36 символов.

0 - 0
...
9 - 9
A - 10
...
Z - 35

S1*36**5 + S2*36**4 + S3*36**3 + S4*36**2 + S5*36**1 + S6
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32193011
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select CHECKSUM('строка')
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32194150
vinalik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересная задача!
Думаю к понедельнику будет готово. Вот только возникло два вопрорса:

1. Откуда данная задача (здорово смахивает на олимпиадную). Или для чего такая задача поставлена. (Это просто из любопытства)
2. Точно ли она имеет решение?
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32194175
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Fendom.
И при чем тут проектирование БД? Если у Вас мозги не могут даже разобрать, в какой форум надо бросить вопрос, то никакие советы Вам уже не помогут. Подумайте. Гардеробщик - тоже хорошая профессия.
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32194737
vinalik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача конечно не в тот форум.
Мое мнение - данная задача не имеет решения.
Представить строку из шести символов четырехзначным числом помоему невозможно, т.к. рассматриваются сочетания из более чем тридцати символов и к томуже в строке символы могут повторяться. Слишком много вариантов.
Я так понимаю что надо ставить в соответствие каждому символу либо группе символов либо какойто последовательностии символов число. нО СЛИШКОМ МНОГО вариантов у меня не получилось. Если задача уже решена или есть какие то предложения - хотелось бы услышать.
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32194854
sti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vinalik,
не четырехзначным (что очевидно невозможно), а четырехбайтовым. Как это сделать я уже написал.
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32195809
vinalik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый Sti,

А что дальше? Ведь один символ – всегда один байт!!!
К примеру 62946198 - это 8 байт.

Не сочтите за труд, разъясните мне.
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32195947
Фотография Циничный Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sti дал верное решение.

В дополнение:

Доказательство того, что чисел хватит для представления комбинаций:
Количество всевозможных комбинаций символов и чисел:
Х = 36*36*36*36*36*36=36^6=2 176 782 336
Количество комбинаций в 4х байтовом представлении:
Y=2^(4*8)=2^32 = 4 294 967 296

X<Y, что и требовалось доказать.


Кто и это не понял - найдите какую-нить книжку про системы счисления, прочитайте.
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32195979
sti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Циничный Кот,
спасибо. Избавил меня от необходимости еще и это объяснять.

vinalik
> Ведь один символ – всегда один байт!!!

Нет. Один байт - это 8 бит. Символы тут вообщем то ни при чем.
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32196063
Фотография Циничный Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 sti
Пожалуйста :о)

2 vinalik
Ведь один символ – всегда один байт!!!

Кстати, не всегда.

Что-то вертится у меня на краю памяти такие умное слово как UNICODE. Интересно, к чему бы это???...
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32196170
vinalik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый Циничный Кот,


1.насчет систем счисления – в последовательности 6 символов из 36 могут быть и повторы, к примеру АААААА, 36777V.
Каково теперь количество возможных комбинаций???(Почитайте учебник по комбинаторике что такое сочетания, перестановки и размещения)

2.О том что один символ – не всегда один байт и символы тут ни при чем:
Я рассматривал данную задачу с точки зрения к примеру : есть последовательность символов – надо на основании ее получить к уникальное имя файла или чтото подобное.
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32196235
sti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vinalik,
упрости слегка задачу. Забудь для начала про символы. Оставь одни цифры. И попробуй решить :)
Когда решишь, поймешь о чем мы тут толкуем.
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32196516
Фотография Циничный Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vinalik


насчет систем счисления – в последовательности 6 символов из 36 могут быть и повторы, к примеру АААААА, 36777V. Каково теперь количество возможных комбинаций???

Это смотря каких комбинаций. Если для вас последовательности 01 и 10 - это одно и то же, тогда количество возможных комбинаций будет меньше, чем то, которое я указал. Интересно было бы, правда, если бы вам зарплату/стипендию платили по тому же принципу - один хрен, что 10, что 01...

Кому-кому там знания в комбинаторике освежить надо??




Что касается задачи - я ее решал так, как написано. А написано там так:

...Необходимо разработать процедуру, которая будет формировать целое число (4 байта), однозначно соответствующее данной строке...

Жую дальше:
Вход: строка из 6 символов: x
Выход: int32: y
Функция: y=f(x)
Условие на f: (x1,y1=f(x1)); (x2,y2=f(x2)). if x1<>x2 then y1<>y2.

Вышеописанный алгоритм этому условию удовлетворяет.


ЗЫ. А задача действительно олимпиадная класса для 8-9. Когда они там начинают информатику-то изучать...
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32200390
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А про RADIX-50 никто вспомнить не может?
(кодирование символов 3 байта в 2)
Ну на худой конец UUEncode или MIME-64...
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32200957
Berg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2vinalik:
alexeyvg тебе написал неплохой вариант...
почитай про hash-функции, может тебе нужны именно они. Самый простой пример такой функции - это сумма s при 1 <= i <= 6. Она, конечно, не удовлетворяет твоим требованиям, но это только пример.

P.S. К вопросу о байтах и символах: комбинаторика здесь не при чем. Ну, в смысле можно и ее, конечно, приплести. Но зачем же усложнять...
В байте и без того не так уж и мало информации сохранить можно...:-)
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32205024
vinalik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья мои!

Насчет комбинаторики, я писал о количестве вариантов: помоему предложен вариант без учета повторов ( хотя это на вскидку, может я и не прав) к примеру сссстр, строка, сттттт. Чего я действительно не понял, и хотелбы чтобы мне объяснили , почему к примеру 45376 - это не 5 байт ( я не профессиональный программист).
И имеет смысл описать практический смысл даной задачи.
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32205812
Фотография Циничный Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vinalik

Неее... Вы все-таки прочитайте (или перечитайте) соответующие книжки еще раз. У меня разжевывать основы никогда терпения не хватало. Хотя ладно, попробую объяснить на пальцах.

Что такое "байт"???... Это - комбинация из восьми битов. Позиции битов различимы - мы знаем, какой бит первый, а какой - последний.

Что такое "бит"???... Это - некоторая сущность, могущая принимать два значения. Обратите внимание, что я не уточняю, какие именно значения.

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

Но нам удобно мыслить о бите, как об абстракции. Для определенности первое значение, которое может прнимать бит, мы обозначим как "0", второе - как "1". Бит может принимать либо одно, либо другое значение. Бита "без значения" быть не может.

Следующий вопрос, о котором редко задумываются - а почему в байте 8 бит???... А хрен его знает, исторически так сложилось. Хотя теоретически там может быть N бит, где N - произвольное число.


Следующий вопрос - решение практической задачи. Нам надо перенумеровать X однородных предметов. (зачем это надо, я тоже не обсуждаю, это вотчина постановщика задач. Надо, и все тут). Вопрос - сколько ячеек нам понадобится для того, чтобы дать уникальную (отличимую от других) комбинацию для каждого предмета? Или, иными словами, какое количество комбинаций представимо комбинацией из N битов?

Считаем:
N=1, понятно дело, что один бит дает только две комбинации - 0 или 1. Значит байт из одного бита может обслужить два предмета.

N=2. Почесав репу, догадываемся, что два бита нам дают 4 комбинации: 00,01,10,11

ЗЫ. Маленький шажок в сторону комбинаторики. Обратим внимание, что мы имеем дело с различимыми позициями. А именно, комбинации 01 и 10 - это не одно и то же. Возвращаясь к ранее обсуждаемому примеру с шариками (пусть они у нас 2х цветов - черные и белые), мы понимаем, что когда слева - белый шарик, а справа - черный, это совсем не то, когда наоборот. Если бы мы наши шарики клали не в ячейки, а, скжем, в мешочек - ситуация выглядела бы совсем по-другому. Мы могли бы сказать только то, что в мешочке находятся один черный и один белый шарик. И все. Общее количество комбинаций равнялось бы 3, а не 4. Кто и этого сейчас не понимает - вперед на скамью первого курса института изучать комбинаторику. Остальным вам заниматься пока рано. ;о)

Так вот... Почесав решу еще раз, мы соображаем, что каждое добавление бита в наш резиновый байт увеличивает доступное количество комбинаций в два раза. И для байта разрядности N количество комбинаций выражается простой формулой:
2*2*2*...*2 = 2^N

Соответственно для компьютерного байта разрядности 8 имеем: 2^8=256
256 произвольных предметов можно пренумеровать. В компьютере это используется для перенумеровывания символов. Таблица соответствия (байт)<->(символ) называется кодовой таблицей.

Легко можно догадаться, что вариантов перенумеровывания существует не один. Следовательно, мы имеем дело с разными кодовыми таблицами, где одному и тому же байту могут соответствовать разные символы. Это, с одной стороны, дает определенную гибкость, а с другой служит предметом постоянного геморроя, когда вместо должной таблицы используется другая и вместо буковок на экране вы любуетесь нечитаемыми крокозяблами. Легко понять, что если каждый человек будет пользоватся собственноизобретенной таблицей, никто никогда друг друга не поймет. Чтобы хоть как-то упорядочить это дело, вводятся стандарты. Самым известным и очень старым является стандарт ASCII, фиксирующий соответствие первых 127 байт определенным символам. Английские буквы и цифры в этот набор входят, поэтому с ними обычно меньше проблем.


Далее. Что такое цифра??? Цифра - это некоторая загогулина, призваная отличить разные значения бита. В двоичной системе счисления этих загогулин всего две. Мы про них говорили раньше, обозначив их 0 и 1. В десятичной системе таких загогулин, соответственно, десять: 0123456789.

К чему я это объснял??? А чтобы ответить на этот вопрос:

Чего я действительно не понял, и хотелбы чтобы мне объяснили , почему к примеру 45376 - это не 5 байт

Теперь отвечаю. 5 байт достаточно, чтобы представить любое десятичное число с пятью разрядами. Вернее, все комбинации символов от 0 до 9.

НО. Эти же комбинации можно представить МЕНЬШИМ числом байт. Почему? Легко посчитать:
Общее количество комбинаций 5-разрядного десятичного числа Х=10^5
Общее количество комбинаций, представимых 5ю 8и разрядными байтами: Y=2^(5*8)=2^40=1 099 511 627 776 ~= 1.1 *10^12.

Видно, что Y много больше Х. Это означает, что биты в 5 байтах используются нерационально - большая часть их не используется. Возникает вопрос - сколько бит дает количество комбинаций, достаточных для перенумерования всех чисел от 0 до 100 000???

Ответ: Комбинация 17 бит. Легко проверить: Z=2^17=131 072.

Два байта и один маааленькй битик. А не 5 больших байт.
Выводы о практическом смысле делайте сами.
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32205970
sti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Циничный Кот

Это было классно. Я плакаль. И это называется "нет терпения". Снимаю шляпу :)
...
Рейтинг: 0 / 0
Хитро преобразовать строку в целое
    #32206238
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Присоединяюсь к оценке sti.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хитро преобразовать строку в целое
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]