(Inspiriert von einem frühen Entwurf der fraktalen Linienherausforderung von PhiNotPi .)
Sie erhalten eine Breite W > 1
, eine Höhe H > 1
und eine Zeichenfolge, die aus 2(W+H-2)
druckbaren ASCII-Zeichen besteht. Die Aufgabe besteht darin, diese Zeichenfolge, beginnend in der oberen linken Ecke, im Uhrzeigersinn um ein Rechteck mit der angegebenen Breite und Höhe zu drucken. Die Innenseite des Rechtecks ist mit Leerzeichen gefüllt. Die Testfälle sollten dies hoffentlich sehr deutlich machen.
Sie können ein Programm oder eine Funktion schreiben, Eingaben über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis entweder an STDOUT (oder die nächstgelegene Alternative) ausgeben oder als Zeichenfolge zurückgeben.
Es dürfen keine führenden oder nachfolgenden Leerzeichen (außer denjenigen, die sich möglicherweise in der Eingabezeichenfolge befinden) vorhanden sein. Optional können Sie eine einzelne nachgestellte Newline ausgeben.
Dies ist Codegolf, daher gewinnt die kürzeste Übermittlung (in Bytes).
Testfälle
Auf jeden Testfall "String" W H
folgt die erwartete Ausgabe.
"Hello, World! "
5 4
Hello
,
!
dlroW
"+--+|||+--+|||"
4 5
+--+
| |
| |
| |
+--+
">v<^"
2 2
>v
^<
"rock beats scissors beats paper beats "
11 10
rock beats
s
s c
t i
a s
e s
b o
r
r s
epap staeb
Note that the following string contains an escaped '"'.
"!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
46 3
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN
~ O
}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQP
Bestenlisten
Hier ist ein Stapel Snippet sowohl eine regelmäßige Rangliste und einen Überblick über die Gewinner von Sprache zu erzeugen.
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=47710;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>
Antworten:
CJam, 27 Bytes
Ich habe nicht wirklich CJam, aber ich denke, das schlägt Martin. Der Hauptunterschied besteht darin, dass wir vor dem Lesen der Eingabe eine neue Zeile einfügen und die erste Zeile sofort ausgeben , ohne dass die Höhe gespeichert werden muss.
Übernimmt die Eingabe in der Reihenfolge
Probieren Sie es online aus.
quelle
Python 2, 95 Bytes
Druckt die erste Zeile, dann die beiden vertikalen Zeilen und dann die letzte Zeile.
Es muss etwas kürzeres als
print
dreimaliges Schreiben geben , aber alles, was ich bisher mit dem Speichern in einer Variablen versucht'\n'.join
habe, war länger.quelle
eval
die print-Anweisungen für die Eingabe verwenden und in eckige Klammern setzen müssen.eval
berücksichtigt! Die Klammer sollte kein allzu großes Problem sein, daprint
in Python 2 ein Leerzeichen danach benötigt wird. Beim Wechsel vonprint blah
nach werdenp(blah)
noch 3 Zeichen gespeichert.CJam,
3130 BytesAuf Optimizers Bestehen ist hier mein eigener Versuch. Ich bin kein Fan davon, meine eigenen Herausforderungen zu gewinnen, also zähle ich die APL-Familie (oder jemanden, der besser bei CJam ist), um dies zu übertreffen. ;)
Nimmt Eingaben in der gleichen Reihenfolge vor, wie in der Frage angegeben:
Teste es hier.
Ein Byte gespart dank Optimizer.
Erläuterung
Ursprünglich hatte ich eine wirklich gute Idee, mit dem Rechteck der Räume zu beginnen und dann die Zeichenfolge buchstäblich darum zu wickeln, während ich das gesamte Gitter viermal drehte. Allerdings konnte ich das scheinbar nicht zum Laufen bringen, wenn Breite oder Höhe oder beides vorhanden waren
2
. Also habe ich den naiven Ansatz ausprobiert (Druck oben, Schleife über den Seiten, Druck unten), und überraschenderweise stellte sich heraus, dass es wirklich kurz war.quelle
l~;:V/(N@s{)V2-S*@(N@_,V-}gW%
spart 1 ZeichenPyth,
474645403736 BytesDies ist der offensichtliche Ansatz, der in Pyth implementiert ist. Es druckt die erste Zeile durch Indizieren
0:width
und dann die Mitte und dann das Ende.Danke an @Jakube für den Tipp mit using
z
undQ
für zwei Eingänge und usingp
.Übernimmt die Eingabe von stdin als String und als Tupel von Dimensionen, durch Zeilenumbruch getrennt:
und schreibt an stdout.
Probieren Sie es hier aus .
quelle
z
Lesen der Zeichenfolge spart eine Menge Zeichen. Ist aucht_N
das selbe wie-_N1
.++
benutzenp
und daszt_N
mit umzuschalten*d-k2
.J, 61 Bytes
Methode:
Ausgehend von einem
(height-2)*(width-2)
Leerzeichenblock nehmen wir die erforderliche Anzahl von Zeichen vom Ende der Zeichenfolge und fügen sie dem aktuellen Block hinzu. Wir wiederholen dies 4 mal. Die insgesamt 5 mit dem'Hello, World! ' 5 4
Beispiel veranschaulichten Zustände (Leerzeichen werdenX
aus Gründen der Lesbarkeit durch s ersetzt ):Der Code:
Explizite Funktionsdefinition. Die Zwei-Operanden-Funktion verwendet eine Zeichenfolge als linkes Argument und eine Liste mit zwei Ganzzahlen als rechtes Argument.
Anwendungsbeispiel:
Probieren Sie es hier online aus.
quelle
Pyth,
3837Ich hatte ursprünglich eine andere 38-Lösung, aber es war im Grunde eine Golf-Lösung von Malcesens Antwort. Also habe ich beschlossen, ein bisschen anders zu gehen.
Probieren Sie es online aus .
quelle
_>z_ttH
ist äquivalent zu<_zttH
.JavaScript (ES6), 110
115Funktion mit 3 Parametern, die einen String zurückliefern
Chrome- Version 119 : Kein Kurzformat für Funktionen, keine Standardparameter. Kein Grund zu benutzen
for(of)
auch wenn es unterstützt wirdES5 Version 126 : nein für (von), kein string.repeat
Ungolfed
Prüfung In der Firefox / FireBug-Konsole
Ausgabe
quelle
Python 2, 97 Bytes
Auf direktem Weg.
quelle
Haskell,
164156 BytesDie Funktion
p
druckt die Ausgabe nicht aus, sondern gibt sie als String zurück, zBp 4 5 "+--+|||+--+|||"
->"+--+\n| |\n| |\n| |\n+--+\n"
. Zur besseren Darstellung verwenden SieputStr
:So funktioniert es: Ich erstelle einen
w
x-h
Block mit Leerzeichen und ersetze die erste Zeile durch den Anfang der Eingabezeichenfolge. Dann drehe ich den Block gegen den Uhrzeigersinn und wiederhole das Ersetzen der ersten Zeile noch dreimal.Um zu verhindern, dass das erste Zeichen nach Runde 4 erneut abgeschnitten wird, hänge ich es vor dem Start an die Eingabezeichenfolge an.
Bearbeiten: Es wurde ein besserer Weg gefunden, das Problem mit dem Cut-Off-First-Character-After-Turn- # 4 zu lösen.
quelle
Postscript, 62 Bytes
Dies verwendet natürlich binäre Token, aber es ist äquivalent zu:
Hier ist ein Hexdump der Datei (
xxd round.ps
):Rennen wie:
Die Ausgabe ist sehr klein (da die Schrift überhaupt nicht skaliert wird), Sie müssen also ein gutes Stück zoomen, um sie zu sehen.
Dadurch kann der
xyshow
Operator die Zeichenfolge mit benutzerdefinierten Zeichenabständen ausschreiben. In diesem Fall benutze ich den negativen vertikalen Abstand zum Aufschreiben, dann den negativen horizontalen Abstand zum Zurückschreiben und dann den positiven vertikalen Abstand zum Aufschreiben. Aus diesem Grund muss ich keine Zeichenfolgenmanipulation verwenden.quelle
> <>,
8280 + 3 = 83 BytesEsolang Seite für> <> (Fisch)
Dies stellte sich als kürzer heraus als ich erwartet hatte. Es verwendet den einfachen Ansatz, die erste Zeile, dann die mit den zentralen Leerzeichen aufgefüllten Spalten und dann die letzte Zeile zu drucken.
Geben Sie den String über STDIN und die Höhe und Breite über die Befehlszeile mit dem
-v
Flag ein, wie folgt :Erläuterung
quelle
Bash + Coreutils, 124
Ein Shell-Skript für den Einstieg:
Übergeben Sie die Eingabe als Befehlszeilenargumente:
quelle
JavaScript,
161160158 BytesDie Methode, die ich mir ausgedacht habe, hat sich als viel zu lang herausgestellt, aber na ja, es war Übung. (Auch habe ich es zu buchstabieren
r+o[u]+'\n':d
.)Bei Eingaben, die keinen Sinn ergeben, ist die Ausgabe undefiniert (buchstäblich und einige Male), funktioniert jedoch für alle Testfälle.
quelle
slice
ist kürzer alssubstr
, es ist nicht genau das gleiche, aber in diesem Fall können Sie es verwendenGroovy, 140
Anruf:
Ausgabe:
quelle
K,
5554 BytesVerwenden des gleichen Ansatzes wie die J-Implementierung von randomra; Beginnen Sie mit einem Leerzeichenblock und fügen Sie vom Ende der Zeichenfolge bis zur Kante hinzu, während Sie viermal drehen:
Und einige Beispiele:
Bringen Sie es ein wenig für die Lesbarkeit,
Generiere einen NxM Block:
Mit transponieren (
+
) und jeweils umkehren (|:'
) um 90 Grad drehen :Wenn wir also einen Block von Räumen haben
t
und einen Strings
, können wir ein Stück des Schwanzes von prepends
zut
:Wir verwenden das Formular,
4 {[x] ... }/( ... )
um wiederholt eine Funktion auf ein Tupel anzuwenden, das aus der Zeichenfolge und der Matrix besteht, die wir erstellen. Jedes Mal, wenn wir diesen Rotations- und Verkettungsschritt ausführen, schneiden wir auch die Zeichenfolge ab.bearbeiten:
Eine andere Idee ist es, die Eingabezeichenfolge bei jeder Drehung in die gewünschten Fragmente aufzuteilen, was den Hauptteil des Programms vereinfacht. Leider ist dies bei 56 Bytes etwas länger:
Wenn es einen besseren Weg gibt, diese Split-Punkte zu berechnen, bin ich offen für Vorschläge.
edit2:
Durch leichtes Umordnen entferne ich ein Paar Klammern. 54 Bytes!
quelle
K,
8068 BytesVerkürzt von 80 dank @JohnE.
Original:
Ich weiß kaum, wie das Ding funktioniert.
Anwendungsbeispiel:
Es gibt einige mögliche Optimierungen, aber ich mache immer wieder Kona segfault ...
quelle
f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}
. 68 Zeichen nach meiner Zählung.R 178
Dies ist eine unbenannte Funktion, die
s, w, h
als Parameter verwendet wird. Ich wünschte, es gäbe eine schönere Möglichkeit, die Saite zu teilen.Ungolfed
Testlauf
quelle
T-SQL, 307
Dies war zwar immer noch schrecklich lang, stellte sich jedoch als viel einfacher (und kürzer) heraus, als ich in einer Abfrage dachte. Implementiert als Inline-Tabellenwertfunktion für T-SQL.
Dies wiederholt sich durch die Zeichenfolge @h mal. Die erste Rekursion schneidet @W Zeichen aus der Zeichenfolge aus. Die mittleren Rekursionen nehmen die letzte und die erste verbleibende Zeichenfolge mit einem Zeichenfolgenabstand dazwischen. Die letzte Rekursion kehrt das Verbleibende um. Es gibt ein paar verlorene Zeichen, die sich mit der Art und Weise befassen, wie SQL Server nachgestellte Leerzeichen in VARCHARS behandelt.
Testlauf
quelle
Pyth, 33 Bytes
Demonstration.
quelle
MATLAB, 101
quelle
C ++, 398 Bytes
Compiler verwendet - GCC 4.9.2 mit
-std=c++14
FlagTeste es hier.
Erläuterung
quelle
char[][]
stattdessen verwenden?vector<vector<char>> M;M.resize(h,vector<char>(w,0));
ist etwas kürzer alschar** M;M=new char*[h];while(i<h)M[i++]=new char[w]();
Perl, 193
195BytesIch bin sicher, dass dies stark verbessert werden kann. Ich bin ein Anfänger. >, <
quelle
Java 11, 180 Bytes
Probieren Sie es online aus (HINWEIS:
String.repeat(int)
wird emuliert alsrepeat(String,int)
für die gleiche Anzahl von Bytes , da Java 11 noch nicht auf TIO läuft.)Erläuterung:
quelle
Kohle , 4 Bytes
Probieren Sie es online (ausführlich) oder online (rein) .
Erläuterung:
Grundsätzlich ein fester Bestandteil dieser Herausforderung. Nehmen Sie die ersten beiden Ganzzahleingaben als Breite und Höhe und drucken Sie ein Feld mit der dritten Eingabezeichenfolge als Rahmen:
quelle