Skip to content

Commit 8e49b7a

Browse files
committed
Merge branch 'master' of github.com:imos/icfpc2020
2 parents 85831a9 + 0ad89c5 commit 8e49b7a

File tree

12 files changed

+405
-80
lines changed

12 files changed

+405
-80
lines changed

.dockerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
/.cache
22
/build
3+
/target

get_room.Dockerfile

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
FROM rust:1.44.1-buster
2+
3+
WORKDIR /solution
4+
COPY Cargo.toml Cargo.toml
5+
COPY Cargo.lock Cargo.lock
6+
COPY src src
7+
RUN cargo build --release --bin=get_room && \
8+
cp ./target/release/get_room /usr/local/bin/get_room && \
9+
rm -rf ./target ~/.cache /usr/local/cargo/registry || true
10+
ARG ENDPOINT
11+
ENV ENDPOINT=$ENDPOINT
12+
RUN mv /usr/local/bin/get_room /usr/local/bin/get_room-internal
13+
RUN echo '#!/usr/bin/env bash' >>/usr/local/bin/get_room && \
14+
echo "exec /usr/local/bin/get_room-internal '$ENDPOINT' \"\$@\"" \
15+
>>/usr/local/bin/get_room && \
16+
chmod +x /usr/local/bin/get_room
17+
ENTRYPOINT ["/usr/local/bin/get_room"]

go/cmd/proxy/README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
## How to build
2+
3+
```
4+
docker build -t imos/icfpc2020:proxy \
5+
--build-arg ENDPOINT='https://icfpc2020-api.testkontur.ru/aliens/send?apiKey=*******' \
6+
-f proxy.Dockerfile .
7+
```
8+
9+
## How to use
10+
11+
Bind your port (e.g., 12345) for the proxy server.
12+
13+
```bash
14+
docker run -p 12345:8080 --rm -it imos/icfpc2020:proxy run
15+
```

go/cmd/proxy/main.go

Lines changed: 59 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,69 @@
11
package main
22

33
import (
4+
"bytes"
5+
"flag"
46
"fmt"
5-
"log"
7+
"io/ioutil"
68
"net/http"
7-
"net/http/httputil"
9+
10+
"github.com/golang/glog"
811
)
912

13+
var icfpcServerURL = flag.String("endpoint", "", "API endpoint")
14+
var port = flag.String("port", ":9000", "API endpoint")
15+
16+
func handler(w http.ResponseWriter, r *http.Request) {
17+
glog.Info("Processing request...")
18+
if r.Body == nil {
19+
glog.Errorf("body is empty")
20+
w.WriteHeader(400)
21+
return
22+
}
23+
defer r.Body.Close()
24+
buf, err := ioutil.ReadAll(r.Body)
25+
if err != nil {
26+
glog.Errorf("body is broken: %#v", err)
27+
w.WriteHeader(400)
28+
return
29+
}
30+
fmt.Printf("REQUEST\t%s\n", string(buf))
31+
resp, err := http.Post(*icfpcServerURL, "text/plain", bytes.NewBuffer(buf))
32+
if err != nil {
33+
glog.Errorf("POST failed: %s", err)
34+
w.WriteHeader(500)
35+
return
36+
}
37+
if resp.Body == nil {
38+
glog.Errorf("response body is empty")
39+
w.WriteHeader(500)
40+
return
41+
}
42+
defer resp.Body.Close()
43+
buf, err = ioutil.ReadAll(resp.Body)
44+
if err != nil {
45+
glog.Errorf("failed to read response body: %#v", err)
46+
w.WriteHeader(500)
47+
return
48+
}
49+
fmt.Printf("RESPONSE\t%s\n", string(buf))
50+
w.Header().Set("Content-Type", "text/plain")
51+
if _, err := w.Write(buf); err != nil {
52+
glog.Errorf("failed to respond")
53+
w.WriteHeader(500)
54+
return
55+
}
56+
}
57+
1058
func main() {
11-
director := func(req *http.Request) {
12-
url := *req.URL
13-
url.Scheme = "https"
14-
url.Host = "icfpc2020-api.testkontur.ru"
15-
req.Host = url.Host
16-
req.URL = &url
17-
buf, _ := httputil.DumpRequest(req, false)
18-
fmt.Println(string(buf))
19-
// buffer, err := ioutil.ReadAll(request.Body)
20-
// if err != nil {
21-
// log.Fatal(err.Error())
22-
// }
23-
// req, err := http.NewRequest(request.Method, url.String(), bytes.NewBuffer(buffer))
24-
// if err != nil {
25-
// log.Fatal(err.Error())
26-
// }
27-
// req.Header = request.Header
28-
// *request = *req
29-
}
30-
modifier := func(resp *http.Response) error {
31-
buf, _ := httputil.DumpResponse(resp, true)
32-
fmt.Println(string(buf))
33-
return nil
34-
}
35-
rp := &httputil.ReverseProxy{
36-
Director: director,
37-
ModifyResponse: modifier,
38-
}
39-
server := http.Server{
40-
Addr: ":9000",
41-
Handler: rp,
42-
}
43-
fmt.Println("Started...")
44-
if err := server.ListenAndServe(); err != nil {
45-
log.Fatal(err.Error())
59+
flag.Parse()
60+
glog.Info("Initializing...")
61+
if *icfpcServerURL == "" {
62+
glog.Fatal("--endpoint flag is required")
63+
}
64+
http.HandleFunc("/", handler)
65+
glog.Infof("Starting server on %s...", *port)
66+
if err := http.ListenAndServe(*port, nil); err != nil {
67+
glog.Fatal(err.Error())
4668
}
4769
}

go/proxy.Dockerfile

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
FROM golang:latest
2+
3+
ARG ENDPOINT
4+
ENV ENDPOINT=$ENDPOINT
5+
WORKDIR /build
6+
COPY . .
7+
RUN go build -o /usr/local/bin/proxy-internal ./cmd/proxy
8+
RUN echo '#!/usr/bin/env bash' >>/usr/local/bin/proxy && \
9+
echo "exec /usr/local/bin/proxy-internal --endpoint='$ENDPOINT' \"\$@\"" \
10+
>>/usr/local/bin/proxy && \
11+
chmod +x /usr/local/bin/proxy
12+
EXPOSE 8080
13+
ENTRYPOINT ["/usr/local/bin/proxy", "--logtostderr", "--port=:8080"]

script/arena.sh

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#!/usr/bin/env bash
2+
3+
set -eux
4+
5+
DATETIME="$(date "+%Y%m%d-%H%M%S")"
6+
ATTACKER="${1:-c090cc8}"
7+
DEFENDER="${2:-c090cc8}"
8+
ATTACKER_PORT="${3:-8001}"
9+
DEFENDER_PORT="${4:-8002}"
10+
11+
DIR="logs/${DATETIME}-${ATTACKER}-vs-${DEFENDER}"
12+
mkdir -p "${DIR}"
13+
14+
docker pull "imos/icfpc2020:${ATTACKER}"
15+
docker pull "imos/icfpc2020:${DEFENDER}"
16+
17+
docker run --rm -p "${ATTACKER_PORT}:8080" --name="proxy-${ATTACKER_PORT}" imos/icfpc2020:proxy > "${DIR}/attacker.txt" &
18+
docker run --rm -p "${DEFENDER_PORT}:8080" --name="proxy-${DEFENDER_PORT}" imos/icfpc2020:proxy > "${DIR}/defender.txt" &
19+
20+
KEYS=($(docker run --rm imos/icfpc2020:get_room))
21+
22+
docker run --rm --net=host "imos/icfpc2020:${ATTACKER}" "http://localhost:${ATTACKER_PORT}/aliens/send" "${KEYS[0]}" >"${DIR}/attacker-stdout.txt" 2>"${DIR}/attacker-stderr.txt" &
23+
ATTACKER_PID=$!
24+
25+
docker run --rm --net=host "imos/icfpc2020:${DEFENDER}" "http://localhost:${DEFENDER_PORT}/aliens/send" "${KEYS[1]}" >"${DIR}/defender-stdout.txt" 2>"${DIR}/defender-stderr.txt" &
26+
DEFENDER_PID=$!
27+
28+
exit_code=1
29+
if wait "${ATTACKER_PID}" && wait "${DEFENDER_PID}"; then
30+
exit_code=1
31+
fi
32+
33+
docker kill "proxy-${ATTACKER_PORT}" &
34+
docker kill "proxy-${DEFENDER_PORT}" &
35+
wait || true
36+
37+
exit "${exit_code}"

src/bin/app_totsugeki.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ fn run() {
2121
println!("!!!TOTSUGEKI!!!!");
2222
let mut router = app::routing::Router::new();
2323

24+
//dbg!(&app::routing::PosVel::new(-17, 7, 2, 4).is_in_valid_area());
25+
26+
// dbg!(&router.get_next_move(-48, -23, 0, 0, 48, 23)); // cowday最初のターン
27+
// dbg!(&router.get_next_move(-19, 3, 3, 6, 9, 17)); // cowday死ぬ直前 - 1
28+
// return;
29+
// dbg!(&router.get_next_move(-17, 7, 2, 4, 4, 17)); // cowday死ぬ直前
30+
2431
/*
2532
dbg!(&router.get_next_move(1, 35, 0, 0, -100, -100));
2633
return;
@@ -38,11 +45,11 @@ fn run() {
3845
}
3946
let player_key = std::env::args().nth(2).unwrap();
4047

41-
client.join(&player_key);
48+
let resp = client.join(&player_key);
4249

4350
// TODO: sideによってトータル変える
4451
let cool = 16;
45-
let mut resp = client.start(448 - cool * 12 - 1 * 2, 0, cool, 1);
52+
let mut resp = client.start(resp.info.ability.potential - cool * 12 - 1 * 2, 0, cool, 1);
4653

4754
let my_id = resp.state.ships.iter().find_map(|s| if s.role == resp.info.role { Some(s.id) } else { None }).unwrap();
4855
let en_id = 1 - my_id; // TODO: 分裂したらやばい・・・・・・しらない・・・・・・

src/bin/get_room.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
extern crate colored;
2+
3+
use std::process::*;
4+
use std::io::prelude::*;
5+
use colored::*;
6+
use app::client::*;
7+
use app::parser::*;
8+
9+
fn get_room(server_url: String) -> (String, String) {
10+
let client = Client::new(server_url);
11+
let e = get_list(&client.send("[1, 0]")).unwrap()[1].clone();
12+
let e = get_list(&e).unwrap();
13+
let a = get_list(&e[0]).unwrap();
14+
let d = get_list(&e[1]).unwrap();
15+
(a[1].to_string(), d[1].to_string())
16+
}
17+
18+
fn main() {
19+
let args: Vec<String> = std::env::args().collect();
20+
let server_url = args[1].clone();
21+
let client = Client::new(server_url);
22+
let e = get_list(&client.send("[1, 0]")).unwrap()[1].clone();
23+
let e = get_list(&e).unwrap();
24+
let a = get_list(&e[0]).unwrap();
25+
let d = get_list(&e[1]).unwrap();
26+
println!("{}", a[1]);
27+
println!("{}", d[1]);
28+
}

src/bin/tos1.rs

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
use app::client::*;
2+
// use std;
3+
use std::convert::*;
4+
use rand::Rng;
5+
6+
fn run() {
7+
let mut rng = rand::thread_rng();
8+
let server_url = std::env::args().nth(1).unwrap();
9+
let mut client = Client::new(server_url);
10+
if std::env::args().len() == 2 {
11+
client.send("[1, 0]");
12+
return;
13+
}
14+
let player_key = std::env::args().nth(2).unwrap();
15+
let mut resp = client.join(&player_key);
16+
let power = 32;
17+
let cool = 0;
18+
let life = 1;
19+
resp = client.start(resp.info.ability.potential - power * 4 - cool * 12 - life * 2, power, cool, life);
20+
21+
// let mut dx: i32 = std::env::var("DX").unwrap().parse().unwrap();
22+
// let dy: i32 = std::env::var("DY").unwrap().parse().unwrap();
23+
let mut dx = 0;
24+
let mut dy = 0;
25+
while resp.stage != 2 {
26+
let mut myship = None;
27+
for ship in resp.state.ships.iter() {
28+
if ship.role != resp.info.role {
29+
continue;
30+
}
31+
myship = Some(ship.clone());
32+
}
33+
let myship = myship.unwrap();
34+
35+
let mut commands = vec![];
36+
37+
{
38+
// anti gravity
39+
let (x, y) = myship.pos;
40+
// println!("{}, {}", x, y);
41+
// assert_eq!(myship.v, (0, 0));
42+
// println!("{:?}", myship.v);
43+
let (gx, gy) = gravity(x, y);
44+
// println!("{}, {}", gx, gy);
45+
commands.push(
46+
Command::Accelerate(myship.id, gravity(x, y))
47+
);
48+
}
49+
50+
let shoot_now = myship.heat -myship.status.cool + 16 <= myship.max_heat;
51+
if shoot_now {
52+
let fix = resp.info.role;
53+
// dx = rng.gen_range(0, 20) + fix;
54+
dx = rng.gen_range(32, 96) + fix;
55+
// dy = rng.gen_range(0, 20) + fix;
56+
dy = 0;
57+
let shoot_power = power;
58+
commands.push(Command::Shoot(1, (myship.pos.0 + dx, myship.pos.1 + dy), shoot_power, None));
59+
}
60+
61+
// !!!
62+
resp = client.command(&commands);
63+
// !!!
64+
65+
if shoot_now {
66+
// println!("{}", resp);
67+
println!("S H O O O O O O O T ! ! ! ! ! ! !");
68+
for ship in resp.state.ships.iter() {
69+
for cmd in ship.commands.iter() {
70+
match cmd {
71+
Command::Shoot(_, (x,y), p, Some((impact, four))) => {
72+
println!("_, x, y, power, impact, four");
73+
println!("[shoot], {}, {}, {}, {}, {}",
74+
x - ship.pos.0,y - ship.pos.1, p, impact, four);
75+
},
76+
_=> {},
77+
}
78+
}
79+
}
80+
}
81+
}
82+
}
83+
84+
fn main() {
85+
let _ = ::std::thread::Builder::new()
86+
.name("run".to_string())
87+
.stack_size(32 * 1024 * 1024)
88+
.spawn(run)
89+
.unwrap()
90+
.join();
91+
}
92+
93+
fn gravity(x: i32, y: i32) -> (i32, i32) {
94+
(
95+
if x.abs() >= y.abs() {
96+
if x < 0 {
97+
1
98+
} else {
99+
-1
100+
}
101+
} else { 0 },
102+
103+
if x.abs() <= y.abs() {
104+
if y < 0 {
105+
1
106+
} else {
107+
-1
108+
}
109+
} else { 0 },
110+
)
111+
}

0 commit comments

Comments
 (0)