ギークなお姉さんは好きですか

恋焦がれる理想の男性・ギークに近づくため、プログラミングがわかるお姉さんを目指すブログ

JavaScriptを知らない私がはまちちゃんのコードを解読してみる

ぼくならこういう実装にするかな
javascript:alert(((((prompt('1-9の好きな数字をいれてね')*2+5)*50)+*1-(prompt('西暦何年うまれ?')))+'').substr(1))

Hamachiya2 - 「年齢は3行で割り出せるぞ!」のコメント欄より

(カッコ)が多すぎて目が死ぬ!マトリョーシカかよ!!!うっうっ・・・。
このままだとさっぱり分からないので、(カッコ)を色分けして縦に書いてみた。
邪道ぽいけど、私はこの方が分かりやすい。


javascript:alert

(
( (

(

(prompt
('1-9の好きな数字をいれてね')*2+5)

*50)

+

(


(new Date) . getFullYear() -

(

(prompt
('今年の誕生日ってもう過ぎてたっけ?(y/n)') =='y'?0:1)

+249)


)

-

(prompt
('西暦何年うまれ?') )

)
+'' ) .substr(1) )



さて、どこから手を付ければ良いものやら(;^ω^)
途方に暮れたが、ふと思い出した。

これ、[カッコ] が二重になってる。意味不明。
でもココは先週あきやんに聞いたの!
えとね、プログラミング言語っていうのはみんなそうらしいんだけど、
こういう場合は ”内側から評価” するらしい。

4日目 おみくじとか作っちゃうかモナー!

確かあのとき、あきやんは「プログラミングやってる人なら分かるんだけど」と言っていた気がする。
だからきっと javascript も内側から評価するはず。よし!出来る気がしてきた!


javascript:alert

ブラウザのアドレスバー(普段URLを入れたりURLが表示されたりしてるところ)に
javascript:alert(計算式); と打ち込んでみましょう。

[javascript]alertを活用する

ぉお!アドレスバーに直接これを打ち込むのか!
.js で保存してしまった。恥。


prompt()

promptメソッドは、指定したウィンドウに文字ダイアログを表示します。
window.prompt("ダイアログに表示される文字列","入力欄の初期値")と指定します。

JavaScriptリファレンス

だからウィンドウで「1-9の好きな数字をいれてね」と出てくるのか。
確かむかぁぁーしちょっとだけかじった javascript 入門書に、window は省略可能と書いてあった気がする・・・
と思って探してみたらやっぱりあった!

windowオブジェクトはブラウザのウィンドウそのものを指します。
わかりきっていることだから「暗黙の了解」ということで、
省略してもかまわないということなのです。

3ステップで覚えるJavaScript―こうすれば自分で書ける・作れる!


はっ、そうか。
いま入力欄の初期値がundefinedって入ってるんだけど、これは指定してないからなのか。

(prompt('1-9の好きな数字をいれてね','')*2+5)

こうするとブランクになる。なるほど感動した!
たぶんこれ常識なんだろうけど、私にとっては感動的なのだ><


*2+5)*50) は計算してるのかな。
算術演算子 - JavaScript演算子

そのあとの+ は、足し算じゃなくて文字列結合だろうか。
文字列結合演算子 - JavaScript演算子


(new Date) . getFullYear()
document.write((new Date).getFullYear()+"年")
現在の西暦を書き出す。

getFullYear()

現在の西暦を取得して、ここから何かを引くらしい。


(prompt ('今年の誕生日ってもう過ぎてたっけ?(y/n)') =='y'?0:1)

この一行の 'y'?0:1 が一番分からなかった><


== っていうのは、代入とは違う。
なんていうか、文字通りイコール。今度は本気のイコール。超イコール。だから2回書く。

5日目 もし私が女子高生だったら

javascriptの == もひょっとして超イコールか!?と思ったらやぱりそうだった!
比較演算子 - JavaScript演算子


「今年の誕生日ってもう過ぎてたっけ?」の答えがyesだったら、yだったら・・・なんなのさヽ(‘Д´)ノ
一瞬あきらめかけたんだけど、↑のページの一番下に希望を見た。

< 代入変数 > = < 条件式 > ? < 真 > : < 偽 > ;
条件演算子 - JavaScript演算子

む。条件演算子

◆ exp1 ? exp2 : exp3 (e3/N2)
exp1 が真であれば exp2 を、さもなくば exp3 を返します。

演算子

とゆことは、「今年の誕生日ってもう過ぎてたっけ?」に対する答えが y だったら0,そうじゃなかったら1を返すってことか。


substr(1)
string の from 番目から len 文字分(最初の文字を 0 番目とする)の文字列を返します。
len を省略すると残りのすべてを返します。

文字列(String)

おおおおおおお!!!!!!
このスクリプト最大のなぞが!!!とけた!!!!!!!!!!!

や、最初に「1-9の好きな数字をいれてね」と言われて入力したのはどこに行っちゃったのかなあと。
あれはなんの意味があるんだろーって、いろいろな数字で試したけど結果は変わらず。
特に意味のない質問だったとしても、数字を入力したことは意味を持つ。
はまちちゃんの茶目っ気さ☆というニュアンスを、プログラムが組んでくれるはずがない><

そーかそーか、1番目の数字から残りすべてを返せ、と指定してるから、
0番目にあたる最初の質問の答えは表示されないのか!
すげー!すげーーー!!今年いちばん感動した!!!
しかし *2+5)*50 はなんだろう・・・うーむ。。。



冒頭のコードに数字を当てはめてみよう。
1979年11月12日生まれのござ先輩の場合でやってみる。
好きな数字には 9 を入力。

{ (9×2+5)×50 } + 2008 − 249 − 1979

答えは 930。substr(1) で 1 文字目から表示しろと指定してるので、30と出る。


あれ、ござ先輩って実はミソジー?


*1:new Date).getFullYear()-((prompt('今年の誕生日ってもう過ぎてたっけ?(y/n)')=='y'?0:1)+249