Роздрукувати блок-діагональну матрицю


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), мають тут перевагу, але я не хочу, щоб це відштовхувало людей від спроб зробити так добре, як вони можуть на своїй виборі мови. Отже, тут є фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою. То чому б не спробувати схопити місце на останньому?

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

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

Відповіді:


20

J, 7 байт

Дякуємо FUZxxl за 2- байтне покращення.

Мови, що базуються на масиві, слід враховувати тут у різній конкуренції, оскільки вони мають величезну перевагу. :)

   =/~@#<\

   (=/~@#<\) 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│
└─┴─┴─┴───┴─────┴───────┴───────┘

За допомогою =/~дієслова ми створюємо таблицю продуктів Декарта з цих коробкових префіксів, і кожна комірка буде, 1якщо обидві записи однакові 0.


2
Я не думаю, що круглі дужки [:=/~]#<\ враховуються до вашої оцінки. Крім того, =/~@#<\ для двох зайвих байтів оббрили.
FUZxxl

"Однак результат повинен бути надрукований в STDOUT (або найближчої альтернативи), на відміну від повернутої з функції, скажімо ." Вам, мабуть, потрібен або явний ввід (тож це не лише функція), або явний вихід.
Марін

@marinus J друкує результат виразу stdout, якщо він не пов'язаний зі змінною.
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 (або найближчої альтернативи), на відміну від повернутої з функції, скажімо .", Тому {∘.=⍨⍵/⍋⍵}не вірно. Вам знадобиться {⎕←∘.=⍨⍵/⍋⍵}, що коштує не лише два символи, але все ще не працює на TryAPL. (І взагалі TryAPL занадто обмежений, щоб бути корисним.)
marinus

Якщо вона має роздрукувати результат, то вам ⎕←все одно не знадобиться навіть без dfn?
FUZxxl

@FUZxxl: ні, висновок виразу друкується автоматично, якщо з ним нічого іншого не робиться.
marinus

А, бачу. У мене було враження, що це відбувається лише тоді, коли ви інтерпретатором користуєтесь інтерактивно.
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
Вло

6

Пітон 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)

Використовуючи splat, щоб скористатися простором, що розділяє простір 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

Редагувати:

Дякую Мартіну Бюттнеру за те, що він допоміг мені скоротити деякі речі!


1
Ви можете зберегти ще кілька символів: ->(l)можна ->l. mapкоротше, ніж each. .join(" ")можна скоротити до *" ".
Мартін Ендер

6

Матлаб, 60 54 байти

Це було б спеціальне поле Матлаба, якби ми могли використовувати вбудовані функції ...

Дякую @sanchises за виправлення помилки, яку я пропустив.

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

Wooow, це було до нині , що я помітив , що це на самому справі JS фрагмент коду створює лідерів !!! Як я ніколи цього не помічав ??? Дякую, що
вказали

Я знаю, правда? Це дійсно круто!
Олексій А.

1
Я збирався опублікувати майже таку ж відповідь :-)
Луїс Мендо

Точне ж чи щось трохи інше? =) (Ну, крім змінних імен.)
недолік

Занадто схоже на мене, щоб його опублікувати :-)
Луїс Мендо

6

Матлаб, 53 байти

Хоча він лише на один знак коротший за інший фрагмент Матлаба, я вважав, що код достатньо інший, щоб вимагати нової відповіді:

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

Головний фокус - це, звичайно, індексація меж, але це поєднується з використанням endяк змінної, щоб зробити її більш компактною.


1
Чорт - я провів півгодини, намагаючись end+1:end+vпозбутися гольфу, щоб позбутися змінної «лічильника», і не думав про це рішення.
Санчізи

Дійсно, як @Geobits згадував, спроба анонімного редагування blkdiagпорушить би вимоги. Тільки для довідки я все одно blkdiag(A,ones(i))
викладу

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

Пітон 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як [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], оскільки nвін не використовується поза letприв'язкою.
Згарб

@Zgarb: приємна знахідка. Спасибі!
німі

3

Pyth, 23 21 байт

Сховище GitHub для Pyth

Ju+G*]GHQYFNJjdmsqdNJ

Введення - це список цілих чисел, наприклад [3, 1, 1, 2]. Спробуйте в Інтернеті: компілятор / виконавець Pyth

Використовує досить схожу ідею, як J-код випадкових випадків. Перша частина коду Ju+G*]GHQYпороджує nчастини подібних речей. Для прикладу введення [3, 1, 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

Друга частина коду - порівняння елементів декартового продукту та його друк.

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

К, 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

Ява, 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

Пітон 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

Здається, це друкує лише один рядок кожного блоку.
xnor

@xnor Ти маєш рацію; Я полагодив це.
KSFT

2

Пітон 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 може зберегти 6 символів, позбувшись andкороткого замикання.
xnor

@xnor Чи помилка припиняє програму або лише виклик функції? Якщо це припиняє програму, то ні, я не думаю, що це дозволено. Я висловив свою думку з цього приводу на мета . Я також думаю, якби feersum вважав, що це повністю законно, він би це заявив у своїй відповіді замість того, щоб сподіватися, що ніхто цього не помітить.
Мартін Ендер

@ 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

Піта, 31 30

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

Досить наївна програма, приймає вклад на stdin. Це, напевно, може бути більше гольфу;

Дякуємо @Jakube за вказівку на марну чару

Спробуйте тут


1

Перл, 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 . також, відповідно до цієї публікації, ви повинні кодувати користувацький шебанг як 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 та видалення назви функції.

Повністю скинув масив і використав серію повторень для створення кожного рядка.

Хоча Міфф сильно бив, але його рішення дало мені зрозуміти, що я можу взагалі скинути 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(), зміни sep=до , s=так як ніякі інші визнані параметри для цієї функції не починаються з «S».
Олексій А.

@ Алекс Дякую, не усвідомлював цього. Все ще на кривій навчання
MickyT

Можна зберегти ще 2, видаливши f=. Це дає вам об’єкт функції. Якщо ви це зробите, вам просто потрібно встановити, що він буде призначений за допомогою чогось, як f=перед його запуском. Я не усвідомлював, що це законно в таких конкурсах, поки не побачив, як Мартін Бюттнер робив це з Рубі.
Олексій А.

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

Отримує вихід, комбінуючи дії IO через mapM_і foldr. Функції dслід надати список входів.


1

K (нг / к) , 10 байт

{x=\:x:&x}

Спробуйте в Інтернеті!

-19 завдяки ngn ... тримаючи моє подання нижче ха-ха


К (нг / к) , 29 байт

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

Спробуйте в Інтернеті!

редагувати: перерви на 1-елементний корпус введення, потребує роботи

edit1: тепер виправлено. +4 байти. бу


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

@ngn oh давай ...
scrawl

цей виклик обговорювався в приміщенні apl , я знав рішення звідти :) k і j мають перевагу тут, оскільки їх "де" -s ( &в 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, оскільки вона є власницею. Те саме стосується таких мов, як SAS.
Олексій А.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.