読者です 読者をやめる 読者になる 読者になる

CodeIQ Blog

自分の実力を知りたいITエンジニア向けの、実務スキル評価サービス「CodeIQ(コードアイキュー)」の公式ブログです。

エンジニア夏祭り2013「オラにじぇじぇじぇなコードを書いてくんろ!」解答編 #engineer #matsuri #hatena #zaim #夏祭り #夏の想い出

CodeIQ×はてな エンジニア夏祭り2013

CodeIQの中の人、OL元帥です。

「はてな」さんとCodeIQがタッグを組んだ『CodeIQ×はてな エンジニア夏祭り2013』
f:id:codeiq:20130725181204j:plain
第1夜「はてなからの挑戦状」が終了しました。
腕利きエンジニア4組からの挑戦状、楽しんでいただけましたか?
挑戦してくださった方は、なんとのべ370人!
みなさん、ありがとうございました。

それではさっそく、
株式会社Zaim 閑歳 孝子さんから届きました、解答・解説を公開します!

f:id:codeiq:20130806104958g:plain



◇◇◇◇◇◇◇◇◇◇


こんにちは!Zaim の閑歳(かんさい)と申します。CodeIQ に出題しました問題に対し、沢山の方より解答を頂戴しまことにありがとうございました。
簡単に解答および解説を記載いたします。


◆ 課題

以下のようにスパゲティ(spagetti)という文字 50 個分をバラバラにしてランダムに配置した文字列があります。この中に前から順番に「n」「e」「a」「p」「o」「l」「i」「t」「a」「n」という順番でナポリタン(neapolitan)という文字が隠れています。その該当文字を抜き出し、前後に [ ] を付け加えてください。

//-------
gtgtsgipgttptinggipsppaigsesgpetgstpatetisiesagaeaigttetepitiatsegssieeeeatepaaiagtpieataatppiitgiapsteitatiiatpetetetttgpetpaasipttssstpeeeggtiagtttegtiipestsasgpsepaasapttgattgiatppegitiatpasgatgepttggapesaeetaeissttggieietgspagesiipestipggstttpateptitiaetottissgggtttaipappgstsptttgtpispattgegstltiappseisapgistaiagteeiptptpisaieisagstapeteietgteiisgtiptstgtstasspeatspptitttatteastsgtptgtasggpniaaeteaisett
//-------

例として、以下の様な状態に文字列を変換できれば正解です。

//-------
gtgtsgipgttpti[n]ggipsppaigs[e]sgpetgstpatetisiesagaeaigttetepitiatsegssieeeeatepaaiagtpieata[a]tppiitgia[p]steitatiiatpetetetttgpetpaasipttssstpeeeggtiagtttegtiipestsasgpsepaasapttgattgiatppegitiatpasgatgepttggapesaeetaeissttggieietgspagesiipestipggstttpateptitiaet[o]ttissgggtttaipappgstsptttgtpispattgegst[l]tiappse[i]sapgis[t]aiagteeiptptpisaieisagstapeteietgteiisgtiptstgtst[a]sspeatspptitttatteastsgtptgtasggp[n]iaaeteaisett
//-------


◆ 注意事項
- 必ず文字の先頭から [n][e][a][p][o][l][i][t][a][n] という並びになるようにしてください
- 例えば「i」など複数回出現するような文字の場合は [l] と [t] の間にあれば、どの i に [] がついても問題ありません


要するに前方から特定の文字を抽出して、決められた文字列操作ができれば正解となります。
言語は特に不問でしたが、ここは Ruby で解答させていただきます。

s="gtgtsgipgttptinggipsppaigsesgpetgstpatetisiesagaeaigttetepitiatsegssieeeeatepaaiagtpieataatppiitgiapsteitatiiatpetetetttgpetpaasipttssstpeeeggtiagtttegtiipestsasgpsepaasapttgattgiatppegitiatpasgatgepttggapesaeetaeissttggieietgspagesiipestipggstttpateptitiaetottissgggtttaipappgstsptttgtpispattgegstltiappseisapgistaiagteeiptptpisaieisagstapeteietgteiisgtiptstgtstasspeatspptitttatteastsgtptgtasggpniaaeteaisett"
n='neapolitan'.split(//)
i=0
a=""
s.split(//).each{|x|n[i]==x ?(i+=1;a<<"[#{x}]"):a<<x}
print a

短くしたかったため、多少読みづらく恐縮です……。
まずは元となる文字列を s, 検索文字列「neapolitan」に split をかけ配列化したものを n とします。
また出力用として文字列 a、"neapolitan" の文字列の何番目まで合致済かを管理する i を定義しておきます。

検索文字列の中で、あるタイミングでチェックすべき文字はひとつです。
まず、s の前から順に、その文字が「n」かどうかを確認します。
合致したら前後に [] を挿入したものを a に追記します。そして i をひとつ増やして検索する文字を「e」に変更します。
いまチェックすべき文字と合致しない場合は、a にその文字をのものを追加します。

実行すると、以下の様な文字列が出力されます。

gtgtsgipgttpti[n]ggipsppaigs[e]sgpetgstp[a]tetisiesagaeaigttete[p]itiatsegssieeeeatepaaiagtpieataatppiitgiapsteitatiiatpetetetttgpetpaasipttssstpeeeggtiagtttegtiipestsasgpsepaasapttgattgiatppegitiatpasgatgepttggapesaeetaeissttggieietgspagesiipestipggstttpateptitiaet[o]ttissgggtttaipappgstsptttgtpispattgegst[l]t[i]appseisapgis[t][a]iagteeiptptpisaieisagstapeteietgteiisgtiptstgtstasspeatspptitttatteastsgtptgtasggp[n]iaaeteaisett

◇◇◇◇◇◇◇◇◇◇



いかがでしたか?
ご自分の解答と同じポイント、または新しい発見などがあったでしょうか?
とくに意図していなかったのですが、えふしんさん、tagomorisさんの出題と合わせるとRuby祭りですね(笑)


あさっては「はてなサマーインターン2013事務局」さんの解答・解説を公開します!お楽しみに♪



CodeIQ × はてな エンジニア夏祭り19113 第2夜 ブログでわっしょい開催中!
f:id:codeiq:20130806104304g:plain
「納涼!ほんとにあった怖いコード」「CodeIQの問題・パズルを考えよう!」のいずれかのお題でブログを書くと、豪華審査員が選評してくれます。
詳しくはキャンペーンページヘ!



エンジニアのための新しい転職活動!CodeIQのウチに来ない?の特集ページを見る