Made in Taiwan

Συντονιστής: polysot

add2math
Δημοσιεύσεις: 67
Εγγραφή: Κυρ Φεβ 23, 2020 5:14 pm
Επικοινωνία:

Made in Taiwan

#1

Μη αναγνωσμένη δημοσίευση από add2math » Πέμ Αύγ 22, 2024 5:43 pm

Η παρακάτω άσκηση είναι από εισαγωγικές εξετάσεις στην Ταϊβάν.

"Ένα πολυκατάστημα διοργανώνει μια κλήρωση για την Ημέρα του Πατέρα με τους εξής κανόνες: Ο διοργανωτής έχει ετοιμάσει δέκα κάρτες με αριθμούς 1, 2, ..., 9, όπου υπάρχουν δύο κάρτες με τον αριθμό 8 και οι υπόλοιπες κάρτες έχουν από έναν αριθμό. Από αυτές τις δέκα κάρτες, επιλέγονται τυχαία τέσσερις κάρτες χωρίς επανατοποθέτηση και τοποθετούνται σε σειρά από αριστερά προς τα δεξιά για να σχηματίσουν έναν τετραψήφιο αριθμό. Εάν ο τετραψήφιος αριθμός πληροί μία τουλάχιστον από τις παρακάτω προϋποθέσεις, ο συμμετέχων κερδίζει ένα βραβείο:

1. Ο τετραψήφιος αριθμός είναι μεγαλύτερος από 6400.
2. Ο τετραψήφιος αριθμός περιέχει δύο αριθμούς 8.

Για παράδειγμα, αν οι τέσσερις κάρτες που επιλέγονται είναι 5, 8, 2, 8, τότε ο τετραψήφιος αριθμός είναι 5828 και κερδίζει βραβείο. Σύμφωνα με τους παραπάνω κανόνες, πόσοι συνολικά τετραψήφιοι αριθμοί υπάρχουν που κερδίζουν βραβείο; "

Το AI μπορεί να μην την έλυσε σωστά (ο κορμός της λύσης του ήταν σωστός αλλά του διέφυγαν αρκετές λεπτομέρειeς), αλλά όταν του το ζήτησα μου έγραψε τον παρακάτω σύντομο κώδικα, (μόλις 10 γραμμών) σε χρόνο dt.

Προσπαθήστε να κάνετε αυτό που η ΑΙ δεν κατάφερε!

Κώδικας: Επιλογή όλων


from itertools import permutations

# Οι κάρτες που έχουμε
cards = [1, 2, 3, 4, 5, 6, 7, 8, 8, 9]

# Λίστα για να αποθηκεύσουμε τους αριθμούς που κερδίζουν
winning_numbers = []

# Δημιουργία όλων των δυνατών συνδυασμών τεσσάρων καρτών
for combo in permutations(cards, 4):
    number = int(''.join(map(str, combo)))
    
    # Έλεγχος αν ο αριθμός είναι μεγαλύτερος από 6400 ή περιέχει δύο 8
    if number > 6400 or combo.count(8) == 2:
        winning_numbers.append(number)

# Αφαίρεση διπλότυπων αριθμών
winning_numbers = list(set(winning_numbers))

# Εκτύπωση του συνολικού αριθμού των τετραψήφιων αριθμών που κερδίζουν
print("Συνολικός αριθμός τετραψήφιων αριθμών που κερδίζουν:", {len(winning_numbers)})

# Εκτύπωση της λίστας με τους αριθμούς που κερδίζουν
print("Λίστα με τους αριθμούς που κερδίζουν:")
print(winning_numbers)
Για να ελέγξετε τα αποτελέσμaτά σας μπορείτε να τρέξετε τον κώδικα σε κάποιον online compiler όπως ο https://www.programiz.com/python-progra ... -compiler/
τελευταία επεξεργασία από add2math σε Δευ Αύγ 26, 2024 12:58 pm, έχει επεξεργασθεί 1 φορά συνολικά.


Χρήστος Σαμουηλίδης

Λέξεις Κλειδιά:
mick7
Δημοσιεύσεις: 1438
Εγγραφή: Παρ Δεκ 25, 2015 4:49 am

Re: Made in Taiwan

#2

Μη αναγνωσμένη δημοσίευση από mick7 » Πέμ Αύγ 22, 2024 7:42 pm

Έχεις την απάντηση ?


add2math
Δημοσιεύσεις: 67
Εγγραφή: Κυρ Φεβ 23, 2020 5:14 pm
Επικοινωνία:

Re: Made in Taiwan

#3

Μη αναγνωσμένη δημοσίευση από add2math » Πέμ Αύγ 22, 2024 8:00 pm

Έχω βρει μια λύση, εννοείται αλλιώς δεν θα το έβαζα...


Χρήστος Σαμουηλίδης
mick7
Δημοσιεύσεις: 1438
Εγγραφή: Παρ Δεκ 25, 2015 4:49 am

Re: Made in Taiwan

#4

Μη αναγνωσμένη δημοσίευση από mick7 » Πέμ Αύγ 22, 2024 8:15 pm

Απλα το νούμερο ήθελα...για να δω πόσο εκτός πέφτω... ;)


add2math
Δημοσιεύσεις: 67
Εγγραφή: Κυρ Φεβ 23, 2020 5:14 pm
Επικοινωνία:

Re: Made in Taiwan

#5

Μη αναγνωσμένη δημοσίευση από add2math » Δευ Αύγ 26, 2024 12:58 pm

Εξετάζουμε περιπτώσεις:
1. Ο αριθμός είναι μεγαλύτερος από 6400:
- Οι αριθμοί που ξεκινούν με 7, 8 ή 9 είναι σίγουρα μεγαλύτεροι από 6400.
Οι αριθμοί που ξεκινούν από 7 είναι της μορφής:
- 7 ΧXX, κανένα 8, X\in \{1,2,3,4,5,6,9\} : 7\cdot6\cdot5=210
- 7 8XX, ένα 8, X\in \{1,2,3,4,5,6,9\} : 3\cdot7\cdot6=126
- 7 88X, δύο 8, X\in\{1,2,3,4,5,6,9\} : 3\cdot7=21
Σύνολο αριθμών που ξεκινούν από 7 είναι 210+126+21=357
Σύνολο αριθμών που ξεκινούν από 9 είναι 210+126+21=357, ομοίως.
Οι αριθμοί που ξεκινούν από 8 είναι της μορφής
- 8 XXX, X \in \{1,2,3,4,5,6,7,8,9\} : δεν υπάρχουν διπλότυπα
Σύνολο αριθμών που ξεκινούν από 8 είναι 9\cdot8\cdot7=504.
Οι αριθμοί που ξεκινούν από 6 και είναι μεγαλύτεροι από 6400 είναι της μορφής
- 6Υ XX, κανένα 8, Y \in \{4,5,7,9\},X\in \{1,2,3,4,5,7,9\}-\{Y\} : 4\cdot6\cdot5=120
- 6Υ 8X ή 6Υ Χ8, ένα 8, Y \in \{4,5,7,9\},X\in \{1,2,3,4,5,7,9\} : 4\cdot2\cdot7=56
- 68 XX, X \in \{1,2,3,4,5,7,8,9\}, δεν υπάρχουν διπλότυπα : 8\cdot7=56
Σύνολο αριθμών που ξεκινούν από 6 είναι 120+56+56=232

Σύνολο αριθμών μεγαλύτερων από 6400 είναι 357+357+504+232=1446

2. Οι αριθμοί που περιέχουν δύο 8:
- 88XX ανεξαρτήτως σειράς των ψηφίων: \binom{4}{2}\cdot8\cdot7=6\cdot8\cdot7=336 συνδυασμοί.
Βρίσκουμε και ποιοι αριθμοί πληρούν και τις δυο προϋποθέσεις για να μην τους μετρήσουμε δυο φορές.
- 7 88X: 3\cdot7=21 συνδυασμοί, αφού η σειρά των 88X δεν παίζει ρόλο
- 8 8XX: 3\cdot8\cdot7=168 συνδυασμοί, αφού η σειρά των 8XX δεν παίζει ρόλο
- 9 88X: 3\cdot7=21 συνδυασμοί, αφού η σειρά των 88X δεν παίζει ρόλο
- 6Υ88: 4 συνδυασμοί, αφού Y \in \{4,5,7,9\}
- 68 Υ8: 2\cdot7=14 συνδυασμοί, αφού η σειρά των Y8 δεν παίζει ρόλο
Άρα έχω 21+168+21+4+14=228 αριθμούς που πληρούν και τις δυο προϋποθέσεις.

Συνολικά, οι αριθμοί που πληρούν τις προϋποθέσεις είναι: 1446+336-228=1554


Χρήστος Σαμουηλίδης
Nikitas K.
Δημοσιεύσεις: 288
Εγγραφή: Δευ Νοέμ 06, 2023 6:01 pm
Τοποθεσία: Ρόδος

Re: Made in Taiwan

#6

Μη αναγνωσμένη δημοσίευση από Nikitas K. » Τετ Αύγ 28, 2024 5:12 pm

Παραμετροποίησα το πρόβλημα σε Java, για όποιον θέλει να εξασκηθεί.

Παράμετροι:
Έστω, μερικοί μη αρνητικοί μονοψήφιοι:

Κώδικας: Επιλογή όλων

static final int[] cards = { 1, 2, 3, 4, 5, 6, 7, 8, 8, 9 };
Επιλέγονται τυχαία μερικοί από αυτούς χωρίς επανατοποθέτηση και τοποθετούνται σε σειρά από αριστερά προς τα δεξιά για να σχηματίσουν έναν αριθμό.

Κώδικας: Επιλογή όλων

static final int holdingCards = 4;
Πόσοι είναι οι μοναδικοί αριθμοί που όταν σχηματιστούν:
είναι

Κώδικας: Επιλογή όλων

static final char inequality = '>'; // Choose inequality '<' or '>'
του

Κώδικας: Επιλογή όλων

static final int greaterThan = 6400;
ή περιέχουν:

Κώδικας: Επιλογή όλων

static final int times = 2;
φορές τον αριθμό:

Κώδικας: Επιλογή όλων

static final int element = 8;
;

Πρόγραμμα:

Κώδικας: Επιλογή όλων

import java.util.ArrayList;
import java.util.List;

public class Main {

	static final int[] cards = { 1, 2, 3, 4, 5, 6, 7, 8, 8, 9 };
	static final int holdingCards = 4;
	static final char inequality = '>'; // Choose inequality '<' or '>'
	static final int relationTo = 6400;
	static final int times = 2;
	static final int element = 8;

	public static void main(String[] args) {
		List<int[]> permutations = new ArrayList<>();
		boolean[] used = new boolean[cards.length];
		generatePermutations(cards, new int[holdingCards], 0, used, permutations);
		ArrayList<Integer> winningNumbers = new ArrayList<Integer>();
		int num;
		for (int[] perm : permutations) {
			num = arrayToNumber(perm);
			if (!winningNumbers.contains(num))
				switch (inequality) {
				case '>':
					if ((num <= relationTo && elemOccurs(num)) || num > relationTo)
						winningNumbers.add(num);
					break;
				case '<':
					if ((num >= relationTo && elemOccurs(num)) || num < relationTo)
						winningNumbers.add(num);
					break;
				}
		}
//		System.out.println(winningNumbers);
		System.out.print(winningNumbers.size());
	}

	private static int arrayToNumber(int[] perm) {
		int num = 0;
		for (int i = 0; i < perm.length; i++)
			num += Math.pow(10, perm.length - 1 - i) * perm[i];
		return num;
	}

	private static boolean elemOccurs(int num) {
		byte count = 0;
		for (char digit : String.valueOf(num).toCharArray())
			if (String.valueOf(digit).equals(String.valueOf(element)))
				count++;
		return count == times;
	}

	private static void generatePermutations(int[] arr, int[] current, int index, boolean[] used,
			List<int[]> permutations) {
		if (index == current.length) {
			permutations.add(current.clone());
			return;
		}

		for (int i = 0; i < arr.length; i++)
			if (!used[i]) {
				used[i] = true;
				current[index] = arr[i];
				generatePermutations(arr, current, index + 1, used, permutations);
				used[i] = false;
			}
	}
}
Την μέθοδο που δημιουργεί όλες τις πιθανές διατάξεις (generatePermutations) την έλαβα έτοιμη από το ChatGPT γιατί, η δική μου μέθοδος είχε περιοριστεί σε τετραψήφιους, ήταν πολύ βαριά και αργή:

Κώδικας: Επιλογή όλων

import java.util.ArrayList;

public class Main {

	private static void initialize(ArrayList<Integer> cards, ArrayList<Integer> hand) {
		hand.add(9);
		hand.add(8);
		hand.add(8);

		for (int i = 7; i > 0; i--)
			cards.add(i);
	}

	private static void swap(ArrayList<Integer> arr1, ArrayList<Integer> arr2, int i, int j) {
		int tmp = arr1.get(i);
		arr1.set(i, arr2.get(j));
		arr2.set(j, tmp);
	}

	private static void loadTable(ArrayList<Integer> table, ArrayList<Integer> bin) {
		for (int i = 0; i < 7; i++)
			table.add(0, bin.remove(0));
	}

	private static boolean checkDoubleEight(int number) {
		int count = 0;
		for (char c : String.valueOf(number).toCharArray())
			if (c == '8')
				count++;
		return count > 1;
	}

	static void ones(ArrayList<Integer> hand, ArrayList<Integer> table, ArrayList<Integer> bin,
			ArrayList<Integer> numbers) {
		for (int i = 0; i < 7; i++) {
			hand.add(3, table.remove(0));

//			System.out.println(hand);

			int number = hand.get(3) + 10 * hand.get(2) + 100 * hand.get(1) + 1000 * hand.get(0);
			if (!numbers.contains(number))
				numbers.add(number);

			bin.add(0, hand.remove(3));
		}
	}

	static void tens(ArrayList<Integer> hand, ArrayList<Integer> table, ArrayList<Integer> bin,
			ArrayList<Integer> numbers) {
		for (int outerLoop = 6; outerLoop >= 0; outerLoop--) {
			ones(hand, table, bin, numbers);
			swap(hand, bin, 2, outerLoop);
			loadTable(table, bin);
		}
		ones(hand, table, bin, numbers);

		bin.add(0, hand.remove(2));
	}

	static void hundreds(ArrayList<Integer> hand, ArrayList<Integer> table, ArrayList<Integer> bin,
			ArrayList<Integer> numbers) {
		for (int outerOuterLoop = 7; outerOuterLoop >= 0; outerOuterLoop--) {
			tens(hand, table, bin, numbers);

			swap(hand, bin, 1, outerOuterLoop);

			if (outerOuterLoop > 0) {
				hand.add(2, bin.remove(7));
				loadTable(table, bin);
			}
		}
		hand.add(2, bin.remove(7));
		loadTable(table, bin);
		tens(hand, table, bin, numbers);
		bin.add(0, hand.remove(1));
	}

	static void thousands(ArrayList<Integer> hand, ArrayList<Integer> table, ArrayList<Integer> bin,
			ArrayList<Integer> numbers) {
		for (int outerOuterOuterLoop = 8; outerOuterOuterLoop >= 0; outerOuterOuterLoop--) {
			hundreds(hand, table, bin, numbers);
			swap(hand, bin, 0, outerOuterOuterLoop); // 8 till 0. Positions.

			hand.add(bin.remove(8));
			hand.add(bin.remove(7));

			loadTable(table, bin);
		}
		hundreds(hand, table, bin, numbers);
	}

	public static void main(String[] args) {
		ArrayList<Integer> table = new ArrayList<Integer>(10), hand = new ArrayList<Integer>(4),
				bin = new ArrayList<Integer>(9), numbers = new ArrayList<Integer>();

		initialize(table, hand);
		thousands(hand, table, bin, numbers);

//		System.out.println();
//		System.out.println(table);
//		System.out.println(hand);
//		System.out.println(bin);
//
//		System.out.println();
//		System.out.println(numbers);

		int count = 0;
		for (int n : numbers)
			if (checkDoubleEight(n) || n > 6400)
				count++;
//		System.out.println();
		System.out.println("The total numbers that wins are: " + count);
	}
}
Στην ουσία ήθελα να κάνω αυτό που, πάλι επιτυχημένα το ChatGPT έκανε:

Κώδικας: Επιλογή όλων

import java.util.HashSet;
import java.util.Set;

public class Lottery {
	private static boolean contains(byte times, byte element, short num) {
		byte count = 0;
		for (char digit : String.valueOf(num).toCharArray())
			if (String.valueOf(digit).equals(String.valueOf(element)))
				count++;
		return count == times;
	}

	private static void addWinningNumber(short num, Set set) {
		if (num > 6400 || contains((byte) 2, (byte) 8, num))
			set.add(num);
	}

	public static void main(String[] args) {
		byte[] cards = { 1, 2, 3, 4, 5, 6, 7, 8, 8, 9 };
		Set<Integer> winningNumbers = new HashSet<>();
		for (byte i = 0; i < cards.length; i++)
			for (byte j = 0; j < cards.length; j++)
				if (j != i)
					for (byte k = 0; k < cards.length; k++)
						if (k != i && k != j)
							for (byte l = 0; l < cards.length; l++)
								if (l != i && l != j && l != k) {
									addWinningNumber(
											(short) (cards[i] * 1000 + cards[j] * 100 + cards[k] * 10 + cards[l]),
											winningNumbers);
								}
		System.out.print(winningNumbers.size());
	}
}


Νικήτας Κακούλλης
«Μέτρον ἄριστον» Κλεόβουλος Εὐαγόρου Λίνδιος
Άβαταρ μέλους
Demetres
Γενικός Συντονιστής
Δημοσιεύσεις: 9010
Εγγραφή: Δευ Ιαν 19, 2009 5:16 pm
Τοποθεσία: Λεμεσός/Πύλα
Επικοινωνία:

Re: Made in Taiwan

#7

Μη αναγνωσμένη δημοσίευση από Demetres » Τρί Σεπ 03, 2024 10:43 am

Ας τα μετρήσουμε και λίγο διαφορετικά:

Περίπτωση 1: Στα τρία τελευταία ψηφία υπάρχουν δύο οκτάρια: Έχουμε 8 τρόπους να επιλέξουμε το πρώτο ψηφίο, 7 τρόπους το άλλο ψηφίο που δεν είναι ίσο με οκτώ και 3 τρόπους για το που να τοποθετήσουμε το άλλο ψηφίο. Σύνολο: 8 \cdot 7 \cdot 4 = 168 τρόποι.

Περίπτωση 2: Στα τρία τελευταία ψηφία υπάρχει το πολύ ένα οκτάρι: Αναγκαστικά το πρώτο ψηφίο πρέπει να είναι μεγαλύτερο ή ίσο του 6.

Περίπτωση 2Α: Το πρώτο ψηφίο είναι το 6. Τότε το δεύτερο πρέπει να ανήκει στο σύνολο \{4,5,7,8,9\}. Έχουμε πέντε τρόπους να το επιλέξουμε. Μένουν άλλα 7 ψηφία και έχουμε 7 \cdot 6 επιλογές για το ποια να επιλέξουμε. Σύνολο 5 \cdot 7 \cdot 6 = 210 τρόποι.

Περίπτωση 2Β: Το πρώτο ψηφίο είναι το 7 ή το 9. Μένουν άλλα 8 ψηφία και έχουμε 8 \cdot 7 \cdot 6 επιλογές για το ποια να επιλέξουμε. Λαμβάνοντας υπόψη και το πρώτο ψηφίο έχουμε 2 \cdot 8 \cdot 7 \cdot 6 = 672 τρόποι.

Περίπτωση 2Γ: Το πρώτο ψηφίο είναι το 8. Μένουν άλλα 9 ψηφία και έχουμε 9 \cdot 8 \cdot 7 = 504 τρόπους να τα επιλέξουμε.

Συνολικά γίνεται με 168+210+672+504 = 1554 τρόπους.


Απάντηση

Επιστροφή σε “Συνδυαστική”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης