1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | package main import ( "fmt" ) func maxVolume(a []int) int { left := 0 right := len(a) - 1 volume := 0 total := 0 for left != right { if a[left] <= a[right] { for i := left + 1; i < len(a); i++ { if a[left] > a[i] { volume += a[left] - a[i] } else { left = i total += volume volume = 0 break } } } else { for i := right - 1; i >= left; i-- { if a[right] > a[i] { volume += a[right] - a[i] } else { right = i total += volume volume = 0 break } } } } return total } func main() { fmt.Println(maxVolume([]int{2, 5, 1, 2, 3, 4, 7, 7, 6}) == 10) fmt.Println(maxVolume([]int{2, 5, 1, 3, 1, 2, 1, 7, 7, 6}) == 17) fmt.Println(maxVolume([]int{2, 3, 1, 2, 3, 1, 3}) == 5) fmt.Println(maxVolume([]int{1, 2, 3, 4, 5, 6, 7, 8, 9}) == 0) fmt.Println(maxVolume([]int{9, 8, 7, 6, 5, 4, 3, 2, 1}) == 0) fmt.Println(maxVolume([]int{1, 1, 1, 1, 1}) == 0) fmt.Println(maxVolume([]int{1, 0, 1}) == 1) fmt.Println(maxVolume([]int{5, 0, 5}) == 5) fmt.Println(maxVolume([]int{5, 0, 4}) == 4) fmt.Println(maxVolume([]int{4, 0, 5}) == 4) fmt.Println(maxVolume([]int{4, 0, 5, 0, 2}) == 6) fmt.Println(maxVolume([]int{0, 1, 0, 1, 0}) == 1) fmt.Println(maxVolume([]int{0, 1, 0, 0, 1, 0}) == 2) fmt.Println(maxVolume([]int{4, 2, 2, 1, 1, 1, 3}) == 8) fmt.Println(maxVolume([]int{0, 3, 2, 1, 4}) == 3) fmt.Println(maxVolume([]int{1, 0, 1, 0}) == 1) fmt.Println(maxVolume([]int{1, 0, 1, 2, 0, 2}) == 3) fmt.Println(maxVolume([]int{2, 5, 1, 2, 3, 4, 7, 7, 6}) == 10) fmt.Println(maxVolume([]int{5, 1, 0, 1}) == 1) fmt.Println(maxVolume([]int{2, 5, 1, 2, 3, 4, 7, 7, 6, 3, 5}) == 12) fmt.Println(maxVolume([]int{3, 0, 1, 0, 2}) == 5) } |
Thursday, October 31, 2013
How to Solve Max Volume Problem
My solution for max volume problem.
How to Solve Spiral Problem
My solution for spiral problem.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | package main import ( "fmt" ) func spiral(height, width, row, col int) []int { a := createSlice(height, width) result := []int{} r := row - 1 c := col - 1 result = append(result, a[r][c]) x := 1 for z := 0; (height * width) != len(result); z++ { for i := 0; i < x; i++ { r, c = up(r, c) if !outOfBoundary(height, width, r, c) { result = append(result, a[r][c]) } } for i := 0; i < x; i++ { r, c = left(r, c) if !outOfBoundary(height, width, r, c) { result = append(result, a[r][c]) } } x += 1 for i := 0; i < x; i++ { r, c = down(r, c) if !outOfBoundary(height, width, r, c) { result = append(result, a[r][c]) } } for i := 0; i < x; i++ { r, c = right(r, c) if !outOfBoundary(height, width, r, c) { result = append(result, a[r][c]) } } x += 1 } return result } func outOfBoundary(height, width, row, col int) bool { return !((row >= 0 && row < height) && (col >= 0 && col < width)) } func left(row, col int) (int, int) { return row, col - 1 } func right(row, col int) (int, int) { return row, col + 1 } func up(row, col int) (int, int) { return row - 1, col } func down(row, col int) (int, int) { return row + 1, col } func createSlice(height, width int) [][]int { a := make([][]int, height) n := 1 for i := 0; i < height; i++ { a[i] = make([]int, width) for j := 0; j < width; j++ { a[i][j] = n n += 1 } } return a } func main() { fmt.Println(spiral(5, 5, 3, 3)) fmt.Println(spiral(2, 4, 1, 2)) fmt.Println(spiral(5, 5, 4, 2)) } |
Sunday, October 27, 2013
How to Call C++ from Go
. └── src └── cgotest ├── hello │ ├── cpp │ │ └── hellocpp.cpp │ ├── hello.go │ ├── include │ │ └── hellocpp.h │ └── lib │ └── libhellocpp.so └── main.gohellocpp.h
1 2 3 4 5 6 7 8 9 10 11 12 | #ifndef _HELLOCPP_H_ #define _HELLOCPP_H_ #ifdef __cplusplus extern "C" { #endif void SayHello(); #ifdef __cplusplus } #endif #endif |
1 2 3 4 5 6 7 | #include <iostream> #include "hellocpp.h" using namespace std; void SayHello() { cout << "Hello from C++" << endl; } |
cd $GOPATH/src/cgotest/hello mkdir lib g++ -Wall -shared -fpic cpp/hellocpp.cpp -Iinclude -o lib/hellocpp.sohello.go
1 2 3 4 5 6 7 8 9 10 | package hello // #cgo CFLAGS: -Iinclude // #cgo LDFLAGS: -Llib -lhellocpp // #include "hellocpp.h" import "C" func HelloFromCpp() { C.SayHello() } |
1 2 3 4 5 6 7 | package main import "cgotest/hello" func main() { hello.HelloFromCpp() } |
cd $GOPATH export LIBRARY_PATH=$GOPATH/src/cgotest/hello/lib export LD_LIBRARY_PATH=$LIBRARY_PATH go build cgotest ./cgotestOutput:
Hello from C++
Wednesday, October 23, 2013
How to Create a Self-Extracting Installer in Bash
The basic idea of creating a self-extracting installer in Bash is really straightforward. We just need to append the binary package, e.g. an archive file in our installer script.
Here's a simple example on how to do that.
- Create an installer script
- Append an archive file into an installer script
- Give an executable permission
- Execute the installer script
1 2 3 4 5 6 7 8 9 10 11 | #!/bin/bash echo "Running self-extracting installer" ARCHIVE=` awk '/^__START_HERE__/ {print NR + 1; exit 0; }' $0` echo $ARCHIVE tail -n+$ARCHIVE $0 | tar xzv exit 0 __START_HERE__ |
cat myproject.tar.gz >> installer
chmod +x installer
./installer
Tuesday, October 15, 2013
How to Programmatically Download Dependencies using Ivy
Below is an example how to programmatically download dependencies using Ivy.
1 2 3 4 5 6 7 8 9 10 11 | apply plugin: "java" apply plugin: "eclipse" repositories { mavenCentral() } dependencies { compile "org.apache.ivy:ivy:2.3.0" testCompile "junit:junit:4.10" } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import java.util.ArrayList; import java.util.List; import org.apache.ivy.Main; public class Test { public static void main(String[] args) throws Exception { List<String> list = new ArrayList<>(); list.add( "-settings" ); list.add( "ivysettings.xml" ); list.add( "-dependency" ); list.add( "testgroup" ); list.add( "testartifact" ); list.add( "1.0.0" ); list.add( "-retrieve" ); list.add( "lib/[artifact]-[revision].[ext]" ); String[] newArgs = new String[list.size()]; Main.main(list.toArray(newArgs)); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | < ivysettings > < settings defaultResolver = "myResolver" /> < property name = "ivy.checksums" value = "" /> < include url = "${ivy.default.settings.dir}/ivysettings-public.xml" /> < include url = "${ivy.default.settings.dir}/ivysettings-shared.xml" /> < include url = "${ivy.default.settings.dir}/ivysettings-local.xml" /> < include url = "${ivy.default.settings.dir}/ivysettings-main-chain.xml" /> < include url = "${ivy.default.settings.dir}/ivysettings-default-chain.xml" /> < resolvers > < url name = "testivy" > < artifact pattern = "http://myivyserver/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" /> </ url > < chain name = "myResolver" > < resolver ref = "default" /> < resolver ref = "testivy" /> < resolver ref = "testmaven" /> </ chain > </ resolvers > </ ivysettings > |
Subscribe to:
Posts (Atom)