2448号:ゴルフで星-11を撮影


次の問題は2447です.
1.質問
1行目はNです.Nは常に3×2^k数.(3, 6, 12, 24, 48, ...) (0≦k≦10、kは整数)
サムネイル:入力24時に出力します.
前に配置された2447のように、整数Nを入力し、星を出力します.
2.解答
今回の質問です.
  *   
 * *  
***** 
形の星が繰り返しているようです.
func printStar(k int, l int, n int) {
	var star []string
	pattern = make([]string, n)
	star = make([]string, n)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	pattern[0] = "  *   "
	pattern[1] = " * *  "
	pattern[2] = "***** "

	star = makeStar(k, l, n, star, pattern)
	stars := strings.Join(star, "\n")
	writer.WriteString(stars)
}
一番上の形はいつも同じなので、あらかじめ図案[0:2]に入れておきます.
func makeStar(k int, l int, n int, star []string, pattern []string) []string {
	if (l+1)*3 > n {
		return star
	}

	if k == 0 {
		star[0] = pattern[0]
		star[1] = pattern[1]
		star[2] = pattern[2]
		return makeStar(k+1, 1, n, star, pattern)
	}

	kk := int(math.Pow(2, float64(k))) * 3
	kkm := int(math.Pow(2, float64(k-1))) * 3

	star = makeBlank(kkm, star)

	j := 0
	for i := kkm; i < kk; i++ {
		star[i] = pattern[j] + pattern[j]
		j++
	}
	copy(pattern, star)
	return makeStar(k+1, l*2+1, n, star, pattern)
}
今まで描いていたSliceを下にもう2回描きます.
描画した星全体をモードに再保存し、次の関数を呼び出す.
  *
 * *
*****
  *     *
 * *   * *
***** *****
  *     *
 * *   * *
***** *****
  *     *     *     *
 * *   * *   * *   * *
***** ***** ***** *****
コピーさえすれば、左右の空白はないので、星の数は合っていますが、形がぼやけてしまいます.
一番上の格子から星を描き、次の行を描く前に
現在ペイントされているシェイプの前に新しく追加された行数を追加します.
func makeBlank(kkm int, star []string) []string {
	for i := 0; i < kkm; i++ {
		for j := 0; j < kkm; j = j + 3 {
			star[i] = "   " + star[i] + "   "
		}
	}
	return star
}
左右に等量の空白が必要です.
https://www.acmicpc.net/problem/status/2448/12/1
go言語で提出された殴られた人のリストは、
実行速度にも大きな違いがあり,再帰関数を使用していないコードも見られた.
文法も文法も勉強しますが、アルゴリズムを勉強するようです...