Hier ist ein einfacher Code in Bite-Größe (Byte-Größe?): Bei einer nicht leeren Liste positiver Ganzzahlen von weniger als 10 wird eine blockdiagonale Matrix gedruckt , wobei die Liste die Größe der Blöcke in der angegebenen Reihenfolge angibt. Die Blöcke müssen aus positiven ganzen Zahlen kleiner als 10 bestehen. Wenn Sie also als Eingabe angegeben werden
[5 1 1 2 3 1]
Ihre Ausgabe könnte zum Beispiel sein,
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
oder
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
oder etwas ähnliches. Die Elemente in der Matrix müssen durch (einzelne) Leerzeichen und die Zeilen durch (einzelne) Zeilenumbrüche getrennt sein. Es dürfen keine führenden oder nachfolgenden Leerzeichen in den Zeilen stehen. Möglicherweise drucken Sie eine nachgestellte Zeile oder nicht.
Sie können eine Funktion oder ein Programm schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument in einem beliebigen geeigneten Zeichenfolge- oder Listenformat vornehmen (sofern es nicht vorverarbeitet ist). Das Ergebnis muss jedoch an STDOUT (oder die nächstgelegene Alternative) ausgegeben werden, anstatt beispielsweise von einer Funktion zurückgegeben zu werden.
Sie dürfen keine eingebauten Funktionen zum Erstellen von Blockdiagonalmatrizen verwenden.
Dies ist Codegolf, daher gewinnt die kürzeste Übermittlung (in Bytes).
Bestenlisten
Ich erwarte, dass die Array-basierten Sprachen (wie J und APL) hier die Nase vorn haben, aber ich möchte nicht, dass die Leute davon abgehalten werden, so gut wie möglich in der Sprache ihrer Wahl zu arbeiten. Hier ist also ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren. Warum also nicht versuchen, einen Platz auf letzterem zu ergattern?
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# 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>
[:=/~]#<\
in Ihrer Punktzahl zählen. Auch=/~@#<\
für zwei zusätzliche Bytes rasiert.(=/~@#<\)
nur eine funktion. Sie müssten es tatsächlich auf etwas anwenden, um einen Ausdruck zu erhalten. Daher benötigen Sie eine explizite Eingabe (".1!:1[1
). Wenn Sie eine Funktion übergeben möchten, sollte diese Funktion den Wert tatsächlich drucken und nicht nur zurückgeben (likeecho@
oder so) ).=/~&I.
APL, 10
Beispiel:
Erläuterung:
∆←⎕
: Eingabe lesen, speichern in∆
.⍋∆
: Finde eine sortierende Permutation∆
(dies gibt einen eindeutigen Wert für jeden Wert in der Eingabe)∆/
: Wiederholen Sie diesen Vorgang für jeden dieser eindeutigen Werte,N
wobeiN
sich der entsprechende Wert in der Eingabe befindet∘.=⍨
: Erstelle eine Matrix, die jeden Wert in dieser Liste mit den anderen Werten vergleicht.quelle
http://tryapl.org
, möchten Sie möglicherweise die DFN verwenden{∘.=⍨⍵/⍋⍵}
, da die Site alle Verwendungen von filtert⎕
(mit Ausnahme von⎕IO
und solchen Dingen ).{∘.=⍨⍵/⍋⍵}
ist daher nicht gültig. Sie müssten{⎕←∘.=⍨⍵/⍋⍵}
, was nicht nur zwei Zeichen kostet, sondern auf TryAPL auch nicht funktionieren würde. (Und im Allgemeinen ist TryAPL zu begrenzt, um nützlich zu sein.)⎕←
sowieso kein , auch ohne die dfn?R
6963Testfall:
Die äußere Funktion erledigt hier den größten Teil der Arbeit. Es geht nur darum, dass die Ausgabe richtig aussieht. Vielen Dank an @Vlo für seine Hilfe
quelle
-/+
, logisch zu zwingen. Speichern Sie ein paar Bytesfunction(x)write(+outer(i<-rep(1:length(x),x),i,"=="),1,sum(x))
63Python 3,
10397827876 BytesVerwenden Sie splat, um die räumliche Trennung von
print
mit ein wenig Rekursion zu nutzen.quelle
Ruby,
869083 BytesMein erstes Golf überhaupt!
Erhält ein Array mit den ganzen Zahlen und gibt das erwartete Ergebnis aus:
Bearbeiten:
Vielen Dank an Martin Büttner, der mir geholfen hat, einige Dinge zu verkürzen!
quelle
->(l)
können sein->l
.map
ist kürzer alseach
..join(" ")
kann auf gekürzt werden*" "
.Matlab,
6054 BytesDies wäre Matlabs Spezialgebiet IF wir eingebauten Funktionen nutzen könnten ...
Vielen Dank an @sanchises für die Behebung des Fehlers, den ich verpasst habe.
quelle
Matlab, 53 Bytes
Obwohl es nur ein Zeichen kürzer als das andere Matlab-Fragment ist, stellte ich fest, dass der Code unterschiedlich genug ist, um eine neue Antwort zu rechtfertigen:
Der Haupttrick ist natürlich das Indizieren außerhalb der Grenzen, aber dies wird mit der Verwendung
end
als Variable kombiniert , um es kompakter zu machen.quelle
end+1:end+v
zu spielen, um eine "Counter" -Variable loszuwerden, und ich habe nicht an diese Lösung gedacht.blkdiag
die Anforderungen verletzen. Nur zum Nachschlagen, ich werde den Kern trotzdem hier platzieren:blkdiag(A,ones(i))
CJam, 21
Versuchen Sie es unter http://cjam.aditsu.net/
Erläuterung:
quelle
Python 3, 79
Verfolgt den am weitesten links stehenden Index des Blocks
s
und macht diex
Einträge danach1
, wobeix
die aktuelle Blockgröße ist. Diese Zeile wird dannx
mal ausgedruckt . Dazu wird Python 3 benötigtprint(*r)
.quelle
r
wie[0]*s+[1]*x+[0]*(sum(l)-s-x)
, aber ich bin immer noch nach einem besseren Weg suchen.Haskell,
118116 BytesVerwendung:
f [2,1,1,3]
Ausgabe:
Wie es funktioniert:
quelle
(h,e:t)<-map(`splitAt`i)[0..length i-1]
, dan
dies außerhalb derlet
Bindung nicht verwendet wird .Pyth,
2321 BytesGitHub-Repository für Pyth
Eingabe ist eine Liste von ganzen Zahlen, wie
[3, 1, 1, 2]
. Probieren Sie es online aus: Pyth Compiler / ExecutorVerwendet eine ganz ähnliche Idee wie der J-Code von randomra. Der erste Teil des Codes
Ju+G*]GHQY
generiertn
Teile ähnlicher Dinge. Für die Beispieleingabe[3, 1, 1, 2]
sieht das Ergebnis folgendermaßen aus:Zuerst drei identische Elemente, dann wieder ein Element und am Ende zwei identische Elemente.
Der zweite Teil des Codes vergleicht die Elemente des kartesischen Produkts und druckt es aus.
quelle
C ++, 294 Bytes
Verwendeter Compiler - GCC 4.9.2
Erklärung -:
quelle
K, 30 Bytes
Grundsätzlich stahl Marinus Antwort
quelle
Java, 163
Ein Verbraucher, der eine Liste von ganzen Zahlen akzeptiert.
Lesbare Version mit Kesselschildcode:
Aufrufen mit:
quelle
Python 2,
163114 BytesKnabber golfen dies ein Haufen.
quelle
print" ".join("01"[i==j]for j in r(l(h))for x in r(h[j]))
?Python 3, 74
quelle
and
Kurzschluss beseitigt wird .f([1,2,3]);print("Done")
, würde der Fehler das Programm beenden, nachdem es die Blockmatrix gedruckt hat, und es würde nicht zum Drucken von "Fertig" kommen.JavaScript (ES6), 103
107103 Bytes als anonyme Funktion, nicht mitgerechnet
F=
(aber zum Testen wird dies benötigt)Test In der Firefox / FireBug-Konsole
Ausgabe
quelle
Oktave,
4941 Bytesquelle
Pyth,
3130Ein ziemlich naives Programm, nimmt die Eingabe auf stdin. Damit kann man wohl mehr golfen;)
Vielen Dank an @Jakube für den Hinweis auf eine verschwendete Saibling
Probieren Sie es hier aus
quelle
Perl, 69
Verwendet die Standardeingabe:
quelle
-e
anstelle einer Datei aufrufen (siehe Beispiele in diesem Meta-Post). auch, ich glaube , Sie haben das nicht brauchenn
Flagge - nach dem perldoc,a
setztn
implizit.perl -nl file.pl
". Ursprüngliche Perlgolfregeln würden den Bindestrich zählen, aber nicht das Leerzeichen, also in diesem Fall 3 Zeichen.-lna //,print join$",map$'==$_|0,@,for@,=map{(++$i)x$_}@F
. BTW meine Version von Perl setzt nicht-n
mit-a
, es muss eine Neuerung sein.R,
117144137133129123 BytesIm Moment ziemlich ausführlich. Sollte in der Lage sein, ein paar mehr zu rasieren. Erhielt eine Anzahl von Bytes, die es korrekt formatierten, ersparte jedoch das Auswechseln der Matrix für ein Array.
Vielen Dank an Alex für den Tipp, wie man sep durch s ersetzt und den Funktionsnamen entfernt.
Löschte das Array vollständig und verwendete eine Reihe von Wiederholungen, um jede Zeile zu erstellen.
Obwohl von Miff geschlagen, ließ seine Lösung mich erkennen, dass ich das s = '' insgesamt fallen lassen konnte.
Und der Test
quelle
cat()
, Änderungsep=
zu ,s=
da keine andere anerkannte Parameter für diese Funktion beginnen mit „s“.f=
. Dies gibt Ihnen ein Funktionsobjekt. Wenn Sie das tun, müssen Sie nur festlegen, dass es mit etwas wie zugewiesen werden soll,f=
bevor Sie es ausführen. Ich wusste nicht, dass das bei solchen Wettbewerben legitim ist, bis ich Martin Büttner bei Ruby sah.Batch - 226 Bytes
Übernimmt die Eingabe von stdin (
C:\>script.bat 5 1 1 2 3 1
) und die Ausgabe von echo. Leider konnte ich das letzte Echo nicht auf derselben Leitung erhalten, da ich sonst wahrscheinlich die gesamte Leitung innerhalb der Leitung anrufen könntecmd/von/c
, um zu vermeiden, dass die verzögerte Erweiterung auf lange Sicht aktiviert werden muss.Nett und ordentlich - nichts als Grunzarbeit:
quelle
Haskell, 124
Erzeugt eine Ausgabe, indem E / A-Aktionen durch
mapM_
und kombiniert werdenfoldr
. Die Funktiond
sollte eine Liste von Ints erhalten.quelle
K (ngn / k) , 10 Bytes
Probieren Sie es online!
-19 danke an ngn ... halte meine Einsendung unter haha
K (ngn / k) , 29 Bytes
Probieren Sie es online!
edit: Pausen für 1-Element-Eingabefall, braucht Arbeit
edit1: jetzt behoben +4 Bytes. Boo
quelle
{x=\:x:&x}
&
in k oderI.
in j) mit int-vektoren arbeitet, während⍸
apls nur mit booleschen arten arbeitet .APL (Dyalog Extended) , 5 Bytes
Probieren Sie es online!
APL gewinnt gegen J und K mit der erweiterten Domain für zurück
⍸
.Wie es funktioniert
quelle
STATA, 155 Bytes
quelle
Gelee , 7 Bytes
Probieren Sie es online!
Gleicher Ansatz wie die J-Antwort.
quelle