37

チャレンジ

次の ASCII 三角形から作成されたシェルピンスキーの N 反復の三角形の ASCII 表現を出力する、文字数による最短コード:

 /\
/__\

入力は単一の正の数値です。

テストケース

Input:
    2
Output:
       /\
      /__\
     /\  /\
    /__\/__\

Input:
    3
Output:
           /\
          /__\
         /\  /\
        /__\/__\
       /\      /\
      /__\    /__\
     /\  /\  /\  /\
    /__\/__\/__\/__\

Input:
    5
Output:
                                   /\
                                  /__\
                                 /\  /\
                                /__\/__\
                               /\      /\
                              /__\    /__\
                             /\  /\  /\  /\
                            /__\/__\/__\/__\
                           /\              /\
                          /__\            /__\
                         /\  /\          /\  /\
                        /__\/__\        /__\/__\
                       /\      /\      /\      /\
                      /__\    /__\    /__\    /__\
                     /\  /\  /\  /\  /\  /\  /\  /\
                    /__\/__\/__\/__\/__\/__\/__\/__\
                   /\                              /\
                  /__\                            /__\
                 /\  /\                          /\  /\
                /__\/__\                        /__\/__\
               /\      /\                      /\      /\
              /__\    /__\                    /__\    /__\
             /\  /\  /\  /\                  /\  /\  /\  /\
            /__\/__\/__\/__\                /__\/__\/__\/__\
           /\              /\              /\              /\
          /__\            /__\            /__\            /__\
         /\  /\          /\  /\          /\  /\          /\  /\
        /__\/__\        /__\/__\        /__\/__\        /__\/__\
       /\      /\      /\      /\      /\      /\      /\      /\
      /__\    /__\    /__\    /__\    /__\    /__\    /__\    /__\
     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\
    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\

コード カウントには、入力/出力 (つまり、完全なプログラム) が含まれます。

4

21 に答える 21

27

J

標準入力から読み取る 46 文字。

(,.~,~[,.~' '$~#,#)^:(<:".1!:1]3)' /\',:'/__\'

\nは常に文を区切るため、S 3内に収めることができませんでした (操作できるのは 54 文字のみ)。S 4は 162 で少し大きいので、パッドを入れてフィットさせました。Serendipitously/\は法的な副詞です。☺

               /\
              i=:3
             /\ /\
            %r=:1!:1
           /\ /\
          t=:] [r+i
         /\ /\ /\ /\
        b=:' /\',:'/__\'
       /\ /\
      i=:1 -".t
     /\ /\ /\ /\
    h=:(''$ ~#,#),.]
   /\ /\ /\ /\
  s=:( h^:1 ,d=: ,.~)
 /\ /\ /\ /\ /\ /\ /\ /\
(,,&(10{a.)"1[s^:(-i)b)(1!:2)(4)
于 2009-11-13T03:14:47.160 に答える
24

遅れてすみません。これは、A. Rex の Perl ソリューションに基づいています。

                           &I                               
                          ;for                              
                         $x  (2                             
                        ..<>){$E                            
                       .=      $E                           
                      ;my$    y;3*                          
                     33  +3  **  3;                         
                    s".+"$y.=$n.$&x2                        
                   ,$              E.                       
                  $&.$            E"ge                      
                 ;;  $_          .=  $y                     
                }print;;        sub I{($                    
               E,      $n      ,$      F,                   
              $B,$    U)=(    $",$    /,qw                  
             (/   \   _  ))  ;$  _=  $E  .$                 
            F.$B.$E.$n.$F.$U.$U.$B};33333333                
于 2009-11-13T21:31:31.790 に答える
20

ゴルフスクリプト - 46

' /\ /__\ '4/{).+: ;.{ \ ++}%\{.+}%+~ ]}@~(*n*

ゴルフスクリプト - 47

' /\ /__\ '4/): ;{  +: ;.{ \ ++}%\{.+}%+}@~(*n*

ゴルフスクリプト - 48

' ': '/\ /__\\'+4/{2 *: ;.{ \ ++}%\{.+}%+}@~(*n*

ゴルフスクリプト - 51

~' ': '/\ /__\\'+4/\(,{;2 *: ;.{ \ ++}%\{.+}%+}%;n*

私の短いpython(およびruby)の回答と同じアルゴリズム

ゴルフスクリプト - 78

2\~(?,{-1*}$1: ;{"  ":$*. 2base.{[$$+' /\ ']=}%n+@@{[$$+"/__\\"]=}%n .2*^: ;}%

私の長いpythonソリューションと同じアルゴリズム

これには重要な改行があります

2\~(?,{-1*}$1: ;{"  ":
*. 2base.{[
2*' /\ ']=}%n+@@{[
2*"/__\\"]=}%n .2*^: ;}%
于 2009-11-13T04:46:14.580 に答える
16

ゴー、273文字

package main
import(f"fmt";"os";s"strconv";)func main(){var
t=[2]string{" /\\ ","/__\\"};
n,_:=s.Atoi(os.Args[1]);a:=1;N:=a<<uint(n);for
N>0{N-=2;for
k:=0;k<2;k++{for
j:=0;j<N;j++{f.Print(" ")}b:=a;for
b>0{o:=t[k];if
b&1==0{o="    "}f.Print(o);b>>=1}f.Print("\n")}a^=a*2}}

空白はすべて重要です。

で最小化解除gofmt sierpinski-3.go | perl -p -e's/\t/ /g':

package main

import (
    "fmt";
    "os";
    "strconv";
)

func main() {
    var t = [2]string{" /\\ ", "/__\\"};
    n, _ := strconv.Atoi(os.Args[1]);
    a := 1;
    N := a << uint(n);
    for N > 0 {
        N -= 2;
        for k := 0; k < 2; k++ {
            for j := 0; j < N; j++ {
                fmt.Print(" ")
            }
            b := a;
            for b > 0 {
                o := t[k];
                if b&1 == 0 {
                    o = "    "
                }
                fmt.Print(o);
                b >>= 1;
            }
            fmt.Print("\n");
        }
        a ^= a * 2;
    }
}

ここで囲碁ゴルフの良いヒントが得られました。

于 2009-11-13T05:04:06.433 に答える
10

パイソン - 102

a=" /\ ","/__\\"
j=' '
for n in~-input()*j:j+=j;a=[j+x+j for x in a]+[x*2for x in a]
print"\n".join(a)

パイソン - 105

a=" /\ ","/__\\"
j=' '
for n in(input()-1)*j:j+=j;a=[j+x+j for x in a]+[x+x for x in a]
print"\n".join(a)

パイソン - 109

a=" /\ ","/__\\"
for n in range(1,input()):j=' '*2**n;a=[j+x+j for x in a]+[x+x for x in a]
print"\n".join(a)

Python2.6 - 120

N=1<<input()
a=1
while N:
 N-=2
 for s in" /\ ","/__\\":print' '*N+bin(a)[2:].replace('0',' '*4).replace('1',s)
 a=a^a*2
于 2009-11-13T03:14:11.457 に答える
9

パール、82ストローク

このバージョンでは、末尾の改行が出力されなくなりました。最初の改行だけが必要です:

$_=' /\ 
/__\\';
for$x(2..<>){
my$y;
$".=$";
s#.+#$y.=$/.$&x2,$".$&.$"#ge;
$_.=$y
}
print

コマンド ライン スイッチが許可されている場合、従来の Perl ゴルフ スコアリングでは、これは 77+3 ストロークになります (最初の改行は文字どおりです)。

#!perl -p
$\=' /\ 
/__\\';
$y="",
$".=$",
$\=~s#.+#$y.=$/.$&x2,$".$&.$"#ge,
$\.=$y
for 2..$_

改善が見られた場合は、お気軽に私の回答を編集してください。

于 2009-11-13T05:44:50.670 に答える
8

Haskell、153 149 137 125 118 112 文字:

末尾再帰の使用:

(%)=zipWith(++)
p="  ":p
g t _ 1=t
g t s(n+1)=g(s%t%s++t%t)(s%s)n
main=interact$unlines.g[" /\\ ","/__\\"]p.read

以前のバージョン、@118 文字:

(%)=zipWith(++)
f 1=[" /\\ ","/__\\"]
f(n+1)=s%t%s++t%t where t=f n;s=replicate(2^n)' ':s
main=interact$unlines.f.read

(当然非推奨です!) n+k パターンを使用すると、 4 文字節約できました。

圧縮された状態でも中途半端に読めるようになるところが気に入っています。

編集:古いメイン

main=do{n<-getLine;putStr$unlines$f$read n}
于 2009-11-13T03:34:53.960 に答える
7

パール

改行を除くと94文字。

$c=2**<>;$\=$/;for$a(0..--$c){print$"x($c-$a&~1),
map$_*2&~$a?$"x4:$a&1?'/__\\':' /\ ',0..$a/2}
于 2009-11-13T04:31:20.343 に答える
7

ルビー — 85

a=' /\ ','/__\\'
j=' '
2.upto(gets.to_i){j+=j;a=a.map{|x|j+x+j}+a.map{|x|x+x}}
puts a


101文字 — /\-Rosetta Code から修正されたソリューション

(a=2**gets.to_i).times{|y|puts" "*(a-y-1)+(0..y).map{|x|~y&x>0?'  ':y%2>0?x%2>0?'_\\':'/_':'/\\'}*''}
于 2009-11-13T06:45:37.320 に答える
4

ロゴ (要件を完全に満たしていない): 47 文字

to F:n if:n[repeat 3[F(:n-1)fd 2^:n rt 120]]end

これはhttp://www.calormen.com/Logo/でのみテストしたので、移植可能かどうかはわかりません。要件を満たしていませんが、ロゴはここで適切な言語でなければなりませんか? :) この記事を書いている時点で、ロゴがゴルフスクリプトと J に匹敵する 1 文字足りないのが気に入っています。

于 2009-11-16T22:36:21.033 に答える
4

MATLAB - 64 文字 (スクリプト バージョン)

Nこれは、変数がワークスペースで既に定義されていることを前提としています。

A=[' /\ ';'/__\'];for i=1:N-1,B=32*ones(2^i);A=[B A B;A A];end;A

MATLAB - 78 文字 (m ファイル関数バージョン)

N関数に引数として渡しますs:

function A=s(N),A=[' /\ ';'/__\'];for i=1:N-1,B=32*ones(2^i);A=[B A B;A A];end
于 2009-11-13T14:55:09.953 に答える
4

Python、135 文字

S=lambda n:[" /\\ ","/__\\"]if n==1 else[" "*(1<<n-1)+x+" "*(1<<n-1)for x in S(n-1)]+[x+x for x in S(n-1)]
for s in S(input()):print s
于 2009-11-13T02:46:03.160 に答える
4

C

Perlの回答と同じアルゴリズムですが、必要な文字数が 131 と重くなります。

a,b;main(c,v)char**v;{c=1<<atoi(v[1]);for(a=0;a<c;a++,puts(""))
for(b=c;b--;write(1,b&~a?"    ":a&1?"/__\\":" /\\ ",4-2*(b>a)))--b;}

UNIX APIだと思っていwrite(1,…)ましたが、これは Windows でもコンパイルおよび実行されるようです。

で置き換えると、1 文字節約され、引き続き機能しますが、合法性に問題がありますcharint

于 2009-11-13T05:48:25.273 に答える
2

ヌロフ、542

$ nroff -rn=5 file.n

.pl 1
.nf
.de b
. nr i 0
. while d\\$1\\ni \{\
.   \\$3 \\$1\\ni \\$2\\ni
.   nr i +1
. \}
..
.de push
. nr i 0
. while d\\$2\\ni \{\
.   nr i +1
. \}
. nr j 0
. while d\\$1\\nj \{\
.   ds \\$2\\ni \&\\*[\\$1\\nj]
.   nr i +1
.   nr j +1
. \}
..
.ds l0 \& /\[rs] \&
.ds l1 "/__\[rs]
.ds s \&\ 
.de o
. ds \\$2 \&\\*s\\*[\\$1]\\*s
..
.de p
. ds \\$2 \&\\*[\\$1]\\*[\\$1]
..
.de assign
. ds \\$2 \&\\*[\\$1]
..
.nr a 2
.while \na<=\nn \{\
. ds s \&\*s\*s
. b l m o
. b l n p
. b m l assign
. push n l
. nr a +1
.\}
.de t
\\*[\\$1]
..
.b l zz t
于 2009-11-14T08:34:33.390 に答える
2

ルア、139文字

t={" /\\ ","/__\\"}for i=2,(...)do for j=1,#t do
t[#t+1]=t[j]:rep(2)k=(" "):rep(#t[j]/2)t[j]=k..t[j]..k end end
print(table.concat(t,"\n"))
于 2009-11-13T04:35:32.440 に答える
1

Python、120文字(再帰的ソリューション)

S=lambda n:n<2and[" /\ ","/__\\"]or[" "*n+x+" "*n for x in S(n/2)]+[x+x for x in S(n/2)]
print"\n".join(S(1<<input()-1))

@fserbが中断したところからグリーンをつけ始めました...

于 2009-11-13T09:37:56.727 に答える
1

F#、225文字

let rec p n=if n=1 then" "else p(n-1)+p(n-1)
and S n=if n=1 then[" /\\ ";"/__\\"]else let s=S(n-1)in List.append(List.map(fun s->p(n)+s+p(n))s)(List.map(fun x->x+x)s)
for s in S(int(System.Console.ReadLine()))do printfn"%s"s
于 2009-11-13T02:29:21.407 に答える
1

GolfScript ( 45 44 文字)

~(' /\ /__\ '4/)@{.+\.{[2$.]*}%\{.+}%+\}*;n*

ニブラーのソリューションに似ています。私の最初の試みはすでにかなり似ていたので、彼を見ていくつかのアイデアを借りました。

于 2012-06-12T15:01:25.197 に答える
1

Clojure: 174 文字

上記の他から盗まれたアルゴリズム。

(doseq[q((fn f[n](if(= n 1)[" /\\ ""/__\\"])let[z(f(dec n))](concat(map #(let [y(repeat(Math/pow 2(dec n))\ )](apply str(concat y % y)))z)(map str zz)))))(read))](println q))

これらの文字のうち 38 文字は括弧です。: (

(doseq [q ((fn f [n]
           (if (= n 1)
             [" /\\ " "/__\\"]
             (let [z (f (dec n))]
               (concat
                (map #(let [y (repeat (Math/pow 2 (dec n))\ )]
                        (apply str (concat y % y))) z)
                (map str z z))))) (read))] 
  (println q))
于 2009-11-13T05:52:42.653 に答える
0

Python、186 文字 (UNIX ライン ターミネーション)

for j in range(1,n):
 for s in p:
  print s
 x=2**j;y=2*x;p.extend(['']*x)
 for i in range(y-1,-1,-1):
  if i<x:
   s=' '*x;p[i]=s+p[i]+s
  else:
   q=p[i-x];p[i]=q+q
于 2009-11-13T04:01:13.163 に答える
0

プロローグ、811 文字

:- module(sierpinsky, [draw/1]).

% draw(+Level)
draw(N) :- K is 2^(N+1)-1,
  for(Line, 0, K),
  draw2(N, Line, true, nl),
  fail.
draw(_).

% draw2(+Level, +Line, +Before, +After)
draw2(0, 0, Before, After) :- !,
  Before, write(' /\\ '), After.
draw2(0, 1, Before, After) :- !,
  Before, write('/__\\'), After.
draw2(N, Line, Before, After) :- N>0, K is 2^N, Line < K, !, M is N-1,
  draw2(M, Line, (Before, tab(K)), (tab(K), After)).
draw2(N, Line, Before, After) :- N>0, K is 2^N, Line >= K, !, M is N-1,
  Line2 is Line - K,
  draw2(M, Line2, Before, draw2(M, Line2, true, After)).

% for(+Variable, +Integer, +Integer)
for(V, N, M) :- N =< M, V = N.
for(V, N, M) :- N < M, K is N+1, for(V, K, M).

% tab(+Integer)
tab(N) :- for(_, 1, N), write(' '), fail.
tab(_).
于 2014-04-02T18:22:59.843 に答える