staging.inyokaproject.org

Skripting -- Aufgabe 2

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

drunkVoodoo

Anmeldungsdatum:
17. November 2004

Beiträge: Zähle...

Sorry, diese hat etwas länger gedauert, dafür ist die auch richtig hart.
Es soll ein Sport simuliert werden, der bis in die erste Hälfte des letzten Jahrhunderts sehr populär war:
Wir erobern Europa

Das Ganze ist *leicht* an Risiko angelehnt.
Ihr sollt ein Skript schreiben, das die Rolle des Eroberers übernimmt.

Die Regeln sind folgende:
1. Der Spieler startet in einem Land und einer Stärke von 50 Armeen
2. Alle anderen Länder werden mit 1-3 Armeen besetzt
3. Jedes eroberte Land gibt dem Spieler 2 Armeen mehr
4. Jeder verlorene Angriff verringert die Stärke des Spielers um 1 Armee
5. Die Wahrscheinlichkeit, einen Angriff zu verlieren, beträgt 15% pro Gegnerische Armee
6. Beim Vorrücken in ein erobertes Land rücken alle Armeen des Spielers bis auf eine vor
7. Bewegt der Spieler sich in ein Land, das bereits ihm gehört, wird wie in 6. vorgerückt, allerdings geht keine Armee verloren

Am Ende sollte der Spieler ganz Europa erobert haben.
Bewertungskriterien sind:
a) Möglichst wenige Züge
b) Möglichst geringer Verlust

Der Spielplan liegt in folgendem Format vor:
Feld 1: Nummer des Landes
Feld 2: Name des Landes
Feld 3: Verbindungen zu anderen Ländern, durch Kommata getrennt

Hier ist der Plan (der steht fest):

1:Island:2,7
2:Skandinavien:1,3,4,5,7
3:Ukraine:2,4
4:Osteuropa:2,3,5
5:Mitteleuropa:2,4,6,7
6:Westeuropa:5,7
7:Grossbrittanien:1,2,5,6

Die Situation wird in in einer Datei mit folgendem Format gegeben:
Feld1: Land-Nummer
Feld2: Anzahl der Armeen
Feld3: Besitzer des Landes (S=Spieler, G=Gegner)

Das ist ein Beispiel (Ausgangsposition, Spieler startet in Land 1):

1:50:S
2:3:G
3:1:G
4:3:G
5:2:G
6:1:G
7:3:G

Der Spieler ist natürlich euer Skript.
Dieses Skript muss als erstes und einziges Argument den Namen der Situationsdatei entgegennehmen.
Die Ausgabe sollte folgende sein:
In Feld 1 steht das "von"-Land
In Feld 2 steht das "ziel"-Land
Beispielsweise:

1:2


Das Ablaufskript nimmt die Zeile entgegen und erstellt eine neue Situationsdatei, die dem Spielerskript zurückgegeben wird.

Das Spielerskript darf in *seinem* Verzeichnis so viele Dateien anlegen, wie gewünscht wird (für die Speicherung vorheriger Züge etc.)

Da das ganze eine etwas härtere Aufgabe ist (und ich euch ausserdem erstmal das Ablaufskript selbst schreiben lasse), denke ich, dass Lösungen (nur Spielerskripte) ab Freitag den 25.3.2005, 19:00 gepostet werden sollten.
Freitag deswegen, da ich dann das WE über Zeit habe, die Skripte laufen zu lassen und Statistiken zu erstellen.
Fragen (und ich glaube es wird hier einige geben) an mich (vorzugsweise Mail, PM geht auch).
Achtung: Das Ganze hat seine Wurzeln im "Problem des Handlungsreisenden". Versucht nicht unbedingt die optimale Route zu finden, das kann in der Ausführung Jahre dauern. Denkt euch eine möglichst gute Strategie aus und postet euer Skript.
Viel Spass (hoffentlich)!

Nachtrag: Das Ablaufskript meinerseits werde ich vorher nicht zeigen, da das Dingen gleichzeitig Bewertungen vornimmt.
Ab Dienstag, dem 29.3.2005 werde ich keine Skripte mehr annehmen, aber dann mein Skript posten, so dass jeder die Ergebnisse prüfen kann die ich dann auch posten werde.

blackbird Team-Icon

Avatar von blackbird

Anmeldungsdatum:
19. November 2004

Beiträge: 3397

Bin schon am Grübeln. 😀

blackbird Team-Icon

Avatar von blackbird

Anmeldungsdatum:
19. November 2004

Beiträge: 3397

Ich glaubs nicht.
Meine Version ist das Opfer des Plattenchrash geworden.
Jetzt fang ich nicht nocheinmal an 😠

drunkVoodoo

(Themenstarter)

Anmeldungsdatum:
17. November 2004

Beiträge: 66

Erstmal: mein Beileid, Blackbird (ich musste regelmässige – externe – Backups auch auf die harte Tour lernen 😉).

An alle: Was ist los? War die Aufgabe zu schwer? Kein Interesse? Mehr Zeit? In Urlaub wg. Ferien?

Lothar

Anmeldungsdatum:
28. Oktober 2004

Beiträge: 106

drunkVoodoo hat geschrieben:

An alle: Was ist los? War die Aufgabe zu schwer? Kein Interesse? Mehr Zeit? In Urlaub wg. Ferien?

Ich kann mit der Aufgabe nichts anfangen. Vielleicht weil ich das Spiel Risiko nicht kenne?

mawe

Anmeldungsdatum:
18. November 2004

Beiträge: 172

Hi!

Ich muss gestehen, daß ich die Aufgabe erst heute gesehen hab 😳 (ich weiß, ich weiß, da reg ich mich vorher grossartig auf, und dann das ...).
drunkVoodoo hat geschrieben:

War die Aufgabe zu schwer? Kein Interesse? Mehr Zeit? In Urlaub wg. Ferien?

Auf mich trifft irgendwie zweiteres zu. Zeig doch mal Deine Lösung, ich versuch gerne sie zu verbessern, aber zum Neuschreiben fehlt mir jetzt die Motivation (sorry).

PS: Die Ausrede von blackbird muss ich mir unbedingt merken, genial 🤣

Gruß, (und nochmal sorry) mawe

Micha

Avatar von Micha

Anmeldungsdatum:
12. März 2005

Beiträge: 146

Hallo,

was Shellscripts angeht, bin ich noch meilenweit davon entfernt, so komplexe Probleme damit lösen zu können.

Bin mir auch nicht sicher, ob ich es wirklich anstrebe, diese Fähigkeit soweit zu vertiefen. Es gibt Programmierumgebungen, die ich auf Anhieb liebe und solche, wo ich denke ... naja: nur soviel wie unbedingt nötig. Die Philosophie hinter den Shellscripten kommt mir auf Anhieb zwar komplex aber auch etwas wirr vor.

Mein persönlicher Favorit ist SuperBasic, das auf dem Sinclair QL 1984 mit dem Multitasking-Betriebssystem QDOS sowohl als Programmiersprache als auch als Betriebsystem-Scriptsprache eingeführt wurde.
Mit dieser Sprache hat es mir sehr viel Spaß gemacht, Programme zu schreiben, die solche Dinge wie Einsteins Rätsel oder ein Travelling Salesman Problem lösen.

Falls es irgendjemanden interessiert, kann ich gern mal eine Lösung der hier ausgeschriebenen Aufgabe unter SuperBasic zu versuchen und dann hier posten. Es soll übrigens auch QL-Emulatoren unter Linux geben, aber da habe ich bisher noch keine persönlichen Erfahrungen damit...

Viele Grüße, und nix für ungut

Micha

mawe

Anmeldungsdatum:
18. November 2004

Beiträge: 172

Hi Micha!

Der Scripting-Contest ist nicht auf Shellscript beschränkt, Du kannst jede Scriptsprache verwenden. Und da drunkVoodoo bei Aufgabe1 auch eine C-Variante gepostet hat, würde ich sogar sagen Du kannst JEDE Programmiersprache verwenden 😉

Gruß, mawe

blackbird Team-Icon

Avatar von blackbird

Anmeldungsdatum:
19. November 2004

Beiträge: 3397

mawe hat geschrieben:

PS: Die Ausrede von blackbird muss ich mir unbedingt merken, genial 🤣

Gruß, (und nochmal sorry) mawe

Haha. Sehr lustig.

drunkVoodoo

(Themenstarter)

Anmeldungsdatum:
17. November 2004

Beiträge: 66

mawe hat geschrieben:

Der Scripting-Contest ist nicht auf Shellscript beschränkt, Du kannst jede Scriptsprache verwenden. Und da drunkVoodoo bei Aufgabe1 auch eine C-Variante gepostet hat, würde ich sogar sagen Du kannst JEDE Programmiersprache verwenden 😉

In der Tat ... ich nehme alles, was frei verfügbar ist! (War das jetzt zu zweideutig? 🙄)

Tatsache ist, wenn der Compiler/Interpreter irgendwo in den Ubuntu-Paketen rumhängt, werde ich versuchen, die Lösung zum Laufen zu kriegen.

Sooo ... kann ich jetzt noch mit Lösungen zu dieser Aufgabe rechnen, oder soll ich die später nochmal stellen?
Einfach so vorgeben tu ich nämlich ... lassma nachdenken ... nix!
Andere Möglichkeit ist: Ich stelle am Freitag eine einfachere Aufgabe.

Wie siehts aus?

mawe

Anmeldungsdatum:
18. November 2004

Beiträge: 172

Hi!

drunkVoodoo hat geschrieben:

Andere Möglichkeit ist: Ich stelle am Freitag eine einfachere Aufgabe.

Ich würde sagen die Aufgabe muss nicht unbedingt einfacher sein. Aber was hälst Du von Aufgaben, die man später verwenden kann (ich wollte jetzt nicht "sinnvolle" sagen 😉). Ich meine solche, die man dann z.B. hier ins Wiki stellen kann. Das würde vielleicht auch mehr Teilnehmer/Interessenten anlocken. Nur so eine Idee ...

Gruß, mawe

Micha

Avatar von Micha

Anmeldungsdatum:
12. März 2005

Beiträge: 146

In der Tat ... ich nehme alles, was frei verfügbar ist!

@Voodoo: Gib's zu, du bist'n Student der nur zu faul ist, seine Informatik-Hausaufgaben selber zu machen 😉

Na jedenfalls hab ich hier ne Lösung des Problems, die in der Art der Programmierung meilenweit an der Vorgabe vorbeischrammt:
nämlich programmiert auf einem Sinclair QL - aus heutiger Sicht ein echter Dinosaurier der Computergeschichte, aber 1984 war der wirklich visionär: welcher andere Heimcomputer hatte damals schon ein multitasking-fähiges Betriebssystem und eine Office Suite, bestehend aus Textverarbeitung, Tabellenkalkulation, Datenbank und Grafikprogramm...

Zurück zum Thema:
ich glaube die gestellte Aufgabe vernebelt unser Denken in einer Hinsicht (ist ja typisch für die berühmten Textaufgaben, die wir alle noch lieben aus der Schulzeit): da man hier alle Gegner besiegen muß, diese aber gemäß den Regeln nicht hinterrücks eigene schwach besetzte Länder zurückerobern, ist es egal, in welcher Reihenfolge man sich die Gegner vorknöpft. Und das Herumgurken in eigenen Ländern kostet dann auch nur wertvolle Züge.

Daher entkoppelt sich das Problem ganz einfach:

1. eine Route finden, bei der man möglichst wenig Züge macht, aber jedes Land mind. einmal erreicht
2. diese Route stur abarbeiten, ggf. denselben Gegner mehrfach angreifen, bis man ihn "geknackt" hat. Statistisch ist es egal, da der Ausgang eines Feldzuges gemäß den Regeln nicht von der Anzahl der eigenen Armeen oder vorherigen Aktionen abhängt.

Und jetzt kommt der hammerharte Teil: das Listing im SuperBasic des Sinclair QL.
Superbasic ist für damalige Zeit ne super Programmiersprache, ähnlich Pascal. Die einzigen Nachteile: Sinclair konnte sich nicht von den Zeilennummern trennen, obwohl die eigentlich nicht mehr notwendig waren in dieser Sprache. Und die Gültigkeitsbereiche von Variablen waren etwas, naja... problematisch. Man wurde dazu verleitet, aus Prozeduren in global gültigen Variablen herumzuändern.

Als Ubuntu-Paket gibt es keinen QL-Emu, soweit ich das überblicke. Aber es gibt schon Linux-fähige QL-Emu's, z.B. dort:

QLAY: http://web.inter.nl.net/hcc/A.Jaw.Venema/

UQLX: http://www.geocities.com/SiliconValley/Bay/2602/uqlx_main.html

@DrunkVoodoo: falls Du es schaffst, so einen Emu zum Laufen zu bringen und hier einen Ergebnis-Screenshot dieses Scripts postest, dann hast du WIRKLICH meinen Respekt verdient...

Viele Grüße!

Micha

1000 CLS
1010 RANDOMISE
1020 RESTORE
1030 READ nL,here
1040 DIM Land$(nL,20)
1050 DIM Who$(nL)
1060 DIM nConn(nL)
1070 DIM nArm(nL)
1080 DIM Conn(nL,nL)
1090 :
1100 FOR i=1 TO nL:Who$(i)="G":REMark Gegner
1110 Who$(here)="S":REMark Spieler
1120 FOR i=1 TO nL
1130  READ Land$(i)
1140  READ nArm(i),nConn(i)
1150  FOR j=1 TO nConn(i):READ Conn(i,j)
1160 END FOR i
1170 PRINT "Anfangslage:":ShowSituation
1180 Route$=DetermineRoute$(here,200)
1190 :
1200 nTrial=0
1210 REPeat gotoWar
1220  x= "," INSTR Route$
1230  IF x THEN
1240   Route$=Route$(x+1 TO LEN(Route$))
1250   target=Route$
1260   nTrial=nTrial+Conquer(target)
1270  ELSE
1280   EXIT gotoWar
1290  END IF
1300 END REPeat gotoWar
1310 PRINT "====="
1320 PRINT " Anzahl Zuege gesamt:";nTrial
1330 nA=0
1340 FOR i=1 TO nL:nA=nA+nArm(i)
1350 PRINT "eigene Armeen brig:";nA
1360 STOP
1370 REMark ** Ende Hauptprogramm **
1380 :
1390 DEFine FuNction Conquer(target)
1400 LOCal n
1410 n=0
1420  REPeat Attempt
1430   n=n+1
1440   IF StepTo(target) THEN EXIT Attempt
1450  END REPeat Attempt
1460  PRINT Land$(target) & " besiegt in " & n & " Versuche(n)."
1470  RETurn n
1480 END DEFine Conquer
1490 :
1500 DEFine FuNction StepTo(x)
1510 REMark ** Einen Zug ausfuehren **
1520 LOCal i,flag,tmp
1530  REMark pruefen ob x aktuell erreichbar
1540  FOR i=1 TO nConn(here)
1550   IF Conn(here,i)=x THEN flag=1
1560  END FOR i
1570  IF NOT flag THEN PRINT "Fehler: Zug nicht moeglich!":STOP
1580  IF Who$(x)="S" THEN
1590   REMark Vorruecken in eigenes Land
1600   mov=nArm(here)-1:nArm(here)=1
1610   IF mov<1 THEN PRINT "Verloren":STOP
1620   here=x:nArm(here)=nArm(here)+mov
1630  ELSE
1640   REMark Angriff auf gegenerisches Land
1650   IF RND>.15*nArm(x) THEN
1660    REMark gewonnen
1670    Who$(x)="S"
1680    nArm(x)=nArm(here)-1+2
1690    nArm(here)=1:here=x
1700    RETurn 1
1710   ELSE
1720    REMark verloren
1730    nArm(here)=nArm(here)-1
1740    RETurn 0
1750   END IF
1770  END IF
1775  RETurn 1
1780 END DEFine StepTo
1790 :
1800 DEFine PROCedure ShowSituation
1810 LOCal i
1820  FOR i=1 TO nL
1830   PRINT Land$(i);
1840   IF i=here THEN
1850    PRINT TO 20,"*",
1860   ELSE
1870    PRINT TO 20,Who$(i),
1880   END IF
1890   PRINT TO 30,nArm(i)
1900  END FOR i
1910  PRINT "-----"
1920 END DEFine ShowSituation
1930 :
1940 DEFine FuNction DetermineRoute$(start,nTrial)
1950 LOCal Route$,OptRoute$,V$,nStep,h
1960 LOCal i,j
1970  nMin=1E9
1980  FOR j=1 TO nTrial
1990   nStep=0
2000   V$="":FOR i=1 TO nL:V$=V$ & "-"
2010   h=start:V$(h)="+"
2020   Route$=h & ","
2030   REPeat suche
2040    IF "-" INSTR V$ THEN
2050     nStep=nStep+1
2060     IF nStep>nMin THEN NEXT j
2070     h=Conn(h,RND(1 TO nConn(h)))
2080     V$(h)="+"
2090     Route$=Route$ & h & ","
2100    ELSE
2110     IF nStep<nMin THEN
2120      nMin=nStep
2130      OptRoute$=Route$
2140     END IF
2150     EXIT suche
2160    END IF
2170   END REPeat suche
2180  END FOR j
2190  OptRoute$=OptRoute$(1 TO LEN(OptRoute$)-1)
2200  RETurn OptRoute$
2210 END DEFine DetermineRoute$
2220 :
2230 REMark Anz. Laender, eigenes Startland
2240 DATA 7,1
2250 REMark Name, #Armeen, #Nachbarn, Liste der Nachbarn
2260 DATA "Island"         ,50,2 ,2,7
2270 DATA "Skandinavien"   ,3 ,5 ,1,3,4,5,7
2280 DATA "Ukraine"        ,1 ,2 ,2,4
2290 DATA "Osteuropa"      ,3 ,3 ,2,3,5
2300 DATA "Mitteleuropa"   ,2 ,4 ,2,4,6,7
2310 DATA "Westeuropa"     ,1 ,2 ,5,7
2320 DATA "Grossbritanien" ,3 ,4 ,1,2,5,6

Apollon

Avatar von Apollon

Anmeldungsdatum:
27. Oktober 2004

Beiträge: 724

Micha hat geschrieben:

@Voodoo: Gib's zu, du bist'n Student der nur zu faul ist, seine Informatik-Hausaufgaben selber zu machen 😉

:up:

drunkVoodoo

(Themenstarter)

Anmeldungsdatum:
17. November 2004

Beiträge: 66

Kein Student,viel schlimmer...aber die Geschichte erzähle ich ein anderes mal (vielleicht). Aber abgesehen davon Programmiersprachen- und Compiler/interpreter-Fetischist.

@Micha: Das mit dem BASIC-Prog nehme ich jetzt mal als Herausforderung, hab zwar nicht viel Zeit dieses WE, aber dafür wird noch was drin sein! 8)

Apollon

Avatar von Apollon

Anmeldungsdatum:
27. Oktober 2004

Beiträge: 724

drunkVoodoo hat geschrieben:

Kein Student,viel schlimmer [...]

Ein Fachinformatiker für Anwendungsentwicklung wie dieser hier? 😛

Antworten |