Dateien Schreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DrragoGangsta
User
Beiträge: 6
Registriert: Mittwoch 11. Februar 2015, 15:49

Hallo Leute,
Ich habe folgende Aufgabe erhalten:
Im Land der Sexteten haben die Bewohner an jeder Hand drei Greifer. Ihr Zahlensystem ist ein Stellenwertsystem wie unser Dezimalsystem, verfügt aber dementsprechend nur über 6 Zeichen, die folgende Werte haben:

Zeichen-Wert
< 0
> 1
* 2
+ 3
( 4
) 5

Wenn eine Sextetenzahl aus mehreren Zeichen besteht, so sind die Stellen wie in unserem Dezimalsystem angeordnet, d.h. die höchstwertige Stelle ganz links und die niedrigstwertige ganz rechts.

Schreiben Sie ein Programm, das die Rechenaufgabe im Sexteten System einliest und eine entsprechende Lösungsdateil erzeugt. Orientieren Sie sich dabei an den Musterdateien. Leerzeichen sind keine gültigen Eingabezeichen.

Zerlegen Sie das Problem in Teilprobleme. Es empfiehlt sich, zunächst (Unter-)Programme zu einzelnen Teilproblemen zu schreiben und zu testen.

Hinweise
Die Zeichen für die Darstellung einer nicht negativen ganzen Zahl im Sexteten-System lassen sich als Reste bei fortgesetzter ganzzahliger Division durch 6 ermitteln.

Für die Zahl 125 ergibt sich die Darstellung +*) wie folgt:

125 / 6 = 20 Rest 5 niedrigstwertige Sexteten-Ziffer: )
20 / 6 = 3 Rest 2 nächst höherwertige Ziffer: *
3 / 6 = 0 Rest 3 nächst höherwertige Ziffer: +

Da der Quotient 0 geworden ist, ist die Konvertierung beendet. Eine Fortführung des Verfahrens würde nur noch führende <-Zeichen ermitteln.

Um umgekehrt den Wert einer Zahl aus ihrer Darstellung im Sexteten-System abzuleiten, geht man die Zeichen von links nach rechts durch. Zu Beginn wird der Wert der Zahl mit 0 initialisiert. Für jedes Zeichen wird der alte Zahlenwert mit 6 multipliziert und dann der Wert des jeweiligen Zeichens addiert. Für die Darstellung +*) ergibt sich:

Zahl ist 0
+ entspricht 3 Zahl wird 0 * 6 + 3 = 3
* entspricht 2 Zahl wird 3 * 6 + 2 = 20
) entspricht 5 Zahl wird 20* 6 + 5 = 125

Ein anderes Verfahren besteht darin jedes Zeichen mit seiner entsprechenden Wertigkeit zu multiplizieren und dann aus den Zahlen die Summe zu bilden.

+ entspricht 3: Zahl wird 3 * 62 = 108
* entspricht 2: Zahl wird 2 * 61 = 12
) entspricht 5: Zahl wird 5 * 60 = 5
Summe: 125
Es soll also aus einer Datei diese Zeichen eingelesen werden. Das habe ich. Auch die Umwandlung in Dezimal und das Addieren. ich scheitere aber am sSchreiben der Datei. Ich erhalte immer:
(*)* | 968
*++* | 560
(*<> | 937
>(+) | 383
><<+ | 219
++(+ | 783
+<>< | 654
))< | 210
**) | 89
>*)( | 322
------ | -----
+)(*> | 5125
Ist auch Logisch, dass ich das erhalte, es soll aber geordnet aussehen, etwa so:
http://www.directupload.net/file/d/3936 ... lh_png.htm
Wie mache ich das, dass der Text "eingerückt" wird, egal was ich vorher für Zeichen eingebe?
Hier ist mal der Code, den ich bisher habe:

Code: Alles auswählen

def sexToDez(sexlist):
    sexteten = {"<": 0, ">": 1, "*": 2, "+": 3, "(": 4, ")": 5}
    hex = ""
    for i in sexlist:
        hex += str(sexteten[i])
    list = [i for i in str(hex)]
    list.reverse()
    count = 0
    res = 0
    for i in list:
        res += (6 ** count) * int(i)
        count += 1
    count = 0
    return res

def dezToSex(dez):
    sexteten = {0: "<", 1: ">", 2: "*", 3: "+", 4: "(", 5: ")"}
    res = []
    sex = ""
    while dez > 0:
        a = int(dez % 6)
        dez = (dez - a) / 6
        res.append(a)
    res.reverse()
    for i in res:
        sex += str(sexteten[i])
    return sex

sexlst = []
sexlist = []
sexstr = ""
dez = 0
toWrite = ""
try:
    f = open("Aufgabe.txt", "r")
except:
    print("Es ist ein Fehler aufgetreten, versuchen Sie es erneut")
for line in f:
    sexlst = [i for i in str(line)]
    for i in range(len(line)):
        if sexlst[i] == " " or sexlst[i] == "" or sexlst[i] == "-" or sexlst[i] == "\n":
            continue
        else:
            sexlist.append(sexlst[i])
    sexstr = "".join(map(str, sexlist))
    toWrite += str(sexstr) + " | " + str(sexToDez(sexstr)) + "\n"
    dez += sexToDez(sexstr)
    sexlist.clear()
sexstr = dezToSex(dez)
w = open("Loesung.txt", "w")
w.write(toWrite)
w.write("----------\n")
w.write(sexstr + "|" + str(dez))
f.close()
w.close()
BlackJack

@DrragoGangsta: Schau Dir mal die `format()`-Methode auf Zeichenketten an und was man da bei den Platzhaltern alles an Feldgrössen und Ausrichtungen angeben kann. `str()` und ``+`` zum Zusammenstückeln von Werten und Zeichenketten ist sowieso eher BASIC als Python.
DrragoGangsta
User
Beiträge: 6
Registriert: Mittwoch 11. Februar 2015, 15:49

BlackJack hat geschrieben:@DrragoGangsta: Schau Dir mal die `format()`-Methode auf Zeichenketten an und was man da bei den Platzhaltern alles an Feldgrössen und Ausrichtungen angeben kann. `str()` und ``+`` zum Zusammenstückeln von Werten und Zeichenketten ist sowieso eher BASIC als Python.
Alles klar, ich werd mal sehen, Danke
BlackJack

@DrragoGangsta: `sexToDez()` und `dezToSex()` sind streng genommen falsche Namen denn beide haben nichts in *Dezimal*zahlen zu tun. Die müssten `sexToInt()` und `intToSex()` heissen.

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
from functools import partial
from itertools import imap, izip

SEXTET_DIGITS = '<>*+()'
SEXTET_DIGIT_TO_VALUE = dict((d, i) for i, d in enumerate(SEXTET_DIGITS))


def sextet_to_int(digits):
    digits = digits.strip()
    if not digits:
        raise ValueError('no digits found')
    result = 0
    for digit in digits:
        try:
            value = SEXTET_DIGIT_TO_VALUE[digit]
        except KeyError:
            raise ValueError('illegal digit {0!r}'.format(digit))
        result = result * len(SEXTET_DIGITS) + value
    return result


def int_to_sextet(value):
    if value < 0:
        raise ValueError('negative value')
    result = list()
    while value:
        value, digit_value = divmod(value, len(SEXTET_DIGITS))
        result.append(digit_value)

    if not result:
        result.append(0)
    else:
        result.reverse()

    return ''.join(SEXTET_DIGITS[i] for i in result)


def iter_lines(filename):
    with open(filename, 'r') as lines:
        for line in lines:
            yield line.strip()


def calculate_column_width(values, result):
    return max(max(imap(len, values)), len(result))


def format_pair(column_width_a, column_width_b, value_a, value_b):
    return '{0:>{1}} | {2:>{3}}'.format(
        value_a, column_width_a, value_b, column_width_b
    )


def main():
    sextet_operands = list(iter_lines('test.txt'))
    operands = map(sextet_to_int, sextet_operands)
    result = sum(operands)
    sextet_result = int_to_sextet(result)

    decimals = map(str, operands)
    decimal_result = str(result)
    sextet_column_width = calculate_column_width(sextet_operands, sextet_result)
    decimal_column_width = calculate_column_width(decimals, decimal_result)
    pair_formatter = partial(
        format_pair, sextet_column_width, decimal_column_width
    )
    for sextet, decimal in izip(sextet_operands, decimals):
        print(pair_formatter(sextet, decimal))
    print(pair_formatter('-' * sextet_column_width, '-' * decimal_column_width))
    print(pair_formatter(sextet_result, decimal_result))


if __name__ == '__main__':
    main()
DrragoGangsta
User
Beiträge: 6
Registriert: Mittwoch 11. Februar 2015, 15:49

@BlackJack wo haben die Dezimalzahlen denn nichts mit Dezimalzahlen zu Tun? Ich wandle ja die Zeichen in Zahlen um, diese sind dann im 6-er system, und dann, in der selben Funktion, werden sie in Dezimalzahlen umgewandelt.
Und danke für deine Hilfe
BlackJack

@DrragoGangsta: Du wandelst die Zeichen in eine *ganze Zahl* um, also in ein `int` und nicht in eine Dezimalzahl. Diese Zahl wird dann wenn man sie in eine *Zeichenkette* umwandelt standardmässig in eine Dezimaldarstellung umgewandelt. Aber erst dann. Theoretisch wäre es natürlich möglich das ein `int` intern in einer Dezimaldarstellung gespeichert wird, aber praktisch dürfte das bei den üblichen Rechnern doch eher eine Binärdarstellung sein. Das ist aber letztendlich egal, denn das ist ein Implementierungsdetail.
Antworten