Skip to content

Instantly share code, notes, and snippets.

View sifue's full-sized avatar

Soichiro Yoshimura sifue

View GitHub Profile
@sifue
sifue / Labyrinth.scala
Created April 7, 2013 17:07
迷路探索問題のScalaの実装例。現在の候補と、一歩進めた後の候補の2つのキューを操作しながら巡回する。
import scala.collection.mutable
case class Step(row:Int, column:Int, char:Char)
object Labyrinth {
private val n = 50 // 行
private val m = 50 // 列
private val labString =
""".S.#.##.####.##....#..#..#........................
|.#.#............##.#.###.#.###.##################.
@sifue
sifue / Donyoku.scala
Created April 19, 2013 16:15
貪欲法を使った区間スケジューリング問題の解答例 (実行時間:309msec)
import scala.collection.mutable
object Donyoku {
case class Work (start:Int, terminal:Int)
def main(args: Array[String]) {
val listStart = List(19, 34, 5, 39, 6, 17, 43, 13, 33, 6, 25, 10, 3, 32, 30, 25, 23, 20, 38, 31, 39, 10, 34, 47, 49, 37, 19, 28, 20, 17, 22, 20, 40, 0, 20, 6, 49, 46, 0, 23, 41, 13, 0, 14, 49, 41, 36, 46, 3, 28, 27, 29, 22, 37, 47, 16, 31, 14, 30, 27, 35, 49, 0, 44, 40, 49, 41, 1, 6, 39, 37, 4, 39, 10, 31, 3, 37, 18, 47, 13, 47, 33, 4, 0, 34, 36, 42, 17, 1, 38, 30, 35, 8, 5, 1, 4, 7, 17, 26, 35)
val listTerminal = List(34, 67, 39, 62, 32, 49, 50, 13, 43, 23, 25, 16, 48, 51, 37, 68, 46, 42, 51, 49, 76, 14, 79, 48, 87, 73, 54, 34, 65, 23, 44, 51, 49, 3, 41, 7, 86, 72, 25, 30, 63, 13, 39, 27, 88, 89, 57, 46, 31, 58, 61, 75, 34, 85, 93, 49, 54, 61, 56, 72, 54, 51, 6, 46, 50, 59, 73, 33, 31, 86, 61, 37, 81, 16, 64, 39, 85, 42, 57, 40, 62, 69, 28, 30, 38, 57, 66, 47, 36, 38, 35, 45, 30, 46, 45, 37, 16, 26, 42, 43)
val works = listStart.zip(listTerminal).map(t => Work(t._1, t._2
@sifue
sifue / DynamicPrograming.scala
Last active December 16, 2015 18:49
最長共通部分列問題 2つの文字列s1,s2...snとt1,t2...tmが与えられます。これら2つの共通部分列の長さの最大値を求めなさい。ただし、文字列s1,s2,...snの部分文字列とは、si1,si2...sim(i1<i2<...<im)と表すことのできる文字列のことを言います。 制約 1 ≦ n, m ≦ 1000
// S1...Si+1とT1...Ti+1に対する共通部分列は、
// ・Si+1=Tj+1の時、S1...SiとT1...Tiに対する共通部分列の後ろにSi+1をつなげたもの
// ・S1...Si+1とT1...Tiに対する共通部分列
// ・S1...SiとT1...Ti+1に対する共通部分列
//と漸化式を立てることができるのでそれを以下のように動的計画法の結果を保持する
//DPデーブルとして実装する
object DynamicPrograming {
def main(args: Array[String]) {
val s = "kgsbyshnthednsehtrgabjmnhnkafwwrnpsuxdbrmfggsgjdrfbcpjyshxdtirzzpytngmjwmfjtduftiwufmxmduxehmtkbureziurphzjzbwwayxuwaandywbneinkiyurhbtkmsbkmmnbjiriupxchtpbsefrnwbhhtxndbdpgdhkjmrtkafxaxziajwweczbsarjuukemchsrbusjnexwwrumsferygnuhkyiadrdrrzxzusxwfcazgmejintyjesfdbdewekepezmmtfwbuynwcustjmzwjxgcbcdxxrrkfpjygidaebatjnweyhryejgzmdmjhdpziucxdtxgcmjjdsjdkmhsdkperpfchcbsszimehtzacmdjpzusnunzcnmrejkjnhuhgmdwpcdnfgdzszrjyjibfkgagmadzkfhzmwesrkgcwruaynadizrngpdimbxhtkaiezhrkgxhdtdmjkptzprsxkbtuzfkpumxenwkminrdeaeftheamxcenzasjkabypgkgrytnyszeunszkcihuuyfcfacdxaepjknekfjeigcnhngufuxbtawtuyhrbehnbhxyfjgrgwywhzsgnptcmtmfkawjtnrybmuwgydrdhbjkgbufsaaeniyywyukmkwsbttprusuejceaupbsyywpwpehsduzngmxrepwabhpdgybhxfbyywxspzznsjfpbetgkfpyweyumrjijukhxb
@sifue
sifue / Expedition.scala
Created May 11, 2013 12:22
Expedition トラックで距離Lの道を移動します。はじめトラックにはガゾリンがP積まれています。このトラックは距離1走るとガソリンが1消費されます。途中でガソリンが0になってしまうとトラックは停止してしまい、移動に失敗してしまいます。途中にはN個ガソリンスタンドがあります。各ガソリンスタンドiは道のスタート地点から距離Aiの地点にあって、Biだけガソリンを補給することができます。トラックの燃料タンクの容量に制限はなく、いくらでもガソリンを補給することができます。トラックは移動を完了できるでしょうか?またそのその際、最小で何回のガソリンの補給が必要でしょうか?完了できる場合は最小の補給回数を、出きない場合は-1を出力して下さい。 制約 1 ≦ N ≦ 10000 1 ≦ L ≦ 1…
import scala.collection.mutable
object Expedition {
// ガソリンスタンドとゴールを同一視する
trait Spot {def position():Int; def gas:Int}
case class GasStand(position:Int, gas:Int) extends Spot
case class Goal(position:Int, gas:Int) extends Spot
object GasOrder extends Ordering[Spot] {
@sifue
sifue / union_find.php
Last active June 5, 2016 04:25
PHPによるUnionFind木の実装
<?php
/**
* Union-Find木におけるノードを表すクラス
*/
class Node
{
/**
* @var int 親のindex 自身が根の場合は自身のindexとなる
*/
private $parentIndex;
@sifue
sifue / FoodChain.scala
Last active December 17, 2015 17:39
食物連鎖 N匹の動物がいて、1,2,....,Nと番号がつけられています。動物はすべて3つの種類、A, B, Cのいずれかです。AはBを食べ、BはCを食べ、CはAを食べます。次の2種類の情報が番号にk個与えられます。 タイプ1 : xとyは同じ種類です。 タイプ2 : xはyを食べます。 これらは全て正しいとは限りません。以前に与えられた情報と矛盾する情報や、x, yが正しい番号(1, 2, ...., N)でないような正しくない情報が与えられる可能性があります。K個の情報のうち、そのような情報の個数を出力して下さい。そのような情報は捨てると考えます。 制約 1 ≦ N ≦ 50000 0 ≦ K ≦ 100000 入力 N = 100 K = 7 // 情報は次の7個 : (タイプ番…
import scala.collection.mutable
object FoodChain {
def main(args: Array[String]) {
/**
* 情報を定義する値オブジェクト
* @param infoType
* @param x
* @param y
@sifue
sifue / Roadblocks.scala
Created June 8, 2013 05:42
Roadblocks R本の道とN個の交差点がある街があります。道路は両方向に通行可能です。1番目の交差点からN番目の交差点への最短経路の長さを求めなさい。ただし、二番目の最短経路とは、最短経路よりも真に長いもののうちで最短のもののことを言います。同じ経路を複数回通っても構いません。 制約 1 ≦ N ≦ 5000 1 ≦ R ≦ 100000 入力 EDGEは(交差点1, 交差点2, 距離の形式で書かれる) N=4 R=4 EDGE= (1, 2, 100), (2, 3, 250), (2, 4,200), (3, 4,100)
import scala.collection.mutable
object Roadblocks {
case class Road(from:Int, to:Int, distance:Int)
case class Next(position:Int,totalDistance:Int)
def main(args: Array[String]) {
// val crossPointNumber = 4
// var edgeCount = 4
@sifue
sifue / file0.sh
Created July 1, 2013 03:10
Mac及び各種Linuxでruby-buildとrbenvをインストールしてruby環境を用意する ref: http://qiita.com/sifue/items/b7d252b18ebbae636fa9
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
cd ~/.rbenv/plugins/ruby-build
sudo ./install.sh
mkdir -p ~/local/src
mv ~/.rbenv/plugins/ruby-build ~/local/src
rm -rf ~/.rbenv
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc
@sifue
sifue / DateTimeTypeMapper.scala
Last active December 20, 2015 22:19
org.joda.time.DateTimeをScala Slick 1.0.x で利用するためのTypeMapper。内部的にTimestampに変換している。また、比較演算子等も利用できる。ただし、日付リテラルは、MySQLのDATETIMEを前提としたものになっている。
import scala.slick.lifted._
import java.util.Date
import org.joda.time.DateTime
import scala.slick.driver.{BasicDriver, BasicProfile}
import scala.slick.session.{PositionedResult, PositionedParameters}
import scala.language.implicitConversions
/**
* [[org.joda.time.DateTime]]を[[java.sql.Date]]にSlickにおいて暗黙変換して利用する
*
@sifue
sifue / file0.txt
Created September 3, 2013 05:45
root権限のないLinuxサーバーの/home下にzsh5.0.2とvim7.4をローカルインストールする ref: http://qiita.com/sifue/items/1dd6c01f9e3a333cf3f0
$ cd ~
$ mkdir -p ~/local/source
$ cd ~/local/source
$ wget "http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz"
$ tar xzvf ncurses-5.9.tar.gz
$ cd ncurses-5.9
$ ./configure --prefix=$HOME/local
$ make
$ make install
$ cd ..