Loading...
IliqnK avatar IliqnK 30 Точки

[HOMEWORK] DB - Functions - Problem 7. Define Function

Здравейте,

Някой може ли да помогне с първите 2 теста от този проблем?

Ето и заявката ми:

CREATE FUNCTION ufn_IsWordComprised
  (
  @setOfLetters nvarchar(max), 
  @word nvarchar(max)
  )
RETURNS bit
AS
BEGIN 
    SET @word = REPLACE(@word, char(9), '')
    SET @word = RTRIM(LTRIM(@word))
    DECLARE @l int = 1;
    WHILE LEN(@word) >= @l
    BEGIN
      DECLARE @charindex int; 
      DECLARE @letter char(1);
      SET @letter = SUBSTRING(@word, @l, 1)
      SET @charindex = CHARINDEX(@letter, @setOfLetters, 0)
      IF @charindex = 0
      BEGIN 
        RETURN 0
      END
      SET @setOfLetters = STUFF(@setOfLetters, @charindex, 1, '')
      SET @l += 1;
    END

    RETURN 1
END

Тагове:
0
Module: C# DB 11/10/2016 10:55:55
stambi4a avatar stambi4a 126 Точки

Ако смениш WHILE LEN(@word) >= @l  с WHILE LEN(@word) > @l тестовете ще минат, макар че логиката е грешна.

1
IliqnK avatar IliqnK 30 Точки

Благодаря.

 

P.S. Какво имаш предвид под грешна логика?

0
09/10/2016 17:09:53
valcho62 avatar valcho62 178 Точки

Колега, моето решение е подобно на твоето, и аз запецнах на 60т. Какво ли не опитах - >=, тримове,ретърни - не става. Ти докара ли я до 100? И въобще някой може ли да постне 100т решение да го видим .

0
IliqnK avatar IliqnK 30 Точки

Променили са явно очаквания резултат, сега гледам, че още първите ми заявки са със 100/100.

Ето и моето решение:

CREATE FUNCTION ufn_IsWordComprised
  (
  @setOfLetters nvarchar(255), 
  @word nvarchar(255)
  )
RETURNS bit
AS
BEGIN 
    DECLARE @l int = 1;
    DECLARE @exist bit = 1;
    WHILE LEN(@word) >= @l AND @exist > 0
    BEGIN
      DECLARE @charindex int; 
      DECLARE @letter char(1);
      SET @letter = SUBSTRING(@word, @l, 1)
      SET @charindex = CHARINDEX(@letter, @setOfLetters, 0)
      SET @exist =
        CASE
            WHEN  @charindex > 0 THEN 1
            ELSE 0
        END;
      SET @l += 1;
    END

    RETURN @exist
END

0
11/10/2016 10:35:00
AntonPortenov avatar AntonPortenov 102 Точки

Здравей, къде е бил проблема при теб?

Моето е сходно но съм 3/4 верни

0
kaloyannikov avatar kaloyannikov 531 Точки

TINYINT не трябва да е с range т.е без (1)  и цикъла не  трябва да е до <= wordLength, а само < . 

0
AntonPortenov avatar AntonPortenov 102 Точки

Нямаше да ми хрумне да е < защото няма логика да започваш от 1 и да не си <=

или поне на Java и C# :)

Иначе то аз си използвах INT за returns може би затова е 3/4.

 

Мерси

0
msmilkoff avatar msmilkoff 338 Точки

По-кратък вариант:

CREATE FUNCTION ufn_IsWordComprised(@setOfLetters VARCHAR (50), @word VARCHAR (50)) 
RETURNS BIT
AS
BEGIN
     DECLARE @index INT = 1
     DECLARE @length INT = LEN(@word)
     DECLARE @letter CHAR(1)

     WHILE (@index <= @length)
     BEGIN
          SET @letter = SUBSTRING(@word, @index, 1)
          IF (CHARINDEX(@letter, @setOfLetters) > 0)
             SET @index = @index + 1
          ELSE
             RETURN 0
     END
     RETURN 1
END 

1
georgiab avatar georgiab 34 Точки

Някой може ли да помогне? Къде бъркам -> https://pastebin.com/iae2ps3r

Благодаря предварително!

0
ambiorix avatar ambiorix 640 Точки

Цялостната ти логика е грешна, защото при вход 'oistmiahf', 'Sofia' за първата буква от думата 'S' ще получиш 1, но след това взимаш 'So' а в буквите 'oistmiahf' няма 'so' поредни.

0
silviyadimitrova avatar silviyadimitrova 6 Точки

Някой може ли да ми каже къде бъркам (освен, че решението е доста дълго..)?

И между другото не трябва ли да търсим резултат 0, ако в Word има два пъти буква, която в SetOfLetters присъства само веднъж? В този случай не можем да конструираме думата Word от дадените букви.

 

CREATE FUNCTION ufn_IsWordComprised(@SetOfLetters NVARCHAR(50), @Word NVARCHAR(50))

RETURNS BIT
AS
BEGIN
    DECLARE @Result BIT = 0

    IF (LEN(@SetOfLetters) < LEN(@Word))
        BEGIN
            RETURN @Result
        END
    
    DECLARE
        @CurrentIndex INT = 1,
        @CurrentLetterIndex INT = 1

    WHILE(LEN(@SetOfLetters) <> 0 AND @CurrentLetterIndex <= LEN(@Word))
    BEGIN
        IF (CHARINDEX(SUBSTRING(@Word, @CurrentLetterIndex, 1), @SetOFLetters, 1) = 0)
        BEGIN
            RETURN @Result
        END
        
        DECLARE @CurrentLetter NVARCHAR(1) = SUBSTRING(@Word, @CurrentLetterIndex, 1)

        SET @SetOfLetters = REPLACE(@SetOfLetters, @CurrentLetter, '')

        SET @CurrentIndex += 1
        SET @CurrentLetterIndex += 1

    END

    SET @Result = 1
    RETURN @Result
END
 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.