Aqui está um código simples de tamanho de mordida (tamanho de byte?): Dada uma lista não vazia de números inteiros positivos menores que 10, imprima um matriz diagonal de blocos, em que a lista especifica o tamanho dos blocos, em ordem. Os blocos devem consistir em números inteiros positivos menores que 10. Portanto, se você receber como entrada
[5 1 1 2 3 1]
Sua saída pode ser, por exemplo,
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
ou
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
ou algo assim. Os elementos na matriz devem ser separados por espaços (únicos) e as linhas separadas por novas linhas (únicas). Não deve haver espaços iniciais ou finais em nenhuma linha. Você pode ou não imprimir uma nova linha à direita.
Você pode escrever uma função ou programa, recebendo entrada via STDIN (ou alternativa mais próxima), argumento de linha de comando ou argumento de função, em qualquer formato conveniente de string ou lista (desde que não seja pré-processado). No entanto, o resultado deve ser impresso em STDOUT (ou alternativa mais próxima), em vez de retornar de uma função, digamos.
Você não deve usar nenhuma função interna projetada para criar matrizes diagonais de bloco.
Isso é código de golfe, então a submissão mais curta (em bytes) vence.
Classificação
Espero que as linguagens baseadas em array (como J e APL) tenham vantagem aqui, mas não quero que isso desencoraje as pessoas a tentarem fazer o melhor que puderem no idioma de sua escolha. Então, aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma. Então, por que não tentar conseguir uma vaga nesse último?
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=45550;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
[:=/~]#<\
contam para a sua pontuação. Além disso,=/~@#<\
por dois bytes extras cortados.(=/~@#<\)
é apenas uma função. Você precisaria aplicá-lo a algo para obter uma expressão, portanto, seria necessário input explícito (".1!:1[1
) ou, se você quiser enviar uma função, essa função deve realmente imprimir o valor e não apenas devolvê-lo (comoecho@
algo assim) )=/~&I.
APL, 10
Exemplo:
Explicação:
∆←⎕
: ler entrada, armazenar em∆
.⍋∆
: encontre a permutação que classifica∆
(isso fornece um valor único para cada valor na entrada)∆/
: para cada um desses valores exclusivos, repita-oN
vezes, ondeN
é o valor correspondente na entrada∘.=⍨
: faça uma matriz comparando cada valor nessa lista com os outros valores.fonte
http://tryapl.org
, convém usar o dfn{∘.=⍨⍵/⍋⍵}
, pois o site filtra todos os usos de⎕
(exceto⎕IO
coisas assim).{∘.=⍨⍵/⍋⍵}
não é válido. Você precisaria{⎕←∘.=⍨⍵/⍋⍵}
, que não apenas custa dois caracteres, mas ainda não funcionaria no TryAPL. (E, em geral, TryAPL é muito limitada para ser útil.)⎕←
qualquer maneira, mesmo sem o dfn?R,
6963Caso de teste:
A função externa faz a maior parte do trabalho aqui, então é apenas um caso de obter a saída correta - Obrigado a @Vlo por sua ajuda com isso
fonte
-/+
para coagir a lógica. Salve alguns bytesfunction(x)write(+outer(i<-rep(1:length(x),x),i,"=="),1,sum(x))
63Python 3,
10397827876 bytesUsando splat para aproveitar a natureza de separação de espaço de
print
, com um pouco de recursão.fonte
Ruby,
869083 bytesMeu primeiro golfe de todos os tempos!
Recebe uma matriz com os números inteiros, imprime o resultado esperado:
Editar:
Obrigado a Martin Büttner por me ajudar a diminuir algumas coisas!
fonte
->(l)
pode ser->l
.map
é mais curto queeach
..join(" ")
pode ser reduzido para*" "
.Matlab,
6054 bytesIsso seria campo especial de Matlab SE nós poderíamos usar builtin funções ...
Obrigado @sanchises por corrigir o erro que eu perdi.
fonte
Matlab, 53 bytes
Embora seja apenas um caractere mais curto que o outro fragmento do Matlab, imaginei que o código fosse suficientemente diferente para garantir uma nova resposta:
O truque principal é, obviamente, a indexação fora dos limites, mas isso é combinado com o uso
end
como uma variável para torná-la mais compacta.fonte
end+1:end+v
para me livrar de uma variável 'counter', e não pensei nessa solução.blkdiag
violaria os requisitos. Apenas para referência, colocarei aqui o cerne da questão de qualquer maneira:blkdiag(A,ones(i))
CJam, 21
Experimente em http://cjam.aditsu.net/
Explicação:
fonte
Python 3, 79
Rastreia o índice mais à esquerda do bloco como
s
e faz asx
entradas depois dele1
, ondex
está o tamanho atual do bloco. Esta linha é impressax
vezes. Python 3 é necessário para fazerprint(*r)
.fonte
r
como[0]*s+[1]*x+[0]*(sum(l)-s-x)
, mas ainda estou procurando uma maneira melhor.Haskell,
118116 bytesUso:
f [2,1,1,3]
Saída:
Como funciona:
fonte
(h,e:t)<-map(`splitAt`i)[0..length i-1]
, poisn
não é usado fora dalet
ligação.Pitão,
2321 bytesRepositório do GitHub para Pyth
Entrada é uma lista de números inteiros, como
[3, 1, 1, 2]
. Experimente online: Pyth Compiler / ExecutorUsa uma idéia bastante semelhante ao código J do randomra. A primeira parte do código
Ju+G*]GHQY
geran
partes de coisas semelhantes. Para a entrada de exemplo,[3, 1, 1, 2]
o resultado é semelhante a este:Primeiro três elementos idênticos, que um elemento, depois um elemento novamente e no final dois elementos idênticos.
A segunda parte do código está comparando os elementos do produto cartesiano e imprimindo-o.
fonte
C ++, 294 bytes
Compilador usado - GCC 4.9.2
Explicação -:
fonte
K, 30 bytes
Roubou basicamente a resposta de Marinus
fonte
Java, 163
Um consumidor que aceita uma lista de números inteiros.
Versão legível, com código padrão:
Invoque usando:
fonte
Python 2,
163114 bytesgnibbler jogou um monte de golfe.
fonte
print" ".join("01"[i==j]for j in r(l(h))for x in r(h[j]))
?Python 3, 74
fonte
and
curto-circuito.f([1,2,3]);print("Done")
, o erro terminaria o programa depois que ele imprimisse a matriz de blocos e não chegaria à impressão "Concluído".JavaScript (ES6), 103
103107103 bytes como uma função anônima, sem contar
F=
(mas você precisa disso para testá-lo)Teste no console Firefox / FireBug
Saída
fonte
Oitava,
4941 bytesfonte
Pyth,
3130Um programa bastante ingênuo, aceita a entrada do stdin. Provavelmente isso pode ser jogado mais;)
Obrigado @Jakube por apontar um caractere desperdiçado
Experimente aqui
fonte
Perl, 69
Usa entrada padrão:
fonte
-e
não a partir de um arquivo (veja exemplos nessa meta post). Além disso, acho que você não precisa dan
bandeira - de acordo com o perldoc,a
definen
implicitamente.perl -nl file.pl
". As regras originais do perlgolf contariam o hífen, mas não o espaço, com três caracteres nesse caso.-lna //,print join$",map$'==$_|0,@,for@,=map{(++$i)x$_}@F
. BTW minha versão do Perl não define-n
com-a
, deve ser uma adição recente.R,
117144137133129123 bytesRazoavelmente detalhado no momento. Deve ser capaz de raspar mais alguns. Ganhou um número de bytes formatando-o corretamente, mas economizou alguns trocando a matriz por uma matriz.
Obrigado a Alex pela dica sobre a substituição de sep por se removendo o nome da função.
Abandonou completamente a matriz e usou uma série de representantes para construir cada linha.
Embora profundamente derrotado por Miff, sua solução me fez perceber que eu poderia largar o s = '' completamente.
E o teste
fonte
cat()
, mudesep=
para,s=
pois nenhum outro parâmetro reconhecido para essa função começa com "s".f=
. Isso fornece um objeto de função. Se você fizer isso, basta estipular que ele seja atribuído usando algo comof=
antes de executá-lo. Eu não sabia que isso era legítimo em concursos como esse até ver Martin Büttner fazendo isso com Ruby.Lote - 226 bytes
Recebe a entrada de stdin (
C:\>script.bat 5 1 1 2 3 1
) e a saída do eco. Infelizmente, não consegui obter o último eco na mesma linha; caso contrário, provavelmente poderia ligar para toda a linhacmd/von/c
para evitar a necessidade de permitir a expansão atrasada.Agradável e arrumado - nada além de trabalho pesado:
fonte
Haskell, 124
Produz saída combinando ações de E / S por meio de
mapM_
efoldr
. A funçãod
deve receber uma lista de entradas.fonte
K (ngn / k) , 10 bytes
Experimente online!
-19 graças a ngn ... mantendo minha submissão abaixo haha
K (ngn / k) , 29 bytes
Experimente online!
editar: interrupções para o caso de entrada de 1 elemento, precisa funcionar
edit1: agora corrigido. +4 bytes. vaia
fonte
{x=\:x:&x}
&
em k ouI.
em j) trabalham com vetores int, enquanto o apl⍸
trabalha apenas com booleanos .APL (Dyalog Extended) , 5 bytes
Experimente online!
O APL ganha de volta contra J e K com o domínio estendido de
⍸
.Como funciona
fonte
STATA, 155 bytes
fonte
Geléia , 7 bytes
Experimente online!
Mesma abordagem que a resposta J.
fonte