61

チャレンジ

ユーザー入力に従って、再生レンガ タワー シリーズを出力する、文字数による最短コード。

入力は、インデックスに続く現在のキューブ タワーの高さを表す一連の数値 (正、負、ゼロ) になります。高さ 0 は、タワーがなく、間隔があることを意味します。

立方体タワーは、立方体を積み重ねて構成されています。現在のインデックスの入力数値が正の場合、キューブは上昇し、入力数値が負の場合、キューブは下降します。次の 4 行を使用して、1 つの立方体が描画されます。

   __
 /__ /|
| | | | | |
|___|/

立方体は 3D です。つまり、2 つの塔を隣り合わせに配置すると、立方体が互いに隠れて、偽の遠近法が生成されます。

すべての入力は有効でエラーがないと見なすことができます - 各数値は空白で区切られ、1 行に 1 つ以上の数値が含まれます。

テストケース

入力:
    2 -3 -2 1 2 -1
出力:
       __ __
     /__ /| /__ /|
    | | | | | | _| | | | |
    |___|/| /__|___|/|
    | | | | |__ _| | | | | |__
    |___|/__ /__|___|___|/__ /|
        | | | | | | | | | | | | | |
        |___|___|/| |___|/
        | | | | | | | |
        |___|___|/
        | | | | | |
        |___|/

入力:
    1 2 3 4 -2 4 3 2 1
出力:
                   __ __
                 /__ /| /__ /|
               _| | | | | | | | | |__
             /__|___|/| |___|/__ /|
           _| | | | | | | | | | | | | |__
         /__|___|___|/| |___|___|/__ /|
       _| | | | | | | | | | | | | | | | | |__
     /__|___|___|___|/| |___|___|___|/__ /|
    | | | | | | | | | | |_| | | | | | | | | | |
    |___|___|___|___|/__|___|___|___|___|/
                    | | | | | |
                    |___|/|
                    | | | | | |
                    |___|/

入力:
    1 3 3 7 0 -2 -2
出力:
                   __
                 /__ /|
                | | | | | |
                |___|/|
                | | | | | |
                |___|/|
                | | | | | |
                |___|/|
           __ _| | | | |
         /__ /__|___|/|
        | | | | | | | | | |
        |___|___|___|/|
       _| | | | | | | | |
     /__|___|___|___|/|
    | | | | | | | | | | | | __ __
    |___|___|___|___|/ /__ /__ /|
                        | | | | | | | |
                        |___|___|/|
                        | | | | | | | |
                        |___|___|/

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

4

13 に答える 13

40

パール 157 文字

このエントリは、キューブのコードへの埋め込みに関する部分を含め、gnibbler の Ruby エントリに触発されました。また、 の 4 arg バージョンについて教えてくれた Kinopiko にも感謝しsubstrます。

@O=($/.$"x99)x99;map{for$n(0..$_-1,$_..-1){map{substr$O[50-2*$n+$_],$W+4/$_,6,
(_,"__"
,"/__ /|",
"|   | |",
"|___|/")[$_]}1..4}$W+=4}@ARGV;print grep/\S/,@O

説明:

行 1: 立方体の移動先を選択
行 2-5: 立方体の移動先に立方体を置き、印刷

于 2009-10-23T07:00:00.640 に答える
39

ルビー - 233

変更可能な文字列 ;) 恣意的な「99」制限はありません。pfft :p
ただし、ソース内の立方体の画像を失う必要がありました

S=gets.split.map{|x|x.to_i}<<0
S.max.downto(S.min){|y|e=" ";q=e*3;r=e*3
S.map{|x|a=0,x;if(w=a.min)<=y&&x!=0&&y<z=a.max
r[-3,4]="|   | |";q[-3,4]="|___|/"+(y>w ?"|":e)else(z=z!=y)?q+=e*4:q[-2,4]="/__ /|"
r+=z ?e*4:"__  "end}
puts r,q}

ルビー - 243

立方体の素敵な写真を得るためにそこに入れた余分なスペースを削除します

S=gets.split.map{|x|x.to_i}<<0
S.max.downto(S.min){|y|e=" ";q=e*3;r=e*3
S.map{|x|a=0,x;if(w=a.min)<=y&&x!=0&&y<=z=a.max
if z==y;r+="__  "
 q[-2,3]="/__ /|"else
r[-3,4]="|   | |"
q[-3,4]="|___|/"+(y>w ?e:"|")end
else r+=e*4;q+=e*4 end}
puts r,q}
$ echo 1 3 7 3 3 |ruby pc.rb
           __              
         /__ /|            
        | | | | | |            
        |___|/|            
        | | | | | |            
        |___|/|            
        | | | | | |            
        |___|/|            
       _| | | |__ __      
     /__|___|/__ /__ /|    
    | | | | | | | | | | | |    
    |___|___|___|___|/|    
   _| | | | | | | | | | |    
 /__|___|___|___|___|/|    
| | | | | | | | | | | | | |    
|___|___|___|___|___|/  
于 2009-10-23T05:21:38.670 に答える
6

Befunge-93(文字が多すぎます)

非常に最適化されていません。私の最初のBefungeプログラム。=]

>〜:88 + `v6> 11p> :! | v g13 $ <v $ <
 000090#8 + >> 68 * 31p v> 1-:! |!:-1g14 <p + g11g13 + g12g 14 <
   __:* * 5 ^ <> 31pvvp16 <>:41p1- 31g1 + g:68 *-!#^ _ ^
 / __ / || \-6 >> 1-:| ^ 8 <$ <| `g16 $ <<
| | |>-* 8 ^ ^ p11-2g11-1 $ <> 31g 11g + ::: 51g` | 1
| ___ | / 8 ^ 0>#-#<v ^ <> 51p ^
        << | `0:p 56 p34:p30:p26:p25:p22:p21:p20:* 68 <
^ v95:<6 ^ * 2:* -10 <> 21g4 + 21p 11
1> *-| >> 31g51gg、31g21g-3-!#v_v
1> $ ^ v <| 、+ 55-g16p15 + 1:g15 <
|!-* 48 <〜> ^ ^ p13 + 1g13 <
> ^ @
于 2009-10-25T17:02:17.723 に答える
6

ルビー、261 258 250 242

c=[]
n=99
$F.map{|e|e=e.to_i
c<<(e<0?[e,-1]:[0,e-1])}
m=[]
x=0
c.map{|d|x+=4
k,l=d
(k+n..l+n).map{|y|y*=2
[[3,3,2,'__'],[2,1,6,'/__ /|'],[1,0,7,'|   | |'],[0,0,6,'|___|/']].map{|e|a,b,c,s=e
(m[y+a]||=' '*79)[x+b,c]=s}}}
puts m.compact.reverse

で実行ruby -n -a v2.rb

このエントリは、スタックを 0 だけでなく、任意のレベルで開始および終了できるという点で、少し過剰に設計されています。「競合バージョン」でこれを指定する方法はありませんが、最初の 4 行を次のように置き換えると、203c=eval $_;n=99に落ちます。バイトで、次のことができます。

[[-3,3],[-3,-2],[2,3],[-3,-3],[-2,-1],[3,3],[2,2],[1,1],[0,0]]
           __ __ __                                                  
         /__ /| /__ /| /__ /|                                                
        | | | | | | | | | | | | | | | | |__                                              
        |___|/| |___|/| |___|/__ /|                                            
        | | | | | | | | | | | | | | | | |__                                          
        |___|/| |___|/ |___|/__ /|                                        
        | | | | | | | | | | |__                                      
        |___|/| |___|/__ /|                                    
        | | | | | | __ | | | | |                                    
        |___|/| /__ /| |___|/                                     
        | | | | |__ | | | | |                                                    
        |___|/__ /| |___|/|                                                    
        | | | | | | | | _| | | | |                                                    
        |___|___|/| /__|___|/                                                     
        | | | | | | | | | | | | | |                                                        
        |___|___|/ |___|/   
于 2009-10-23T06:34:59.273 に答える
5

ゴルフスクリプト - 154

改行は重要です。末尾の改行を取り除かないと、一番下に余分な数字が出力されます! と の間に TAB が-あります。0

" "4*:s%{~}%0+: $):
;0=:g;{2,{:r;s {[
-   0
-]$(:b\(:t\;=!t!0t<1b>*2*+*[{s}[{"__  "}{-2<"/__ /|"}]r={-3<["|   | |""|___|/"["| "b!=]+]r=}]\=~+}%n}%
(:
g<!}do

ゴルフスクリプト - 163

0`+" ":s%{~}%:A$):y;0=1-:g;{2,{:r;3s*A{[y- 0y-]$(:b\(:t\;=!:j;[{4s*}[{"__  "}{-2<"/__ /|"}]r={-3<["|   | |""|___|/"["| "b!=]+]r=}]0t=0t<1b>*2*+j*=~+}%n}%y(:y g>}do

ゴルフスクリプト - 165

0`+" ":s%{~}%:A$):y;0=1-:g;{2,{:r;3s*A{[y- 0y-]$(:b\(:t\;=!:j;[
{4s*}.{"__  "
}{-2<"/__ /|"}
{-3<"|   | |"}
{-3<"|___|/"["| "b!=]+}]0t=2*0t<1b>*4*+r+j*=~+}%n}%y(:y g>}do
于 2009-10-27T01:19:19.803 に答える
5

Haskell、349 文字:

r=replicate
f=foldl
k=repeat
o n a s=r n a++s++k a
main=do{a<-getLine;let{n=map read$words a;u=f max 0 n;d=f min 0 n;i=r(2*(1+u-d))$r(4*length n+3)' '};putStr$unlines$f(\j(x,n)->f(\i y->[[if a=='x'then b else a|(a,b)<-zip m n]|(m,n)<-zip(o(2*(u-y))(k 'x')$map(o(4*x)'x')["xxx__xx","x/__ /|","|   | |","|___|/x"])i])j[1+min 0 n..max 0 n])i$zip[0..]n}
于 2009-10-23T10:26:43.410 に答える
4

C、287 文字

#define F(r)for(r=0;r<98;r++)
#define C(y,s)for(k=0;s[k];k++)b[49-i][w+k+y]=s[k];i++;
char k,i,j,w,t,b[98][99];main(c,v)char**v;{F(i)F(j)b[i][j]=32;
for(j=0;j<c;j++){i=2*atoi(v[j]);t=0;if(i>0)t=i,i=0;for(;i<t;i-=2){
C(0,"|___|/")C(0,"|   | |")C(1,"/__ /|")C(3,"__")}w+=4;}F(i)puts(b[i]);}

(この文字数には 2 つの改行が含まれていません)

これは、次のようなコマンド ライン プログラムとして実行されます。

./キューブ 1 2 3 4 5 0 1 3 2 -1 -10

ここで実行してみることができます: http://codepad.org/tu4HDqSy (codepad.org ではコマンドライン引数が許可されていないため、このバージョンは変更されています)。

非ゴルフの便利なヒントは、それを実行してからcpp次のことを行うことindentです。

char                k        , i, j, w, t, b[98][99];
main(c, v)
    char          **v;
{
    for (i = 0; i < 98; i++)
        for (j = 0; j < 98; j++)
            b[i][j] = 32;
    for (j = 0; j < c; j++) {
        i = 2 * atoi(v[j]);
        t = 0;
        if (i > 0)
            t = i, i = 0;
        for (; i < t; i -= 2) {
            for (k = 0; "|___|/"[k]; k++)
                b[49 - i][w + k + 0] = "|___|/"[k];
            i++;
            for (k = 0; "|   | |"[k]; k++)
                b[49 - i][w + k + 0] = "|   | |"[k];
            i++;
            for (k = 0; "/__ /|"[k]; k++)
                b[49 - i][w + k + 1] = "/__ /|"[k];
            i++;
            for (k = 0; "__"[k]; k++)
                b[49 - i][w + k + 3] = "__"[k];
            i++;
        } w += 4;
    } for (i = 0; i < 98; i++)
        puts(b[i]);
}
于 2009-10-23T10:40:20.340 に答える
3

Python (2.6)、1092 905 623 501 478 345 --> 318 文字

すべてのコメントを歓迎します!

r=range;p="  __","/__ /|","|   | |","|___|/"
l=map(int,raw_input().split())+[0];d=max(l)
g=[[" "]*(len(l)+1)*4 for i in r(d-min(l)+1)*2]
for i,e in enumerate(l):
 for x,y in sorted([(i*4,(d-e+y-(0,1)[e<0])*2)for y in r(0,e,(1,-1)[e<0])])[::-1]:
  for i in r(4):g[y+i][(x,x+1)[i<2]:x+6]=p[i]
for k in g:print ''.join(k)
于 2009-10-23T06:17:49.760 に答える
2

VB.NET 9 の 627 バイト (改行を含まない)

Dim a As New List(Of Int32)
Dim b=InputBox("").Split(" ".ToCharArray)
For Each d In b
a.Add(Int32.Parse(d))
Next
Dim e=New String(){"|___|/","|   | |","/__ /|","__"}
Dim f=a.Min
Dim g=a.Max
Dim h=a.Count
Dim i As New List(Of String)
Dim j=(If(g>0,g,0)+If(f<0,-f,0))*2+1
For d=0To j
i.Add(Space(h*6))
Next
For d=f To g
If (d<>0) Then
For k=0To 3
Dim l=i(j)
Dim m=0
While m<h
If (d<0And a(m)<=d)Or(d>0And a(m)>=d) Then
Dim n=m*4+If(k>1,(k-2)*2+1,0)
l=l.Substring(0,n)&e(k)&l.Substring(n+e(k).Length)
i(j)=l
endif
m+=1
End While
j-=1
Next
j+=2
EndIf
Next
For Each d In i
Console.WriteLine(d)
Next
于 2009-10-23T13:34:56.447 に答える
1

ルア、453文字

s=io.read("*l")x={}for v in s:gmatch("-?%d+")do x[#x+1]=tonumber(v)end m=math
u=unpack s=string c={s.byte("   __   /__ /||###|#||___|/ ",1,28)}t=m.max(0,u(x))-1
b=m.min(0,u(x))l=#x*4+3 a={}for n=b,t do for p,v in ipairs(x)do y=n<0 and v<=n
or n>=0 and v>n for i=1,4 do e=(t-n)*2+i a[e]=a[e]or{}for j=1,7 do
d=c[(i-1)*7+j]f=(p-1)*4+j a[e][f]=y and d~=32 and d or a[e][f] or 32 end
end end end for i,v in ipairs(a)do print((s.char(u(v)):gsub("#"," ")))end
于 2009-10-23T03:49:04.973 に答える
1

Ruby の 313 バイト

c=gets.split.map{|n|n.to_i}+[0];l=[" "*(c.length*5)]*((c.max-c.min)*2+2)
c.each_index{|i|h=c[i];h==0&&next
(h<0?(h...0):(0...h)).to_a.each{|b|y=c.max*2+1-b*2;x=i*4;s=(x+7)..-1
4.times{|a|l[y-a]=l[y-a][0,x+[0,0,1,3][a]]+['|___|/','|   | |','/__ /|','__'
][a]+(l[y-a][[(x+6)..-1,s,s,s][a]]||'')}}};l.each{|e|puts e}

(カウントされない改行が 1 つあります。そうしないと非常に長い行になるため、そこにあるだけです。)

文字の 2D 配列を作成し、キューブを 1 つずつ、下から上、左から右に貼り付けるという明白な方法を使用しました。

于 2009-10-23T05:19:07.757 に答える
1

ペソ - 447 398

ここにある他のものほど短くはないことは知っていますが、満足しています;)

<?$g=$argv;unset($g[0]);$c=array('|___|/',' '=>'|   | |','/__ 
/|',3=>'__');$x=max(max($g),0);$m=$i=min(min($g),0);$row=$y=0;
while($x>=$i){$n=$row++*2;foreach ($c as $w=>$p){
$L[]=str_pad('',count($g)*4," ");$t='';$y=0;foreach ($g as $h)
{if((($h>=$i&&$i>0)||($h<$i&&$i<=0)))$L[$n]=substr_replace($L[$n],$p,4*$y+$w,
strlen($p));$y++;}$n++;}$i++;}array_splice($L,$n);krsort($L);
print implode("\n",$L);?>

入出力

   C:\development\code-golf>php cubes1.php 1 2 1 -5 -5 4 3 3
                       __
                     /__ /|
                    |   | |__  __
                    |___|/__ /__ /|
       __           |   |   |   | |
     /__ /|         |___|___|___|/|
   _|   | |__       |   |   |   | |
 /__|___|/__ /|     |___|___|___|/|
|   |   |   | |__  _|   |   |   | |
|___|___|___|/__ /__|___|___|___|/
            |   |   | |
            |___|___|/|
            |   |   | |
            |___|___|/|
            |   |   | |
            |___|___|/|
            |   |   | |
            |___|___|/|
            |   |   | |
            |___|___|/
于 2009-10-27T02:45:41.267 に答える