(Inspiré par une première version du défi de la ligne fractale de PhiNotPi .)
Vous obtenez une largeur W > 1
, une hauteur H > 1
et une chaîne composée de 2(W+H-2)
caractères ASCII imprimables. La tâche consiste à imprimer cette chaîne enroulée autour d'un rectangle de la largeur et de la hauteur données, en commençant dans le coin supérieur gauche, dans le sens des aiguilles d'une montre. L'intérieur du rectangle est rempli d'espaces. Espérons que les cas de test devraient être très clairs.
Vous pouvez écrire un programme ou une fonction, en saisissant les données via STDIN (ou l'alternative la plus proche), l'argument de ligne de commande ou l'argument de la fonction, et en imprimant le résultat dans STDOUT (ou l'alternative la plus proche) ou en le renvoyant sous forme de chaîne.
Il ne doit pas y avoir d'espaces de début ou de fin (à l'exception de ceux qui pourraient se trouver dans la chaîne d'entrée). Vous pouvez éventuellement générer une seule nouvelle ligne de fin.
Il s'agit du code golf, donc la soumission la plus courte (en octets) l'emporte.
Cas de test
Chaque cas de test est "String" W H
suivi de la sortie attendue.
"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
Classements
Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:
# 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>
Réponses:
CJam, 27 octets
Je ne suis pas vraiment CJam, mais je pense que cela bat Martin. La principale différence est que nous poussons une nouvelle ligne avant de lire l'entrée et imprimons la première ligne immédiatement, éliminant ainsi la nécessité de stocker la hauteur.
Prend la saisie dans l'ordre
Essayez-le en ligne.
la source
Python 2, 95 octets
Imprime la première ligne, puis les deux lignes verticales, puis la dernière ligne.
Il doit y avoir quelque chose de plus court que d'écrire
print
trois fois, mais tout ce que j'ai essayé jusqu'à présent avec l'enregistrement dans une variable'\n'.join
est plus long.la source
eval
sur l'entrée et mettre entre parenthèses les instructions print.eval
en compte! La parenthèse ne devrait pas poser trop de problème carprint
en Python 2 a besoin d'un espace après. Le passage deprint blah
àp(blah)
enregistre toujours 3 caractères.CJam,
3130 octetsÀ l'insistance d'Optimizer, voici ma propre tentative. Je ne suis pas fan de gagner mes propres défis, donc je compte la famille APL (ou quelqu'un de meilleur à CJam) pour battre cela. ;)
Prend la saisie dans le même ordre que celui indiqué dans la question:
Testez-le ici.
Un octet enregistré grâce à l'Optimizer.
Explication
À l'origine, j'avais une très bonne idée de commencer par le rectangle d'espaces, puis d'enrouler littéralement la chaîne tout en faisant tourner la grille entière quatre fois. Cependant, je n'arrivais pas à obtenir que cela fonctionne dans le cas où la largeur ou la hauteur ou les deux sont
2
. J'ai donc essayé l'approche naïve (haut imprimé, boucle sur les côtés, bas imprimé), et étonnamment, cela s'est avéré être vraiment court.la source
l~;:V/(N@s{)V2-S*@(N@_,V-}gW%
enregistre 1 car.Pyth,
474645403736 octetsC'est l'approche évidente implémentée en Pyth. Il imprime la première ligne par indexation
0:width
puis le milieu, puis la fin.Merci à @Jakube pour l'astuce avec using
z
etQ
pour deux entrées et usingp
.Prend l'entrée de stdin comme une chaîne et comme un tuple de dimensions, la nouvelle ligne est séparée:
et écrit à stdout.
Essayez-le ici .
la source
z
pour lire la chaîne économise pas mal de caractères. C'est aussit_N
la même chose que-_N1
.++
utiliserp
et de basculer lezt_N
avec*d-k2
.J, 61 octets
Méthode:
À partir d'un
(height-2)*(width-2)
bloc d'espaces, nous prenons le nombre nécessaire de caractères à la fin de la chaîne et l'ajoutons au bloc actuel. Nous répétons cela 4 fois. Les 5 états au total illustrés par l''Hello, World! ' 5 4
exemple (espaces remplacés parX
s pour plus de lisibilité):Le code:
Définition de fonction explicite. La fonction à deux opérandes prend une chaîne comme argument de gauche et une liste de deux entiers comme argument de droite.
Exemple d'utilisation:
Essayez-le en ligne ici.
la source
Pyth,
3837J'avais à l'origine une solution 38 différente, mais c'était essentiellement une solution golfique de la réponse de Maltysen. J'ai donc décidé d'aller un peu différent.
Essayez-le en ligne .
la source
_>z_ttH
est équivalent à<_zttH
.JavaScript (ES6), 110
115Fonction avec 3 paramètres, renvoyant une chaîne
Chrome version 119 : pas de format court pour les fonctions, pas de paramètres par défaut. Aucune raison d'utiliser
for(of)
même s'il est pris en chargeES5 version 126 : non pour (de), pas de chaîne.
Non golfé
Tester dans la console Firefox / FireBug
Sortie
la source
Python 2, 97 octets
Adopter l'approche directe.
la source
Haskell,
164156 octetsLa fonction
p
n'imprime pas la sortie, mais la renvoie sous forme de chaîne, par exemplep 4 5 "+--+|||+--+|||"
->"+--+\n| |\n| |\n| |\n+--+\n"
. Pour une meilleure utilisation de l'affichageputStr
:Comment ça marche: je crée un bloc
w
xh
d'espaces et remplace la première ligne par le début de la chaîne d'entrée. Ensuite, je fais pivoter le bloc dans le sens antihoraire et répète en remplaçant la première ligne encore trois fois.Pour éviter de couper à nouveau le premier caractère après le tour # 4, je l'ajoute à la chaîne d'entrée avant de commencer.
Edit: a trouvé un meilleur moyen de résoudre le problème de la coupure du premier caractère après le tour # 4.
la source
Postscript, 62 octets
Cela utilise bien sûr des jetons binaires, mais cela équivaut à:
Voici un hexdump du fichier (
xxd round.ps
):Courir comme:
La sortie est vraiment petite (en raison de la non-mise à l'échelle de la police), vous devez donc zoomer un peu pour la voir.
Cela permet à l'
xyshow
opérateur d'écrire la chaîne en utilisant des espacements de caractères personnalisés. Dans ce cas, j'utilise l'espacement vertical négatif pour écrire, puis l'espace horizontal négatif pour écrire en arrière, puis l'espace vertical positif pour écrire vers le haut. Pour cette raison, je n'ai besoin d'aucune sorte de manipulation de chaîne.la source
> <>,
8280 + 3 = 83 octetsPage Esolang pour> <> (Poisson)
Cela s'est avéré être plus court que ce à quoi je m'attendais. Il utilise l'approche simple consistant à imprimer la première ligne, puis les colonnes rembourrées avec les espaces centraux, puis la dernière ligne.
Entrez la chaîne via STDIN et la hauteur et la largeur via la ligne de commande avec le
-v
drapeau, comme ceci:Explication
la source
Bash + coreutils, 124
Un script shell pour vous aider à démarrer:
Passez l'entrée comme arguments de ligne de commande:
la source
JavaScript,
161160158 octetsLa méthode que j'ai élaborée s'est avérée beaucoup trop longue, mais bon, c'est une pratique. (De plus, je l'ai expliqué
r+o[u]+'\n':d
.)Pour une entrée qui n'a pas de sens, la sortie n'est pas définie (littéralement et plusieurs fois), mais elle fonctionne pour tous les cas de test.
la source
slice
est plus court quesubstr
, ce n'est pas exactement la même chose mais dans ce cas, vous pouvez l'utiliserGroovy, 140
appel:
sortie:
la source
K,
5554 octetsEn utilisant la même approche que l'implémentation J de randomra; Commencez avec un bloc d'espaces et ajoutez de la queue de la chaîne au bord tout en tournant quatre fois:
Et quelques exemples:
Le décomposer un peu pour la lisibilité,
Générez un bloc NxM:
Faites pivoter de 90 degrés en utilisant la transposition (
+
) et l'inverse de chaque (|:'
):Donc, si nous avons un bloc d'espaces
t
et une chaînes
, nous pouvons ajouter une tranche de la queue des
àt
:Nous utilisons le formulaire
4 {[x] ... }/( ... )
pour appliquer à plusieurs reprises une fonction à un tuple composé de la chaîne et de la matrice que nous construisons. Chaque fois que nous effectuons cette étape de rotation et de concaténation, nous coupons également la chaîne.modifier:
Une autre idée est d'essayer de diviser la chaîne d'entrée en fragments que nous voulons à chaque rotation, ce qui simplifie le corps principal du programme. Malheureusement, cela s'avère être légèrement plus long à 56 octets:
S'il existe une meilleure façon de calculer ces points de partage, je suis ouvert aux suggestions.
edit2:
Réorganiser légèrement me permet de supprimer une paire de parenthèses. 54 octets!
la source
K,
8068 octetsRaccourci de 80 grâce à @JohnE.
Original:
Je sais à peine comment ça marche.
Exemple d'utilisation:
Il y a quelques optimisations possibles, mais je continue de faire Kona segfault ...
la source
f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}
. 68 caractères par mon compte.R, 178
Il s'agit d'une fonction sans nom prenant
s, w, h
comme paramètres. Je souhaite qu'il y ait une meilleure façon de diviser la chaîne.Non golfé
Essai
la source
T-SQL, 307
Bien que toujours horriblement long, cela s'est avéré être un peu plus facile (et plus court) que je ne le pensais dans une requête. Implémenté en tant que fonction de valeur de table en ligne pour T-SQL.
Cela revient à travers la chaîne @h fois. La première récursion coupe @W caractères de la chaîne. Les récursions du milieu prennent la dernière et la première de la chaîne restante avec un remplissage de chaîne entre les deux. La dernière récursion inverse ce qui reste. Il y a quelques caractères perdus qui traitent de la façon dont SQL Server traite les espaces de fin sur VARCHARS.
Essai
la source
Pyth, 33 octets
Manifestation.
la source
MATLAB, 101
la source
C ++, 398 octets
Compilateur utilisé - GCC 4.9.2 avec
-std=c++14
indicateurTestez-le ici.
Explication
la source
char[][]
place?vector<vector<char>> M;M.resize(h,vector<char>(w,0));
est légèrement plus court quechar** M;M=new char*[h];while(i<h)M[i++]=new char[w]();
Perl, 193
195octetsJe suis sûr que cela peut être considérablement amélioré. Je suis un noob. >, <
la source
Java 11, 180 octets
Essayez-le en ligne (REMARQUE:
String.repeat(int)
est émulé commerepeat(String,int)
pour le même nombre d'octets, car Java 11 n'est pas encore sur TIO.)Explication:
la source
Fusain , 4 octets
Essayez-le en ligne (verbeux) ou essayez-le en ligne (pur) .
Explication:
Fondamentalement, une fonction intégrée pour ce défi. Prenez les deux premières entrées entières comme largeur et hauteur, et imprime une boîte avec la troisième chaîne d'entrée comme bordure:
la source