ピラミッドを作る
Posted feedbacks - Flatten
Nested Hidden1 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
|
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, '*')]
|
以下でも同じく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
|
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
|
出題者なので黙っていたけど我慢できなくなったのでw 48Bです。
1 | for i in range(n):print('*'*(i*2+1)).center(n*2)
|
あ、nの入力を受け取るコードが入ってないからフェアじゃない…orz
コマンド付で
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
|
vim7で...
1 2 3 | fun! Pyramid(n)
exe "normal! ".(a:n-1)."o\<esc>:%s/^/\\=repeat('*',line('.')*2-1)\<cr>:%ce\<cr>"
endfun
|
ごく普通に。
1 2 3 4 5 6 7 8 | <?php
function pyramid($n){
for($i = 0; $i < $n; $i++){
printf("%s%s\n", str_repeat(' ', $n - $i), str_repeat('*', 2 * $i + 1));
}
}
pyramid(4);
?>
|
正規表現を使ってみました。思ったより短くならない・・・。
1 | ruby -e';s="*";2.upto(ARGV[0].to_i){s.gsub!(/\A(\s*)|$/){$1?" #$1*\n#$1":"**"}};puts s' 4
|




にしお
#3364()
Rating0/0=0.00
n=4の時の出力は下のようになります。
[ reply ]