Προγραμματιστική πρόκληση Νο 1 : Άθροισμα διαιρετέων αριθμών

Να δώσω τότε και μια συναρτησιακή εκδοχή του απλού αλγόριθμου.

#include <fmt/format.h>
#include <range/v3/all.hpp>

namespace rs = ranges;
int main() {
    fmt::print("The answer is {:n}",
       rs::accumulate(rs::iota_view(1uL, 101uL) |
       rs::view::filter([](auto v) {return (v % 3 == 0) or (v % 5 == 0); }),0));
    return 0;
}

Σε C++17, μαζί με δυο βιβλιοθήκες, που θα είναι μέσα στην επόμενη C++20, αλλά μπορούν να χρησιμοποιηθούν από σήμερα. Δεν έχει την κομψότητα και την απλότητα της Python, αλλά την πλησιάζει υπερβολικά πολύ :slight_smile:

3 «Μου αρέσει»

Mία όχι και τόσο efficient εκδοχή, αλλά με έμφαση στο readability και το maintainability, γραμμένη σε Go:

package main

import "fmt"

// isItDivisibleByBoth() evaluates true or false
// whether num1 is divisible by both num2 and num3
func isItDivisibleByBoth(num1, num2, num3 int) bool {
	multiples := num2 * num3
	if num1%multiples == 0 {
		return true
	}
	return false

}

// findNumbersDivisibleBy() returns an array of integers
// including numbers disible by "a" and "b"
// beginning from the "start" and finishing at the "end"
func findNumbersDivisibleBy(start, end, a, b int) []int {
	numbers := []int{}
	for i := start; i <= end; i++ {
		if isItDivisibleByBoth(i, a, b) {
			numbers = append(numbers, i)
		}
	}
	return numbers
}

// sum() calculates the sum of an integer array
func sum(input []int) int {
	sum := 0
	for i := range input {
		sum += input[i]
	}
	return sum
}

func main() {
	// example:
	// In a list of numbers from 23 to 100, find numbers divisible by 3 and 5
	numbers := findNumbersDivisibleBy(23, 100, 3, 5)
	fmt.Println(numbers)

	// Calculate the summary of these numbers
	sumNumbers := sum(numbers)
	fmt.Println(sumNumbers)
}
2 «Μου αρέσει»

Ξέρω ότι άργησα 10 μέρες να το ανεβάσω. Δεν είμαι ο καλύτερος στον προγραμματισμό, αλλά εδώ έχω τη λύση του προβλήματος σε C (όσο το δυνατόν απλούστερη, σε λιγότερες από 20 γραμμές). Και καλώς ή κακώς, ίσως να πήρα κάποιες ιδέες, για να διορθώσω κάποιες λεπτομέρειες, από προηγούμενα posts εδώ. Κανείς δεν είναι τέλειος…

#include <stdio.h>

void main()
{
  int num = 0, input = 0, div1 = 3, div2 = 5, i = 0;
  printf("\nType a number: ");
  scanf("%d", &input);
  for (num = 0; num <= input; num++) {
    if ((num % div1 == 0) && (num % div2 == 0)) {
      i = i + num;
      }
   }
  printf("\n%d", i);
  printf("\n");
}
4 «Μου αρέσει»

να βάλω και μια γλώσσα τού μέλλοντος.

#proklisi1.nim

import strutils

proc souma(n: int): int =
    var s=0
    var i=3
    while true:
        if i > n: return s
        if i mod 3 == 0 or i mod 5== 0: s = s + i
        inc i

echo "Δώσε αριθμό:"
let n = readLine(stdin).parseInt()
echo souma n
1 «Μου αρέσει»
    def sum_of_nums():
        list_3=[]
        list_5=[]
        number = 1
        while number==1:
            x=input('Number: ').strip()
            if not x.isdigit(): continue
            else:
                # Εισαγουμε σε 2 λίστες τους αριθμούς που διαιρούντε με το 3 και με το 5
                x = int(x)
                list_3 = [n for n in range(1, x + 1) if n % 3==0]
                list_5 = [n for n in range(1, x + 1) if n % 5==0]
                break
        # βρίσκουμε το αθροισμα της κάθε λίστας
        s3 = 0
        for i in list_3: s3+=i
        s5 = 0
        for i in list_5: s5 += i
        print('Άθροισμα αριθμών που διαιρούνται με το 3: {}'.format(s3))
        print('Άθροισμα αριθμών που διαιρούνται με το 5: {}'.format(s5))

    if __name__=='__main__':sum_of_nums()
2 «Μου αρέσει»

Πάρτε και ένα list comprehension

def divider(x):
    return sum([i for i in range(0,x) if i%3==0 and i%5==0])
2 «Μου αρέσει»