Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 punto switcher или даже не знаю как назвать.  [new]
gang
Member

Откуда:
Сообщений: 1394
Коллеги подскажите с какой стороны подступиться к такой задаче.
Есть некоторая строка (переменная @string varchar(max)), в которой часть символов может быть написана не в той раскладке. Как пример йцукен-йwertн.
Есть таблица, содержащая сопоставление символов, например:
+
create table symbol_variants 
(
  symbol_eng nchar(1)
, symbol_rus nchar(1)
)

insert symbol_variants select 'q','й'
insert symbol_variants select 'w','ц'
и т.д. 

Для каждого символа в строке возможно только 2 варианта написания "верный" или "ошибочный".
Задача - получить все возможные варианты записи исходной строки.
Пример: таблица symbol_variants
symbol_eng | symbol_rus
r | к
h | р
y | н

Для @string='кран' нужно получить:
кран
,Rран
,кHан
,краY
,RHан
,RраY
,кHаY
,RHаY

Пока в голову лезет только какой-то цикл непонятного уровня вложенности, может пятница сказывается. Может какой-то cross apply сюда прикрутить надо?
Подайте идейку плз.
7 дек 12, 13:03    [13593741]     Ответить | Цитировать Сообщить модератору
 Re: punto switcher или даже не знаю как назвать.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
у меня тока 1 вопрос - а как вы отпределите на каком языке строке ???
Тем более - может стоять еще и немецкая раскладка клавиатуры и украинская..что тогда делать будите ?
7 дек 12, 13:09    [13593812]     Ответить | Цитировать Сообщить модератору
 Re: punto switcher или даже не знаю как назвать.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а вообще .... просто найдите или создайте таблицу -клавиатуру , разобрав слово -вы получите "клавиши" -потом найдите все возможные "пересечения"
7 дек 12, 13:11    [13593845]     Ответить | Цитировать Сообщить модератору
 Re: punto switcher или даже не знаю как назвать.  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Maxx
а вообще .... просто найдите или создайте таблицу -клавиатуру , разобрав слово -вы получите "клавиши" -потом найдите все возможные "пересечения"


с одной стороны - да, а с другой ...
7 дек 12, 13:15    [13593886]     Ответить | Цитировать Сообщить модератору
 Re: punto switcher или даже не знаю как назвать.  [new]
n x n
Guest
цикл как раз понятно какой вложенности.
это ж перебор n x n ситуаций, n - длина слова
7 дек 12, 13:19    [13593930]     Ответить | Цитировать Сообщить модератору
 Re: punto switcher или даже не знаю как назвать.  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Наверно, задача - завалить сервер!
7 дек 12, 13:26    [13594006]     Ответить | Цитировать Сообщить модератору
 Re: punto switcher или даже не знаю как назвать.  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
Наверно, задача - завалить сервер!
Это ж надо додуматься: все комбинации символов в varchar(max)!
Кстати, по-хорошему тогда надо nvarchar(max)?
7 дек 12, 13:27    [13594025]     Ответить | Цитировать Сообщить модератору
 Re: punto switcher или даже не знаю как назвать.  [new]
gang
Member

Откуда:
Сообщений: 1394
Махх, не буду определять. Вопрос только про 2 раскладки русская и английская.
n x n, Вы неправы. Количество 2^n? где n - количество позиций в строке, допускающих неоднозначное написание.
iap, рад что повеселил. (max) написал, чтобы не было вопросов типа "а что будете делать если длиннее Х?" Ну заменим (max) на (20), этож скучно, не поржать, чё.

По существу. Maxx, по поводу пересечения и клавиш. Я тоже предполагал, что сначала входную строку нужно разобрать в некий массив (таблицу) символов. Вопрос как раз в том чтобы построить это самое пересечение затем.
7 дек 12, 13:42    [13594162]     Ответить | Цитировать Сообщить модератору
 Re: punto switcher или даже не знаю как назвать.  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
gang
Количество 2^n? где n - количество позиций в строке, допускающих неоднозначное написание.
Слышали притчу о шахматной доске и зерне?
7 дек 12, 14:12    [13594520]     Ответить | Цитировать Сообщить модератору
 Re: punto switcher или даже не знаю как назвать.  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
iap
gang
Количество 2^n? где n - количество позиций в строке, допускающих неоднозначное написание.
Слышали притчу о шахматной доске и зерне?


да, да..
7 дек 12, 14:18    [13594600]     Ответить | Цитировать Сообщить модератору
 Re: punto switcher или даже не знаю как назвать.  [new]
gang
Member

Откуда:
Сообщений: 1394
iap, Winnipuh, да, слышал. И что дальше? Формулу 2^n я написал собственноручно. Вы подозреваете что я не могу вычислить по ней значение? 2^20=1048576. Что-то по существу-то сказать имеете?
7 дек 12, 14:28    [13594706]     Ответить | Цитировать Сообщить модератору
 Re: punto switcher или даже не знаю как назвать.  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
gang
iap, Winnipuh, да, слышал. И что дальше? Формулу 2^n я написал собственноручно. Вы подозреваете что я не могу вычислить по ней значение? 2^20=1048576. Что-то по существу-то сказать имеете?
Домой попаду - может быть
7 дек 12, 14:39    [13594815]     Ответить | Цитировать Сообщить модератору
 Re: punto switcher или даже не знаю как назвать.  [new]
shr-13
Guest
declare @s varchar( max)
set @s= 'кран'

declare @t table( s varchar( max))

declare @t2 table( cr char( 1), ce char( 1))
insert @t2 values ( 'к', 'r'), ('р', 'h'), ('а', 'f' ), ( 'н', 'y')

declare @ndx int
set @ndx= 1

insert @t select @s

while @ndx<= len( @s) begin
	insert @t 
	select left( t.s, @ndx-1)+ t2.ce+ substring( t.s, @ndx+1, 255)
	from @t as t
	join @t2 as t2 on substring( t.s, @ndx, 1) = t2.cr
	union all
	select left( t.s, @ndx-1)+ t2.cr+ substring( t.s, @ndx+1, 255)
	from @t as t
	join @t2 as t2 on substring( t.s, @ndx, 1) = t2.ce
	set @ndx= @ndx+ 1
end


select * from @t
order by 1
10 дек 12, 17:14    [13608350]     Ответить | Цитировать Сообщить модератору
 Re: punto switcher или даже не знаю как назвать.  [new]
gang
Member

Откуда:
Сообщений: 1394
shr-13, Спасибо огромное, работает как надо.
11 дек 12, 15:05    [13613043]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить