BG Development


  Reply to this topicStart new topicStart Poll

> Проблем с реализацията на проста Руби функция, Функция, коят приема масив и връща нов
chessplayer
Публикувано на: 04-09-2020, 10:23
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 13
Регистриран на: 06.11.18



Здравейте,

Изучавам Руби и се опитвам да решавам задачи в HackerRank.

Имам за задача да реализирам функцията skip_animals, която се извиква по следния примерен начин:

CODE
skip_animals(['leopard', 'bear', 'fox', 'wolf'], 2)


И трябва да върне масив от типа:

CODE
["2:fox", "3:wolf"]


Моята имплементация е :

CODE
def skip_animals(animals, skip)
 new_array = Array.new("")
 animals.each_with_index do |item, index|
     array_index=0
     if (index>=skip) then
         new_array[array_index] = item
         array_index++
     end
   end
   return new_array;
end


Но средата на HackerRank, казва:

CODE
Solution.rb:8: syntax error, unexpected end
     end
     ^~~
Solution.rb:40: syntax error, unexpected end-of-input, expecting end


Не разбирам защо се оплаква на този
CODE
end
.

Какъв е проблема според Вас?
PMEmail Poster
Top
Lachezar
Публикувано на: 04-09-2020, 12:23
Quote Post



Име: Лъчезар Добрев
Група: Потребител
Ранг: Почетен член

Мнения: 2729
Регистриран на: 10.11.04



Може би точката и запетаята на предпоследния ред?


--------------------
И'м ватцхинг ъоу...
PMUsers Website
Top
chessplayer
Публикувано на: 04-09-2020, 13:49
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 13
Регистриран на: 06.11.18



QUOTE (Lachezar @ 04-09-2020, 12:23)
Може би точката и запетаята на предпоследния ред?

Не е това, продължавам с другите упражнения, пробвах функцията и на локалния си компютър, импретатора дава същата грешка.
PMEmail Poster
Top
devil
Публикувано на: 04-09-2020, 14:35
Quote Post



Име: Ангелов
Група: Потребител
Ранг: Почетен член

Мнения: 1445
Регистриран на: 17.05.04



QUOTE (chessplayer @ 04-09-2020, 14:49)
QUOTE (Lachezar @ 04-09-2020, 12:23)
Може би точката и запетаята на предпоследния ред?

Не е това, продължавам с другите упражнения, пробвах функцията и на локалния си компютър, импретатора дава същата грешка.

Тук дискутират май точно тази задача (и до колкото виждам, има разни варианти предложени).


--------------------
PMUsers WebsiteICQ
Top
Lachezar
  Публикувано на: 04-09-2020, 19:38
Quote Post



Име: Лъчезар Добрев
Група: Потребител
Ранг: Почетен член

Мнения: 2729
Регистриран на: 10.11.04



QUOTE (chessplayer @ 04-09-2020, 13:49)
QUOTE (Lachezar @ 04-09-2020, 12:23)
Може би точката и запетаята на предпоследния ред?

Не е това, продължавам с другите упражнения, пробвах функцията и на локалния си компютър, импретатора дава същата грешка.

Мда... Неочаквано:
https://stackoverflow.com/questions/3660563...ement-operators

В смисъл
CODE
array_index++
не е валидно в Груби.

Това обаче не е достатъчни:
CODE
:~$ docker run --rm -it ruby:alpine
irb(main):001:1* def skip_animals(animals, skip)
irb(main):002:1*   new_array = Array.new("")
irb(main):003:2*   animals.each_with_index do |item, index|
irb(main):004:2*     array_index=0
irb(main):005:3*     if (index>=skip) then
irb(main):006:3*       new_array[array_index] = item
irb(main):007:3*       array_index += 1
irb(main):008:2*     end
irb(main):009:1*   end
irb(main):010:1*   return new_array;
irb(main):011:0> end
=> :skip_animals
irb(main):012:0> skip_animals(['leopard', 'bear', 'fox', 'wolf'], 2)
Traceback (most recent call last):
       7: from /usr/local/bin/irb:23:in `<main>'
       6: from /usr/local/bin/irb:23:in `load'
       5: from /usr/local/lib/ruby/gems/2.7.0/gems/irb-1.2.1/exe/irb:11:in `<top (required)>'
       4: from (irb):12
       3: from (irb):2:in `skip_animals'
       2: from (irb):2:in `new'
       1: from (irb):2:in `initialize'
TypeError (no implicit conversion of String into Integer)
irb(main):013:0>


Поправяш конструктора на масива, и тогава вече:
CODE
:~$ docker run --rm -it ruby:alpine
irb(main):001:1* def skip_animals(animals, skip)
irb(main):002:1*   new_array = Array.new()
irb(main):003:2*   animals.each_with_index do |item, index|
irb(main):004:2*     array_index=0
irb(main):005:3*     if (index>=skip) then
irb(main):006:3*       new_array[array_index] = item
irb(main):007:3*       array_index += 1
irb(main):008:2*     end
irb(main):009:1*   end
irb(main):010:1*   return new_array;
irb(main):011:0> end
=> :skip_animals
irb(main):012:0> skip_animals(['leopard', 'bear', 'fox', 'wolf'], 2)
=> ["wolf"]


А това вероятно ще решиш че не работи правилно, защото „>=“ не е същото като „>“.


--------------------
И'м ватцхинг ъоу...
PMUsers Website
Top
chessplayer
Публикувано на: 05-09-2020, 07:29
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 13
Регистриран на: 06.11.18



QUOTE (Lachezar @ 04-09-2020, 19:38)



QUOTE

Поправяш конструктора на масива, и тогава вече:
CODE
:~$ docker run --rm -it ruby:alpine
irb(main):001:1* def skip_animals(animals, skip)
irb(main):002:1*   new_array = Array.new()
irb(main):003:2*   animals.each_with_index do |item, index|
irb(main):004:2*     array_index=0
irb(main):005:3*     if (index>=skip) then
irb(main):006:3*       new_array[array_index] = item
irb(main):007:3*       array_index += 1
irb(main):008:2*     end
irb(main):009:1*   end
irb(main):010:1*   return new_array;
irb(main):011:0> end
=> :skip_animals
irb(main):012:0> skip_animals(['leopard', 'bear', 'fox', 'wolf'], 2)
=> ["wolf"]


А това вероятно ще решиш че не работи правилно, защото „>=“ не е същото като „>“.



Не мога да разбера все още защо връща само Wolf, с проверка >= трябва да вземе 2 индекс включително, тоест и fox също? Но това може би ще го избистря и сам. Иначе, благодаря за помощта.
PMEmail Poster
Top
relax4o
Публикувано на: 05-09-2020, 21:20
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2567
Регистриран на: 04.04.07



QUOTE (chessplayer @ 05-09-2020, 07:29)
QUOTE (Lachezar @ 04-09-2020, 19:38)



QUOTE

Поправяш конструктора на масива, и тогава вече:
CODE
:~$ docker run --rm -it ruby:alpine
irb(main):001:1* def skip_animals(animals, skip)
irb(main):002:1*   new_array = Array.new()
irb(main):003:2*   animals.each_with_index do |item, index|
irb(main):004:2*     array_index=0
irb(main):005:3*     if (index>=skip) then
irb(main):006:3*       new_array[array_index] = item
irb(main):007:3*       array_index += 1
irb(main):008:2*     end
irb(main):009:1*   end
irb(main):010:1*   return new_array;
irb(main):011:0> end
=> :skip_animals
irb(main):012:0> skip_animals(['leopard', 'bear', 'fox', 'wolf'], 2)
=> ["wolf"]


А това вероятно ще решиш че не работи правилно, защото „>=“ не е същото като „>“.



Не мога да разбера все още защо връща само Wolf, с проверка >= трябва да вземе 2 индекс включително, тоест и fox също? Но това може би ще го избистря и сам. Иначе, благодаря за помощта.

Защото на всяка итерация зануляваш array_index и де факто заменяш стойността на new_array[0].
array_index = 0 трябва да е извън цикъла.

Това мнение е било редактирано от relax4o на 05-09-2020, 21:21


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0