Професионална програма
Loading...
+ Нов въпрос
Tryhard avatar Tryhard 1 Точки

Number Beggars - Fundamentals PY

Здравейте, от два часа съм "зациклил" трябват ми насоки как да реша тази задача. 

1.Number Beggars

Your task here is pretty simple: given a list of numbers and a number of beggars, you are supposed to return a list with the sum of what each beggar brings home, assuming they all take regular turns, from the first to the last.

For example: [1,2,3,4,5] for 2 beggars will return a result of 9 and 6, as the first one takes [1,3,5], the second collects [2,4].

The same list with 3 beggars would produce a better outcome for the second beggar: 5, 7 and 3, as they will respectively take [1, 4], [2, 5] and [3].

Also note that not all beggars have to take the same amount of "offers", meaning that the length of the list is not necessarily a multiple of n; length can be even shorter, in which case the last beggars will of course take nothing (0).

Input

You will receive 2 lines of input: a single string containing the numbers separated by a comma and a space ", ". On the second line you will receive the number of beggars.

Output

Print a list of all the sums that each beggar got.

INPUT                  OUTPUT |         INPUT                      OUTPUT

1, 2, 3, 4, 5             [9, 6]      |         3, 4, 5, 1, 29, 4          [3, 4, 5, 1, 29, 4]

2                                           |        6

Тагове:
1
Fundamentals Module
ItsMomchilS avatar ItsMomchilS 28 Точки
Best Answer

Както и да е, намерих го. Тествах един код и работи 100/100. Ако искаш ми прати твоя код да го погледна и да ти кажа къде е проблема.

П.С. Наистина е доста объркващ, но главно като зациклиш с такива задачи търси в интернет. Винаги има отговори!

Ето го кода ми:

numbers_list = [int(x) for x in input().split(", ")]
number_of_beggars = int(input())

beggars_list = [0] * number_of_beggars

for num in range(len(beggars_list)):
    current_beggar = num
    for n in range(len(numbers_list)):
        current_num = n % number_of_beggars
        if current_num == current_beggar:
            if beggars_list[num] == 0:
                if numbers_list[n] == 0:
                    beggars_list[current_num] = 0
                    break
                beggars_list[current_num] = numbers_list[n]
            else:
                beggars_list[current_num] += numbers_list[n]

print(beggars_list)
0
25/10/2020 15:28:38
Antoan.Stefanov avatar Antoan.Stefanov 3 Точки

Понеже не мога да разбера този код , ка моли да го напиша , можеш ли да ми дадеш съвет какво да предприема като действие ?
Дебъгвам и дебъгвам , но не схващам логиката ... притесних се до известна степен , как да разбера кода ? 

0
ItsMomchilS avatar ItsMomchilS 28 Точки

Добре ще ти го обясня по-описателно. 

Правиш лист за първия input и ги разделяш с ',' (чрез comprehension) , след това другия input се подразбира.: 

numbers_list = [int(x) for x in input().split(", ")]

Тази част прави в този случей един лист с толкова нули колкото са просяците, за да може сле това в loop-a да се пълнят в зависимост кой е под ред:

beggars_list = [0] * number_of_beggars

След това първия for цикъл прави така че да вземе всеки един от всички просяци, и current_beggar е равен на текущия просяк.:

for num in range(len(beggars_list)):
    current_beggar = num

Тук този for цикъл минава през листа със всички числа които трябва да се разпределят на просяците в зависимост от реда им. current_num проверява чрез %,

проверява дали е равно на 0, щом е равно на 0 значи се дели на сегашния просяк без остатък и това значи че е той. А другия if под него проверява дали този просяк има пари.

for n in range(len(numbers_list)):
    current_num = n % number_of_beggars
    if current_num == current_beggar:
След това следващия if проверя дали има пари. Защото ако няма това значи че листа с парите е свършил и на следващите просяци ще дава по 0.

В примерите има някой просяци, които са повече от парите и в този случеи е нужен този if.

if numbers_list[n] == 0:
    beggars_list[current_num] = 0
    break

Aко ли не то под него има там където да се добавят първите пари. Ето това.

beggars_list[current_num] = numbers_list[n]

И след това else е щом просяка вече е получавал пари да се добавят към онези.

else:
    beggars_list[current_num] += numbers_list[n]

И накрая принтира листа който трябва да е output-a на този код.

print(beggars_list)

 

Надявам се този път да беше по-добре обяснено. Ако има все пак нещо, което не е ясно ме питай! :)

 

0
01/11/2020 20:38:44
Antoan.Stefanov avatar Antoan.Stefanov 3 Точки

Много ти благодаря за обяснението , ще го разгледам утре на трезва глава ... (От следобед до сега ми се изпари акъла).
При объркани задачи с if-ове нямам особени проблеми , но при  вложените цикли - греда. 
Ако има нещо ще ти пиша отново ! :D 

0
ItsMomchilS avatar ItsMomchilS 28 Точки

Здравей, можеш ли само да пратиш линк на задачата в judge?

Meрси!

0
vigyriousx avatar vigyriousx 10 Точки
coins = [int(num) for num in input().split(", ")]
beggars = int(input())
count = 0
beggars_list = [0] * beggars
for coin in coins:
    beggars_list[count] += coin
    count += 1
    if count >= beggars:
        count = 0
print(beggars_list)

Ето и моето решение на задачката. 100/100

1
Ina_K avatar Ina_K 3 Точки

Много леко и добро решение. Браво!

1
Julianh12 avatar Julianh12 2 Точки
coins=[int(num) for num in input().split(", ")]
number_beggars=int(input())
list_beggers=[0]*number_beggars
count=0
for i in range(len(coins)):
        list_beggers[count]+=coins[i]
        count+=1
        if count>=number_beggars:
            count=0
print(list_beggers)
0
D1mitroV avatar D1mitroV 6 Точки

Просто перфектно,много хитро решение..Поздравления

1
krum_43 avatar krum_43 710 Точки

Ето и едно решение на C#

using System;
using System.Linq;

namespace Number_Beggars
{
    class Program
    {
        static void Main(string[] args)
        {
            string line = Console.ReadLine();
            int numberOfBeggars = int.Parse(Console.ReadLine());
            int[] inputDate = line.Split(",").Select(int.Parse).ToArray();
            int[] outputDate = new int[numberOfBeggars];
            for (int i = 0;i<inputDate.Length;i++)
            {
                int currentNumber = i % numberOfBeggars;
                outputDate[currentNumber]+= inputDate[i];                
            }
            Console.Write("[");
            Console.Write(String.Join(",",outputDate));
            Console.WriteLine("]");
        }
    }
}
 

1
RosieIvanova avatar RosieIvanova 1 Точки

Ето и моето решение след ужасно много умуване:

coins = input().split(", ")
count_beggars = int(input())
list_beggars = [0] * count_beggars
index = 0

while len(coins) > 0:
    list_beggars[index] += int(coins[0])
    coins.remove(coins[0])
    index += 1 
    if index >= count_beggars:
        index = 0
else:
    print(list_beggars)

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