ブロック対角行列を印刷する


27

これは単純な、一口サイズ(バイトサイズ?)のコードゴルフです。10未満の正の整数の空でないリストが与えられると、ブロック対角行列を出力します。リストはブロックのサイズを順番に指定します。ブロックは10未満の正の整数で構成する必要があります。したがって、入力として指定された場合

[5 1 1 2 3 1]

たとえば、出力は次のようになります。

1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1

または

1 2 3 4 5 0 0 0 0 0 0 0 0
6 7 8 9 1 0 0 0 0 0 0 0 0
2 3 4 5 6 0 0 0 0 0 0 0 0
7 8 9 1 2 0 0 0 0 0 0 0 0
3 4 5 6 7 0 0 0 0 0 0 0 0
0 0 0 0 0 8 0 0 0 0 0 0 0
0 0 0 0 0 0 9 0 0 0 0 0 0
0 0 0 0 0 0 0 1 2 0 0 0 0
0 0 0 0 0 0 0 3 4 0 0 0 0
0 0 0 0 0 0 0 0 0 5 6 7 0
0 0 0 0 0 0 0 0 0 8 9 1 0
0 0 0 0 0 0 0 0 0 2 3 4 0
0 0 0 0 0 0 0 0 0 0 0 0 5

またはそのようなもの。マトリックス内の要素は(単一の)スペースで区切られ、行は(単一の)改行で区切られている必要があります。行の先頭または末尾にスペースがあってはなりません。末尾の改行を印刷する場合と印刷しない場合があります。

STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して、便利な文字列またはリスト形式で入力を取得して、関数またはプログラムを作成できます(前処理されていない限り)。ただし、たとえば、関数から返されるのではなく、結果をSTDOUT(または最も近い代替)に出力する必要があります。

ブロック対角行列を作成するために設計された組み込み関数を使用しないでください。

これはコードゴルフであるため、最短の提出(バイト単位)が優先されます。

リーダーボード

配列ベースの言語(JやAPLなど)がここで優位に立つことを期待していますが、選択した言語でできる限り人々がやろうとするのを思いとどまらせたくありません。そこで、ここに、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットがあります。それでは、後者にスポットを当ててみませんか?

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

回答:


20

J、7バイト

2バイトの改善をしてくれたFUZxxlに感謝します。

配列ベースの言語は大きな利点があるため、ここでは別の競争で数えるべきです。:)

   =/~@#<\

   (=/~@#<\) 3 1 1 2
1 1 1 0 0 0 0
1 1 1 0 0 0 0
1 1 1 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 1 0 0
0 0 0 0 0 1 1
0 0 0 0 0 1 1

別の7バイトのアプローチ:

#]=@##\

古いバージョンの説明([:=/~]#<\)

最初のステップはn、すべてのリスト要素に対して類似したもの(たとえば、数字)を生成することnです。これらは他の要素とは異なる必要があります。たとえば、自然数を使用する3 1 1 2とになり0 0 0 1 2 3 3ます。

バイトを節約するために、リストのボックス化されたプレフィックスを使用します。

   ]#<\ 3 1 1 2
┌─┬─┬─┬───┬─────┬───────┬───────┐
│3│3│3│3 1│3 1 1│3 1 1 2│3 1 1 2│
└─┴─┴─┴───┴─────┴───────┴───────┘

=/~動詞我々はこれらの箱入りのプレフィックスのデカルト製品のテーブルを作成し、各セルは次のようになります12つのエントリが等しい場合は0そうでありません。


2
括弧が[:=/~]#<\ あなたのスコアにカウントされるとは思わない。また、=/~@#<\ 余分な2バイトが削られます。
FUZxxl

「ただし、関数から返されるのではなく、結果をSTDOUT(または最も近い代替)に出力する必要があります。おそらく、明示的な入力(関数ではない)または明示的な出力のいずれかが必要です。
マリヌス

@marinus Jは、変数にバインドされていない場合、式の結果を標準出力に出力します。
FUZxxl

@FUZxxl:はい、しかし(=/~@#<\)単なる機能です。式を取得するには実際に何かに適用する必要があるため、明示的な入力(".1!:1[1)が必要になります。または、関数を送信する場合、その関数は値を返すだけでなく、実際に値を出力する必要があります(echo@または)。
マリヌス

=/~&I.­­­­­­­
ngn

11

APL、10

∘.=⍨∆/⍋∆←⎕

例:

      ∘.=⍨∆/⍋∆←⎕
⎕:
      5 1 1 2 3 1 
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1

説明:

  • ∆←⎕:入力を読み取り、に保存します。
  • ⍋∆:ソートする順列を見つける(これにより、入力の各値に一意の値が与えられます)
  • ∆/:これらの一意の値ごとに、それをN何回か繰り返します。ここNで、入力の対応する値は
  • ∘.=⍨:リスト内の各値を他の値と比較するマトリックスを作成します。

これをテストhttp://tryapl.orgするには、dfnを使用することができます。これは、{∘.=⍨⍵/⍋⍵}サイトがのすべての使用をフィルタリングするためです⎕IOそのようなものを除く)。
FUZxxl

1
@FUZxxl:「ただし、関数から返されるので{∘.=⍨⍵/⍋⍵}はなく、結果をSTDOUT(または最も近い代替)に出力する必要があります(たとえば。)」ため、無効です。が必要{⎕←∘.=⍨⍵/⍋⍵}になりますが、2文字かかるだけでなく、TryAPLでは動作しません。(一般に、TryAPLはあまりにも制限されているため有用ではありません。)
マリナス

結果を出力する必要がある場合⎕←、dfnがなくても、とにかく必要ないでしょうか?
FUZxxl

@FUZxxl:いいえ、他に何もしなければ式の出力は自動的に出力されます。
マリヌス

ああ、なるほど。これは、インタプリタをインタラクティブに使用しているときにのみ発生するという印象を受けました。
FUZxxl

8

R、69 63

function(x)write(+outer(i<-rep(1:length(x),x),i,"=="),1,sum(x))

テストケース:

(function(x)write(+outer(i<-rep(1:length(x),x),i,"=="),1,sum(x)))(c(5,1,1,3,1))
1 1 1 1 1 0 0 0 0 0 0 
1 1 1 1 1 0 0 0 0 0 0 
1 1 1 1 1 0 0 0 0 0 0 
1 1 1 1 1 0 0 0 0 0 0 
1 1 1 1 1 0 0 0 0 0 0 
0 0 0 0 0 1 0 0 0 0 0 
0 0 0 0 0 0 1 0 0 0 0 
0 0 0 0 0 0 0 1 1 1 0 
0 0 0 0 0 0 0 1 1 1 0 
0 0 0 0 0 0 0 1 1 1 0 
0 0 0 0 0 0 0 0 0 0 1

外側の関数はここでほとんどの作業を行いますが、出力が正しく見えるようにするための単なるケースです-@Vloに感謝します


非常に素晴らしいソリューション
-MickyT

素晴らしい解決策。-/+論理的に強制するために使用することを考えたことはありません。数バイトを節約function(x)write(+outer(i<-rep(1:length(x),x),i,"=="),1,sum(x))63
Vlo

6

Python 3、103 97 82 78 76バイト

def P(L,n=0):k,*L=L;exec("print(*[0]*n+[1]*k+[0]*sum(L));"*k);L and P(L,n+k)

スプラットを使用して、のスペースを分離する性質を利用printし、少し再帰します。


6

ルビー、86 90 83バイト

初めてのゴルフ!

->l{n=l.reduce :+;s=0;l.map{|x|x.times{puts ([0]*s+[1]*x+[0]*(n-x-s))*" "};s+=x}}

整数の配列を受け取り、期待される結果を出力します:

$ (->l{n=l.reduce :+;s=0;l.map{|x|x.times{puts ([0]*s+[1]*x+[0]*(n-x-s))*" "};s+=x}}).call([5, 1, 1, 2, 3, 1])
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1

編集:

いくつかのことを短縮するのを手伝ってくれたMartinBüttnerに感謝します!


1
さらにいくつかの文字を保存->(l)できます->lmapはより短いeach.join(" ")に短縮できます*" "
マーティンエンダー

6

Matlab、60 54バイト

これは、MATLABの特別なフィールドになるのIF我々は機能の組み込み使用することができます...

見逃したエラーを修正してくれた@sanchisesに感謝します。

c=0;a=input('');for A=a;v=c+1:c+A;d(v,v)=1;c=c+A;end;d

うーん、まで私はこのjsスニペットが実際にリーダーボードを生成することに気づいたのです!!! どうしてこれに気付かなかったの?これを指摘してくれてありがとう=)
flawr

私は当然知っている?本当にかっこいい!
アレックスA.

1
私はほぼ同じ答えを投稿しようとしていた:
ルイスメンドー

まったく同じものか、少し違うものですか?=)(変数名とは別に)
-flawr

投稿するにはあまりにも似てます:-)
ルイスメンドー

6

Matlab、53バイト

他のMatlabフラグメントより1文字短いだけですが、コードは新しい答えを保証するのに十分異なると考えました。

d=[];a=input('');for A=a;v=1:A;d(end+v,end+v)=1;end;d

もちろん、主要なトリックは範囲外のインデックス付けですが、これをend変数として使用することと組み合わせて、よりコンパクトにします。


1
くそー- end+1:end+v「カウンター」変数を取り除くためにゴルフをしようとして30分を費やしましたが、この解決策を考えていませんでした。
-Sanchises

実際、@ Geobitsが言及したように、匿名による編集の試みblkdiagは要件に違反します。ただ、参考のために私はとにかくここでのコアを配置します:blkdiag(A,ones(i))
デニスJaheruddin

4

CJam、21

q~{T):Ta*~}%_f{f=S*N}

http://cjam.aditsu.net/で試してください

説明:

q~          read and evaluate the input array
{…}%        transform each number using the block
    T):T    increment T (initially 0)
    a*      wrap T in an array and repeat it <number> times
    ~       dump the repeated numbers so they end up in a flat array
_           duplicate the array
f{…}        for each array item and the array
    f=      compare the current item with each item, resulting in an array of 1 and 0
    S*      join with spaces
    N       add a newline

4

Python 3、79

def f(l,s=0):
 for x in l:r=[0]*sum(l);r[s:s+x]=[1]*x;s+=x;exec("print(*r);"*x)

トラックとしてブロックの左端の指標sとなりx、それの後にエントリがである1場合、x現在のブロックサイズです。次に、この行が印刷されxます。実行するにはPython 3が必要ですprint(*r)


rとして表現するのは1文字短くなります[0]*s+[1]*x+[0]*(sum(l)-s-x)が、私はまだより良い方法を探しています。
xnor

4

Haskell、118 116バイト

(#)=replicate
f i=putStr$[e#(unwords$sum h#"0"++e#"1"++sum t#"0")|(h,e:t)<-map(`splitAt`i)[0..length i-1]]>>=unlines

使用法: f [2,1,1,3]

出力:

1 1 0 0 0 0 0
1 1 0 0 0 0 0
0 0 1 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 1 1 1
0 0 0 0 1 1 1
0 0 0 0 1 1 1

使い方:

[0..length i-1]           for each index n of the input list i
(h,e:t)<-map(`splitAt`i)  split i at n and
                            let e be the element at index n
                            let h be the list of elements to the left of e
                            let t be the list of elements to the right of e
                          foreach triple h, e, t make a list of
sum h # "0" ++              sh copies of "0" (sh = the sum of the elements of h) followed by
e # "1" ++                  e copies of "1" followed by
sum t # "0"                 st copies of "0" (st = the sum of the elements of t)
unwords                   join those list elements with spaces inbetween
e #                       make e copies
>>=unlines                join those lists with newlines inbetween
putStr                    print

バインディングの外では使用されないため(h,e:t)<-map(`splitAt`i)[0..length i-1]、を実行することで2バイトを節約できます。nlet
ズガルブ

@Zgarb:素敵な発見。ありがとう!
-nimi

3

Pyth、23 21バイト

Pyth用GitHubリポジトリ

Ju+G*]GHQYFNJjdmsqdNJ

入力はのような整数のリストです[3, 1, 1, 2]。オンラインで試す:Pyth Compiler / Executor

randomraのJコードと非常によく似た考えを使用します。コードの最初の部分は、同様の部分をJu+G*]GHQY生成しnます。入力例で[3, 1, 1, 2]は、結果は次のようになります。

[
 [], 
 [], 
 [], 
 [[], [], []], 
 [[], [], [], [[], [], []]], 
 [[], [], [], [[], [], []], [[], [], [], [[], [], []]]], 
 [[], [], [], [[], [], []], [[], [], [], [[], [], []]]]
]

1つの要素よりも最初に3つの同一の要素、次に1つの要素、最後に2つの同一の要素。

Ju+G*]GHQY
 u      QY  reduce the input Q, start with empty list G=[]
            for each H in input, replace the value of G by:
  +G*]GH       G+[G]*H
J           store the result in J

コードの2番目の部分は、デカルト積の要素の比較と印刷です。

FNJjdmsqdNJ
FNJ          for N in J:
     m    J     map each element d of J to
       qdN          the boolean value of d == N
      s             and convert it to an integer (0 = False, 1 = True)
   jd           print the resulting list seperated by d (=space)

3

C ++、294バイト

使用されるコンパイラ-GCC 4.9.2

#include<bits/stdc++.h>
using namespace std;
#define F(a,b) for(a=0;a<b;a++)
#define V vector<int>
int n,i,j,s,o;
main(){V v;while(cin>>n)v.push_back(n),s+=n;vector<V> m(s,V(s,0));F(i,v.size()){F(j,v[i])F(n,v[i])m[j+o][n+o]=1;o+=v[i];}F(j,s){F(n,s)cout<<m[j][n]<<((n==s-1)?"":" ");cout<<"\n";}}

説明 -:

#include<bits/stdc++.h>
using namespace std;
#define F(a,b) for(a=0;a<b;a++)
#define V vector<int>
int n, i, j, s, o;
/*
 n = Used to take inputs, and as an iterator after that
 i, j = Iterators
 s = sum of all the inputs
 o = offset ( used to find the location of the starting cell of the next matrix of 1's )
*/

main()
{
    V v;
    while ( cin >> n )  // Take input
    {
        v.push_back( n ), s += n;
    }

    vector<V> m( s, V( s, 0 ) ); // m is a matrix of size (s*s) with all elements initialized to 0
    F( i, v.size() )
    {
        F( j, v[i] )F( n, v[i] )m[j + o][n + o] = 1; // Assign 1 to the required cells
        o += v[i]; // Add the value of the current element to the offset
    }

    F( j, s )  // Output the matrix
    {
        F( n, s )cout << m[j][n] << ( ( n == s - 1 ) ? "" : " " ); // Prevent any trailing whitespace
        cout << "\n";
    }
}

3

K、30バイト

{"i"$,/x#',:',/'g=\:\:x#'g:<x}

基本的にマリヌス​​の答えを盗んだ

k){"i"$,/x#',:',/' g=\:\:x#'g:<x}5 1 1 2 3 1
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1

2

Java、163

a->{int n=a.stream().mapToInt(x->x).sum(),t=0,j,k;for(int i:a){for(j=0;j++<i;System.out.println("\b"))for(k=0;k<n;)System.out.print(k>=t&k++<t+i?"1 ":"0 ");t+=i;}}

整数のリストを受け入れるコンシューマ。

読みやすいバージョン、定型コード:

java.util.function.Consumer<java.util.List<Integer>> c = a -> {
    int n = a.stream().mapToInt(x -> x).sum(), t = 0, j, k;
    for (int i : a) {
        for (j = 0; j++ < i; System.out.println("\b")) {
            for (k = 0; k < n;) {
                System.out.print(k >= t & k++ < t + i ? "1 " : "0 ");
            }
        }
        t += i;
    }
};

次を使用して呼び出します。

List list = Arrays.asList(5, 1, 1, 2, 3, 1);
c.accept(list);

2

Python 2、163 114バイト

ニブラーはこれをたくさんゴルフしました。

h=input()
r=range
l=len(h)
for i in r(l):
 for k in r(h[i]):print" ".join("01"[i==j]for j in r(l)for x in r(h[j]))

3
どうprint" ".join("01"[i==j]for j in r(l(h))for x in r(h[j]))
ニブラー

ヘクタール!そのようなことができると思った。
KSFT

これは、各ブロックの1行のみを印刷するようです。
xnor

@xnorそのとおりです。それを私が直した。
KSFT

2

Python 3、74

def f(a,p=0):n=a.pop(0);exec("print(*'0'*p+'1'*n+'0'*sum(a));"*n);f(a,p+n)

これはエラーで終了しませんか?
xnor

@xnorはい、そうです!
feersum

1
@feersum許可されていますか?この問題に関するメタ投稿はありません。マーティン、どう思いますか?許可されている場合、Sp3000はand短絡を取り除くことで6文字を節約できます。
xnor

@xnorエラーはプログラムを終了させますか、それとも関数呼び出しのみを終了させますか?これでプログラムが終了する場合は、許可されていないと思います。私はこれについてメタに関する私の意見を表明しました。また、フェールサムがこれが完全に合法であるという意見であれば、誰も気付かないことを期待するのではなく、彼の答えでそれを述べたでしょう。
マーティンエンダー

@MartinBüttnerあなたが求めていることを理解したら、プログラムを終了します。実行するf([1,2,3]);print("Done")と、エラーはブロックマトリックスを出力した後にプログラムを終了し、「完了」を出力できません。
xnor

2

JavaScript(ES6)、103 107

カウントしない匿名関数として103バイトF=(ただし、テストするにはこれが必要です)

F=l=>alert(l.map((n,y)=>(l.map((n,x)=>Array(n).fill(x==y|0))+'\n').repeat(n))
.join('').replace(/,/g,' '))

Firefox / FireBugコンソールでテストする

F([5,1,1,2,3,1])

出力

1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1


1

Pyth、31 30

FbQVbjd++*]0Z*b]b*]0--sQbZ)~Zb

かなり単純なプログラムで、stdinで入力を受け取ります。これはおそらくもっとゴルフすることができます;)

無駄な文字を指摘してくれた@Jakubeに感謝

ここで試してみてください


1

Perl、69

#!perl -na
$j=s/./0 x$&/ger;print+($j|$i.1x$_)=~s/\B/ /gr x($i.=0 x$_,$_)for@F

標準入力を使用します。

$ perl a.pl <<<"1 2 3"
1 0 0 0 0 0
0 1 1 0 0 0
0 1 1 0 0 0
0 0 0 1 1 1
0 0 0 1 1 1
0 0 0 1 1 1

奇妙なことに、これはideoneに改行を印刷しません。また、この投稿よると、カスタムシバンを2バイトではなく4バイトとしてコーディングする必要があります。shebagを使用せず、代わりにインタープリターでフラグを使用-eし、ファイルからではなくコードを呼び出すことにより、これを修正できます(そのメタ投稿の例を参照)。また、nフラグは必要ないと思います-perldocによれば、暗黙的にa設定されますn
マーティンエンダー

プログラムは、標準入力からeolを再利用します。ideoneセットアップは、追加するときに機能します。文字数については、すべての回答でこのように数えていますが、他の人もこのように数えているのを見てきました。以前にリンクした投稿を見たことがありますが、「違いを数える」ことで意味がわかりませんperl -nl file.pl。元のperlgolfルールでは、ハイフンはカウントされますが、スペースはカウントされないため、この場合は3文字です。
-nutki

@MartinBüttner、randomraのアプローチははるかに短い解決策を提供するので、とにかくすべてが無意味です:-lna //,print join$",map$'==$_|0,@,for@,=map{(++$i)x$_}@F。ところで、私のPerlのバージョンはで設定され-n-aいませんが、最近追加されたに違いありません。
-nutki

1

R、117の 144 137 133 129 123バイト

現時点ではかなり冗長です。さらにいくつかを剃ることができるはずです。それを正しくフォーマットするバイト数を増やしましたが、配列のマトリックスを交換することを節約しました。

sepをsに置き換え、関数名を削除するヒントをくれたAlexに感謝します。

アレイを完全に削除し、一連の担当者を使用して各ラインを構築しました。

Miffにsound打されたが、彼の解決策は私がs = ''を完全に落とせることに気付いた。

function(i){s=sum(i);i=cumsum(i);b=0;for(n in 1:s){d=i[i>=n][1];cat(c(rep(0,b),rep(1,d-b),rep(0,s-d)),fill=T);if(d==n)b=d}}

そしてテスト

> (function(i){s=sum(i);i=cumsum(i);b=0;for(n in 1:s){d=i[i>=n][1];cat(c(rep(0,b),rep(1,d-b),rep(0,s-d)),fill=T,s=' ');if(d==n)b=d}})(c(5,1,1,3,1))
1 1 1 1 1 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 1
> 

関数パラメーターの部分一致を使用して2バイトを保存できます。でcat()、「s」で始まるその関数の他の認識されたパラメーターがないため、に変更sep=s=ます。
アレックスA

@Alexありがとう、気づかなかった。まだ習熟中
MickyT

を削除すると、さらに2を保存できますf=。これにより、関数オブジェクトが得られます。それを行う場合、f=実行する前に何かを使用して割り当てられることを規定する必要があります。MartinBüttnerがRubyでそれをするのを見るまで、このようなコンテストでそれが合法であることに気づきませんでした。
アレックスA.

1

バッチ-226バイト

@echo off&setLocal enableDelayedExpansion&set c=0&for %%a in (%*)do set/ac+=1&for /l %%b in (1,1,%%a)do (set l=&set d=0&for %%c in (%*)do (set/ad+=1&for /l %%d in (1,1,%%c)do if !d!==!c! (set l=!l!1)else set l=!l!0)
echo !l!)

stdin(C:\>script.bat 5 1 1 2 3 1)から入力を取得し、エコーの出力を取得します。残念ながら、同じ行でその最後のエコーを取得できませんでした。そうでなければ、おそらく行全体をcmd/von/c

素晴らしく、きちんとした-ただうんざりする仕事:

@echo off
setLocal enableDelayedExpansion
set c=0
for %%a in (%*) do (
    set /a c+=1
    for /l %%b in (1,1,%%a) do (
        set l=
        set d=0
        for %%c in (%*) do (
            set /a d+=1
            for /l %%d in (1,1,%%c) do if !d!==!c! (set l=!l!1) else set l=!l!0
        )
        echo !l!
    )
)

1

ハスケル、124

(%)=replicate
d l=fst$foldr(\x(m,n)->(m>>mapM_(\_->putStrLn$unwords$n%"0"++x%"1"++(sum l-n-x)%"0")[1..x],n+x))(return(),0)l

mapM_とでIOアクションを組み合わせて出力を生成しfoldrます。関数にdは、intのリストを指定する必要があります。


1

K(ngn / k)、10バイト

{x=\:x:&x}

オンラインでお試しください!

-19 ngnに感謝します。


K(ngn / k)、29バイト

{,/d#',:'-':+\[d:x,0]>\:!+/x}

オンラインでお試しください!

編集:1要素の入力の場合、ブレーク、作業が必要

edit1:現在修正されています。+4バイト。ブー


1
{x=\:x:&x}­­­
ngn

@ngnああ...さあ
走り書き

このチャレンジはされていたAPLルームで議論、私は、その「どこで」(-sここでの利点を持っているが:) kおよびjから解決策を知っていた&KまたはI.Jで)int型のベクターを用いた作業、しばらくAPLの作品だけブール値で。
ngn


0

STATA、155バイト

di _r(a)
forv x=1/wordcount($a){
gl b=word($a,`x')
gl c=_N+1
set ob _N+$b
forv y=$c/_N{
g d`y'=_n>=$c
}
}
forv z=1/_N{
replace d`z'=0 if d`z'>1
}
l,noo noh

これをどこかでオンラインでテストできますか?
マーティンエンダー

@MartinBüttner:私が知る限り、Stataは独自仕様であるため、Stata用のオンラインコンパイラはありません。SASのような言語についても同様です。
アレックスA.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.