Étant donné un entier, affichez une tente à l'envers.
L'entrée détermine à la fois la taille de la tente (valeur absolue) et si l'entrée est du côté gauche (nombres négatifs) ou du côté droit (nombres positifs).
If input = -1:
____
\/_/
If input = -2:
________
\ / /
\/___/
If input = -3:
____________
\ / /
\ / /
\/_____/
If input = 1:
____
\_\/
If input = 2:
________
\ \ /
\___\/
If input = 3:
____________
\ \ /
\ \ /
\_____\/
et cetera
Notez que le haut de la tente (c'est-à-dire la dernière ligne) a des 2 * abs(input) - 1
traits de soulignement.
Il ne peut pas y avoir d'espaces de début, de sorte que la première ligne commence directement par un trait de soulignement.
Supposons que l'entrée ne le sera jamais 0
.
Votre code doit être aussi court que possible.
Ce défi est basé sur un mini défi de chat par Helka Homba , qui peut être utilisé dans de vrais défis dans les conditions de la licence publique Calvin's Hobbies .
3
par exemple?Réponses:
MATL ,
55535251 octetsEssayez-le en ligne!
Explication
Notons
N
l'entrée. Le code se déroule en trois étapes.Tout d'abord , la première ligne de
4*N
soulignements est construite sous forme de chaîne et s'affiche (ce qui la supprime de la pile).Deuxièmement , le «cadre» de la tente est construit à l'aide des deux types de barres obliques. Pour ce faire, un tableau numérique 2D est créé qui contient
1
et2
correspondant aux deux types de barres obliques, et0
pour l'espace.Cela se fait en concaténant quatre matrices:
abs (N)
;2
dans l'antidiagonale;La concaténation verticale de ces quatre matrices donne, à
N=3
titre d'exemple, la4*N × N
matrice suivante :(qui, transposée, commence à ressembler à la tente).
Nous prenons maintenant soin du signe de l'entrée. S'il est positif, nous transposons simplement la matrice et l'index ci-dessus dans la chaîne
'\/ '
. L'indexation est basée sur 1 et modulaire, donc1
devient'\'
,2
devient'/'
et0
devient' '
, produisant le tableau de caractères 2DD'un autre côté, si l'entrée est négative, nous inversons verticalement et nions arithmétiquement la
4*N × N
matrice, produisantL'index
-1
fait maintenant référence à'/'
et-2
à'\'
. Autrement dit, les deux types de barres obliques ont été échangés, comme requis. Transposer et indexer à nouveau dans la chaîne'\/ '
donne donc la tente inversée:Troisièmement , les traits de soulignement doivent être remplis dans une partie de la dernière ligne du tableau de caractères 2D. La position horizontale de cette ligne dépend du signe de l'entrée, et sa longueur est
abs(N)
.Une fois que les espaces correspondants ont été remplacés par des traits de soulignement, le résultat est affiché implicitement, sous la ligne initiale de traits de soulignement qui était déjà affichée à la première étape.
la source
Javascript (ES6), 139 octets
Construit la tente récursivement:
Non golfé et commenté
Exemples
la source
Python 2,
143 141 139 139 138137 octets-2 octets grâce à @ Sp3000 (pas besoin de parenthèse exec en Python 2)
-1 octet grâce à @ Sp3000 (utilisation
cmp
)Testez-le chez ideone
D'abord, nous voyons si
n
est négatif et faisonsd
+1
si c'est le-1
cas et sinon.Ensuite, nous sélectionnons les deux barres obliques,
a
etb
, en utilisant ded
telle sorte quea='\', b='/'
quandn
est positif eta='/', b='\'
quandn
est négatif.Ensuite, nous définissons
s=abs(n)
ce qui peut être atteint pars=n*d
.Ensuite, nous calculons le nombre de
_
en haut (bas de l'image), qui est également le nombre desur le côté de la tente comme
x=2*s-1
.Ensuite, nous calculons le nombre de
_
à la base de la tente (haut de l'image), et le stockons commey=4*s
car il sera utilisé dans la boucle pour créer le reste de la tente.Maintenant, nous imprimons la base de la tente en utilisant
print'_'*y
.Ensuite, nous imprimons le reste de la tente en exécutant
s
des instructions d'impression avec une variable en bouclei
initialisée à0
laquelle s'incrémente par1
pour chaque instruction d'impression.Le reste de la tente a alors des
y-3-x-i-i
espaces dans la porte et desx
espaces dans le corps jusqu'à ce que le sommet est atteint, quands-i>1
evalue sur False, la cueillette_
de'_ '
.Pour une tente positive à gauche, la totalité de la tente, à l'exclusion des espaces de tête, est de l'arrière vers l'avant, donc elle est inversée tandis que la tente positive, à droite, n'est pas avec
[::d]
.la source
cmp(0,0)
revient malheureusement0
Python 2, 121 octets
Juste beaucoup de formatage de chaînes.
la source
C #,
215214 octetsIl est possible d'enregistrer quelques octets lors de l'utilisation
using s=string;
préalable.ce qui serait 15 (en utilisant) + 184 (méthode) = 199 octets.
la source
var
à l'intérieur de la boucle for enstring
, vous pouvez supprimer le secondevar
(y compris l'espace pour enregistrer l'octet). Ainsivar f
devientstring f
et;var p=
devient,p=
.TSQL, 195 octets
Golfé:
Non golfé:
Violon
la source
V , 66 octets
Essayez-le en ligne!
C'est une approche assez naïve, donc j'essaierai de l'explorer plus tard dans la journée. Cette solution contient des caractères non imprimables, voici donc un hexdump:
la source
05AB1E , 52 octets
Explication
Essayez-le en ligne!
la source
PowerShell v2 +,
217205190187 187184 octetsPrend entrée
$b
comme un entier. Notez que si$b
est négatif, vous devez l'entourer explicitement de parens pour le caser correctement (voir les exemples), sinon PowerShell pensera que c'est une chaîne.Quelle que soit la direction dans laquelle la tente fait face, la première ligne est la même, un tas de soulignements; exactement
4*abs(input)
beaucoup d'entre eux, en fait. Ce numéro est également stocké dans$a
pour une utilisation ultérieure. De plus, maintenant que nous avons la valeur absolue de$b
stocké dans$a
, nous nous transformons$b
en booléen pour son signe, et choisissons nos barres obliques stockées dans$y
et$z
.La ligne suivante construit et formule la sortie, et c'est un doozy, alors décomposons-le.
Nous indexons essentiellement dans un tableau de deux éléments,
(big long calculations saved into $x)
ou$x
, en fonction de$b
.Les calculs sont l'endroit où le corps de la tente est construit. Nous bouclons
1..$a|%{...}
. À chaque itération, nous construisons une ligne du corps de la tente. Nous commençons avec un nombre d'espaces égal à la ligne # sur laquelle nous sommes-1
, afin qu'il soit correctement aligné à gauche. C'est stocké dans$w
pour plus tard, et concaténé avec la barre oblique appropriée ($ z, basée sur$b
), puis le nombre d'espaces d'encadrement de porte, puis l'autre barre oblique$y
, puis soit des traits de soulignement soit des espaces selon que nous sommes sur la ligne du bas ou non, puis une autre barre oblique$y
, et enfin le nombre approprié d'espaces de fin ($w
) pour construire une chaîne rectangulaire. Ce tableau de chaînes résultant est stocké dans$x
.Si la moitié gauche du tableau est sélectionnée (c'est-à-
$b
direFalse
que l'entrée est positive), alors nous devons parcourir$x
et inverser chaque élément de ligne - c'est là que les espaces de fin entrent en jeu; cela nous permet simplement d'inverser les lignes plutôt que de recalculer les distances.Si
$b
c'est le casTrue
, alors la moitié droite du tableau$x
est sélectionnée à la place.Dans les deux cas, le pipeline contient désormais un tableau de chaînes. Sortie implicite via
Write-Output
se produit à la fin du programme, avec une nouvelle ligne par défaut entre les éléments.Exemples
la source
Haskell,
187184183 octetsJe pense que ce n'est pas un bon score pour Haskell, donc toutes les idées d'amélioration sont les bienvenues.
Non golfé
la source
main
afin qu'il acceptestdin
comme entrée?:
caractère. c'est-"\\" ++ entrance...
à- dire changer pour'\\':entrance
.|1>0=(2*(n-i-1))%' '
pour|q<-2*(n-i-1)=q%' '
.C,
240207193 octetsCette fois, j'ai optimisé la fonction g (...) pour utiliser une boucle simple.
Cette fois, la macro X est mieux gérée en tant que fonction g (...) et comme y et z sont des paramètres dans une nouvelle portée, je peux simplement les décrémenter dans la portée de g.
Testez avec cette fonction principale; Cela devrait jouer au golf beaucoup plus petit.
la source
C #
241231octets10 octets enregistrés grâce à @Kevin Cruijssen
Ancienne version:
A l' origine avait l'
new string(...)
une ,Func<char,int,string>
mais sauvé un octet en utilisant le constructeur. Je souhaiteint
->char
était impliciteJe suis sûr que mes calculs peuvent être corrigés d'une manière ou d'une autre, mais je ne le vois pas
la source
int
avantz=
en l' ajoutant à la boucle for:int j=0,z
. Et comme vous en utilisezstring
beaucoup, vous pouvez l'aliaser avecusing s=System.String;
Ainsi le total devient:using s=System.String;s f(int N){var f=N<0;N=N>0?N:-N;var o=new s('_',N*4);for(int j=0,z;j<N;){z=-2*j+2*N-2;var O=j>N-2?'_':' ';o+='\n'+new s(' ',j)+'\\'+new s(' ',z)+(f?'/':O)+new s(O,j++*2)+(f?O:'\\')+new s(' ',z)+'/';}return o;}
( 231 octets )Swift 2.2 421 octets
Eh bien ... C'était une tentative.
Golfé:
Non golfé:
la source
PHP, 143 octets
courir avec
php -r '<code>' <parameter>
panne
la source
Lot, 289 octets
Prend entrée sur STDIN. Commence par créer une chaîne de
2*(abs(n)-1)
traits de soulignement. Ceci est ensuite répété plus 4 soulignements supplémentaires pour la base de la tente. Le reste de la tente se compose alors d'un tiret (qui augmente de 1 sur chaque ligne), a\
, le milieu de la tente et a/
. Le milieu de la tente commence comme des2*(abs(n)-1)
espaces, plus soit\
ou/
plus un espace (que je ne peux pas représenter dans Markdown), plus d'autres2*(abs(n)-1)
espaces. Je réutilise la chaîne de soulignement et les change en espaces pour plus de commodité, mais je change ensuite les espaces en soulignements pour la dernière ligne. Chaque ligne supprime deux espaces d'un côté du milieu de la tente, bien qu'il soit légèrement plus golfeur de déplacer les deux espaces au début de la chaîne en premier si nécessaire.la source
Toile , 25 octets
Essayez-le ici!
la source