challenge ピラミッドを作る

正の整数nが与えられたときに、高さnのピラミッドを出力するプログラムを作ってください。

n=4の時の出力は下のようになります。

   *
  ***
 *****
******* 

Posted feedbacks - Nested

Flatten Hidden

	
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
pyramid :: Int -> IO ()
pyramid height = mapM_ pyramid' [1 .. height]
    where
      pyramid' :: Int -> IO ()
      pyramid' row
          = do putStr (replicate (height - row) ' ')
               putStr (replicate (row * 2 - 1)  '*')
               putStrLn ""

main = pyramid 4
1ゲト
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function pyramid(n) {
  alert(
    (function f(n, p) {
      if (n < 2) return [p + '*'];
      var o = f(n - 1, p + ' ');
      o.push(o[o.length - 1].replace(/ \*/, '***'));
      return o;
    })(n, '').join('\n'));
}
pyramid(4);
渡る世間はjavaばかり
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class PyramidPrint {
	
	public static void main(String[] args) {
		print(4);
	}

	public static void print(int n) {
		for (int i = 0, ii = n - 1; i < n; i++, ii--) {
			System.out.println(
			    loop(ii, ' ')
			    +
			    loop((i * 2) + 1, '*')
			);
		}
	}
	public static String loop(int n, char ch) {
		StringBuffer buffer = new StringBuffer();
		for (int i = 0; i < n; i++) {
			buffer.append(ch);
		}
		return buffer.toString();
	}

}
はぁはx
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/usr/bin/perl

sub p {
    my $n = shift;
    my $w = 2 * $n - 1;
    for (my $m = 1; $m <= $n; $m++) {
        my $sw = ($w - (2 * $m - 1)) / 2;
        printf("%s%s%s\n", " " x  $sw, "*" x (2 * $m - 1), " " x $sw);
    }
}

p($ARGV[0]);
map厨ですがなにか
1
2
3
4
5
sub pyramid {
  my $n = shift;
  print map { ' 'x($n-$_) . '*'x($_*2-1) . "\n" } 1..$n;
}
pyramid(4);

	
1
2
3
4
5
6
7
| n |
n := 4.
Transcript open.
0 to: n - 1 do: [:idx |
   Transcript cr;
      show: (String new: n - idx - 1 withAll: $ );
      show: (String new: idx * 2 + 1 withAll: $*)]
Perlワンライナーで
1
print" "x($ARGV[0]-$_),"*"x($_*2-1),"\n"for(1..$ARGV[0]);
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
string pyramid(int n, const string& sp = "") {
  string stars = n < 2 ? "*" : pyramid(n - 1, sp + " ") + "**";
  cout << sp << stars << endl;
  return stars;
}

int main(int, char**) {
  pyramid(4);
  return 0;
}
普通に。
1
2
3
def pyramid(n):
    for line in range(1, n+1):
        print ' ' * (n - line) + '*' * (line * 2 - 1)
普通に書きました。
1
2
3
4
def make_pyramid(n):
    for i in xrange(n):
        i += 1
        print "%s%s" % (" " * ( n - i + 1 ), "*" * ( i * 2 - 1 ))
普通に。
1
n=input();i=1;exec"print' '*(n-i)+'*'*(i*2-1);i+=1;"*n
以下でも同じく54B。
1
n=input();i=1;exec"print('*'*i).center(n*2-1);i+=2;"*n
53B。ショートコードはとりあえずここまでとするつもり。
1
n=input();i=1;exec"print('*'*i).rjust(n+i/2);i+=2;"*n
出題者なので黙っていたけど我慢できなくなったのでw
48Bです。
1
for i in range(n):print('*'*(i*2+1)).center(n*2)
あ、nの入力を受け取るコードが入ってないからフェアじゃない…orz
C#だとstringのコンストラクタで作るのが一番シンプルかなぁ...。
1
2
3
4
5
static void Pyramid(int n)
{
	for (int i = 1; i <= n; i++)
		Console.WriteLine(new string(' ', n - i) + new string('*', i * 2 - 1));
}
clispで確認しました。
(pyramid 4)
1
2
3
4
5
6
7
8
(defun pyramid (h)
  (labels ((p-line (n)
                   (loop for i from 1 to (- h n) do (princ " "))
                   (loop for i from 1 to (1- (* n 2)) do (princ "*"))
                   (terpri))
           (rec (n)
                (unless (> n h) (p-line n) (rec (1+ n)))))
    (rec 1)))
バッファオーバーフローとか言わないw
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
void pyramid(int n) {
  char buf[256];
  int i;
  
  memset(buf, ' ', n - 1);
  for (i = 0; i < n; i++) {
    buf[n - i - 1] = '*';
    strcpy(buf + n + i - 1, "*\n");
    fputs(buf, stdout);
  }
}

int main(int argc, char** argv) {
  pyramid(4);
  return 0;
}
1
2
3
pyramid n = putStr $ unlines $ map pyr $ take n [0..]
    where
      pyr x = concatMap (uncurry replicate) [(n-x-1, ' '), (2*x+1, '*')]
awk で変な方向に頑張ってみました。
1
2
awk 'BEGIN{n=ARGV[1];while(n){print --n}}' 4 | \
awk '{printf "%"$1+NR*2"s\n",sprintf("%0"NR*2-1"d",0)}'
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#! /bin/bash

n=${1:-4}    # default=4
block='*'
space=$(printf "%${n}s")

for((; n; n--)); do
    space=${space:0:n-1}
    echo "$space$block"
    block="${block}**"
done
#!/bin/sh
n=${1:-4}
b='*'
for i in $(seq 0 $n); do
	echo "$(printf "%$(($i - $n - 1))s")$b"
	b="${b}**"
done
コマンド付で
1
ruby -e 'n=4;b=1;n.times{n=n-1;p" "*n+"*"*b+" "*n;b=b+2}'
明示的算術演算なし版、Lazyならではのコード片
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
module Main (main) where
import System.Environment (getArgs)
main :: IO ()
main    = getArgs >>= putStr . pyramid . read . head
pyramid :: Int -> String
pyramid = unlines . reverse . zipWith (++) (iterate (" "++) "") . reverse . flip take (iterate ("**"++) "*")

{-
*Main> :main 7
      *
     ***
    *****
   *******
  *********
 ***********
*************
-}
erl -noshell -eval 'pyramid:pyramid(4), halt().'
のように実行.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
-module(pyramid).
-export([pyramid/1]).

pyramid(N) ->
        pyramid(N, 1).

pyramid(Max, Row) when Max < Row ->
        ok;
pyramid(Max, Row) ->
        write(" ", Max - Row),
        write("*", Row * 2 - 1),
        io:put_chars("\n"),
        pyramid(Max, Row + 1).

write(_String, 0) ->
        ok;
write(String, Repeat) ->
        io:put_chars(String),
        write(String, Repeat - 1).
ざっくり。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
>>> def pyramid(n=4):
...     for i in range(n):
...             print ("*" * (i * 2 + 1)).center(n * 2 + 1)
... 
>>> pyramid()
    *    
   ***   
  *****  
 ******* 
>>> pyramid(6)
      *      
     ***     
    *****    
   *******   
  *********  
 *********** 
>>> 
さくっと書き上げてみた。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def stars(n)
  2*n-1
end

def pyramid(n)
  1.upto(n) do |i|
    puts(("*"*stars(i)).center(stars(n)))
  end
end
pyramid(10)
んー、String#centerがCommon Lispにはないから書かないといけなかったorz
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
(defun center (str len &optional (padchar #\ ))
  "If LEN is greater than the length of STR, returns a new String 
   of length LEN with STR centered and padded with PADCHAR; 
   otherwise, returns STR."
  (let ((pad (make-string (/ (- len (length str)) 2) :initial-element padchar)))
    (format nil "~a~a~a" pad str pad)))

(defun stars (n)
  (- (* 2 n) 1))

(defun pyramid (n)
  (loop for i from 1 to n do
       (format t "~a~%" (center (make-string (stars i) :initial-element #\*)
                                (stars n)))))
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import sys

mark = '*'
if len(sys.argv) == 2:
    n = int(sys.argv[1])
if len(sys.argv) == 3:
    n, mark = int(sys.argv[1]), sys.argv[2]

for i in xrange(1,n * 2,2):
    print(mark * i).center(n * 2)
R5RS に収まる範囲でシンプルに。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
(define (print-tree n)
  (let loop ((i 0))
    (if (< i n)
        (begin (display
                (make-string (- n i 1) #\ )
                (make-string (+ 1 (* 2 i)) #\*))
               (newline)
               (loop (+ 1 i))))))

(print-tree (read))
1
n=4;1.upto(n){|i|puts" "*(n-i)+"*"*(i*2-1)}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>

void main(int argc, char **argv) {
	int i, j, n;

	n = argc > 1 ? atoi(argv[1]) : 4;

	for(i=0; i<n; i++) {
		printf("%*c", n-i, '*');
		for(j=0; j<i*2; j++) putchar('*');
		printf("\r\n");
	}
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class Pyramid {
    public static void main(String[] args) {
        print(4);
    }
    private static void print(int n) {
        int i;
        StringBuffer sb = new StringBuffer();
        for (i = n; i > 1; i--) sb.append(" ");
        for (i = n*2-1; i > 0; i--) sb.append("*");
        for (i = n; i > 0; i--) System.out.println(sb.substring(n-i, 3*n-2*i));
    }
}
pyramidooooooo!
1
2
3
4
5
6
7
8
(define (pyramid h)
  (for-each (lambda (pyram) (display pyram) (newline))
            (do ((space (- h 1) (- space 1))
                 (star 1 (+ star 2))
                 (pyram '() (cons (string-append (make-string space #\space)
                                                 (make-string star #\*))
                                  pyram)))
                ((> 0 space) (reverse pyram)))))
Gaucheで。
1
2
3
4
5
6
(define (pyramid h)
  (let loop ((space (- h 1)) (star 1))
    (if (<= 0 space)
        (begin
          (print #`",(make-string space #\\space),(make-string star #\\*)")
          (loop (- space 1) (+ star 2))))))
素直に書いてみた。
1
2
3
4
my $n = shift;
for my $i ( 1 .. $n ) {
    print ' ' x ( $n - $i ) . '*' x ( $i * 2 - 1 ) . "\n";
}
興味本位で「ひまわり」にて。 プログラムはアルファベットが良いなぁ。 英語圏の人は、プログラムを書いていて頭が混乱しないのか気になります。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
「階層は何階?」と、尋ねて、階層に、入れる。
ワークは、「」。
表示文字は、「」。
センタリング。
階層回(
 ワークは、ワーク &「*」
 表示文字は、表示文字 & ワーク & 「\n」
)。
表示文字と、表示する。
センタリング解除。
まだ文字列置換を使うのは出てないようなんで。 文字列を副作用で加工してった方が短くなると思うけど、とりあえずGaucheで。
1
2
3
4
(define (pyramid n)
  (define (p s n) (q (regexp-replace* s #/ \*/ "***" #/ $/ "*") n))
  (define (q s n) (when (> n 0) (print s) (p s (- n 1))))
  (p (make-string n) n))
同じアイディアをsedで。
ピラミッドの段数分のスペースからなる行を標準入力から与えます。

$ echo "     " | sed -n -f t.sed
    *
   ***
  *****
 *******
*********
1
2
3
4
s/ $/*/p
:x
s/ \*/***/p
tx