Професионална програма
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 341 Точки

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

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 642 Точки

Цялостната ти логика е грешна, защото при вход '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