monkeymusic 0.0.14 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Gemfile +0 -1
- data/README.md +166 -177
- data/demo_players/java/DemoPlayer.java +250 -0
- data/demo_players/java/install +2 -0
- data/demo_players/java/runme +2 -0
- data/demo_players/python/install +2 -0
- data/demo_players/python/monkey.py +111 -0
- data/demo_players/python/runme +2 -0
- data/demo_players/python/state.pickle +0 -0
- data/demo_players/python/util.py +29 -0
- data/demo_players/python/util.pyc +0 -0
- data/{demo_player → demo_players/ruby/demo_player.rb} +3 -2
- data/levels/demo_level.rb +1 -0
- data/levels/maze.rb +20 -0
- data/levels/metadata.rb +17 -0
- data/levels/walls.rb +20 -0
- data/lib/monkey_music/game.rb +1 -2
- data/lib/monkey_music/level.rb +2 -9
- data/lib/monkey_music/level_loader.rb +4 -0
- data/lib/monkey_music/player.rb +8 -6
- data/lib/monkey_music/runner.rb +15 -12
- data/lib/monkey_music/ui/browser.rb +26 -17
- data/lib/monkey_music/ui/console.rb +13 -15
- data/lib/monkey_music_generate/runner.rb +2 -3
- data/lib/monkey_music_generate/score_system.rb +2 -0
- data/users/demo_user.yaml +250 -250
- metadata +15 -11
- data/levels/testlevel.rb +0 -29
- data/levels/testlevel_maze.rb +0 -24
- data/levels/testmaze_10.rb +0 -38
- data/levels/testmaze_20.rb +0 -38
- data/levels/testmaze_30.rb +0 -38
- data/levels/the_last_crusade.rb +0 -21
- data/levels/travelling_salesmonkeys.rb +0 -0
- data/users/synth.rb +0 -11
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OGIwZjAyMDZjNTgxZjc3NzQzZGM0ZjYzOWRkZmE5YjJjYTYwNzJkMA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NjkwYjEzMjU4ODNhZjAyMGE2ZjJmZjBhOThlMTYxMjI4MDk4NDQ0NA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZTlhN2E1ZGFkZWNkNDI1YjEyZjYwNmJmNWI5NjdkYzUxNThmYjE1NTE0MWJk
|
10
|
+
ZDc2ZWU3NzkyOGI0NWUwM2RkZGMzOTBjOWQxMDMxMTYyYjRiZmE2M2NjMDk2
|
11
|
+
YjRmMDRlMTAyMmE0ODZhYTc4ZTU5MjFiMzJhZjgzNzhmZjFjMTY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NzE0YzRmYTllNjA0MzgyMTVlMzVjMjk0MzMwZDU0MWY1NjJkYmMwNTI4NmVj
|
14
|
+
NGQwNzY0YjkwMTY5MmRlOGE3YzkzMDUwNjY3ODYyNTA2N2VlMDQyMGEzZGNj
|
15
|
+
ZjA1NzIwMjNmMDMyODBiNWUzNGY5YjhjN2RiODE4MWU4ZTk3YTQ=
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -5,7 +5,7 @@ Monkey Music Challenge
|
|
5
5
|
Introduction
|
6
6
|
------------
|
7
7
|
|
8
|
-
The Spotify backend
|
8
|
+
The Spotify backend consists of a multitude of individual services. One such service is the music recommendation service, which is responsible for finding and recommending new tracks to Spotify users, according to their music taste.
|
9
9
|
|
10
10
|
The music recommendation service has lately been getting some pretty negative feedback from users. The word out on Twitter is that even monkeys could find better music recommendations!
|
11
11
|
|
@@ -13,37 +13,43 @@ Therefore, upper management has made an informed decision that the next version
|
|
13
13
|
|
14
14
|
You have therefore decided to write a computer program that helps monkeys find good track recommendations for Spotify users.
|
15
15
|
|
16
|
-
This is all entirely fictional of course.
|
16
|
+
This is all entirely fictional of course. :)
|
17
17
|
{: .tip}
|
18
18
|
|
19
19
|
Task summary
|
20
20
|
------------
|
21
21
|
|
22
|
-
The task consists of implementing a program to play the Monkey Music game.
|
22
|
+
The task consists of implementing a program to play the Monkey Music game.
|
23
|
+
The goal of the game is to score points by gathering track recommendations
|
24
|
+
for a Spotify user.
|
23
25
|
|
24
26
|
The game
|
25
27
|
--------
|
26
28
|
|
27
|
-
|
29
|
+
The game takes place in a two dimensional level. The level is a rectangular
|
30
|
+
grid of cells.
|
28
31
|
|
29
|
-
|
32
|
+
Your program will move a monkey around the level by printing commands
|
33
|
+
to `stdout`. Before every command, your program will be fed information about the current state
|
34
|
+
of the game and level through `stdin`.
|
30
35
|
|
31
|
-
|
32
|
-
|
36
|
+
The game is divided into turns. Upon each turn, every monkey on the level gets
|
37
|
+
to execute one command.
|
33
38
|
|
34
39
|
Before every turn, execution of your program starts. After every turn, execution of your program stops.
|
40
|
+
{: .tip}
|
35
41
|
|
36
42
|
Rules
|
37
43
|
-----
|
38
44
|
|
39
45
|
### Scoring
|
40
46
|
|
41
|
-
Your
|
47
|
+
Your mission is to move around the level, pick up tracks, and deliver them
|
48
|
+
to a Spotify user.
|
42
49
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
{. tip}
|
50
|
+
Each track is worth a certain amount of points. Every time you deliver a
|
51
|
+
track, these points are added to your score. The player with the highest score
|
52
|
+
at the end of the game is the winner.
|
47
53
|
|
48
54
|
### Turn limit
|
49
55
|
|
@@ -53,134 +59,113 @@ The game ends when the turn limit is reached.
|
|
53
59
|
|
54
60
|
### Time limit
|
55
61
|
|
56
|
-
Every time your program is executed, the execution time will be measured. Every level has a total time limit
|
62
|
+
Every time your program is executed, the execution time will be measured. Every level has a total time limit that your program should not exceed.
|
57
63
|
|
58
|
-
If your execution time reaches the time limit, your monkey will run out of
|
64
|
+
If your execution time reaches the time limit, your monkey will run out of
|
65
|
+
energy and fall asleep for `5` turns, after which your execution time will
|
66
|
+
be replenished.
|
59
67
|
|
60
68
|
### Carrying capacity
|
61
69
|
|
62
|
-
|
70
|
+
Your monkey must pick up tracks and carry them to a user. The number of
|
71
|
+
tracks your monkey can carry at any given time is called the carrying capacity.
|
72
|
+
|
73
|
+
When you have picked up enough tracks, you must deliver them to a user
|
74
|
+
before picking up more.
|
63
75
|
|
64
76
|
The carrying capacity of your monkey is different for every level.
|
77
|
+
{: .tip}
|
65
78
|
|
66
79
|
Level layout
|
67
80
|
------------
|
68
81
|
|
69
|
-
The level is a `n x m` grid of cells.
|
82
|
+
The level is a `n x m` grid of cells.
|
83
|
+
|
84
|
+
It is sent to the standard input of your program as `m` lines, with `n`
|
85
|
+
comma-separated cells each.
|
86
|
+
|
87
|
+
Each cell contains an ASCII string, which can be one of the following
|
88
|
+
things:
|
70
89
|
|
71
|
-
Each cell contains one of the following things:
|
72
90
|
|
73
91
|
### Monkeys
|
74
92
|
|
75
|
-
|
93
|
+
**ASCII:** `M[id]`
|
76
94
|
|
77
95
|
You, and your competitors each have your own monkey to control.
|
78
96
|
Every monkey is identified by a unique numerical id.
|
79
97
|
|
80
98
|
### Walls
|
81
99
|
|
82
|
-
|
100
|
+
**ASCII:** `#`
|
83
101
|
|
84
102
|
Walls are inanimate objects that monkeys cannot pass through.
|
85
103
|
|
86
104
|
### Tracks
|
87
105
|
|
88
|
-
|
106
|
+
**ASCII:** `spotify:track:[hash]`
|
89
107
|
|
90
|
-
Tracks are identified by their unique Spotify URI.
|
108
|
+
Tracks are identified by their unique Spotify URI.
|
91
109
|
|
92
|
-
|
110
|
+
Every track URI starts with `spotify:track:`, followed by `22`
|
111
|
+
alphanumerical characters:
|
112
|
+
|
113
|
+
spotify:track:5H85hOp2oMlhMh9JlkdJP2
|
93
114
|
|
94
115
|
Tracks can be picked up and carried around by monkeys.
|
95
116
|
|
96
|
-
###
|
117
|
+
### User
|
97
118
|
|
98
|
-
|
119
|
+
**ASCII:** `U`
|
99
120
|
|
100
|
-
The user is where monkeys deliver their track recommendations. Monkeys are
|
101
|
-
scored for every track delivered to the user, according to how well the track fits
|
121
|
+
The Spotify user is where monkeys deliver their track recommendations. Monkeys are
|
122
|
+
scored for every track delivered to the user, according to how well the track fits
|
123
|
+
the user's music taste.
|
102
124
|
|
103
125
|
### Empty
|
104
126
|
|
105
|
-
|
127
|
+
**ASCII:** `_`
|
106
128
|
|
107
|
-
|
129
|
+
Empty cells are represented by an underscore.
|
108
130
|
|
109
131
|
A cell can only contain one thing at any time.
|
110
132
|
{: .tip}
|
111
133
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
How well tracks match the music taste of a user is decided by the user's toplists.
|
116
|
-
|
117
|
-
Every Spotify user has a track toplist, an album toplist and an artist toplist. Every entry in a toplist is a comma-separated string of metadata.
|
118
|
-
|
119
|
-
The toplists are sent to the standard input of your program on the following formats:
|
120
|
-
|
121
|
-
### Track toplist
|
122
|
-
|
123
|
-
First an integer `n`, followed by `n` lines of track metadata entries.
|
124
|
-
|
125
|
-
n
|
126
|
-
track,album,artist,year
|
127
|
-
track,album,artist,year
|
128
|
-
...
|
129
|
-
|
130
|
-
### Album toplist
|
131
|
-
|
132
|
-
First an integer `n`, followed by `n` lines of album metadata entries.
|
133
|
-
|
134
|
-
[n]
|
135
|
-
album,artist,year
|
136
|
-
album,artist,year
|
137
|
-
...
|
138
|
-
|
139
|
-
### Artist toplist
|
140
|
-
|
141
|
-
First an integer `n`, followed by `n` lines of artist metadata entries.
|
142
|
-
|
143
|
-
n
|
144
|
-
artist
|
145
|
-
artist
|
146
|
-
...
|
147
|
-
|
148
|
-
### Disliked artist toplist
|
134
|
+
Score system
|
135
|
+
------------
|
149
136
|
|
150
|
-
|
137
|
+
Every Spotify user has a number of toplists:
|
151
138
|
|
152
|
-
|
139
|
+
* Top tracks
|
140
|
+
* Top albums
|
141
|
+
* Top artists
|
153
142
|
|
154
|
-
|
155
|
-
artist
|
156
|
-
artist
|
157
|
-
...
|
143
|
+
In the Monkey Music game, every user also has another toplist:
|
158
144
|
|
159
|
-
|
160
|
-
{: .tip}
|
145
|
+
* Top disliked artists
|
161
146
|
|
162
|
-
|
163
|
-
------------
|
147
|
+
How well tracks match the music taste of a user is decided by the user's toplists.
|
164
148
|
|
165
|
-
Each track
|
149
|
+
Each track belongs to one of 5 score tiers. There are three positive
|
150
|
+
tiers: `1`, `2` and `3`. There are two negative tiers, `-1` and `-2`.
|
166
151
|
|
167
|
-
|
152
|
+
If a track fulfills a negative criteria, it is immediately
|
153
|
+
placed into the corresponding tier. This differs from the positive tiers.
|
154
|
+
For every positive criteria that matches, the track climbs one tier.
|
168
155
|
|
169
156
|
The following criteria decide which tier a track belongs to:
|
170
157
|
|
171
158
|
### Tier -2: Disliked artist
|
172
159
|
|
173
|
-
The track artist is
|
174
|
-
these tracks is an epic fail.
|
160
|
+
The track artist is among the users's top disliked artists.
|
175
161
|
|
176
162
|
### Tier -1: Played to death
|
177
163
|
|
178
|
-
The track is already
|
179
|
-
in recommending it.
|
164
|
+
The track is already among the user's top tracks.
|
180
165
|
|
181
166
|
### Tier += 1: Favorite artist
|
182
167
|
|
183
|
-
The track artist is
|
168
|
+
The track artist is among the user's top artists.
|
184
169
|
|
185
170
|
### Tier += 1: Favorite album
|
186
171
|
|
@@ -190,98 +175,92 @@ If track album in the user's album toplist.
|
|
190
175
|
|
191
176
|
The year of the track belongs to the user's top decade.
|
192
177
|
|
193
|
-
|
178
|
+
Every user has a top decade, which is the decade that is most prominent in the user's track toplist and album toplist.
|
194
179
|
|
195
180
|
### Tally
|
196
181
|
|
197
182
|
Your track will be scored according to it's tier:
|
198
183
|
|
199
|
-
**Tier -2:** -16 points
|
200
|
-
|
201
|
-
**Tier
|
202
|
-
|
203
|
-
**Tier
|
204
|
-
|
205
|
-
**Tier 2:** 16 points
|
184
|
+
* **Tier -2:** -16 points
|
185
|
+
* **Tier -1:** -4 points
|
186
|
+
* **Tier 1:** 4 points
|
187
|
+
* **Tier 2:** 16 points
|
188
|
+
* **Tier 3:** 64 points
|
206
189
|
|
207
|
-
|
208
|
-
|
209
|
-
Tier 3 tracks are obviously very valuable, so be on the lookout for these.
|
190
|
+
Tier 3 tracks are obviously very valuable. Be on the lookout for these.
|
210
191
|
{: .tip}
|
211
192
|
|
212
193
|
Game progression
|
213
194
|
----------------
|
214
195
|
|
215
|
-
###
|
216
|
-
|
217
|
-
The game consists of two different phases.
|
196
|
+
### Init phase
|
218
197
|
|
219
|
-
The first phase is the
|
198
|
+
The first phase of the game is the init phase, which occurs once every game.
|
220
199
|
|
221
|
-
During the
|
200
|
+
During the init phase, your program will be given information about the level that will be useful during the entire course of the game.
|
222
201
|
|
223
202
|
The information that can be read from `stdin` during the `init` phase is:
|
224
203
|
|
225
204
|
INIT\n
|
226
|
-
M[id]\n
|
227
|
-
[WIDTH]\n
|
228
|
-
[HEIGHT]\n
|
229
|
-
[TURN LIMIT]\n
|
230
|
-
[n]\n
|
231
|
-
[TRACK],[ALBUM],[ARTIST],[YEAR]\n
|
232
|
-
[n]\n
|
233
|
-
[ALBUM],[ARTIST],[YEAR]\n
|
234
|
-
[n]\n
|
235
|
-
[ARTIST]\n
|
236
|
-
[n]\n
|
237
|
-
[ARTIST]\n
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
* The `width` of the map
|
242
|
-
* The `height` of the map
|
243
|
-
* The `turn limit` of the game
|
244
|
-
* The number of entries in the user's track toplist
|
245
|
-
* The track toplist entries
|
246
|
-
* The number of entries in the user's album toplist
|
247
|
-
* The album toplist
|
248
|
-
* The number of entries in the user's artist toplist
|
249
|
-
* The artist toplist
|
250
|
-
* The number of entries in the user's disliked artist toplist
|
251
|
-
* The disliked artist toplist
|
252
|
-
|
253
|
-
After the initialization phase, execution of your program will stop until the next phase.
|
254
|
-
|
255
|
-
Make sure to keep the data from the initialization phase in a persistent cache!
|
205
|
+
M[id]\n // id of your monkey
|
206
|
+
[WIDTH]\n // width of the level
|
207
|
+
[HEIGHT]\n // height of the level
|
208
|
+
[TURN LIMIT]\n // turn limit of the game
|
209
|
+
[n]\n // the number of entries in the track toplist
|
210
|
+
[TRACK],[ALBUM],[ARTIST],[YEAR]\n // n rows of track metadata
|
211
|
+
[n]\n // the number of entries in the album toplist
|
212
|
+
[ALBUM],[ARTIST],[YEAR]\n // n rows of album metadata
|
213
|
+
[n]\n // the number of entries in the artist toplist
|
214
|
+
[ARTIST]\n // n rows of artist metadata
|
215
|
+
[n]\n // the number of entries in the disliked artist toplist
|
216
|
+
[ARTIST]\n // n rows of disliked artist metadata
|
217
|
+
|
218
|
+
After the init phase, execution of your program will stop. Make sure
|
219
|
+
to keep the data from the init phase in a persistent cache!
|
256
220
|
{: .tip}
|
257
221
|
|
258
|
-
###
|
222
|
+
### Turns
|
223
|
+
|
224
|
+
After the init phase, a number of turns will follow.
|
259
225
|
|
260
|
-
|
226
|
+
The total number of turns is decided by the turn limit of the level.
|
261
227
|
|
262
|
-
|
228
|
+
Every turn, your program will issue one command, but first it will read
|
229
|
+
the current state of the game.
|
263
230
|
|
264
|
-
The information that can be read from `stdin` during a turn
|
231
|
+
The information that can be read from `stdin` during a turn is:
|
265
232
|
|
266
233
|
TURN\n
|
267
|
-
M[ID]\n
|
234
|
+
M[ID]\n // id of your monkey
|
268
235
|
[TURN NUMBER]\n
|
269
236
|
[REMAINING CAPACITY]\n
|
270
|
-
[REMAINING TIME]\n
|
271
|
-
[
|
272
|
-
[
|
273
|
-
[
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
237
|
+
[REMAINING TIME]\n // milliseconds
|
238
|
+
[BOOST COOLDOWN]\n // number of turns until boost ready
|
239
|
+
[n]\n // amount of metadata lookup results
|
240
|
+
[URI],[TRACK],[ALBUM],[ARTIST],[YEAR]\n // n rows of metadata lookup results
|
241
|
+
[CELL],[CELL],..,[CELL]\n // [height] rows of comma separated level cells
|
242
|
+
|
243
|
+
An example turn could look like:
|
244
|
+
|
245
|
+
TURN\n
|
246
|
+
M2\n
|
247
|
+
1\n
|
248
|
+
3\n
|
249
|
+
4503\n
|
250
|
+
0\n
|
251
|
+
1\n
|
252
|
+
spotify:track:5H85hOp2oMlhMh9JlkdJP2,Condemnation,Depeche Mode,Songs Of Faith And Devotion,1993\n
|
253
|
+
_,_,_,_,_,_\n
|
254
|
+
_,#,#,_,_,_\n
|
255
|
+
_,#,spotify:track:5H85hOp2oMlhMh9JlkdJP2,_,_,_\n
|
256
|
+
_,_,_,_,_,U\n
|
257
|
+
M2,_,_,_,_,_\n
|
258
|
+
_,_,_,spotify:track:4CARtDIJS87fOmWb1RxLKK,_,_\n
|
259
|
+
#,_,_,_,_,_\n
|
260
|
+
_,_,_,_,_,_\n
|
261
|
+
_,#,spotify:track:0S8LgLoseDB6W2HWd1ym6P,_,_,_\n
|
262
|
+
_,#,#,#,#,_\n
|
263
|
+
_,_,_,_,_,_\n
|
285
264
|
|
286
265
|
Monkey commands
|
287
266
|
---------------
|
@@ -291,52 +270,52 @@ In each turn of the game, every monkey executes one command.
|
|
291
270
|
|
292
271
|
Commands which the monkeys can execute are:
|
293
272
|
|
294
|
-
[MOVE] | [
|
273
|
+
[MOVE] | [URI LOOKUP] | B,[COMMAND],[COMMAND],[COMMAND]
|
295
274
|
|
296
|
-
|
275
|
+
Fate decides the order in which monkeys execute their commands during a
|
276
|
+
turn.
|
277
|
+
{: .tip}
|
278
|
+
|
279
|
+
### Movement
|
297
280
|
|
298
281
|
You can command the monkey to move in the four cardinal directions using
|
299
282
|
the commands:
|
300
283
|
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
E
|
306
|
-
|
307
|
-
Moves the monkey one cell to the right.
|
308
|
-
|
309
|
-
N
|
284
|
+
* **North:** `N`
|
285
|
+
* **West:** `W`
|
286
|
+
* **East:** `E`
|
287
|
+
* **South:** `S`
|
310
288
|
|
311
|
-
|
312
|
-
|
313
|
-
S
|
314
|
-
|
315
|
-
Moves the monkey one cell down.
|
289
|
+
Each of the above command causes the monkey to attempt to move one cell in
|
290
|
+
the specified direction.
|
316
291
|
|
317
292
|
Trying to move to an already occupied cell will casue the monkey to stand
|
318
293
|
still for the duration of the round.
|
319
294
|
{: .tip}
|
320
295
|
|
321
|
-
###
|
296
|
+
### URI lookup
|
322
297
|
|
323
|
-
You can lookup the metadata of a track on the level by issuing a
|
298
|
+
You can lookup the metadata of a track on the level by issuing a URI
|
324
299
|
lookup command:
|
325
300
|
|
326
|
-
spotify:track
|
301
|
+
spotify:track:[hash]
|
327
302
|
|
328
|
-
You will recieve the result of the
|
303
|
+
You will recieve the result of the URI lookup in the next turn input.
|
329
304
|
|
330
|
-
Your monkey must every turn choose between moving and looking up the
|
305
|
+
Your monkey must every turn choose between moving and looking up the
|
306
|
+
metadata of a track.
|
331
307
|
{: .tip}
|
332
308
|
|
333
309
|
### Boost
|
334
310
|
|
335
311
|
B,[COMMAND],[COMMAND],[COMMAND]
|
336
312
|
|
337
|
-
|
313
|
+
You can issue a boost command and then issue three other comma separated commands during the same turn.
|
314
|
+
|
315
|
+
After using boost, the command will be on cooldown before being available
|
316
|
+
for use again.
|
338
317
|
|
339
|
-
|
318
|
+
Keep a close watch on the boost cooldown, use your boost wisely!
|
340
319
|
{: .tip}
|
341
320
|
|
342
321
|
The turn input after having issued this command:
|
@@ -351,8 +330,9 @@ could look like:
|
|
351
330
|
1
|
352
331
|
4529
|
353
332
|
2
|
354
|
-
spotify:track:5H85hOp2oMlhMh9JlkdJP2,
|
355
|
-
spotify:track:
|
333
|
+
spotify:track:5H85hOp2oMlhMh9JlkdJP2,Condemnation,Depeche Mode,Songs Of Faith And Devotion,1993
|
334
|
+
spotify:track:spotify:track:3NYCaxkggl0Hh8vQptSUvV,Enola Gay - 2003 - Remaster,Orchestral Manoeuvres In The Dark
|
335
|
+
,Organisation,2003
|
356
336
|
|
357
337
|
### Picking up tracks
|
358
338
|
|
@@ -382,15 +362,21 @@ To install the challenge runtime:
|
|
382
362
|
|
383
363
|
> gem install monkeymusic
|
384
364
|
|
385
|
-
To get
|
365
|
+
To get some demo code to start from:
|
386
366
|
|
387
367
|
> monkeymusic demo
|
388
368
|
|
389
369
|
To see something on the screen:
|
390
370
|
|
391
|
-
> monkeymusic -p
|
371
|
+
> monkeymusic -p demo_players/ruby/runme
|
392
372
|
|
393
|
-
|
373
|
+
For more info:
|
374
|
+
|
375
|
+
> monkeymusic --help
|
376
|
+
|
377
|
+
You can probably reuse some of the code from the demo players.
|
378
|
+
Specifically if you do not want to spend too much time on parsing and
|
379
|
+
persisting data between rounds.
|
394
380
|
|
395
381
|
Handing in
|
396
382
|
----------
|
@@ -398,4 +384,7 @@ Handing in
|
|
398
384
|
Your competition entry is to be handed in as a zip archive containing
|
399
385
|
everything needed to run your program.
|
400
386
|
|
401
|
-
When unpacked, your program should be runned through an
|
387
|
+
When unpacked, your program should be runned through an runnable file called `runme`.
|
388
|
+
|
389
|
+
If your program requires some sort of installation, such as compilation,
|
390
|
+
this should be encoded in another runnable file called `install`.
|