Parkzeit und Parkgebühren

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14033
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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:
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

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))
Benutzeravatar
__blackjack__
User
Beiträge: 14033
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Ist das Problem dank der Community nun gelöst? :')
Benutzeravatar
DeaD_EyE
User
Beiträge: 1234
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 18267
Registriert: Sonntag 21. Oktober 2012, 17:20

@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))
Benutzeravatar
__blackjack__
User
Beiträge: 14033
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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 "$@"
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten