echo

anarchy golf - echo

入力をそのまま出力へ受け流す、というもの。
最近Scalaでゴルフってると、入力の受け取り方を整理したいなと思うことが多かったので、しばらくはこのあたりのシンプルなのをこなしていこうと思う。


あなごるで標準入力から値を取得する場合によく使われるのが、readLine と io.Source.stdin (だと思う。他にいい方法あったら教えてください!)
まだゴルフ初心者だけど、なんとなく両者にもってるイメージというかを書いてみる。

  • readLine: String (8 bytes)
    • 1行ごとに文字列を取得して処理できる。取得結果の文字列からは行末の改行コードは省かれる。
    • while(0<1)ループや再起と一緒に使用して繰り返し処理を行い、例外で処理を止める(いいのかw)というパターンが多い。
    • よって、無限ループで使用する場合、入力がとぎれたところで例外を飛ばすようになっていないと処理が終わらずタイムアウトする。
    • 8 bytes なので短い。
  • io.Source.stdin: BufferedSource (15 bytes)
    • 全入力が一度にとれる。
    • 15 bytes なので若干長い。
    • io.Source.stdin.mkString で全入力を1つの文字列としてげっつ。でも長い。
    • io.Source.stdin.getLines で行ごとのイテレータげっつ。でも長(ry
    • BufferedSource をうまく使えるといろいろできるかも?


とかとか。


前置きが長くなったけども、今回の問題 echo
入力をそのまま出せばいいなら、

while(0<1)println(readLine)


でいいんじゃないの?と思ったが、これだと↑の方でも書いたけども、ループが終わらずタイムアウトになる。


じゃあio.Source.stdin 使うか、と書いたのが次。
全文字列を1回でprint。

  • 31bytes

print(io.Source.stdin.mkString)


mkStringそもそも使わなくてもいんじゃね、というのが次。
foreachで回して1文字ずつprint。

  • 30bytes

io.Source.stdin.foreach(print)


これ以上どうすれば、でもTOPは27bytesだしな・・・としばらく悩んだ後に出たのが次。
.rで正規表現オブジェクトにすることで、入力がなくなったら例外が投げられて処理が終わるように!

  • 29bytes

while(0<1)println(readLine.r)


とりあえず現状29bytesが精一杯。
TOPとは2bytes差。
ゴルフはやりだすと夢中になってしまい、時間がマッハで過ぎていくので、そこそこで自制しないと危ないw

モテるぷよぷよ系女子力を磨くための4つの心得

元ネタ : モテる女子力を磨くための4つの心得「オムライスを食べられない女をアピールせよ」等 | Pouch[ポーチ]


1. あえて2〜3世代前のカエル積みを対戦会で使用する
あえて2〜3世代前のカエル積みを使うようにしましょう。そして対戦会の場で好みの男がいたら乱入して、わざとらしくカエル積みをしてみましょう。そして「あ〜ん! この積み方本当にマジでチョームカつくんですけどぉぉお〜!」と言って、男に「どうしたの?」と言わせましょう。言わせたらもう大成功。「積み方とか詳しくなくてぇ〜! ずっとコレ使ってるんですけどぉ〜! 使いにくいんですぅ〜! ぷんぷくり〜ん(怒)」と言いましょう。だいたいの男は新しい定型を組みたがる習性があるので、古かったとしても1世代前の階段積み*1を使っているはずです。


そこで男が「新しい積み方にしないの?」と言ってくるはず(言ってこない土台レパートリーの少ない男はその時点でガン無視OK)。そう言われたらあなたは「なんかなんかぁ〜! 最近フキゲンGTRが人気なんでしょー!? あれってどうなんですかぁ? 新しい土台身につけたいんですけどわかんなぁぁああい!! 私かわいそーなコ★」と返します。すると男は「GTRでしょ? フキゲンGTRはまだフキゲンだよ。本当に良くわからないみたいだね。どんなのが組みたいの?」という話になって、次の休みの日にふたりでミカド対戦台レンタルのデートに行けるというわけです。あなたの女子力が高ければ、男が筺体買ってくれるかも!?


2. 土台で><を使うとモテる
「キャー!」とか「悲しい!」などを表現する「><」を土台に入れると、ぷよ対戦会の男性ユーザーは「なんかこの子カワイイなぁ」や「リバシかも」と思ってくれます。AC対戦台上では現実世界よりもイメージが増幅されて相手に伝わるので 土台に 「><」 を多用することによって、男性はあなたをフィーリング連鎖勢で女の子らしいと勘違いしてくれるのです。そういう土台にするとほぼ絶対にワンクレジット分のプレイ*2が終了しますが気にしないようにしましょう。


3. とりあえず男には「えー! なにそれ!?  知りたい知りたーい♪」と言っておく
対戦会などで男が女性に話すことといえばセカンド技術や連鎖尾の話ばかり。よって、女性にとってどうでもいい話ばかりです。でもそこで適当に「へぇーそうなんですかぁ〜?」とか「よくわかんないですけどすごいんですねぇ」と返してしまうと、さすがの男も「この女、斉藤スペシャルもわからないのか、ダメだな」と気がついてしまいます。ダメ女だとバレたら終わりです。そこは無意味にテンションをあげて、「えー! なにそれ!?  知りたい知りたーい♪」と言っておくのが正解。たとえ興味がない話題でも、テンションと積極性でその場を乗り切りましょう。積極的に話を聞いてくれる女性に男は弱いのです。

いろいろと話を聞いたあと、「サガットスペシャルは定型2列潜り込み連鎖尾で、デアリスは定型3列潜り込み連鎖尾なんですね! 覚えたぞぉ! メモメモ!」*3とコメントすればパーフェクト。続けてDSでとこぷよを始めて、ぷよをくるくる回しつつ「キュンキュンキュン! キュンキュンキュン!」と言って、「どうしたの?」と男に言わせるのもアリ。そこで「私の13段目にタッタカタしているのでありますっ☆」*4と言えば女子力アップ! そこでまた男は「この子おもしろくてカワイイかも!?」と思ってくれます。私は連鎖力も凝視力もありませんし速攻厨ですが、こういうテクニックを使えば知識がない私のようなバカ女のほうがモテたりするのです。男は優越感に浸りたいですからね。


4. 対戦では大連鎖を発火できない女をアピールせよ
男と対戦台に座ったら、真っ先に大連鎖を組んで「あーん! 私これ発火できないんですよねぇ〜(悲)」と言いましょう。するとほぼ100パーセント「どうして? 暴発しちゃったの?」と聞かれるので、「暴発はしてないし発火色はツモったし打ちたいけど打てないんですっ><」と返答しましょう。ここでまた100パーセント「発火色きてるのにどうして発火できないの?」と聞かれるので、うつむいて3〜5秒ほど間をおいてからボソッとこう言います。「……だって、……だって、後打ちで本線打ったらおじゃまぷよが相殺されちゃうじゃないですかぁっ! おじゃまぷよかわいそうですぅ! まだ降ってきてもないのにぃぃ〜(悲)。プレイヤーをばたんきゅ〜すらできないんですよ……」と身を震わせて言うのです。

その瞬間、あなたの女子力がアップします。きっと男は「なんて優しいスケルトン-Tのようなコなんだろう! 絶対にゲットしてやるぞ! コイツは俺の女にして、毎日MDぷよ通*5で100先*6だ!」と心のなかで誓い、あなたに惚れ込むはずです。意中の男と付き合うことになったら、そんなことは忘れて好きなだけ本線を打って大丈夫です。「大連鎖打てないんじゃなかったっけ?」と言われたら「大丈夫になった」とか「慣れた」、「先打ち5万*7で満足してる男キモイ」と言っておけばOKです。

*1:誤解のないように行っておくと、階段積みは決して弱くありません。連鎖力は高いです。

*2:だいたい50円で2本先取

*3:http://blog.livedoor.jp/tom109/archives/51805740.html

*4:ぷよぷよのフィールドとして見えるのは12段だが、画面外の見えない13段目にもぷよが置ける。タッタカタは、13段目にぷよを置くための"まわし"の1つ。

*5:メガドライブ版ぷよぷよ通。家庭用としてはACぷよ通に一番近い環境として重宝されている。

*6:100本先取。ぷよ界でのスタンダード。だいたい3時間。

*7:だいたい10〜11連鎖。先打ちとしては不安な威力。

サイ本要約 9章後半

9章の後半から!


9.6 継承以外のクラス拡張方法


別クラスから関数を「借りる」

  • 別クラスのメソッドをコピーして使用することができる。
  • コピー元prototype -> コピー先prototype へとメソッドをコピーしたり。


メソッドコピー関数の例

  • あるクラスの全メソッドを、別のクラスのプロトタイプオブジェクトにコピーする関数の例。

function borrowMethods(borrowFrom, addTo) {
  //コピー元
  var from = borrowFrom.prototype;
  //コピー先
  var to   = addTo.prototype;
  
  //コピー元プロトタイプの全プロパティを調べる
  for(m in from) {
    //関数以外は無視する
    if (typeof from[m] != "function") continue;
    //メソッドのコピー
    to[m] = from[m];
  }
}


ミックスインクラス

  • 他のクラスから利用することを想定した、汎用的なメソッドを定義するクラスのこと。
  • 例:Utilにfooメソッドを定義して、他で使う。

//汎用クラス
function Util() {}
Util.prototype.foo = function(x) {
  alert(x);
}

//使用元クラス
function Hoge() {
  .
  .
}
function Fuga() {
  .
  .
}
//直接引っ張ってきたり
Hoge.prototype.foo = Util.prototype.foo;
//↑で定義したborrowMethods使用したり
borrowMethods(Util, Fuga);

//使ってみる
var hoge = new Hoge();
hoge.foo(3);  //alert(3)
var fuga = new Fuga();
fuga.foo(4);  //alert(4)

  • コンストラクタ関数を借りる例

//汎用クラス
function Util(num) { this.num = num; }
Util.prototype.getNum = function() {
  return this.num;
}

//使用元クラス
function Hoge(num) {
  .
  .
  //コンストラクタを借りる
  Util.call(this, num)
}
//メソッドも
Hoge.prototype.getNum = Util.prototype.getNum;

//使ってみる
var h = new Hoge(193);
h.getNum(); //193


9.7 オブジェクトクラスの判定


typeof演算子

  • 基本データ型とオブジェクトの区別には便利だとか
  • typeof null は"object"
  • 関数もオブジェクトなのに、返り値は"function"
x typeof x
数値 "number"
文字列 "string"
論理値 "boolean"
オブジェクト "object"
配列 "object"
関数 "function"
null "object"
undefined "undefined"


instanceof演算子

  • 左側のオペランドがオブジェクトでない場合false
  • 右側のオペランドがオブジェクトでない場合、実行時エラー
  • 関数fに対して以下の式はすべてtrue

typeof f == "function"
f instanceof Function
f instanceof Object

  • あるオブジェクトがとあるクラスの直接のインスタンスであるかどうかは、constructorプロパティを使う。

var d = new Date();
d instanceof Object     //true
d.constructor == Object //false
d.constructor == Date   //true



Object.toString()

  • デフォルトのObject.toString()の返り値は、"[object (class名)]"
  • (class名)は、オブジェクトの内部クラスを意味する文字列。
  • ユーザ定義オブジェクトでは常に(class名)は"Object"なので、ユーザ定義クラスの判定に使える?
  • ほとんどのクラスはtoString()をオーバーライドしているので、あるオブジェクトに対してObject.toString()を呼び出したい場合は、以下のようにする。

Object.prototype.toString.apply(hogeObject);

//配列での例
[1,2].toString(); //"1,2"
Object.prototype.toString.apply([1,2]); //"[object Array]"


ダックタイピング

  • 「あるオブジェクト(O)が、あるクラス(C)で定義されているメソッドをすべて実装していれば、OはCのインスタンスであるとみなせる」
  • ダックタイピングができるメリットがちゃんとわかっていない。おしえてエロい人!


9.8 例:defineClass()ユーティリティ

  • 9章で出てきたことを使った例なので、目を通しておこう!決してめんどくさくなったわけじゃないよ!

Scala×sbt×Android ・・・の準備

なんか最近周囲でAndroid開発が熱いようで、ならば乗るしかない、このビッグウェーブに・・・!ということで、DesireHDを0円乞食ゲットしてきました。


さて、Androidの開発といえばJava使用なんですが、せっかくなのでScalaの勉強もかねて、ScalaちゃんでAndroid開発はじめました!
開発環境に関しては、いろいろ試行錯誤した結果、とりあえず簡単そうなsbtを使ってみることに。
ちなみにWin7上です。

AndroidSDKは既にインストールされてるとして、以下。


まずは、sbtを準備。


次に、create_project(androidプロジェクト作成スクリプト)を用意。

create_projectUnix系ならそのまま使えばいいんですが、Windows上では直接は動かせないのでこちらを参考に、ちょっと手を入れてScalaオブジェクトにして実行する手法をとる。

> scalac create_project
> scala -cp . CreateProject \   //プロジェクトの雛形作成
   HelloProject scalatohoku.example.hello \
    --platform android-8 \
    --scala-version 2.8.0 \
    --activity HelloActivity

あとは作成されたプロジェクトへ移動して、sbt起動してあれこれする。

> cd HelloProject 
> sbt              //sbt起動
//以下sbt上でのコマンド例
> compile          //コンパイル
> install-emulator //エミュレータにインストール
> start-emulator   //コンパイル〜エミュレータにインストール、実行までまとめて
> start-device     //↑の実機版

sbtにはいろいろコマンドが用意されている。
このへんは使いながら覚えていくことにしますん。


基本的な流れとしては、

  • CreateProjectでプロジェクト作成
  • 中身をガリガリ書く
  • sbtでコンパイル、エミュレータや実機へ

でよさげ。


以下、参考にさせていただいたエントリ。

(4/22追記)
↑では抜けたけど、どこかのタイミングで ANDROID_SDK_HOME を環境変数に加えた!

Tenco! 用の ChromeExtention 作ってみた。

ふと「Chrome拡張機能を作ってみたいな〜」と思い立ったので、Tenco!用の何かを作ってみた。


と言っても、全然大したものではなく、「マイページの対戦履歴、過去の対戦相手のリンクにマウスを乗っけるとその相手のレートが表示される」というもの。


対戦履歴から。
f:id:jacobi824:20110202022106p:image


過去の対戦相手のレートもこんな感じに。
f:id:jacobi824:20110202022107p:image

Chrome使ってる人は一度使ってみてください。
作ってて速攻ネタが尽きたので、「こういう機能がほしい」「こんなのあったら便利だよね」何でもいいのでアイデアあったらください!
ちょっとドタバタしてるので数日中にちゃんと整理します。


ダウンロードはこちら

FizzBuzz CodeGolf in Scala extends noire722

コードゴルフ的なお話。

FizzBuzz in Scala - cignoir の日記
を見て、なんとかscalaちゃんでもうちょっとがんばれないかとやってみた。


基本構文はそのまま丸パクリ。

  • 87bytes

for(i<-1 to 100)println((if(i%3>0)""else"Fizz")+(if(i%5>0)if(i%3>0)i else""else"Buzz"))


やったこととしては、"FizzBuzz"の表記を無くし、
前半("Fizz"部分)と後半("Buzz"部分)とに分けて"+"で文字列結合。
2bytes減ったよ、やったねscalaちゃん!


しかし依然人権がないのだった・・・。


パッと見て、()やelseが多い気はする。
まだscalaの構文がよくわかってないのでなんともだけども、もうちょいなんとかしたいですね!


(追記)

id:Dekosuke の助言により、

"Fizz"*(i%3/2)  → "Fizz" (i%3/21 <=> i+13の倍数)
                → ""     (それ以外)

という技法を習得したので早速適応。

  • 77bytes

for(i<-0 to 99)println(if(i%3<2&&i%5<4)i+1 else"Fizz"*(i%3/2)+"Buzz"*(i%5/4))

ポイントは、i の値を1つ小さくしてずらすことで、剰余判定を楽にしているところ。


さらに、id:noire722 からの、「最初のif文中の && は & でよくないか」というのを反映し、

  • 76bytes

for(i<-0 to 99)println(if(i%3<2&i%5<4)i+1 else"Fizz"*(i%3/2)+"Buzz"*(i%5/4))

みんなの力を合わせれば短くなるもんですね。
まだ何か削れないかな・・・。

(さらに追記)

以前縮めて登録していたものを発掘したのでぺたぺた。
ただ、トップは70bytesだったりであと一息が遠い。

  • 73bytes

for(i<-1 to 100)println(if(i%3*i%5>0)i else"Fizz"*(1-i%3)+"Buzz"*(1-i%5))