Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

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

Bitte melde dich an um einen Kommentar abzugeben

5 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)

Verifikation/Checksumme:

675941283

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit:
Schwierigkeit: Leicht
Webcode: bweo-xqmc
Autor: ()

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen