ツイッターを見ていたら面白そうなツイートが流れてきた。
┏┳┳┳┳┳┳┳┳┳┳┓
— GeekOut公式 (@geekout_jp) 2017年10月17日
┣ #エンジニア専用RPG┫
┗┻┻┻┻┻┻┻┻┻┻┛
コードの力で解答を導き
4人の魔王を打ち倒せ😈!
このツイートをRTで
全国共通すし券🍣
1万円分プレゼント実施中
▼あなたは解ける?https://t.co/WhjiJJoE9H #謎解き
CODE QUEST 〜伝説ノエンジニア、求ム〜|GeekOut : https://geek-out.jp/cp/code-quest/
ちょっくらやってみっかと挑戦してみたところ、1個めと2個めの問題はすぐにクリア出来たのだけど、3個めの問題はプログラムを組まないとクリアできなさそうな問題だった。
問題の内容は
"イアラ","ウェイト","オメガロ","ガルヒ","ガングリオンズ","クリオ","ジェノバ","スノウガ","ズビズバ","スペシウム","タグアズ","ドドンパ","トルネ","ネメシス","バイナリル","ハザード","パリピファイア","バルース","ヒラケゴマ","フェイク","プリズマ","ホルーガ","マッハ","マホマホ","ムート","ラリホフ","ランス","ループ","ロールウェイブ","ワロス"
という30個の魔法をシリトリで繋げて20個以上連鎖させるというもの。
最初は魔法の重複があっても良いと思っていたので、そういうコードを書いてたけど、実際に答えを入力してみると重複は許されないらしい。
これはたしかに、人間がやると大変そうな良問題。
ということでコンピューターの力を使って強引に、組合せをランダムにシャッフルしながら多数の試行を重ねて解くという、いわゆるブルートフォースアタック的なやり方で解決した。
なるべくわかりやすいように丁寧にコメント書いてみました。
やりかたは色々あると思うんですが、この場合再帰を使うのが一番やりやすいかなと思いました。
自力でクリアしたい人はネタバレになってしまいますので気をつけて…。
#! /usr/bin/env ruby
@spells = ["イアラ","ウェイト","オメガロ","ガルヒ","ガングリオンズ","クリオ","ジェノバ","スノウガ","ズビズバ","スペシウム","タグアズ","ドドンパ","トルネ","ネメシス","バイナリル","ハザード","パリピファイア","バルース","ヒラケゴマ","フェイク","プリズマ","ホルーガ","マッハ","マホマホ","ムート","ラリホフ","ランス","ループ","ロールウェイブ","ワロス"]
@result = ""
@count = 0
def get_spell(arr,key)
#文字の最初と最後がマッチするスペルの検索
r = arr.select{|s| s[0]==key[-1]}
#接続単語発見時
if(r.length > 0)then
#発見した要素を結果に追加
@count += 1
@result += r[0] + " "
#発見した要素を消す
arr.delete(r[0])
#再帰
get_spell(arr,r[0])
#接続単語が発見出来なかった時
else
#20個以上の単語接続が出来ていたら
if(@count >= 20)then
#終了処理へ
return true
#20個未満の単語接続ならやり直し
else
#ダメだった結果表示
puts @count
puts @result
#イニシャライズ
@count = 0
@result = ""
end
end
end
while(1)
#接続単語を見つける度にリストの単語を消化用の配列を用意
#毎回同じ結果に鳴らないように、初期化の度に配列の要素をシャッフルする
dic = @spells.clone.shuffle
buf = dic[0]
#先頭の単語を結果に入れる
@result += buf + " "
dic.delete(buf)
#接続単語数のカウンターをインクリメント
@count +=1
#再帰処理
#20個以上の単語接続が出来ていたらループ脱出
if(get_spell(dic,buf) == true)then
break
end
end
#最終結果表示
puts "*****clear*****"
puts @count
puts @result
どうやら連鎖は20個がマックスじゃないかな〜。
更新情報をお届けします





















この記事へのコメントはありません。