Распечатать блочно-диагональную матрицу


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 (или ближайшую альтернативу), а не, скажем, возвращен из функции, скажем.

Вы не должны использовать какие-либо встроенные функции, предназначенные для создания блочно-диагональных матриц.

Это код гольф, поэтому выигрывает самое короткое представление (в байтах).

Leaderboards

Я ожидаю, что основанные на массивах языки (такие как J и APL) будут иметь преимущество, но я не хочу, чтобы это отговаривало людей пытаться делать то, что они могут, на своем языке. Итак, вот фрагмент стека для генерации как регулярной таблицы лидеров, так и обзора победителей по языкам. Так почему бы не попытаться найти место на последнем?

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# 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

@marinus J выводит результат выражения в стандартный вывод, если он не связан с переменной.
— FUZxxl

@FUZxxl: да, но (=/~@#<\)это просто функция. Вы должны на самом деле применить это к чему-то, чтобы получить выражение, поэтому вам понадобится явный ввод ( ".1!:1[1), или, если вы хотите передать функцию, эта функция должна фактически напечатать значение, а не просто вернуть его (например, echo@или что-то в этом роде). ).
— Марин

=/~&I.­­­­­­­
— нгн

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
— 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)

Использование 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

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

Wow, это было до сих пор, когда я заметил, что этот фрагмент JS на самом деле производит таблицу лидеров !!! Как я никогда этого не замечал ??? Спасибо за указание на это =)
— flawr

Я точно знаю? Это действительно здорово!
— Алекс А.

1
Я собирался опубликовать почти тот же ответ :-)
— Луис Мендо

Точно такой же или немного другой? =) (Ну, кроме имен переменных.)
— flawr

Слишком похоже на меня, чтобы опубликовать это :-)
— Луис Мендо

6

Matlab, 53 байта

Хотя он всего на один символ короче другого фрагмента Matlab, я подумал, что код достаточно отличается, чтобы дать новый ответ:

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

Основной трюк, конечно, заключается в индексации границ, но это в сочетании с использованием endв качестве переменной делает его более компактным.


1
Черт, я потратил полчаса, пытаясь поиграть в гольф, end+1:end+vчтобы избавиться от «встречной» переменной, и я не думал об этом решении.
— Sanchises

Действительно, как упомянул @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

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как [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 Compiler / Executor

Использует довольно похожую идею как 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

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

Кажется, это печатает только одну строку каждого блока.
— 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 может сохранить 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

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 . также, согласно этому посту, вы должны кодировать пользовательский шебанг как 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) и вывод echo. К сожалению, я не мог получить последнее эхо в одной и той же строке, иначе я мог бы вызвать всю строку внутри, 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_и foldr. Функция dдолжна содержать список целых чисел.


1

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

{x=\:x:&x}

Попробуйте онлайн!

-19 спасибо нгн ... держу мое подчинение ниже хаха


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

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

Попробуйте онлайн!

редактировать: разрывы для 1-элементного ввода, требуется работа

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


1
{x=\:x:&x}­­­
— нгн

@ngn, да ладно ...
— каракули

эта проблема обсуждалась в комнате apl , я знал решение оттуда :) k и j имеют здесь преимущество, потому что их "where" -s ( &в k или I.в j) работают с векторами int, в то время как apl ⍸работает только с логическими значениями ,
— нг


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.