Seite 2 von 2

Re: Parkzeit und Parkgebühren

Verfasst: Freitag 2. November 2018, 18:00
von __blackjack__
Wenn die Ruby-Lösung zu High-Level war, hier mal ein Ansatz in MIPS-Assembler: :mrgreen:

Code: Alles auswählen

.data

minutes:
	.word 121

.text
	lw	$a0, minutes
	
	li 	$t0, 60			# $t0 = commenced hours
	div 	$a0, $t0
	mflo	$t0
	mfhi	$t1
	sgt	$t1, $t1, $zero
	add 	$t0, $t0, $t1

	subi	$t0, $t0, 2		# $t0 = billable hours
	bge	$t0, $zero, more_than_two_hours
	move	$t0, $zero
more_than_two_hours:

	li	$t1, 2			# $v0 = total parking fee
	mul	$v0, $t0, $t1
	
	li	$t0, 30			# $v0 = capped to max parking fee
	ble	$v0, $t0, not_over_max
	move	$v0, $t0
not_over_max:

Re: Parkzeit und Parkgebühren

Verfasst: Freitag 2. November 2018, 18:26
von pixewakb
Die nachfolgende Lösung gefällt mir noch nicht, aber sie funktioniert. Die Integration der Variablen (Gebühr pro Stunde, Freie Parkdauer usw.) könnte man sicher noch machen...

Code: Alles auswählen

def parking_fee(minutes):
    if minutes < 2 * 60:
        return 0.0
    else:
        fee = ( ((minutes - 2 * 60) // 60) + (1 if minutes % 60 != 0 else 0) ) * 2
        if fee > 30:
            return 30.0
        else:
            return fee


print(parking_fee(60 * 4.0))

Re: Parkzeit und Parkgebühren

Verfasst: Samstag 3. November 2018, 00:17
von __blackjack__
Auf meinem alten HP48 Taschenrechner liesse sich eine Funktion `pfee` so schön knapp ausdrücken:

Code: Alles auswählen

« 60 / CEIL 2 - 0 MAX 2 * 30 MIN » 'pfee' STO

Re: Parkzeit und Parkgebühren

Verfasst: Montag 5. November 2018, 15:52
von xXSkyWalkerXx1
Ist das Problem dank der Community nun gelöst? :')

Re: Parkzeit und Parkgebühren

Verfasst: Dienstag 6. November 2018, 09:57
von DeaD_EyE
Ja, natürlich..
Hätte auch noch einen Ansatz, der den anderen ähnelt.

Code: Alles auswählen

def calc_parking(duration):
    free = 2 * 60
    if duration <= free:
        return 0.0
    elif duration > free:
        duration -= free
        return min(30, math.ceil(duration / 60) * 2.0)
Jetzt fehlt nur noch ein netter Docstring, der das Beschreibt was die Funktion macht und unit tests ^^

Was mir immer wieder auffällt, dass viele versuchen alles in einer Funktion zu erschlagen. Berechnungen durchführen und formatierten Text ausgeben z.B.
Teilt es auf. Eine Funktion rechnet und eine andere Funktion gibt den berechneten Wert der ersten Funktion formatiert aus. So kann man ggf. die erste
Funktion zur Berechnung der gebühren im Programm an anderer Stelle verwenden.

Re: Parkzeit und Parkgebühren

Verfasst: Dienstag 6. November 2018, 10:50
von Sirius3
@Dead_Eye: wenn in einer elif-Bedingung das genaue Gegenteil der if-Bedingung steht, nimmt man else. Bei Dir fehlt z.B. der else-Block, so dass man beim Lesen gar nicht weiß, was da dann passieren soll, bzw. warum die Funktion in diesem Fall None zurückgibt.

Code: Alles auswählen

def calc_parking_fee(duration, free_fee=4, max_fee=30):
    return max(0, min(max_fee, math.ceil(duration / 60.) * 2 - free_fee))

Re: Parkzeit und Parkgebühren

Verfasst: Dienstag 6. November 2018, 11:03
von __blackjack__
Mal Benutzerinteraktion und Berechnungen getrennt. Als Bash-Skript. :-)

Code: Alles auswählen

#!/bin/bash
readonly FreeHours=2
readonly FeePerHour=2
readonly MaxFee=30

MinutesToHours() {
    local minutes=$1
    local hours
    hours=$((minutes / 60))
    ((minutes % 60)) && ((hours++))
    echo "$hours"
}

CalculateParkingFee() {
    local hours=$1
    local fee=0
    [[ hours -gt FreeHours ]] && fee=$(((hours - FreeHours) * FeePerHour))
    [[ fee -gt MaxFee ]] && fee=$MaxFee
    echo "$fee"
}

Main() {
    local minutes
    local hours
    local fee
    read -r -p "Parkzeit in Minuten: " minutes
    hours=$(MinutesToHours "$minutes")
    fee=$(CalculateParkingFee "$hours")
    echo "Die Parkgebühr für $hours Stunde(n) beträgt $fee €."
}

[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"