Python :: Aufgabe #139

1 Lösung Lösung öffentlich

Berechnung und Ausgabe einer Zahlen-Schnecke

Anfänger - Python von pocki - 06.01.2017 um 16:36 Uhr
Das Programm soll eine Ganzzahl (int) entgegen nehmen und berechnen ob eine Zahlen-Schnecke (wie auf einem Brettspiel) mit dieser Anzahl an Feldern bzw. höchsten Zahl möglich ist und gegebenfalls in einer einfachen Form (z.B. in Konsole oder Textdatei) ausgeben.

Die Zeilen- und Spaltenanzahl muss nicht gleich groß sein.
Option: Die Zahl 0 soll je nachdem ob sie für eine Durchführung benötigt wird, eingefügt oder weggelassen werden.
Erweiterung: Lass den Benutzer auswählen, ob die Schnecke sich im oder gegen den Uhrzeigersinn dreht.

Beispielausgabe:

Konsolenausgabe:

Höchste Zahl der Zahlenschnecke: 19
0 1 2 3 4
13 14 15 16 5
12 19 18 17 6
11 10 9 8 7

Höchste Zahl der Zahlenschnecke: 2
Fehler: Die Zahl 2 ist zu klein für eine Zahlenschnecke

PS: Hat diese Art einer Schnecke eine andere Bezeichnung?

Lösungen:

vote_ok
von satn1241 (3090 Punkte) - 25.04.2020 um 20:42 Uhr
Quellcode ausblenden Python-Code
# Primzahltest
def prim_zahl(zahl):
    prim = True
    a = int(zahl ** 0.5)
    for j in range(2, a + 1):
        rest = zahl % j
        if rest == 0:
            prim = False
            break
    return prim


def breite_berechnen(zahl):
    teiler = []
    a = int(zahl ** 0.5)
    for j in range(1, a + 1):
        rest = zahl % j
        if rest == 0:
            teiler.append(j)
    breite = max(teiler)
    return breite


# Programm-Start
# Check, ob eine Zahl eingegeben wird
while True:
    zahl = input("Gib bitte eine Zahl ein: ")
    try:
        int(zahl)
        zahl = int(zahl)
        if zahl > 2:
            break
        else:
            print("Die Zahl muss größer als 2 ein")
    except:
        "none"
# Check, ob r/l eingegeben wird
while True:
    richtung = str(input("Soll die Schnecke links oder rechts herum gehen? (l/r) > "))
    if richtung == "l":
        break
    elif richtung == "r":
        break
    else:
        print("Falsche Eingabe")

# Primzahlen auf im Rechteck darstellbare Zahl anpassen
if prim_zahl(zahl):
    zahl += 1
    index = -1
else:
    index = 0

# Matrix erstellen
breite = breite_berechnen(zahl)
länge = int(zahl / breite)

import numpy as np

matrix = np.arange(1, zahl + 1)
matrix.shape = (breite, länge)
for i in range(0, breite):
    for j in range(0, länge):
        matrix[i][j] = -1

# Schnecke Uhrzeigersinn ausführen
if richtung == "r":
    for x in range(0, breite):
        for i in range(0, länge):
            if matrix[0 + x][i] == -1:
                index += 1
                matrix[0 + x][i] = index

        for j in range(0, breite):
            if matrix[j - x][länge - 1 - x] == -1:
                index += 1
                matrix[j - x][länge - 1 - x] = index

        for h in range(länge - 1, -1, -1):
            if matrix[breite - 1 - x][h] == -1:
                index += 1
                matrix[breite - 1 - x][h] = index

        for k in range(breite - 1, -1, -1):
            if matrix[k][0 + x] == -1:
                index += 1
                matrix[k][0 + x] = index

# Schnecke gegen den Uhrzeigersinn ausführen
if richtung == "l":
    for x in range(0, breite):
        for k in range(0, breite):
            if matrix[k][0 + x] == -1:
                index += 1
                matrix[k][0 + x] = index
        for h in range(0, länge):
            if matrix[breite - 1 - x][h] == -1:
                index += 1
                matrix[breite - 1 - x][h] = index
        for j in range(breite - 1, -1, -1):
            if matrix[j - x][länge - 1 - x] == -1:
                index += 1
                matrix[j - x][länge - 1 - x] = index
        for i in range(länge - 1, -1, -1):
            if matrix[0 + x][i] == -1:
                index += 1
                matrix[0 + x][i] = index
print(matrix)