Twitterで大流行中のペンパイナッポーアッポーペン(PPAP)を実装してみた – LiveScript編
突然ですが「ペンパイナッポーアッポーペン(PPAP)」をご存知ですか?
今回はPPAPを使ってプログラミングのネタを投稿させていただきます。
ペンパイナッポーアッポーペンって?
今 巷で話題のこの動画をご存知でしょうか?
謎のシンガー・ソングライター「ピコ太郎」が歌う「ペンパイナッポーアッポーペン」です。
YouTubeでの再生回数は 1,000万回以上! 流行に敏感な中高生のみならず、あのジャスティン・ビーバーもTwitterで紹介するほどの人気で、PPAPを真似して踊っている動画が次々に投稿されています。
歌詞
作詞:ピコ太郎
曲名:ペンパイナッポーアッポーペン
I have a pen . I have a apple
アイ ハブ ア ペーン アイ ハブ ア アッポー
ah! Apple pen!
アー! アポーペーン!
I have a pen . I have a Pineapple
アイ ハブ ア ペーン アイ ハブ ア パイナッポー
ah! Pineapple pen!
アー! パイナッポーペーン!
Apple pen!Pineapple pen!
アポーペーン!パイナッポーペーン!
ah!
アー!
Pen Pineapple Apple pen!
ペンパイナッポーアッポーペン!
Pen Pineapple Apple pen!
ペンパイナッポーアッポーペン!
単調なリズムと歌詞に面白いダンスで一回聞くと耳に残ってしまいますよね。
この歌詞ですが、殆どが「Pen」「Apple」「Pineapple」で構成されていますので、プログラミングできそうな気がしませんか?
気がしますね。
というわけで、この歌詞を出力するプログラムを作ってみようと思います。
プログラム
言語は弊社のメイン開発言語であるAltJSの LiveScript にしました。
マイナーな言語かもしれませんが、関数型っぽく書けるCoffeeScriptだと考えていただければ大丈夫です。
使ってみるととても便利でキレイに書けるので、弊社のイチオシAltJSです。
# ppap.ls
{split, map, join, take, reverse, each, apply, replicate} = require \prelude-ls
ah = (left, right) ->
console.log \ah!
right
|> reverse
|> ( ++ left)
|> join \-
doya = (mono) ->
console.log "#{mono}!"
mono
console.log \PPAP
[<[Pen Apple]> <[Pen Pineapple]>]
|> map ->
it
|> each (word) ->
word
|> take 1
|> ->
switch it
| <[A I U E O]> => \an
| _ => \a
|> ("I have " +) >> (+ " #word") >> (+ "!") >> console.log
|> map replicate 1
|> apply ah
|> doya
|> each ( + \~~) >> (console.log)
|> map (split \-)
|> apply ah
|> doya
|> doya
↓実行結果
PPAP
I have a Pen!
I have an Apple!
ah!
Apple-Pen!
I have a Pen!
I have a Pineapple!
ah!
Pineapple-Pen!
Apple-Pen~~
Pineapple-Pen~~
ah!
Pen-Pineapple-Apple-Pen!
Pen-Pineapple-Apple-Pen!
なかなかスマートに書けました。
ahとdoyaに関数を束縛し、それぞれ文字をくっつける処理とドヤっ!ってする処理をおこなっています。
ポイントは ah 関数の引数であるright
だけをreverse
している点です。
これにより["Pineapple", "Pen"]→["Pen", "Pineapple"]
に変換しています。
単語の先頭文字を判定し、冠詞のa
とan
を付け替えている部分は個人的なこだわりです。
(動画では”I have a Apple”となっています)
おまけ
以前に「きよしのズンドコ節」をプログラミングするのが流行ったのを覚えているエンジニアもいらっしゃるかと思います。
「ズン」と「ドコ」をランダムで繰り返し出力し、「ズンズンズンズンドコ」と並んだら「キ・ヨ・シ!」と出力して終了するプログラムなのですが、似たようなことをPPAPでもやってみました。
#zundoko_ppap.ls
{fix, at, join, take, reverse} = require \prelude-ls
list =
(fix (f)-> (x)->
x
|> reverse >> (take 4) >> (reverse) >> (join "-")
|> ->
switch it
| "Pen-Pineapple-Apple-Pen" => x
| _ => x |> (++ <[Pen Apple Pineapple Pen]> |> at (Math.random! |> (* 4) >> (Math.floor))) |> f
) []
console.log list,list.length
↓実行結果
[ 'Pineapple',
'Pen',
'Pen',
'Pen',
'Apple',
'Apple',
'Pen',
'Pen',
'Apple',
'Apple',
'Pen',
'Pineapple',
'Pen',
'Pen',
'Pen',
'Pineapple',
'Pen',
'Pen',
'Pineapple',
'Pen',
'Pineapple',
'Apple',
'Pen' ] 23
配列の最後4つがPPAPになっています。(最後の23は配列の長さです)
再帰ってステキですね。
上記のような関数型言語で仕事してみたい!LiveScriptに興味でてきた!
という方!こちらよりご応募お待ちしております。
-
お問い合わせ
SiTest の導入検討や
他社ツールとの違い・比較について
弊社のプロフェッショナルが
喜んでサポートいたします。 -
コンサルティング
ヒートマップの活用、ABテストの実施や
フォームの改善でお困りの方は、
弊社のプロフェッショナルが
コンサルティングいたします。
今すぐお気軽にご相談ください。
今すぐお気軽に
ご相談ください。
(平日 10:00~19:00)
今すぐお気軽に
ご相談ください。
0120-315-465
(平日 10:00~19:00)
グラッドキューブは
「ISMS認証」を取得しています。
認証範囲:
インターネットマーケティング支援事業、インターネットASPサービスの提供、コンテンツメディア事業
「ISMS認証」とは、財団法人・日本情報処理開発協会が定めた企業の情報情報セキュリティマネジメントシステムの評価制度です。