Der Tresor (Schleifen)
Ein reicher Mann hat leider den Code für seinen Tresor vergessen. Er weiß lediglich noch, dass alle Ziffern von 1 bis 9 genau einmal vorkommen. Der Code hat also die Form ABCDEFGHI. Außerdem hat er noch einen kleinen Zettel mit folgenden Notizen gefunden:
E – I = F
I + E = B
G * I = A
H – C = D / I
Schreibe einen Algorithmus, der diesen Code – wenn möglich performant - knackt.
0 Kommentare
6 Lösung(en)
import itertools
for x in itertools.permutations(range(1, 10)):
if x[4]-x[8] == x[5] and x[4]+x[8] == x[1] and x[6]*x[8] == x[0] and x[8]*(x[7]-x[2]) == x[3]:
print("".join(map(lambda z: str(z), x)))
break
Lösung von: Name nicht veröffentlicht
// C++ 20 | VS-2022
#include <iostream>
#include <algorithm>
#include <sstream>
#include <array>
int main() {
std::array v{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::stringstream s;
while (std::next_permutation(v.begin(), v.end())) {
if (v[4] - v[8] == v[5] &&
v[8] + v[4] == v[1] &&
v[6] * v[8] == v[0] &&
v[7] - v[2] == (v[3] / v[8])) {
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(s, "")); // C++ 20
std::cout << s.str().c_str() << "\n";
break;
}
}
}
// ca. 50ms inklusive Bildschirmausgabe
Lösung von: Jens Kelm (@JKooP)
// NET 6.x | C# 10.x | VS-2022
var nums = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var p = new Permutation();
p.Permute(nums);
Console.WriteLine(p);
public class Permutation {
private List<string> _lst = new List<string>();
public void Permute(int[] arr) => Permute(arr, 0, arr.Length - 1);
private void Permute(int[] arr, int k, int m) {
if (k == m) {
if (arr[4] - arr[8] == arr[5] &&
arr[8] + arr[4] == arr[1] &&
arr[6] * arr[8] == arr[0] &&
arr[7] - arr[2] == (arr[3] / arr[8])) {
_lst.Add(string.Join("", arr));
}
}
else
for (int i = k; i <= m; i++) {
(arr[k], arr[i]) = (arr[i], arr[k]);
Permute(arr, k + 1, m);
(arr[k], arr[i]) = (arr[i], arr[k]);
}
}
public override string ToString() => _lst.FirstOrDefault() ?? "";
}
Lösung von: Jens Kelm (@JKooP)
from itertools import permutations
f=lambda x,y: int(str(x)[y])
print([i for i in [int(''.join(findall('[1-9]',str(b)))) for b in list(permutations('123456789'))] if f(i,4)-f(i,-1)==f(i,5) and f(i,-1)+f(i,4)==f(i,1) and f(i,-3)*f(i,-1)==f(i,0) and f(i,-2)-f(i,2)==f(i,3)/f(i,-1)][0])
Lösung von: rob ert (tub)
/***************************************************************\
| ZUNÄCHST EIN BISSCHEN ZETTEL-STIFT-ARBEIT: |
|===============================================================|
| (I) E - I = F |
| (II) I + E = B |
| (III) G * I = A |
| (IV) H - C = D / I |
|...............................................................|
| aus (III) folgen die einzig gültigen werte für: |
| A = {6, 8} |
| G = {2, 3, 4} |
| I = {2, 3, 4} |
|...............................................................|
| aus (IV) folgen die einzig gültigen werte für: |
| D = {4, 6, 8, 9} |
| H - C = {2, 3, 4} |
|...............................................................|
| aus (I) folgt E > I, daher |
| E = {4, 5, 6, 7, 8, 9} |
| F = {1, 2, 3, 4, 5, 6, 7} |
|...............................................................|
| aus (I) und den vorherigen überlegungen: |
| B = {6, 7, 8, 9} |
|...............................................................|
| schließlich, aus (IV) und den umstellungen: |
| C = {1, 3, 5} |
| H = {7, 8, 9}. |
|---------------------------------------------------------------|
| so, zettel voll. |
| ZUSAMMENFASSENDE TABELLE DER MÖGLICHEN WERTE: |
|...............................................................|
| A: - - - - - 6 - 8 - |
| B: - - - - - 6 7 8 9 |
| C: 1 - 3 - 5 - - - - |
| D: - - - 4 - 6 - 8 9 |
| E: - - - 4 5 6 7 8 9 |
| F: 1 2 3 4 5 6 7 - - |
| G: - 2 3 4 - - - - - |
| H: - - - - - - 7 8 9 |
| I: - 2 3 4 - - - - - |
|...............................................................|
| ich denke, das reicht um jetzt den rechner einzuschalten: |
\***************************************************************/
function check(arr) {
if ([...arr].sort().join('') != '123456789') return false; // dubletten?/1-9?
if (arr[4] - arr[8] != arr[5]) return false; // (I)
if (arr[8] + arr[4] != arr[1]) return false; // (II)
if (arr[6] * arr[8] != arr[0]) return false; // (III)
if (arr[7] - arr[2] != arr[3] / arr[8]) return false; // (IV)
return true;
}
// main
console.time();
for (let a of [6, 8])
for (let b of [6, 7, 8, 9])
for (let c of [1, 3, 5])
for (let d of [4, 6, 8, 9])
for (let e of [4, 5, 6, 7, 8, 9])
for (let f of [1, 2, 3, 4, 5, 6, 7])
for (let g of [2, 3, 4])
for (let h of [7, 8, 9])
for (let i of [2, 3, 4]) {
let cur = [a, b, c, d, e, f, g, h, i];
if (check(cur)) console.log(cur.join(''));
}
console.timeEnd(); // ~ 100 ms
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 9
void swap(int* lhs, int* rhs) {
int tmp = *lhs;
*lhs = *rhs;
*rhs = tmp;
}
void check(int* arr) {
if (arr[4] - arr[8] == arr[5] &&
arr[8] + arr[4] == arr[1] &&
arr[6] * arr[8] == arr[0] &&
arr[7] - arr[2] == (arr[3] / arr[8])) {
for (int i = 0; i < MAX_SIZE; ++i)
printf("%i ", arr[i]);
printf("\n");
}
}
void Permute(int* arr, int k, int m) {
if (k == m)
check(arr);
else
for (int i = k; i <= m; i++) {
swap(&arr[k], &arr[i]);
Permute(arr, k + 1, m);
swap(&arr[k], &arr[i]);
}
}
int main() {
int nums[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Permute(nums, 0, MAX_SIZE - 1);
return 0;
}
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme:
675941283
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung: