2013/01/27

[SublimeText]Emmetで高速HTML/CSSコーディング HTML編

CSSセレクタのルールでHTMLを記述できるEmmetが凄い!

Sublime Text 2 を使い始めた理由の半分が
Emmet で高速 HTML/CSS コーディングしたかったからだ。
Emmet の凄さを見ればきっとあなたも使いたくなるだろう。
百聞は一見に如かずだ。
Emmet Documentationでその凄さを見てきてほしい。
Sublime Text 2 へのインストールは sergeche/emmet-sublime · GitHub から。
ここではHTML展開の基本をまとめたいと思う。

トリガー

タブまたはCtrl+Eで以下のような変換ができる。

HTMLの展開

要素名

タグ名を入力してトリガー発動するだけ。タグ名でなくてもタグっぽく展開する。

ネスト演算子

子: >
ul>li
<ul>
    <li></li>
</ul>
兄弟: +
div+div
<div></div>
<div></div>
親: ^
ul>li^div
<ul>
    <li></li>
</ul>
<div></div>
複数回も可能
div>ul>li^^div
<div>
    <ul>
        <li></li>
    </ul>
</div>
<div></div>
掛け算: *
ul>li*3
<ul>
    <li></li>
    <li></li>
    <li></li>
</ul>
グループ: ()
table>(tr>(th+td))*3
<table>
    <tr>
        <th></th>
        <td></td>
    </tr>
    <tr>
        <th></th>
        <td></td>
    </tr>
    <tr>
        <th></th>
        <td></td>
    </tr>
</table>

属性演算子

id と class
ul#nav>li.item
<ul id="nav">
    <li class="item"></li>
</ul>
複数クラスを指定することも可能
div.btn-group>button.btn.btn-primary*2
<div class="btn-group">
    <button class="btn btn-primary"></button>
    <button class="btn btn-primary"></button>
</div>
カスタム属性
img[src alt="プロフィール画像"]
<img src="" alt="プロフィール画像">
ナンバリング
ul>li.item$*3
<ul>
    <li class="item1"></li>
    <li class="item2"></li>
    <li class="item3"></li>
</ul>
ゼロパディングも設定可能
ul>li.item$$*3
<ul>
    <li class="item01"></li>
    <li class="item02"></li>
    <li class="item03"></li>
</ul>

テキスト: {}

{詳しくは}+a{こちら}+{。}
詳しくは<a href="">こちら</a>。
テキストは親を変更しない。それによって意図しない結果が展開されることがある。
span{詳しくは}+a{こちら}+{。}
<span>詳しくは</span><a href="">こちら</a>。
span タグの中に a タグを書きたい場合は以下のように書く。
span>{詳しくは}+a{こちら}+{。}
<span>詳しくは<a href="">こちら</a>。</span>

暗黙的なタグ名

タグ名を入力せずに展開するとその場所によってタグ名が自動的に指定される。
ブロック要素内: div
インライン要素内: span
ul, ol 要素内: li
table, thead, tbody, tfoot 要素内: tr
tr 要素内: td
select, optgroup 要素内: option

ダミーテキスト: Lorem Ipsum

ダミーテキストとして “Lorem Ipsum” generator を使用することができる。
lorem または lipsum
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Maxime quam dolor vitae blanditiis totam a nemo. Aperiam necessitatibus numquam cum eligendi molestias corporis sunt facere molestiae autem omnis magnam earum.
単語数を決めて展開することもできる。
lorem10
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Earum voluptas.
上記の暗黙的なタグ名解決を利用することができる。
ul>lorem2.item*2
<ul>
    <li class="item">Lorem ipsum.</li>
    <li class="item">Dolores ratione.</li>
</ul>

次回

次回はCSS編を予定。HTMLも凄いけどCSSも凄い!使いこなして高速コーディングしたい。
2013/01/23

SublimeText2でPHPファイルをビルド&Build Systemを使いこなす

SublimeText2でPHPを実行できると何かと便利だと思うので設定する。
PHPはインストール済みとする。
MacならPHPがインストールされていると思うので大丈夫だと思う。

参考: Build Systems — Sublime Text Unofficial Documentation

設定

Sublime Text 2 >Tools > Build System > New Build System... から
設定ファイルを新規作成して以下のJSONをコピペすると良い。
{
    "cmd": ["php", "$file"],
    "selector": "source.php"
}
$file が現在のファイルを指し示す。
selector で source.php と書いておくとPHPファイルで Tools > Build System > Automatic の際に
自動的にPHPと認識してビルドしてくれる。

ビルド

PHPファイルを開いて command + B でビルドできる。

標準入力の処理があるPHPファイルを実行する

競技プログラミングのテストケースをファイルとして持っておき、
それを実行したいPHPファイルにパイプで渡してCLI(Command Line Interface)で実行すれば
コードを書き換えることなく競技プログラミング用のテストが出来る。
{
    "cmd": ["cat $file_path/test.txt | php $file | diff - $file_path/answer.txt -u"],
    "selector": "source.php",
    "shell": true
}
$file_path は実行したファイルのディレクトリ。コマンドが急に俺のスキルを越えていったので解説。
  1. cat $file_path/test.txtでテストケースを標準出力に流しこむ
  2. パイプで標準入力として受け取りphp $fileで実行
  3. 結果の標準出力をパイプで受け取り、diff - $file_path/answer.txt -uで正誤チェック
標準入力とファイルの diff を取る場合は - を指定するらしい。オプションで diff 表示形式変更可能。
参考: UNIXの部屋 コマンド検索:diff (*BSD/Linux)

上のようにコマンドを区切っていたらどうにもエラーになるので
"shell": true にしてコマンドを全部いっぺんに渡している。

答えまで準備するのは面倒な場合は以下のように途中で渡すのをやめれば良い。
{
    "cmd": ["cat $file_path/test.txt | php $file"],
    "selector": "source.php",
    "shell": true
}
これでシームレスにコーディングと実行ができ、快適な競技プログラミングができるでしょう!

Build Systemを使いこなす

{
    "selector": "source.php",
    "variants": [
        {
            "cmd": ["php $file"],
            "name": "php build",
            "shell": true
        },
        {
            "cmd": ["cat $file_path/test.txt | php $file"],
            "name": "php run test case",
            "shell": true
        },
        {
            "cmd": ["cat $file_path/test.txt | php $file | diff - $file_path/answer.txt -u"],
            "name": "php check answer",
            "shell": true
        }
    ]
}
上で書いたコマンドを使い分けたい場合は1ファイルに"variants"に配列で指定すれば良い。
ここでは1階層目に"cmd"を記述しなかったので command + B を押しても何も起こらない。
コマンドパレットで Build: php build とか候補が出るようになるのでこちらで使い分けると良い。
2013/01/22

[SublimeText2]スニペットを作成する

SublimeText2のスニペットが使いたくなったので設定もそこそこに作成してみた。
参考: Sublime Text 2で自分用のスニペットを作る方法 | prime factor

Tools > New Snippet.. からでも作れるし(デフォルトで入力されているけど)、
普通に新規ファイル作成でも作ることができる。

構造

snippet: 以下の要素を入れる親要素。
content: スニペット展開後の内容。リテラルとしての $ は \$ にエスケープする必要がある。
tabTrigger: スニペットを呼び出す際の名前。
scope: よくわからないけど source.python と書いてあると python のソース内で有効になるらしい。
Scopes - Syntax Definitions — Sublime Text Unofficial Documentationによると
TextMate の Scope Selector をインスパイアしているらしい。
TextMate Manual » Scope Selectorsを読めば何かわかるかもしれない。
description: 入力補完リストに表示される説明。
<snippet>
    <content><![CDATA[]]></content>
    <tabTrigger></tabTrigger>
    <scope></scope>
    <description></description>
</snippet>
ちなみにスニペットにインデントを含む場合は常にタブを使えって書かれている。
タブなら設定の translateTabsToSpaces が true なら自動的にスペースに変換してくれるらしい。
が、自分はインデントはスペース派で、スニペットを誰かと共有する予定もないので無視してスペースで書いた。

拡張子

.sublime-snippetをつけて保存する。

保存場所

[Sublime Text 2]/Packages以下ならどこでもいいようだ。
わかりやすく [Sublime Text 2]/Packages/User の中に Snippets フォルダを作って
言語ごとにフォルダ作って管理しておくといいかもしれない。

[競技プログラミング][PHP][AtCoder]鉛筆リサイクルの新技術で作ってたスニペットを晒すとこんな感じ。
<snippet>
    <content><![CDATA[
function println(\$var, \$line = null){
    if(is_null(\$line)){
        echo \$var . PHP_EOL;
    }else{
        echo \$line . ':' . \$var . PHP_EOL;
    }
}
]]></content>
    <tabTrigger>f_println</tabTrigger>
    <scope>source.php</scope>
    <description>競技プログラミング用出力関数</description>
</snippet>
これでPHPのソース内で f_println を入力してタブを押すだけでこの関数が展開される。すごく便利。

少し不満な点はコードを選択して右クリックメニューとかショートカットキーとかで
シームレスにスニペットを作成できない点。(まだ使い始めで知らないだけかもしれないが…。)

スニペットのフォーマットを覚えるのが嫌だったので
スニペットのテンプレートを展開するスニペットを作ろうとしたけど展開しても空文字になって挫折した。
上の不満点もあるし、プラグインを作ってみたい。
2013/01/21

[SublimeText2]Bracket Highlighterで括弧を強調表示する

  • 括弧 (),[],<>,{} のカスタマイズ可能なハイライト
  • タグのカスタマイズ可能なハイライト
  • 引用符のカスタマイズ可能なハイライト
  • タグ、括弧、または引用符のマッチングの有効/無効の選択
  • 言語に基づくタグ、括弧、または引用符のホワイトリスト/ブラックリストマッチングの有効/無効の選択
  • ショートカットによって使われた歳のステータスバーにマッチング間の行数と文字カウントの表示
  • カッコの中身の最初と最後にカーソルを移動できるショートカット
  • カッコの中身を全選択するショートカット
  • 引用符のスタイルを変更するショートカット
  • マルチセレクトが動く
  • ブラケット関連プラグイン
  • カスタムガターアイコンが設定可能
  • 文字列の中の括弧をハイライト
  • 文字列括弧の括弧エスケープモードのトグル(regex|string)
  • 実験的なCFMLのサポート

使えそうなショートカットキー

Shift + command + B, Shift + command + B: タグ間の行数と文字数

Shift + command + B, Shift + command + J: 括弧の切り替え

Shift + command + B, Shift + command + W: 引用符の切り替え

Shift + command + B, Shift + command + [: 括弧内を折りたたみ

Shift + command + B, Shift + command + S: 括弧の内容を全選択

alt + up: 開始括弧にフォーカス alt + down: 終了括弧にフォーカス

設定のDIff

// Higlight brackets of tag only instead of entire tag
+    // metaタグなどの空要素タグの全体をハイライトするかどうか。読みにくいのでタグ部分のみにする。
-    "tag_brackets_only" : false,
+    "tag_brackets_only" : true,

     // Match brackets only when cursor is between the brackets
+    // 括弧の間にカーソルがあるときだけ括弧にマッチする。
+    // ハイライトでキャレットが内外どちらにいるかわからなくなるため内側の時のみハイライトする。
-    "match_brackets_only_when_between": false,
+    "match_brackets_only_when_between": true,
読みやすいし便利。
2013/01/20

[競技プログラミング][PHP][AtCoder]鉛筆リサイクルの新技術

A - 鉛筆リサイクルの新技術

時間制限 : 2sec / スタック制限 : 64MB / メモリ制限 : 256MB

問題文

世界的大手鉛筆会社のファイバーカステラ社が、
小さくなって使えなくなってしまった鉛筆を再利用する画期的な新技術を発明した。
この技術は小さくなった鉛筆 m 本から新しい鉛筆を n 本 (m > n) 作り出すものである。
ファイバーカステラ社が N 本の鉛筆を製造・販売し、その全てが使用されて回収され、
回収された使えなくなった鉛筆から新しい鉛筆を作る。
これらを販売し、やはり全てが使用後回収されて新たな鉛筆の原料となる。
これを繰り返した結果として、
ファイバーカステラ社が総計何本の鉛筆を販売できるか計算するプログラムを作成せよ。
再利用する際に、回収されたにもかかわらず新しい鉛筆の原料とされなかった鉛筆を保持しておき、
任意のタイミングで回収した鉛筆に加えても良い。
販売できる本数には、はじめの N 本も忘れずに加えること。
また、 N > m とし、m と n が互いに素であるとする。

入力

入力は以下の形式で標準入力から与えられる。 自然数 m 、 n 、 N がこの順に半角空白区切りで入力される。
m n N
1 行目には整数 m 、 n 、N が与えられる。
m は小さくなって使えなくなってしまった鉛筆の数である。
n はファイバーカステラ社が作り出す新しい鉛筆の本数である。
N はファイバーカステラ社が最初に販売する鉛筆の本数である。
(1 ≦ n < m < N ≦ 1,000) であり、m と n が互いに素であることは保証されている。

出力

ファイバーカステラ社が販売する鉛筆の総数を標準出力に 1 行で出力すること。
この数には使い終わった後に再度製造された鉛筆も含まれる。
また、出力の最後には改行をいれること。

出典

A: 鉛筆リサイクルの新技術 - AtCoder Regular Contest #011 | AtCoder

回答

AtCoder/arc011_1.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, "%d %d %d", $consume, $create, $number);
$total = $number;
$rest = 0;
while($number >= $consume){
    $rest = $number % $consume;
    $number = (int)($number/ $consume) * $create;
    $total += $number;
    $number += $rest;
}
println($total);
function println($var, $line = null){
    if(is_null($line)){
        echo $var . PHP_EOL;
    }else{
        echo $line . ':' . $var . PHP_EOL;
    }
}
?>
A問題くらい飲みながらでも解けるだろーとか思ってたら
いつものA問題よりちょっと難しくてヤベってなった。
シャキッとして出力例2の解説を読みつつ組んだ。
途中で競技プログラミング用に結果出力とデバッグ出力を兼ねた関数を作り始めて、
SublimeText2 のスニペット登録してたら時間終わってた。
2013/01/19

[PHP]DateTimeオブジェクトをforeach文で回せるDatePeriodクラス

[競技プログラミング][PHP][AtCoder]超大型連休 | DevAchieveDateTimeオブジェクトを
for 文で日付を回そうと思ったのだけど、以下のようにとんでもないことになってしまった。
<?php
for(
    $date = DateTime::createFromFormat('Y/m/d', '2012/01/01', new DateTimeZone('Asia/Tokyo')),
    $end = DateTime::createFromFormat('Y/m/d', '2012/12/31', new DateTimeZone('Asia/Tokyo'));
    $date->diff($end)->format('%R') === '+';
    $date->add(new DateInterval('P1D'))
){
    // 2012/01/01 から 2012/12/31 まで1日毎に日付を回すfot文
}
これはいくらなんでも微妙すぎだと思っていたんだけど、その後DatePeriodクラスというものを知った。
期間を設定してやれば foreach 文で日付を回せるらしい。百聞は一見に如かず。
<?php
$start = DateTime::createFromFormat('Y/m/d', '2012/01/01', new DateTimeZone('Asia/Tokyo'));
$end = clone $start; // clone でオブジェクトを複製
$end->add(new DateInterval('P1Y'));
$period = new DatePeriod($start, new DateInterval('P1D'), $end);
foreach($period as $date){
    // 2012/01/01 から 2012/12/31 まで1日毎に日付を回すfoteach文
}
とってもスッキリして読みやすくなりました。
しかし地味にバグがあって、終了日の時刻が"00:00:00"だと終了日がイテレーションに含まれないらしいです。
バグレポートはされていてオプションで対応するみたいですが、まだ使えないみたいです。
参考: DatePeriod::INCLUDE_END_DATE - ゆっくり*ゆっくり

そのため上記の例では1日毎に日付を回すので+1の 2013/01/01 ということで 1年足しました。
さりげなく DateTime::createFromFormat では作らずに clone でオブジェクトを複製しました。
PHP: オブジェクトのクローン作成 - Manual
細かい説明は抜きに下のコードをhttp://codepad.viper-7.com/で試してみてください。
<?php
$date = DateTime::createFromFormat('Y/m/d', '2012/01/01', new DateTimeZone('Asia/Tokyo'));
$copy = $date;
$copy->add(new DateInterval('P1Y'));
echo $date->format('Y/m/d'); // 2013/01/01
echo $copy->format('Y/m/d'); // 2013/01/01

$date = DateTime::createFromFormat('Y/m/d', '2012/01/01', new DateTimeZone('Asia/Tokyo'));
$copy = clone $date;
$copy->add(new DateInterval('P1Y'));
echo $date->format('Y/m/d'); // 2012/01/01
echo $copy->format('Y/m/d'); // 2013/01/01
clone を使わないと $copy の変更で $date も変更されてしまっていたでしょう?
つまりそういうことです。

ということで、ちょっと脱線してしまったけど DatePeriod クラスの使い方はこれでおしまい。
綺麗にforeach 文が書けてチョーイイネ!サイコー!
2013/01/13

[Sublime Text 2]Sublime Package Controlをインストールする

Sublime Text 2はパッケージと呼ばれるプラグインをインストールすることで
カスタマイズすることが可能なのだが、
そのパッケージを簡単に検索、インストール、アップデート、アンインストールできる
Sublime Package Control というものがある。
Sublime Package Control – a Sublime Text 2 Package Manager by wbond

たくさんのパッケージをインストールすると
管理できなくなりそうなので最初に入れておきたい。

インストール方法

Sublime Text 2を起動し、Ctrl+Shift+@でコンソールを出して
Installation – Sublime Package Control – a Sublime Text 2 Package Manager by wbondにある
コードを貼り付けて実行するだけ。最後に再起動が必要。

使い方

Usage – Sublime Package Control – a Sublime Text 2 Package Manager by wbond
Sublime Text 2でCommand+Shift+pでコマンドパレットを開くことができるので
Package Control:とか打つとできる事がわかる。

Package Control: Install Package

コマンドパレットで実行するとPackage Control経由でインストールできるパッケージが表示される。
選択してエンターを押せば再起動せずにインストールが出来る。

Package Control: Remove Package

コマンドパレットで実行するとインストールされているパッケージが表示される。
選択してエンターを押せば簡単にアンインストールできる。

他の使い方は適宜使用したら追記予定。
2013/01/12

ターミナルからSublime Text 2を起動するための設定

僕は zsh を使用しているので違うシェルの人は読み替えてください。
vi ~/.zshrc
alias st="/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl"
source ~/.zshrc

これで、あんまりないかもしれないけど
ターミナルからSublime Text 2で開きたい時のためにエイリアスの設定ができたので
st hoge.txtとか打てばSublime Text 2が起動して編集できる。
起動が軽快で素晴らしい。
2013/01/11

Sublime Text 2の設定をDropboxで共有する

Sublime Text 2は個人で複数台のPCにインストールして利用することが
許可されているので(Sublime Text 2 - Sales FAQ)
複数台のPCにインストールしようと思うが、設定は共通にしておきたい。
Sublime Text 2によるストレスフリーな開発環境 | ntcncp.netを参考に
設定を共通化してみようと思う。
環境は両方ともMacなのでWindowsの人はできるか知らないけど読み替えてください。

設定をDropboxに移行

ターミナルで以下のコマンドを実行する。
mkdir ~/Dropbox/Settings/
まずはDropboxフォルダに設定を入れるフォルダを作成する。
mv ~/Library/Application\ Support/Sublime\ Text\ 2/ ~/Dropbox/Settings/
上記のフォルダにSublime Text 2の設定などが入ったフォルダを丸ごと移動する。
ln -s ~/Dropbox/Settings/Sublime\ Text\ 2/ ~/Library/Application\ Support/Sublime\ Text\ 2
Dropboxに移した設定などのファイルにシンボリックリンクを張り、
Sublime Text 2が設定などを参照してもDropboxに置いた設定などを読めるようにする。

元に戻したかったら以下のコマンドでシンボリックリンクを削除して
rm -rf ~/Library/Application\ Support/Sublime\ Text\ 2
以下のコマンドで元の場所に戻せば良い(はず)。
mv ~/Dropbox/Settings/Sublime\ Text\ 2/ ~/Library/Application\ Support/Sublime\ Text\ 2/

他のMacでDropboxの設定を反映

他のMacでSublime Text 2をインストールしたら以下のコマンドで既存の設定などのファイルを削除する。
rm -rf ~/Library/Application\ Support/Sublime\ Text\ 2/
-rf をつけると Sublime Text 2以下のフォルダにあるファイルを再帰的に削除してくれる。
ln -s ~/Dropbox/Settings/Sublime\ Text\ 2/ ~/Library/Application\ Support/Sublime\ Text\ 2
Dropboxに置いてある設定などのファイルからシンボリックリンクを張れば
他のMacでもDropboxに置いてある設定などのファイルを参照してくれる。

これで複数台のMacで設定を一本化できるのでやっておいて損はない。
2013/01/10

[競技プログラミング][PHP][AtCoder]超大型連休

B - 超大型連休

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

2011 年、AtCoder 国の高橋首相はある重大な決定を行った。
その決定とは...法改正である。国民の祝日に関する法律を変更し、休日を増やすことにした!!
国民の創造性を尊重するその決定が、霞が関を魔境へと変えたッ!

あなたは霞が関の国土交通省に勤務する職員であり、この法改正により上司から新たな任務を与えられた。
その任務とは、2012 年の「連休の最大日数」を計算することである。
連休の大きさを事前に計算することで国民の行動を予想し、
高速道路の部分的な値下げを行い、経済を活性させるためだ。
したがって、あなたに失敗することは許されない。国民の行動を正確に予想できなくなるからだ。

以下に、「連休」の定義と諸注意を記す。
AtCoder 国が使用する暦はグレゴリオ暦に従う。
「連休」とは、「休日」が連続して続くことである。
「土曜日」「日曜日」「祝日」「振替休日」が「休日」に相当する。
「祝日」が他の休日と同じ日に指定されていた場合、「振替休日」を必ず設置する。
「振替休日」は祝日の時系列順に決定していき、その祝日以降最も近い平日(休日を除いた日)となる。
2012 年 1 月 1 日は日曜日である。

入力

入力は以下の形式で標準入力から与えられる。
N
m1/d1
m2/d2
:
:
mn/dn
1 行目には祝日の日数を表す整数 N が与えられ、 0≦N≦366 を満たす。
2 行目から N+1 行目までの N 行で祝日の日付が与えられる。
mi は i(1≦i≦366) 番目に与えられる祝日の月で、 1≦mi≦12 を満たす。
di は i(1≦i≦366) 番目に与えられる祝日の日で、
mi=2 のとき、 1≦di≦29 を満たす。
mi=(4,6,9,11) のとき、 1≦di≦30 を満たす。
mi=(1,3,5,7,8,10,12) のとき、 1≦di≦31 を満たす。
mi と di はともに整数である。
mi と di は必ず/で区切られて与えられる。
祝日は時系列順に与えられるとは限らないことに注意せよ。
ただし、同じ日付が複数与えられないことは保証されている。

出力

法改正後における 2012 年の連休の最大日数を出力せよ。
出力は標準出力におこない、末尾には改行をいれること。

出典

B: 超大型連休 - AtCoder Regular Contest #010 | AtCoder

回答

Submission #65857 - AtCoder Regular Contest #010 | AtCoder
AtCoder/arc010_2.php at master · wada811/AtCoder · GitHub
<?php
// 土日の設定
$holidays = array();
for(
    $date = DateTime::createFromFormat('Y/m/d', '2012/01/01', new DateTimeZone('Asia/Tokyo')),
    $end = DateTime::createFromFormat('Y/m/d', '2012/12/31', new DateTimeZone('Asia/Tokyo'));
    $date->diff($end)->format('%R') === '+';
    $date->add(new DateInterval('P1D'))
){
    if($date->format('w') === '0' || $date->format('w') === '6'){
        $holidays[$date->format('Y/m/d')] = true;
    }else{
        $holidays[$date->format('Y/m/d')] = false;
    }
}
// 祝日の取得・設定
fscanf(STDIN, "%d", $n);
for($i = 0; $i < $n; $i++){
    fscanf(STDIN, "%d/%d", $month, $day);
    $date = DateTime::createFromFormat('Y/m/d', "2012/{$month}/{$day}", new DateTimeZone('Asia/Tokyo'));
    // 振替休日の設定
    while($holidays[$date->format('Y/m/d')]){
        $date->add(new DateInterval('P1D'));
    }
    $holidays[$date->format('Y/m/d')] = true;
}
// 最大連休日数の取得
$max = 0;
$count = 0;
foreach($holidays as $holiday){
    if($holiday){
        $count++;
    }else{
        $count = 0;
    }
    $max = $count > $max ? $count : $max;
}
echo $max . PHP_EOL;
?>
通らなかったコード。
AtCoderの回答を見るとわかるのだが一部の問題は何故か通らない。
サンプルなどは通ってしまって何が行けないのか全くわからなくなってしまった。
それにしてもfor文の初期化部でDateTime型の変数を宣言するというのはまぁ酷い。
そしてこれは解決しなそうな感じがする。
誰かわかったらコメントお願いします。
2013/01/09

[競技プログラミング][PHP][AtCoder]名刺交換

A - 名刺交換

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

青木君は就職活動をおこなっている大学生で、名刺を N 枚持っています。
これから M 日間の就職活動を予定しており、 i 日目には名刺を ci 枚消費することがわかっています。
就職活動を行うにあたり、名刺が足りなくなると非常に困ります。
そこで、青木君はそれぞれの日のはじめに名刺の所持枚数を確認し、
A 枚以下ならば B 枚名刺を補充することにしました。
B 枚補充しても A 枚以下にしかならないような場合でも、それ以上の補充はできません。

最初から持っている N 枚とこのような補充で、就職活動の最後の日まで乗りきれるかどうか判定してください。
もし、足りなくなる場合は、その日付を青木君に教えてあげてください。

入力

入力は以下の形式で標準入力から与えられる。
N M A B
c1
c2
:
:
cM
1 行目に N , M , A , B が半角スペースで区切られて与えられる。
N は持っている名刺の枚数で 1≦N≦1,000 を満たす。
M は就職活動の日数で 0≦M≦100 を満たす。
A は名刺を補充するタイミングの枚数を示す数で 0≦A≦1,000 を満たす。
B は補充する名刺の枚数で 0≦B≦1,000 を満たす。
N , M , A , B は全て整数である。
2 行目から M+1 行目までの M 行間で、名刺を配る枚数がそれぞれ与えられる。
ci は i(1≦i≦M) 日目に配る名刺の枚数を表す整数で 0≦ci≦1,000 を満たす。

出力

就職活動の最後の日まで乗り切ることができればcompleteと出力すること。
もし、名刺を配りきってしまった場合は、足りなくなった日の日付を出力すること。
出力は標準出力におこない、末尾には改行をいれること。

出典

A: 名刺交換 - AtCoder Regular Contest #010 | AtCoder

回答

AtCoder/arc010_1.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, "%d %d %d %d", $num, $days, $limit, $purchase);
for($i = 1; $i <= $days; $i++){
    $distribute = trim(fgets(STDIN));
    if($limit >= $num){
        $num += $purchase;
    }
    if($num >= $distribute){
        $num -= $distribute;
    }else{
        echo $i . PHP_EOL;
        exit();
    }
}
echo 'complete' . PHP_EOL;
?>
補充チェックして配布チェックして出力するだけの簡単な問題。
2013/01/08

2012年の反省と2013年の目標

あけましておめでとうございます。
2012/01/08に始まったこのブログも
1周年を迎えました。
おかげ様でこのブログのアクセスも
順調に増えて行きました。
12月にこの記事で話題になり
大きくアクセスも伸びました。
昔からの人も最近からの人も
2012年、お世話になりました!
2012年のエンジニア人生を振り返って
2013年の目標を立ててみようと思います。

2012年

Excel VBAを学んだ
マクロ組めれば普通だったら便利屋さんになれる。ちょっと触るくらいならいい。もうあんまりやりたくない。
Objective-Cを学んだ
iPhoneアプリを作ろうということでガッツリやったり。これで一応iPhone/Androidできるようになった。
PHPを学んだ
なんでもアリな感じでヒャッハーって感じですね。なんでもアリすぎて他人のコードを受け付けなくなりそうな感じ。
SQLを学んだ
SQLマジアツい。楽しい。いろんなクエリ組んでて一通りできるようになったと思う。たぶん。

生産性の向上
NetBeans触ってて使い勝手悪くて微妙な感じなので環境を見直して効率を上げたい。
UnitTestを学べなかった
UnitTestできて一人前よねーみたいな風潮があったからできるようになりたかったけど結局触れれず。

2013年

生産性の向上
Sublime Text 2をカスタマイズして開発スピードを上げたい。
巳年なのでPythonを学ぶ?
Sublime Text 2のプラグインはPythonで書くのでPythonを学んで(出来れば3系だけがいいなー)
プラグイン作って生産性の向上を果たすかもしれない。
新しい言語を学ぶ
上のPythonも含めて毎年なにか一つ新しいプログラミング言語を学びたい。
UnitTestを学ぶ
他にも学ぶべきことがいっぱいあってプライオリティ下がり気味で後回しになりがちだけど今年中には…!
CI(継続的インテグレーション)を学ぶ
Jenkins氏と友だちになりたい。ちょこちょこ調べて導入していきたい。
個人でのプロダクトを出す
iPhone/Androidアプリ、Webサービスなんでもいいから一つくらい個人のプロダクトを出したい。
収入を増やす
応用情報技術者を取るなり、生産性を上げてプラスアルファの働きをしてバリューを生み出すなりしよう。
そういえば思い出したけどヘッドハンティングのメール来てたし、転職という手もあるかもしれない。
個人プロダクトで稼ぐでもいいし、ネット上で何らかの方法で稼ぐでもいい。
個人の時代と言われるこの時代を一人でも生き抜くことができる、稼ぐことができるような力が欲しい。

2013年もよろしくお願いします!

さらなる飛躍の年にするべく頑張ります!

タグ(RSS)