联系方式

  • QQ:99515681
  • 邮箱:99515681@qq.com
  • 工作时间:8:00-21:00
  • 微信:codinghelp

您当前位置:首页 >> Algorithm 算法作业Algorithm 算法作业

日期:2018-04-30 01:23

Verwenden Sie im Wesentlichen elem, head, tail, map, reverse, last, filter, concat, sum

und (++), um die folgenden Funktionen zur Listenverarbeitung in Haskell zu programmieren –

die Verwendung von Pattern-Matching ist verboten:

a) Eine Funktion, die einen String1

erh¨alt und zun¨achst folgende Ersetzungen durchfuhren ¨

soll:

– Entspricht ein Zeichen einer Ziffer, so soll es auf die entsprechende Zahl abgebildet

werden.

– Entspricht ein Zeichen dem Buchstaben a, so soll dieses Zeichen auf die Zahl 1 abgebildet

werden.

– Alle anderen Zeichen sollen auf die Zahl 0 abgebildet werden.

Danach soll die Summe dieser Zahlen berechnet werden. Zum Beispiel soll fur ¨ "138aza"

der Wert 14 berechnet werden. (7 Punkte)

b) Einige Leute geben heutzutage einer Aussage nochmal eine besonders freundliche Betonung,

indem sie alles groß schreiben. Ebenso tippen einige Personen gefuhlt 20.000 Zeichen ¨

pro Sekunde mit dem Smartphone, haben aber absolut keine Zeit, die Groß- und Kleinschreibung

zu beachten. Geben Sie eine Funktion an, die eine Liste von Strings erh¨alt und

alle Kleinbuchstaben eines Strings, der mit einem Ausrufezeichen endet, in Großbuchstaben

umwandelt. Falls ein String jedoch nicht mit einem Ausrufezeichen endet, sollen alle

Großbuchstaben in Kleinbuchstaben umgewandelt werden. Zum Beispiel soll fur ¨

["Du bist so intelligent wie eine Bananeschale und halb so gutaussehend!",

"Ich schreibe jedes Wort klein Nebensaetze und Punkte kenne ich nicht"]

das folgende Ergebnis berechnet werden:

["DU BIST SO INTELLIGENT WIE EINE BANANESCHALE UND HALB SO GUTAUSSEHEND!",

"ich schreibe jedes wort klein nebensaetze und punkte kenne ich nicht"]

(7 Punkte)

c) Eine Funktion, die eine Liste von Listen von Zahlen erh¨alt und zun¨achst alle innersten

Listen entfernt, die weniger als 4 Elemente enthalten. Die ubriggebliebenen inneren Listen ¨

sollen umgedreht werden und außerdem sollen bei jeder inneren Liste alle Elemente außer

den ersten Dreien entfernt werden. Danach sollen alle inneren Listen zu einer großen verschmolzen

werden. Zum Beispiel soll fur ¨ [[1,2],[1..4],[6..8],[8..12]] das Ergebnis

[4,3,2,12,11,10] berechnet werden. (11 Punkte)

1Strings sind in Haskell nichts anderes als Listen von Zeichen, d.h. "Haskell" ist nur eine andere Darstellung

fur die Liste ¨ [’H’,’a’,’s’,’k’,’e’,’l’,’l’].

1

Hinweis: Die Bibliothek Data.Char beinhaltet nutzliche Funktionen, die Sie in Ihrer L ¨ ¨osung

verwenden durfen. Sie k ¨ ¨onnen die Bibliothek durch import Data.Char am Anfang des Quelltextes

in Ihr Programm einbinden. Die Dokumentation von Bibliotheken finden Sie im Internet

unter http://www.haskell.org/ghc/docs/latest/html/libraries/.

Aufgabe 2 (30 Punkte)

Implementieren Sie in Haskell die folgenden Funktionen auf Listen im Wesentlichen unter Verwendung

von Pattern-Matching und Rekursion – d.h. Sie durfen Hilfsfunktionen definieren und ¨

nutzen, allerdings ist die Verwendung von Listenfunktionen wie z.B. map, concat, replicate

usw. verboten.

a) Eine Funktion, die eine Liste erwartet und je zwei benachbarte Elemente vertauscht.

Enth¨alt die Liste eine ungerade Anzahl an Elementen, so bleibt die Position des

letzten Elements unver¨andert. Zum Beispiel soll fur die Liste ¨ [1..9] das Ergebnis

[2,1,4,3,6,5,8,7,9] berechnet werden. (7 Punkte)

b) Eine Funktion, die eine Liste von Listen von Listen von Zahlen erwartet und die Summe

der jeweils ersten Elemente der innersten Listen berechnet. Zum Beispiel soll 44 fur die ¨

Liste [[[1,2],[4,5],[7,8,9]],[[13,15],[19]]] berechnet werden. (10 Punkte)

c) Eine Funktion, die eine Liste erwartet und eine Liste zuruckgibt, die das ¨ k-te Element

der Eingabeliste k-mal enth¨alt. Dabei soll die Reihenfolge unver¨andert bleiben und der

Listenindex erstreckt sich von 1 bis zur L¨ange der Liste. Zum Beispiel soll fur die Liste ¨

[’a’,’b’,’c’] das Ergebnis "abbccc" berechnet werden. (13 Punkte)

Aufgabe 3 (45 Punkte)

Diese Aufgabe besch¨aftigt sich mit Darts.

Das Dart-Board ist in 20 Zahlensegmente unterteilt. Die Felder z¨ahlen jeweils soviel, wie außen

am entsprechenden Segment notiert ist. Ausnahmen sind die schmalen Kreise. Im ¨außeren Kreis

z¨ahlen die Felder das Doppelte (Double-Felder), im mittleren Kreis das Dreifache (Triple-Felder)

der entsprechenden Zahl. Der Mittelpunkt des Boards, das Bullseye, z¨ahlt 50 Punkte (Double 25),

der Ring darum herum (Bull) 25 Punkte. Gespielt wird die Variante 501 mit Double-Out:

Jeder Spieler beginnt bei 501 Punkten. Eine Aufnahme besteht

aus (maximal) drei nacheinander geworfenen Darts.

Die erzielten Punkte werden jedesmal von der verbleibenden

Punktzahl abgezogen, wobei nach jeder Aufnahme der

jeweilige Gegenspieler dran ist. Es durfen nur diejenigen ¨

Darts gez¨ahlt werden, die im Board steckenbleiben. Gewonnen

hat derjenige Spieler, der zuerst genau 0 Punkte

erreicht hat, wobei der letzte Dart ein Doppel-Feld oder

das Bullseye treffen muss. Erzielt der Spieler zu viele Punkte

oder so viele, dass er nicht mehr mit einem Doppel abschließen

kann (der Spieler uberwirft sich), so werden alle ¨

Darts dieser Aufnahme nicht gez¨ahlt – der Spieler bleibt

auf dem selben Rest wie vor der Aufnahme. In der letzte

Aufnahme, in der die Punktzahl genau auf 0 reduziert

wird, k¨onnen auch weniger als 3 Darts geworfen werden.

Falls man sich uberwirft kann eine Aufnahme ebenso aus ¨

weniger als 3 Darts bestehen.

20 5 1

12 18

9 4

14 13

11 6

8 10

16 15

7 2

19 17 3

doppelt

dreifach

Bullseye

Bull

einfach

Ein einzelnes Spiel dieser Art nennt man Leg. Wer zuerst eine festgelegte Anzahl an Legs gewonnen

hat, gewinnt das gesamte Spiel. Dabei beginnen die Spieler die Legs jeweils abwechselnd.

2

Ein Leg im obigen Modus sei in Haskell wie folgt dargestellt:

• Ein Liste mit genau zwei Elementen [m, p] stellt die Punktzahl eines einzelnen geworfenen

Darts dar, wobei fur ¨ m eine 1, 2 oder 3 entsprechend Single, Double oder Triple darstellt

und p die Punktzahl des Zahlensegments ist. Das heißt die Triple 20 entspricht der Darstellung

[3, 20], Double 20 [2, 20] und Single 20 [1, 20]. Da das Bullseye als Doppelfeld gez¨ahlt

wird, wird es als [2, 25] dargestellt. Außerdem entspricht [0, 0] einem Fehlwurf.

• Eine Aufnahme ist eine Liste solcher zweielementigen Listen, z.B. entspricht

[[3, 20], [3, 19], [2, 25]] einem Treffer in die Triple 20, gefolgt von einem Treffer in die Triple

19, gefolgt von einem Treffer in das Bullseye. Falls ein Spieler seine Aufnahme schon

mit weniger als 3 Darts beendet hat, sich also uberworfen oder das Leg gewonnen hat, so ¨

enth¨alt die Liste entsprechend weniger Elemente.

• Ein Leg wird durch eine Liste von Aufnahmen (also einer Liste von Listen mit zweielementigen

Listen) dargestellt, in der jede Aufnahme mit ungerader Listenposition dem Spieler

zugeordnet ist, der das Leg begonnen hat und alle geraden dem Gegenspieler.

Hier einige Beispiel-Legs:

leg1 = [[[3,20],[3,20],[3,20]], [[3,20],[3,19],[2,25]], [[3,19],[3,19],[3,19]],

[[3,20],[3,19],[2,25]], [[2,25],[2,25],[2,25]]]

leg2 = [[[3,20],[3,20],[3,20]], [[3,20],[3,19],[2,25]], [[3,19],[3,19],[3,19]],

[[3,20],[3,19],[2,25]], [[2,25],[2,25],[1,25]], [[3,20],[3,19],[2,25]]]

leg3 = [[[3,20],[1,20],[1,20]], [[3,20],[1,20],[1,20]], [[3,20],[3,20],[3,20]],

[[3,20],[3,20],[3,20]], [[3,20],[1,1] ,[2,20]], [[3,20],[1,1] ,[2,20]],

[[3,20],[1,20],[2,20]]]

leg4 = [[[3,20],[1,20],[1,20]], [[3,20],[1,20],[1,20]], [[3,20],[3,20],[3,20]],

[[3,20],[3,20],[3,20]], [[3,20],[1,1] ,[2,20]], [[3,20],[1,1] ,[2,20]],

[[3,20],[1,20],[1,20]], [[3,20],[1,20],[2,20]]]

a) Implementieren Sie in Haskell eine Funktion legSieger, die ein Leg in der obigen Darstellung

als Eingabe erwartet und 1 zuruckliefert, falls der Spieler gewinnt, der das Leg be- ¨

gonnen hat, falls der andere Spieler gewinnt soll 2 zuruckgegeben werden. Ber ¨ ucksichtigen ¨

Sie dazu die oben dargestellten Regeln.

Die Funktion soll fur fehlerhafte Legs ¨ 0 zuruckgeben. Zum Beispiel falls kein Spieler genau ¨

0 Punkte erreicht hat, die angegebenen Felder gar nicht existieren (zum Beispiel TripleBull

oder Single-21) oder falls ein Spieler bereits gewonnen hat und der Gegner danach

trotzdem noch wirft.

Fur die Beispiel-Legs soll also ¨ legSieger leg1 als Ergebnis 1 liefern und legSieger leg2

soll 2 berechnen.

Tipp: Verwenden Sie Hilfsfunktionen um die Regeln systematisch abzudecken. Wie kann

das Abwechseln der Spieler einfach implementiert werden? (35 Punkte)

b) Die letzten maximal 3 Wurfe eines Legs, die der Gewinner des Legs zum gewinnen ben ¨ ¨otigt,

nennt man Finish. Implementieren Sie in Haskell eine Funktion highOut, welche eine Liste

von Legs in der obigen Darstellung entgegennimmt und fur den Spieler, welcher das ¨

erste Leg beginnt, uber alle Legs sein h ¨ ¨ochstes Finish ausrechnet. Beachten Sie dass diese

Information w¨ahrend des Spiels berechnet werden k¨onnen soll, gegebenenfalls ist also das

letzte Leg in der Eingabeliste noch nicht zu Ende gespielt. Falls der Spieler (noch) kein

Leg gewonnen hat, soll 0 zuruckgegeben werden. ¨

Zum Beispiel soll highOut [leg3,leg2,leg3,leg4,leg3] das Ergebnis 167 zuruckgeben, ¨

w¨ahrend 0 fur ¨ highOut [leg4,leg3] zuruckgegeben werden soll. (10 Punkte) ¨

版权所有:编程辅导网 2021 All Rights Reserved 联系方式:QQ:99515681 微信:codinghelp 电子信箱:99515681@qq.com
免责声明:本站部分内容从网络整理而来,只供参考!如有版权问题可联系本站删除。 站长地图

python代写
微信客服:codinghelp