adding optional exercise darts
parent
0fa4a3174c
commit
ccde123fa5
|
@ -13,7 +13,7 @@ Bob gibt nur eine von fünf möglichen Antworten:
|
||||||
|
|
||||||
- **"Klar."** Das ist seine Antwort, wenn man ihm eine Frage stellt, z. B. „Wie geht es dir?“. Fragen erkennt man daran, dass sie mit einem Fragezeichen enden.
|
- **"Klar."** Das ist seine Antwort, wenn man ihm eine Frage stellt, z. B. „Wie geht es dir?“. Fragen erkennt man daran, dass sie mit einem Fragezeichen enden.
|
||||||
- **"Whoa, entspann dich!"** Das sagt er, wenn man IHN ANSCHREIT. Schreien erkennt man daran, dass ALLE BUCHSTABEN GROßGESCHRIEBEN SIND.
|
- **"Whoa, entspann dich!"** Das sagt er, wenn man IHN ANSCHREIT. Schreien erkennt man daran, dass ALLE BUCHSTABEN GROßGESCHRIEBEN SIND.
|
||||||
- **"Chill mal, ich weiß, was ich tue!"** So antwortet er, wenn man ihn anschreit und gleichzeitig eine Frage stellt.
|
- **"Chill mal, ich bin da schon dran!"** So antwortet er, wenn man ihn anschreit und gleichzeitig eine Frage stellt.
|
||||||
- **"Na gut. Dann eben nicht!"** Das ist seine Reaktion auf Stille. Stille bedeutet, dass nichts gesagt wird oder nur Leerzeichen vorhanden sind.
|
- **"Na gut. Dann eben nicht!"** Das ist seine Reaktion auf Stille. Stille bedeutet, dass nichts gesagt wird oder nur Leerzeichen vorhanden sind.
|
||||||
- **"Whatever."** Das ist seine Antwort auf alles andere.
|
- **"Whatever."** Das ist seine Antwort auf alles andere.
|
||||||
|
|
||||||
|
|
|
@ -1,40 +1,28 @@
|
||||||
import System.IO
|
import System.IO
|
||||||
import Data.Char ( isSpace, isAlpha, isUpper )
|
|
||||||
|
|
||||||
|
|
||||||
isYelling :: [Char] -> Bool
|
|
||||||
isYelling stmt = any isAlpha stmt && all isUpper (filter isAlpha stmt)
|
|
||||||
|
|
||||||
isQuestion :: [Char] -> Bool
|
|
||||||
isQuestion stmt = last (filter (not . isSpace) stmt) == '?'
|
|
||||||
|
|
||||||
responseFor :: String -> String
|
responseFor :: String -> String
|
||||||
responseFor prompt -- implement here
|
responseFor prompt -- implement here
|
||||||
| all isSpace prompt = "Na gut. Dann eben nicht!"
|
|
||||||
| isQuestion prompt && isYelling prompt = "Chill mal, ich weiß, was ich tue!"
|
|
||||||
| isQuestion prompt = "Klar."
|
|
||||||
| isYelling prompt = "Whoa, entspann dich!"
|
|
||||||
| otherwise = "Whatever."
|
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
inputContent <- readFile "example-input"
|
inputContent <- readFile "example-input"
|
||||||
outputContent <- readFile "example-output"
|
outputContent <- readFile "example-output"
|
||||||
|
|
||||||
let prompt = map read (lines inputContent) :: [String]
|
let prompts = lines inputContent
|
||||||
expectedResults = map read (lines outputContent) :: [String]
|
expectedResults = lines outputContent
|
||||||
actualResults = map responseFor prompt
|
actualResults = map responseFor prompts
|
||||||
|
results = zip3 prompts expectedResults actualResults
|
||||||
|
|
||||||
let errors = [ (i, prompt, expected, actual)
|
let incorrectResults = filter (\(_, expected, actual) -> expected /= actual) results
|
||||||
| (i, (prompt, expected, actual)) <- zip3 [1..] prompts expectedResults actualResults
|
|
||||||
, expected /= actual ]
|
|
||||||
|
|
||||||
if null errors
|
if null incorrectResults
|
||||||
then putStrLn "All tests passed!"
|
then putStrLn "All tests passed successfully!"
|
||||||
else do
|
else do
|
||||||
putStrLn "Errors detected:"
|
putStrLn "The following tests failed:"
|
||||||
mapM_ (\(i, prompt, expected, actual) ->
|
mapM_ (\(prompt, expected, actual) ->
|
||||||
putStrLn $ "Error in prompt " ++ show i ++ ": \"" ++ prompt ++ "\"\nExpected: \"" ++ expected ++ "\"\nGot: \"" ++ actual ++ "\"\n") errors
|
putStrLn $ "Prompt: " ++ show prompt ++
|
||||||
|
"\nExpected: " ++ show expected ++
|
||||||
|
"\nActual: " ++ show actual ++ "\n") incorrectResults
|
||||||
|
|
||||||
-- let results = map (show . responseFor) (lines inputContent)
|
-- let results = map (show . responseFor) (lines inputContent)
|
||||||
-- writeFile "example-output" (unlines results)
|
-- writeFile "example-output" (unlines results)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
Klar.
|
Klar.
|
||||||
Chill mal, ich wei\223, was ich tue!
|
Chill mal, ich bin da schon dran!
|
||||||
Klar.
|
Klar.
|
||||||
Na gut. Dann eben nicht!
|
Na gut. Dann eben nicht!
|
||||||
Klar.
|
Klar.
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Optionale Bonusaufgabe: Factorial
|
||||||
|
## Anweisungen
|
||||||
|
|
||||||
|
Schreibe eine Funktion, die die verdienten Punkte bei einem einzelnen Wurf im Dartspiel zurückgibt.
|
||||||
|
|
||||||
|
Darts ist ein Spiel, bei dem die Spieler Darts auf ein Ziel werfen.
|
||||||
|
|
||||||
|
In dieser speziellen Variante des Spiels vergibt das Ziel je nach Trefferbereich 4 verschiedene Punktzahlen:
|
||||||
|
|
||||||
|
Unser Dart-Scoreboard mit Werten von einem kompletten Fehlschuss bis zum Bullseye:
|
||||||
|
|
||||||
|
- Wenn der Dart außerhalb des Ziels landet, verdient der Spieler keine Punkte (0 Punkte).
|
||||||
|
- Wenn der Dart im äußeren Kreis des Ziels landet, verdient der Spieler 1 Punkt.
|
||||||
|
- Wenn der Dart im mittleren Kreis des Ziels landet, verdient der Spieler 5 Punkte.
|
||||||
|
- Wenn der Dart im inneren Kreis des Ziels landet, verdient der Spieler 10 Punkte.
|
||||||
|
|
||||||
|
Der äußere Kreis hat einen Radius von 10 Einheiten (dies entspricht dem gesamten Radius des Ziels), der mittlere Kreis einen Radius von 5 Einheiten und der innere Kreis einen Radius von 1. Natürlich sind sie alle um denselben Mittelpunkt zentriert — das heißt, die Kreise sind konzentrisch und durch die Koordinaten (0, 0) definiert.
|
||||||
|
|
||||||
|
Schreibe eine Funktion, die für einen gegebenen Punkt im Ziel (definiert durch seine kartesischen Koordinaten x und y, wobei x und y reale Zahlen sind) die richtige Anzahl der Punkte zurückgibt, die durch einen Dartwurf an diesem Punkt verdient werden.
|
|
@ -0,0 +1,29 @@
|
||||||
|
import System.IO
|
||||||
|
|
||||||
|
score :: Float -> Float -> Int
|
||||||
|
score x y -- implement here
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
input <- readFile "example-input"
|
||||||
|
expectedOutput <- readFile "example-output"
|
||||||
|
|
||||||
|
let results = map (\line ->
|
||||||
|
let [xStr, yStr] = words line
|
||||||
|
x = read xStr :: Float
|
||||||
|
y = read yStr :: Float
|
||||||
|
in score x y) (lines input)
|
||||||
|
|
||||||
|
let expectedResults = map read (lines expectedOutput) :: [Int]
|
||||||
|
|
||||||
|
let comparisons = zip results expectedResults
|
||||||
|
errors = filter (uncurry (/=)) comparisons
|
||||||
|
|
||||||
|
-- Print results
|
||||||
|
if null errors
|
||||||
|
then putStrLn "Success: All calculated scores match the expected results."
|
||||||
|
else mapM_ (\(calculated, expected) ->
|
||||||
|
putStrLn $ "Error: Calculated " ++ show calculated ++ " but expected " ++ show expected)
|
||||||
|
errors
|
||||||
|
|
||||||
|
-- writeFile "example-output" (unlines results)
|
|
@ -0,0 +1,10 @@
|
||||||
|
1.0 2.0
|
||||||
|
3.5 4.5
|
||||||
|
-1.2 3.8
|
||||||
|
0.0 0.0
|
||||||
|
-5.5 -6.5
|
||||||
|
7.1 8.2
|
||||||
|
9.9 -10.1
|
||||||
|
-3.3 2.2
|
||||||
|
4.4 -4.4
|
||||||
|
5.5 5.5
|
|
@ -0,0 +1,10 @@
|
||||||
|
5
|
||||||
|
1
|
||||||
|
5
|
||||||
|
10
|
||||||
|
1
|
||||||
|
0
|
||||||
|
0
|
||||||
|
5
|
||||||
|
1
|
||||||
|
1
|
Loading…
Reference in New Issue