powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Решение ряда задач.
25 сообщений из 100, страница 4 из 4
Решение ряда задач.
    #38817734
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Долго пытался вспомнить применение реверсу. Что-то такое видел.
В каком ЯП - не скажу точно. Толи делфи толи PowerBuilder Поэтому - псевдокод:


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
if (f.isFile) then

    if ( startWith(reverse(f.name),".lmx") then

        processFuckenXMLFile(f);

    end;

end;
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38817737
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или так.

Код: pascal
1.
( startWith(reverse(f.name),"lmx."))
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38817756
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДолго пытался вспомнить применение реверсусам по себе реверс малоинтересен
разбиение юникодной скроки на кластеры графем - интереснее
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38817757
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДолго пытался вспомнить применение реверсу.
На собеседованиях могут спросить.
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38817762
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Код: plaintext
1.
startWith(reverse(f.name),".lmx")



За такое сразу уволить без выходного пособия :)
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38817767
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИли так.
Код: pascal
1.
( startWith(reverse(f.name),"lmx."))

Тогда уж:
Код: pascal
1.
startWith(reverse(f.name), reverse(".xml"))
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38817808
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилmaytonДолго пытался вспомнить применение реверсусам по себе реверс малоинтересен
разбиение юникодной скроки на кластеры графем - интереснее
Переход между big/little-endian можно считать реверсом. Вот еще кейс.

По поводу графем - интереснее конечно только углубляться в эту тему
как-то лень.
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38817812
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПереход между big/little-endian можно считать реверсом.Нельзя.
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38817815
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сама лаконичность!
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38817819
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но если очень хочется то можно :)
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38817828
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну-ну ...
Высказать непродуманную мысль, конечно, можно, но хотелось бы услышать обоснование теоретической возможности сделать преобразование BE/LE на строке в кодировке UTF-8.
Для простоты можно начать с обоснования если не эквивалентности, то хотя бы подобия изменения порядка байт и порядка символов.
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38817830
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ладно не парься!
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38817832
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И не думал. Просто страшно за неокрепшую психику молодёжи
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38820394
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во, наткнулся на реальное применение реверса строк:
Код: sql
1.
SELECT email_address FROM customers WHERE reverse(email_address) LIKE reverse('%@wikipedia.org');


Это чтобы задействовался индекс.
Пруф
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38820400
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvik, ага. Я тоже эту тему вспомнил.
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38820401
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikЭто чтобы задействовался индекс.
Не, это чтобы не задействовалась первая НФ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38820456
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начиная с Oracle11g могли-бы virtual columns создавать. Туда - перевёрнутые имена почтовых доменов.
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38822198
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Привожу третью задачу. (вторая позже)
3 задачаПроверить, является ли целое число счастливым билетом.

Эта задача показалась мне слишком простой. Потому решил следующую задачу:
Что на самом деле нужно решитьНайти количество счастливых билетов, входной параметр -количество символов в билете 2n.
И тут я использовал длинную арифметику. Алгоритм решения привожу ниже:

1 часть

все уже видели
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
// HappyTickets.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MIN_POW (1+1)
#define SHIFT '0'


//выделение len Байт
char* allocate_memory(size_t len)
{
	return (char*)malloc(len*sizeof(char));
}

//освобождение памяти
int freeMemory(char* s1, char* s2, int isFreeMemory)
{
	if (isFreeMemory >= 1)
	{
		free(s1);
		s1 = NULL;
	}
	if (isFreeMemory >= 2)
	{
		free(s2);
		s2 = NULL;
	}
	return 0;
}



//СУММА
//s1>=s2
int la_sum_inplace(char* sum, size_t p, char* s1, size_t p1, char* s2, size_t p2)
{
	memset(sum, '0', p); *(sum + p - 1) = '\0';//установка стартового значения
	memcpy(sum + p1 - p2 + 1, s2, p2 - 1);//пишем в конец результирующей строки минимальное число
	int d = 0;
	for (int i = p - 2; i > 0; i--)
	{
		int t0 = *(sum + i) + *(s1 + i - 1) + d - 2 * SHIFT;
		int t1 = t0 % 10;
		*(sum + i) = t1 + '0';
		d = (t0 >= 10) ? 1 : 0;
	}
	if (!d && p != 2)
		memmove(sum, sum + 1, p - 1);
	else
		*(sum + 0) = d + '0';
	return 0;
}

//s1+s2      s1,s2>=0
char* la_sum(char* s1, char* s2, int isFreeMemory)
{
	size_t p[2] = { strlen(s1) + 1, strlen(s2) + 1 };
	int max_i = (p[0] > p[1]) ? 0 : 1; //индекс максимальной строки
	int min_i = 1 - max_i;//индекс минимальной строки
	char* max_s = (max_i == 0) ? s1 : s2;
	char* min_s = (min_i == 0) ? s1 : s2;

	int p_res = p[max_i] + 1;//просим на 1 Байт больше чтобы исключить вероятность повторного аллоцирования
	char* res = allocate_memory(p_res);
	la_sum_inplace(res, p_res, max_s, p[max_i], min_s, p[min_i]);   // calculate in-place   
	freeMemory(s1, s2, isFreeMemory);
	return res;
}




//УМНОЖЕНИЕ 
//s-строка,num-число
//функция оптимизированна под умножение строки на строку за счёт сдвига shift
int la_mul_string_on_num_inplace(char* res, size_t p, char* s, size_t ps, unsigned int num, int sh)
{
	if ((ps == MIN_POW && s[0] == '0') || (num == 0))
	{
		res[0] = '0'; res[1] = '\0';
		return 0;
	}
	memset(res, '0', p);
	int d = 0;
	for (int i = ps - 2; i >= 0; --i)
	{
		int t = (s[i] - SHIFT)*num + d;
		int t1 = t % 10;
		res[i + 1] = t1 + SHIFT;
		d = (t - t1) / 10;
	}
	res[p - 1] = '\0';
	if (!d)
		memmove(res, res + 1, p - 1);
	else
		res[0] = d + SHIFT;
	return 0;
}

//s*num*10^sh
char* la_mul_string_on_num(char* s, unsigned int num, int sh)
{
	size_t ps = strlen(s) + 1;
	size_t p = ps + 1 + sh;//реализую умножение на 10^sh
	char* res = allocate_memory(p);
	la_mul_string_on_num_inplace(res, p, s, ps, num, sh);
	return res;
}


//s1*s2
char* la_mul(char* s1, char* s2, int isFreeMemory)
{
	size_t p1 = strlen(s1) + 1;
	size_t p2 = strlen(s2) + 1;
	size_t p = p1 + p2 - 1;

	char* res = allocate_memory(2); res[0] = '0'; res[1] = '\0';
	for (int i = p2 - 2; i >= 0; --i)
	{
		char* t = la_mul_string_on_num(s1, s2[i] - SHIFT, p2 - 2 - i);
		res = la_sum(res, t, 2);
	}
	freeMemory(s1, s2, isFreeMemory);
	return res;
}


//РАЗНОСТЬ s1-s2 s1>=s2
int la_diff_inplace(char* res, size_t p, const char* s1, size_t p1, const char* s2, size_t p2)
{
	memcpy(res, s1, p);
	for (int i = p - 2; i >= 0; --i)
	{
		if (res[i] - s2[i] >= 0)
		{
			res[i] = res[i] - s2[i] + SHIFT;
		}
		else
		{
			int j;
			for (j = i - 1; res[j] == '0'; --j)
			{
				res[j] = '9';
			}
			res[j] -= 1;
			res[i] = 10 + res[i] - s2[i] + SHIFT;

		}
	}
	int count_0 = 0;
	int z = 0;
	for (; z < p - 1 && res[z] == '0'; ++z);
	if (z)
		memmove(res, res + z, p - z);
	return 0;
}

char* la_diff(char* s1, char* s2, int isFreeMemory)
{
	size_t p1 = strlen(s1) + 1;
	size_t p2 = strlen(s2) + 1;
	size_t p = p1;

	char* ss2 = (char*)malloc(sizeof(char)*p);
	memset(ss2, '0', p);
	memcpy(ss2 + p - p2, s2, p2);//было memcpy(ss2 + p - p2, s2, p2);

	char* res = allocate_memory(p);
	la_diff_inplace(res, p, s1, p, ss2, p);
	free(ss2);
	freeMemory(s1, s2, isFreeMemory);
	return res;
}





struct Number
{
	int num;
	int num2;
	int count;
	int* multipliers;
};

struct Number* initializeNumber(int a)
{
	struct Number* n = (struct Number*)malloc(sizeof(struct Number));
	n->num = a;
	n->num2 = a;
	n->count = 0;
	n->multipliers = NULL;
	return n;
}

int viewNumber(struct Number* a)
{
	printf("num= %i\n", a->num);
	printf("num2= %i\n", a->num2);
	printf("divisors:");
	for (int i = 0; i < a->count; ++i)
	{
		printf("%i ", a->multipliers[i]);
	}
	printf("\n");
	return 0;
}

//assume a->num > 1
int factorization(struct Number* a)
{
	for (int i = 2; i <= a->num2; ++i)
	{
		if (a->num2%i == 0)
		{
			a->count += 1;
			a->multipliers = (int*)realloc(a->multipliers, a->count*sizeof(int));
			a->multipliers[a->count - 1] = i;

			a->num2 /= i;
			factorization(a);
			break;
		}
	}
	return 0;
}
//Сочетания
char* la_combination(unsigned n, unsigned m)
{
	char* res = allocate_memory(2); res[0] = '1'; res[1] = '\0';
	m = (n - m > m) ? m : n - m;
	if (m == 0)
	{
		return res;
	}
	int* up = (int*)malloc(sizeof(int)*m);//числитель
	int* down = (int*)malloc(sizeof(int)*m);//знаменатель

	for (int i = 1; i <= m; ++i)
	{
		*(up + m - i) = n - m + i;
		*(down + m - i) = i;
	}

	int len_down = m;
	for (int i = 0; i < len_down; ++i)//1 проход по знаменателю, длина знаменателя меняется
	{
		int j = 0;
		for (j = 0; j < m; ++j)//проход по числителю
		{
			if (!(up[j] % down[i]))
			{
				up[j] /= down[i];
				break;
			}
		}
		if (j == m && down[i] != 1) //если перебрали все элементы числителя, а фиксированный элемент знаменателя не сократили
		{
			struct Number* n = initializeNumber(down[i]);
			factorization(n); //раскладываю число на множители
			down[i] = 1;
			len_down += n->count;
			down = (int*)realloc(down, sizeof(int)*len_down);
			for (int i = 0; i < n->count; ++i)
			{
				down[len_down - n->count + i] = n->multipliers[i];
			}
			free(n->multipliers);
			free(n);
		}
	}

	char* t = (char*)malloc(10);
	for (int i = 0; i < m; ++i)
	{
		sprintf(t, "%d", up[i]);
		res = la_mul(res, t, 1);
	}
	free(t);
	free(up);
	free(down);
	return res;
}



2 часть Основной алгоритм
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
//len=2n
char* countHappyTicket(int n)
{
	char* sn = allocate_memory(5); sprintf(sn, "%i", n);
	int k = 9 * n / 2;
	char* res1 = allocate_memory(2); res1[0] = '0'; res1[1] = '\0';
	for (int i = 0; i < n; i += 2)
	{
		char* t1 = la_combination(2 * n, i);
		char* t2 = la_combination(11 * n - 1 - 10 * i, 2 * n - 1);
		char* t3 = la_mul(t1, t2, 2);
		res1 = la_sum(res1, t3, 2);
	}
	char* res2 = allocate_memory(2); res2[0] = '0'; res2[1] = '\0';
	for (int i = 1; i < n; i += 2)
	{
		char* t1 = la_combination(2 * n, i);
		char* t2 = la_combination(11 * n - 1 - 10 * i, 2 * n - 1);
		char* t3 = la_mul(t1, t2, 2);
		res2 = la_sum(res2, t3, 2);
	}
	char* res = la_diff(res1, res2, 2);
	return res;
}

int main()
{
	char* res = countHappyTicket(3);
	printf("%s", res);
	free(res);
	return 0;
}



ниже, скриншот для длины 1000 (n=500)
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38822203
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот тесты этого кода аналогичной задачи
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38822205
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как бы вы решали эту задачу ?
Мне кажется, что можно решить проще
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38822229
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты не поверишь. Эту задачу на SQL.ru тоже решали.
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38822410
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikmaytonДолго пытался вспомнить применение реверсу.
На собеседованиях могут спросить.

Я единственное что могу вспомнить/придумать -- для построения дерева суффиксов слов для полнотекстового поиска.
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38822416
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На тему текстового поиска я заготовил замечательную задачку на пятницу.
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38822554
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТы не поверишь. Эту задачу на SQL.ru тоже решали.

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

И где-то в МССКЛ-Ораклах мерялись длиной execution plan. Не помню точно.
...
Рейтинг: 0 / 0
Решение ряда задач.
    #38822641
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас тут С,С++, а не базы данных. Кстати, очень сомневаюсь что через интеграл возможно найти точное число при длине билета в 1000 символов, например.
...
Рейтинг: 0 / 0
25 сообщений из 100, страница 4 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Решение ряда задач.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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