@mattn さんの ホクホクのイモ という記事を読んで、もっと簡単にホクホクの芋が食べられたらなと思った。
ホクホクのイモとは?
こちらの記事がとても分かりやすかったです。
https://qiita.com/matarillo/items/0876311a901e313c36e8
- 「ホクイモ」の4字から、ランダムに、かつ重複せずに2文字取り出す。取り出す順番は考慮する。 (例:"モホ")
- で取り出した文字を2回繰り返す。(例:「モホモホ」)
- と同じ処理をもう一度やりなおす。その際、さっき何を取り出したかは影響しない。(例:"クモ")
- 2. と 3. の文字を「の」でつなぐ。(例:「モホモホのクモ」)
golang版
package main
import (
"fmt"
"math/rand"
"strings"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
rs := []rune("ホイクモ")
hoku := func(j []int) string {
return string(rs[j[0]]) + string(rs[j[1]])
}
fmt.Printf("%sの%s", strings.Repeat(hoku(rand.Perm(4)[:2]), 2), hoku(rand.Perm(4)[:2]))
}
javascript版は打ち合わせしながら考える・・・
JS版
node.jsを使用しました
let hokuimo = "ホクイモ".split("")
let r = (max) => Math.floor(Math.random() * (max))
let f = (arr, rv) => {
return arr.length > 2 ? arr[rv] + f(arr.filter((v, i) => i != rv), r(arr.length -1)) : ""
}
console.log(`${f(hokuimo, r(hokuimo.length)).repeat(2)}の${f(hokuimo, r(hokuimo.length))}`)
@tkturbo さんのコメントを見てJSでワンライナーできないかなと思ってこんな感じにしてみました。
((h = (s = "ホクイモ", n = true, r = Math.floor(Math.random() * s.length), t1 = s.substr(r, 1)) => n ? (rp = 2) => (t1 + h(s.replace(t1, ""), false)).repeat(rp) : t1) => console.log(`${h()()}の${h()(1)}`))()
基本の処理はコメントの内容ですが、ワンライナーで処理できるように所々工夫しています。
もっと簡単な書き方があったら教えてください・・・
~ホクホクのイモに関する定義から外れてしまっている部分があったので投稿し直します。。。~
2019/7/8 追記
jsのロジックに誤りがあったので修正しました・・・
かつ重複せずに2文字取り出す