48

これは、このスレッドに触発された/引用されたものです:http: //www.allegro.cc/forums/thread/603383

問題

ユーザーが1から7の範囲の数値入力を提供するとします。入力はコンソールから取得する必要があります。引数はあまり望ましくありません。

入力が1の場合、以下を出力します。

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

1より大きい値は、上記のパターンで終わるパターンの倍数を生成する必要がありますが、対称的にスタックされます。たとえば、3は次のように出力する必要があります。

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

裏面も印刷するとボーナスポイント。

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

言語ごとに1つの答えを維持して、私たち全員が改善できるようにすることはできますか?

4

23 に答える 23

38

アセンブラ、165 バイト アセンブル済み

ビルド手順

  1. ここからA86をダウンロード
  2. A86 実行可能ファイルへの参照を DOS 検索パスに追加します。
  3. 以下のコードをテキスト ファイルに貼り付けます (例: triforce.asm)
  4. アセンブラを呼び出します。a86 triforce.asm
  5. これにより、.COM ファイルが作成されます。triforce.com
  6. 入力triforceして実行

これは、標準の WinXP DOS ボックス ([スタート] -> [プログラム] -> [アクセサリ] -> [コマンド プロンプト]) を使用して開発されました。他の DOS エミュレーターでも動作するはずです。

A86 を使用して組み立て、作成した .COM ファイルを実行するには WinXP DOS ボックスが必要です。'q' を押して終了し、キー 1 ~ 7 を押して出力を描画します。

  l20:mov ah,7
      int 21h
      cmp al,'q'
      je ret
      sub al,'0'
      cmp al,1
      jb l20
      cmp al,7
      ja l20
      mov [l0-1],al
      mov byte ptr [l7+2],6
      jmp $+2
      mov ah,2
      mov ch,0
      mov bh,3
   l0:mov bl,1
   l1:mov dh,0
   l3:cmp dh,ch
      je l2
      mov dl,32
      int 21h
      inc dh
      jmp l3
      ret
   l2:mov dh,bh
   l6:mov cl,12
   l5:mov dl,42
      cmp cl,bl
      ja l4
      mov dl,32
      cmp dh,1
      je l21
   l4:int 21h
      dec cl
      jnz l5
  l21:dec dh
      jnz l6
      mov dl,10
      int 21h
      mov dl,13
      int 21h
  l10:inc ch
   l9:add bl,2
   l7:cmp ch,6
      jne l1
  l13:add byte ptr [l7+2],6
  l11:dec bh
  l12:cmp bh,0
      jne l0
      xor byte ptr [l0+1],10
      xor byte ptr [l9+1],40
      xor byte ptr [l10+1],8
      xor byte ptr [l13+1],40
      sub byte ptr [l7+2],12
      mov dh,[l0-1]
      inc dh
      xor [l12+2],dh
      xor byte ptr [l11+1],8
      xor byte ptr [l1+1],1
      inc bh
      cmp byte ptr [l0+1],11
      je l0
      jmp l20

トライフォースとそのミラーを実行するために多くの自己変更コードを使用し、自己変更コードを変更します。

于 2010-03-09T11:17:12.027 に答える
23

GolfScript-43文字

~:!6*,{:^' '
 *'*'12*' '
  ^6%.+)*+
   -12>!^
    6/-*
     n}
     /

~:!6*,{:^' '*'*'12*' '^6%.+)*+-12>!^6/-*n}/

ボーナスのための48文字

~:!6*,.-1%+{
 :^' '*'*'12
  *' '^6%.+
   )*+-12>
    !^6/-
     *n}
      /

~:!6*,.-1%+{:^' '*'*'12*' '^6%.+)*+-12>!^6/-*n}/
于 2010-03-09T09:33:52.947 に答える
17

Python - 77 文字

n=input()
for k in range(6*n):print' '*k+('*'*12+' '*(k%6*2+1))[-12:]*(n-k/6)

n=input()
for k in range(6*n):j=1+k%6*2;print' '*k+('*'*(12-j)+' '*j)*(n-k/6)

ボーナス用の89文字

n=input();R=range(6*n)
for k in R+R[::-1]:print' '*k+('*'*11+' '*11)[k%6*2:][:12]*(n-k/6)

文字列の置換のみを使用した114文字のバージョン

u,v=' *';s=(v*11+u)*input()
while s.strip():print s;s=u+s.replace(*((v*2+u,u*3),(v*1+u*10,v*11))[' * 'in s])[:-2]

Unk Charsはすべて 1 つのステートメントで、2.x および 3.x で動作するはずです。enumerate() は、単一の input() を使用する必要がある両方の場所で機能できるようにすることです。

print ('\n'.join('\n'.join(((' '*(6*n))+' '.join(('%s%s%s'%(' '*(5-x),'*'*(2*x+1),' '*(5-x)) for m in range(i + 1)))) for x in range(5,-1,-1)) for n, i in enumerate(range(int(input())-1,-1,-1))))

さらに別の方法

def f(n): print '\n'.join(' '*6*(n-r)+(' '*(5-l)+'*'*(l*2+1)+' '*(5-l)+' ')*r for r in xrange(1, n+1) for l in xrange(6))
f(input())
于 2010-03-09T06:05:06.143 に答える
13

ルビー - 74 文字

(6*n=gets.to_i).times{|k|puts' '*k+('*'*(11-(j=k%6*2))+' '*(j+1))*(n-k/6)}
于 2010-03-09T11:18:36.113 に答える
12

COBOL - 385 文字

$ cobc -free -x triforce.cob && echo 7| ./triforce

PROGRAM-ID.P.DATA DIVISION.WORKING-STORAGE SECTION.
1 N PIC 9.
1 M PIC 99.
1 value '0100***********'.
2 I PIC 99.
2 K PIC 99.
2 V PIC X(22). 
2 W PIC X(99).
PROCEDURE DIVISION.ACCEPT N
COMPUTE M=N*6
PERFORM M TIMES
DISPLAY W(1:K)NO ADVANCING
PERFORM N TIMES
DISPLAY V(I:12)NO ADVANCING
END-PERFORM
DISPLAY ''
ADD 2 TO I
IF I = 13 MOVE 1 TO I ADD -1 TO N END-IF
ADD 1 TO K
END-PERFORM.

K は、グループ レベルの外に戻すことができます。VALUE 句のない数値のゼロの初期値は、英数字フィールドのスペースの初期値と同様に、コンパイラの実装に依存します (W は、余分な文字コストなしでこれを解決しました)。K を戻すと、2 文字節約できます。-free もコンパイラに依存するため、おそらくうるさいです。

于 2010-03-10T03:53:01.610 に答える
9

sed、117 文字

s/$/76543210/
s/(.).*\1//
s/./*********** /gp
:
s/\*(\**)\*/ \1 /gp
t
:c
s/\* {11}\*/ ************/
tc
s/\*  /   /p
t

使用法:$ echo 7 | sed -rf this.sed

最初の試み; 改善される可能性はありますが…

于 2010-03-09T14:05:46.633 に答える
7

Ruby 1.9-84文字:

v=gets.to_i
v.times{|x|6.times{|i|puts' '*6*x+(' '*i+'*'*(11-2*i)+' '*i+' ')*(v-x)}}
于 2010-03-09T06:51:10.360 に答える
7

Perl - 72 文字

die map$"x$_.("*"x(12-($l=1+$_%6*2)).$"x$l)x($n-int$_/6).$/,0..6*($n=<>)

78文字

map{$l=$_%6*2;print$"x$_,("*"x(11-$l).$"x$l.$")x($n-int$_/6),$/}0..6*($n=<>)-1

87文字

$n=<>;map{$i=int$_/6;$l=$_%6*2;print$"x$_,("*"x(11-$l).$"x$l.$")x($n-$i),$/}(0..6*$n-1)

97文字

$n=<>;map{$i=int$_/6;$l=$_%6;print$"x(6*$i),($"x$l."*"x(11-2*$l).$"x$l.$")x($n-$i),$/}(0..6*$n-1)

108文字

$n=<>;map{$i=int$_/6;$l=$_%6;print ""." "x(6*$i),(" "x$l."*"x(11-2*$l)." "x$l." ")x($n-$i),"\n";}(0..6*$n-1)
于 2010-03-09T08:51:58.587 に答える
6

Powershell、78 文字

0..(6*($n=read-host)-1)|%{" "*$_+("*"*(12-($k=1+$_%6*2))+" "*$k)*(.4+$n-$_/6)}

おまけ、92文字

$a=0..(6*($n=read-host)-1)|%{" "*$_+("*"*(12-($k=1+$_%6*2))+" "*$k)*(.4+$n-$_/6)}
$a
$a|sort

出力は文字列の配列 に格納され、$aその逆は配列をソートすることによって作成されます。もちろん、配列を逆にすることもできますが、入力する文字数が多くなります:)

于 2010-03-09T22:11:12.780 に答える
5

Haskell - 131 138 142 143文字

(⊗)=replicate
z o=[concat$(6*n+m)⊗' ':(o-n)⊗((11-m-m)⊗'*'++(1+m+m)⊗' ')|n<-[0..o-1],m<-[0..5]]
main=getLine>>=mapM_ putStrLn.z.read

これは現在、より長い (146 148文字) ですが、興味深い別の攻撃方法です。

(⊗)=replicate
a↑b|a>b=' ';_↑_='*'
z o=[map(k↑)$concat$(6*n)⊗' ':(o-n)⊗"abcdefedcba "|n<-[0..o-1],k<-"abcdef"]
main=getLine>>=mapM_ putStrLn.z.read
于 2010-03-09T06:45:14.247 に答える
5

FORTRAN - 97 文字

#define暗黙のループのおかげで、 を取り除き、 8 バイトを節約しました!

$ f95 triforce.f95  -o triforce && echo 7 | ./triforce

READ*,N
DO K=0,N*6
M=2*MOD(K,6)
PRINT*,(' ',I=1,K),(('*',I=M,10),(' ',I=0,M),J=K/6+1,N)
ENDDO
END

おまけに125バイト

READ*,N
DO L=1,N*12
K=L+5
If(L>N*6)K=N*12-L+6
M=2*MOD(K,6)
PRINT"(99A)",(32,I=7,K),((42,I=M,10),(32,I=0,M),J=K/6,N)
ENDDO
END

FORTRAN - 108 文字

#define R REPEAT
READ*,N
DO I=0,6*N
J=MOD(I,6)*2
PRINT*,R(' ',I)//R(R('*',11-J)//R(' ',J+1),N-I/6)
ENDDO
END
于 2010-03-09T10:19:30.360 に答える
4

JavaScript 1.8 - SpiderMonkey - 118 文字

N=readline()
function f(n,c)n>0?(c||' ')+f(n-1,c):''
for(i=0;i<N*6;i++)print(f(i)+f(N-i/6,f(11-(z=i%6*2),'*')+f(z+1)))

ボーナス付き - 151 文字

N=readline()
function f(n,c)n>0?(c||' ')+f(n-1,c):''
function l(i)print(f(i)+f(N-i/6,f(11-(z=i%6*2),'*')+f(z+1)))
for(i=0;i<N*6;i++)l(i)
for(;i--;)l(i)

使用法:js thisfile.js

JavaScript - ブラウザ内 - 154 文字

N=prompt()
function f(n,c){return n>0?(c||' ')+f(n-1,c):''}
s='<pre>'
for(i=0;i<N*6;i++)s+=f(i)+f(N-i/6,f(11-(z=i%6*2),'*')+f(z+1))+'\n'
document.write(s)

難読化されていないバージョン (gnarf による最適化前):

var N = prompt();
var S = ' ';

function fill(c, n) {
    for (ret=''; n--;)
        ret += c;
    return ret;
}

var str = '<pre>';

for (i=0; i<N*6; i++) {
    str += fill(S, i);
    for (j=0; j<N-i/6; j++)
        str += fill('*', 11-i%6*2) + fill(S, i%6*2+1);
    str += '\n';
}

document.write(str);

これは、replace() を使用して、三角形の行の各行のある行から次の行に移動する別のアルゴリズムです。

161文字

N=readline()
function f(n,c){return n>0?(c||' ')+f(n-1,c):''}l=0
for(i=N;i>0;){r=f(i--,f(11,'*')+' ');for(j=6;j--;){print(f(l++)+r)
r=r.replace(/\*\* /g,'   ')}}
于 2010-03-09T08:04:03.487 に答える
4

F#、184 181 167 151 147 143 142133文字

let N,r=int(stdin.ReadLine()),String.replicate
for l in[0..N*6-1]do printfn"%s%s"(r l" ")(r(N-l/6)((r(11-l%6*2)"*")+(r(l%6*2+1)" ")))

ボーナス、215 212 198 166 162 158 157148文字

let N,r=int(stdin.ReadLine()),String.replicate
for l in[0..N*6-1]@[N*6-1..-1..0]do printfn"%s%s"(r l" ")(r(N-l/6)((r(11-l%6*2)"*")+(r(l%6*2+1)" ")))
于 2010-03-09T23:28:00.577 に答える
3

C-177183文字

#define P(I,C)for(m=0;m<I;m++)putchar(C)
main(t,c,r,o,m){scanf("%d",&t);for(c=t;c>0;c--)for(r=6;r>0;r--){P((t-c)*6+6-r,32);for(o=0;o<c;o++){P(r*2-1,42);P(13-r*2,32);}puts("");}}

C-222243文字(ボーナスポイント付き)

#define P(I,C)for(m=0;m<I;m++)putchar(C)
main(t,c,r,o,m){scanf("%d",&t);for(c=t-1;-c<2+t;c-=1+!c)for(r=c<0?1:6;c<0?r<7:r>0;r+=c<0?1:-1){P((t-abs(c+1))*6+6-r,32);for(o=0;o<abs(c+1);o++){P(r*2-1,42);P(13-r*2,32);}puts("");}}

これは私の最初のコードゴルフの提出でもあります!

于 2010-03-09T07:27:49.017 に答える
2

Mathematica、46文字

答えは横に印刷されます。

TableForm@{Table["*",{l,#},{l},{j,6},{2j-1}]}&
于 2011-03-22T13:44:38.843 に答える
2

ルア、121文字

R,N,S=string.rep,io.read'*n',' 'for i=0,N-1 do for j=0,5 do X=R(S,j)print(R(S,6*i)..R(X..R('*',11-2*j)..X..S,N-i))end end

123

R,N,S=string.rep,io.read'*n',' 'for i=0,N-1 do for j=0,5 do print(R(S,6*i)..R(R(S,j)..R('*',11-2*j)..R(S,j)..S,N-i))end end
于 2010-03-09T14:27:40.340 に答える
2

DC 105 文字

123 129 132 139 141

[rdPr1-d0<P]sP?sn
0sk[1lk6%2*+sj32lkd0<Plnlk6/-si
[[*]12lj-d0<P32ljd0<Pli1-dsi0<I]dsIx
10Plk1+dskln6*>K]dsKx
于 2010-03-09T08:45:38.163 に答える
2

Cで書かれた

ボーナスポイント (492 文字):

p(char *t, int c, int s){int i=0;for(;i<s;i++)printf("      ");for(i=0;i<c;i++)printf("%s",t);printf("\n");}main(int a, char **v){int i=0;int k;int c=atoi(v[1]);for(;i<c;i++){p("*********** ",c-i,i);p(" *********  ",c-i,i);p("  *******   ",c-i,i);p("   *****    ",c-i,i);p("    ***     ",c-i,i);p("     *      ",c-i,i);}for(i=0;i<c;i++){k=c-i-1;p("     *      ",1+i,k);p("    ***     ",1+i,k);p("   *****    ",1+i,k);p("  *******   ",1+i,k);p(" *********  ",1+i,k);p("*********** ",i+1,k);}}

ボーナス ポイントなし (322 文字):

p(char *t, int c, int s){int i=0;for(;i<s;i++)printf("      ");for(i=0;i<c;i++)printf("%s",t);printf("\n");}main(int a, char **v){int i=0;int k;int c=atoi(v[1]);for(;i<c;i++){p("*********** ",c-i,i);p(" *********  ",c-i,i);p("  *******   ",c-i,i);p("   *****    ",c-i,i);p("    ***     ",c-i,i);p("     *      ",c-i,i);}}

こちらも初投稿!

于 2010-03-09T08:51:30.193 に答える
1

ハイパートーク - 272 文字

function triforce n
    put"******" into a
    put n*6 into h
    repeat with y=0 to h-1
        put"   " after s
        put char 1 to y of s after t
        repeat n-y div 6
            get y mod 6*2
            put char 1 to 11-it of (a&a)&&char 1 to it of s after t
        end repeat
        put return after t
    end repeat
    return t
end triforce

インデントは不要で、カウントもされません (HyperCard が自動的に追加します)。

その他:

HyperCard 2.2 (私が知っている) にはコンソールの概念やコンソール引数にアクセスする方法がないため、代わりに関数が提供されます。次の方法で呼び出すことができます。

on mouseUp
    ask "Triforce: "
    put triforce(it) into card field 1
end mouseUp

これを使用するには、カード フィールドを作成し、固定幅フォントに設定します。HyperCard の answer コマンドを使用すると、テキストを含むダイアログが表示されますが、次の理由で機能しません。

  • 回答ダイアログのフォント (シカゴ) は固定幅ではありません。
  • answer コマンドは、長いテキストの表示を拒否します (triforce(2) が長すぎる場合でも)。
于 2010-03-11T06:03:11.050 に答える
0

gnibbler に基づく 77 文字の代替 python ソリューション:

n=input()
k=0
exec"print' '*k+('*'*12+' '*(k%6*2+1))[-12:]*(n-k/6);k+=1;"*6*n

驚いたことに、ボーナスもまったく同じでした(101文字、まあ)

n=input()
l=1
k=0
s="print' '*k+('*'*12+' '*(k%6*2+1))[-12:]*(n-k/6);k+=l;"*6*n
exec s+'l=-1;k-=1;'+s
于 2010-03-10T09:43:32.733 に答える