Aquí hay un código simple, tamaño de mordida (¿tamaño de byte?): Dada una lista no vacía de enteros positivos menores que 10, imprima una matriz de bloques en diagonal , donde la lista especifica el tamaño de los bloques, en orden. Los bloques deben constar de enteros positivos menores que 10. Entonces, si se le da como entrada
[5 1 1 2 3 1]
Su salida podría ser, por ejemplo,
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
o
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
o algo así. Los elementos en la matriz deben estar separados por espacios (simples) y las filas separadas por líneas nuevas (simples). No debe haber espacios iniciales o finales en ninguna línea. Puede o no imprimir una nueva línea final.
Puede escribir una función o programa, tomando datos a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función, en cualquier cadena conveniente o formato de lista (siempre que no esté preprocesado). Sin embargo, el resultado debe imprimirse en STDOUT (o la alternativa más cercana), en lugar de ser devuelto por una función, por ejemplo.
No debe utilizar ninguna función incorporada diseñada para crear matrices de bloques en diagonal.
Este es el código de golf, por lo que gana el envío más corto (en bytes).
Tablas de clasificación
Espero que los lenguajes basados en matrices (como J y APL) tengan la ventaja aquí, pero no quiero que eso desaliente a las personas a intentar hacer lo mejor que puedan en su idioma de elección. Así que aquí hay un Fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma. Entonces, ¿por qué no tratar de obtener un lugar en este último?
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# 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>
[:=/~]#<\
cuenten para tu puntaje. Además,=/~@#<\
para dos bytes adicionales recortados.(=/~@#<\)
es solo una función. Tendría que aplicarlo realmente a algo para obtener una expresión, por lo que necesitaría una entrada explícita (".1!:1[1
), o si desea enviar una función, esa función debería imprimir el valor y no solo devolverlo (me gustaecho@
o algo así) )=/~&I.
APL, 10
Ejemplo:
Explicación:
∆←⎕
: leer entrada, almacenar en∆
.⍋∆
: encuentra la permutación que ordena∆
(esto le da un valor único para cada valor en la entrada)∆/
: para cada uno de esos valores únicos, repíteloN
veces, dondeN
está el valor correspondiente en la entrada∘.=⍨
: crea una matriz que compara cada valor de esa lista con los otros valores.fuente
http://tryapl.org
, es posible que desee utilizar el dfn{∘.=⍨⍵/⍋⍵}
, ya que el sitio filtra todos los usos de⎕
(excepto para⎕IO
y cosas por el estilo).{∘.=⍨⍵/⍋⍵}
lo que no es válido. Necesitaría{⎕←∘.=⍨⍵/⍋⍵}
, que no solo cuesta dos caracteres, sino que aún no funcionaría en TryAPL. (Y en general, TryAPL es demasiado limitado para ser útil.)⎕←
todos modos, incluso sin el dfn?R,
6963Caso de prueba:
La función externa hace la mayor parte del trabajo aquí, entonces es solo un caso para que la salida se vea bien - Gracias a @Vlo por su ayuda con eso
fuente
-/+
para forzar la lógica. Ahorre algunos bytesfunction(x)write(+outer(i<-rep(1:length(x),x),i,"=="),1,sum(x))
63Python 3,
10397827876 bytesUsando splat para aprovechar la naturaleza de separación de espacios de
print
, con un poco de recursividad.fuente
Ruby,
869083 bytes¡Mi primer golf!
Recibe una matriz con los enteros, imprime el resultado esperado:
Editar:
¡Gracias a Martin Büttner por ayudarme a acortar algunas cosas!
fuente
->(l)
puede ser->l
.map
es más corto queeach
..join(" ")
se puede acortar a*" "
.Matlab,
6054 bytesEste sería el campo especial de Matlab SI pudiéramos usar funciones integradas ...
Gracias @sanchises por corregir el error que me perdí.
fuente
Matlab, 53 bytes
Aunque es solo un carácter más corto que el otro fragmento de Matlab, pensé que el código es lo suficientemente diferente como para garantizar una nueva respuesta:
El truco principal es, por supuesto, la indexación fuera de límites, pero esto se combina con el uso
end
como una variable para hacerlo más compacto.fuente
end+1:end+v
para deshacerme de una variable 'contador', y no pensé en esta solución.blkdiag
violaría los requisitos. Solo como referencia, pondré el núcleo aquí de todos modos:blkdiag(A,ones(i))
CJam, 21
Pruébalo en http://cjam.aditsu.net/
Explicación:
fuente
Pitón 3, 79
Rastrea el índice más a la izquierda del bloque como
s
y realiza lasx
entradas después de que sea1
, dondex
está el tamaño actual del bloque. Esta fila se imprimex
veces. Python 3 es necesario para hacerprint(*r)
.fuente
r
como[0]*s+[1]*x+[0]*(sum(l)-s-x)
, pero todavía estoy buscando una mejor manera.Haskell,
118116bytesUso:
f [2,1,1,3]
Salida:
Cómo funciona:
fuente
(h,e:t)<-map(`splitAt`i)[0..length i-1]
, yan
que no se usa fuera dellet
enlace.Pyth,
2321 bytesRepositorio de GitHub para Pyth
La entrada es una lista de enteros, como
[3, 1, 1, 2]
. Pruébelo en línea: Pyth Compiler / ExecutorUtiliza una idea bastante similar al código J de randomra. La primera parte del código
Ju+G*]GHQY
generan
partes de cosas similares. Para el ejemplo de entrada[3, 1, 1, 2]
el resultado se ve así:Primero tres elementos idénticos, que un elemento, luego un elemento nuevamente y al final dos elementos idénticos.
La segunda parte del código es comparar los elementos del producto cartesiano e imprimirlo.
fuente
C ++, 294 bytes
Compilador utilizado - GCC 4.9.2
Explicación -:
fuente
K, 30 bytes
Básicamente robó la respuesta de Marinus
fuente
Java, 163
Un consumidor que acepta una lista de enteros.
Versión legible, con código repetitivo:
Invocar usando:
fuente
Pitón 2,
163114 bytesgnibbler golfed esto un montón.
fuente
print" ".join("01"[i==j]for j in r(l(h))for x in r(h[j]))
?Pitón 3, 74
fuente
and
cortocircuito.f([1,2,3]);print("Done")
, el error finalizaría el programa después de que imprima la matriz de bloques, y no llegaría a imprimir "Listo".JavaScript (ES6), 103
103107103 bytes como una función anónima, sin contar
F=
(pero necesita esto para probarlo)Prueba en la consola Firefox / FireBug
Salida
fuente
Octava,
4941 bytesfuente
Pyth,
3130Un programa bastante ingenuo, toma la entrada en stdin. Esto probablemente se puede jugar más al golf;)
Gracias @Jakube por señalar un char perdido
Pruébalo aquí
fuente
Perl, 69
Utiliza entrada estándar:
fuente
-e
lugar de desde un archivo (ver ejemplos en esa meta publicación). Además, creo que no necesita lan
bandera, según el perldoc, sea
establecen
implícitamente.perl -nl file.pl
". Las reglas originales de perlgolf contarían el guión pero no el espacio, por lo que 3 caracteres en este caso.-lna //,print join$",map$'==$_|0,@,for@,=map{(++$i)x$_}@F
. Por cierto mi versión de Perl no establece-n
con-a
, debe ser una adición reciente.R,
117144137133129123 bytesRazonablemente detallado en este momento. Debería poder afeitarse un poco más. Obtuve una cantidad de bytes formateándolo correctamente, pero guardé algunos intercambiando la matriz por una matriz.
Gracias a Alex por la sugerencia de reemplazar sep con sy eliminar el nombre de la función.
Soltó la matriz por completo y usó una serie de repeticiones para construir cada línea.
Aunque golpeado por Miff, su solución me hizo darme cuenta de que podía soltar el s = '' por completo.
Y la prueba
fuente
cat()
, cambiesep=
as=
dado que ningún otro parámetro reconocido para esa función comienza con "s".f=
. Esto te da un objeto de función. Si hace eso, solo tiene que estipular que se asigne usando algo comof=
antes de ejecutarlo. No me di cuenta de que era legítimo en concursos como este hasta que vi a Martin Büttner hacerlo con Ruby.Lote: 226 bytes
Toma la entrada de stdin (
C:\>script.bat 5 1 1 2 3 1
) y la salida de echo. Desafortunadamente no pude obtener ese último eco en la misma línea, de lo contrario, probablemente podría llamar a toda la línea dentrocmd/von/c
para evitar tener que permitir la expansión retardada en el largo camino.Agradable y ordenado, nada más que un trabajo duro:
fuente
Haskell, 124
Produce resultados combinando acciones IO a través de
mapM_
yfoldr
. La funciónd
debe recibir una lista de entradas.fuente
K (ngn / k) , 10 bytes
Pruébalo en línea!
-19 gracias a ngn ... manteniendo mi presentación debajo jaja
K (ngn / k) , 29 bytes
Pruébalo en línea!
editar: saltos para el caso de entrada de 1 elemento, necesita trabajo
edit1: ahora corregido. +4 bytes. abucheo
fuente
{x=\:x:&x}
&
en k oI.
en j) funcionan con vectores int, mientras que apl's⍸
solo funciona con booleanos .APL (Dyalog Extended) , 5 bytes
Pruébalo en línea!
APL vuelve a ganar contra J y K con el dominio extendido para
⍸
.Cómo funciona
fuente
STATA, 155 bytes
fuente
Jalea , 7 bytes
Pruébalo en línea!
El mismo enfoque que la respuesta de J.
fuente