Ecrivez un programme ou une fonction qui contient une chaîne dont le caractère garanti est de ne contenir que des caractères ASCII imprimables, à l' exception de l'espace, et d'être un nombre triangulaire positif (1, 3, 6, 10, 15, ...).
Imprimer ou retourner la même chaîne, mais en forme de triangle à l'aide d'espaces. Certains exemples montreront mieux ce que je veux dire:
Si l'entrée est R
alors la sortie sera
R
Si l'entrée est cat
alors la sortie sera
c
a t
Si l'entrée est monk3y
alors la sortie sera
m
o n
k 3 y
Si l'entrée est meanIngfu1
alors la sortie sera
m
e a
n I n
g f u 1
Si l'entrée est ^/\/|\/[]\
alors la sortie sera
^
/ \
/ | \
/ [ ] \
Si l'entrée est
Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?
alors la sortie sera
T
h i
s r u
n o f c
h a r a c
t e r s i s
m e a n t t o
h a v e a l e n
g t h t h a t c a
n b e e x p r e s s
e d a s a t r i a n g
u l a r n u m b e r . D
i d i t w o r k ? Y o u t
e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?
Fondamentalement, les nouvelles lignes sont insérées entre les sous-chaînes de longueur triangulaire, les espaces sont ajoutés entre tous les caractères et chaque ligne est mise en retrait avec des espaces pour s’ajuster à la forme du triangle.
Une seule nouvelle ligne de fin et des lignes avec des espaces de fin sont éventuellement autorisées, mais sinon, votre sortie doit correspondre exactement à ces exemples. La dernière ligne du triangle ne doit pas comporter d'espaces de début.
Le code le plus court en octets gagne.
Réponses:
Pyth, 22 octets
Essayez-le en ligne: démonstration ou suite de tests
Explication:
la source
Python, 81 octets
Une fonction récursive. Aller de la fin de
s
, couper et imprimer des caractères. Le nombre de caractères à prendre est calculé à partir de la longueur des
. La fonction est configurée pour imprimer dans l'ordre inverse des appels récursifs, qui se terminent quands
est vide puis résolus de sauvegarder la ligne. Chaque couche, le préfixep
a un espace supplémentaire ajouté.En Python 3, cela
if
peut être fait via un court-circuit, bien que cela ne semble pas économiser les caractères:Une alternative également longue avec des inégalités chaînant:
Les deux
print
etf
revenirNone
, ce qui est difficile à utiliser.la source
Retina ,
1081029487826463 octetsMerci à Sp3000 de m'avoir fait suivre mon approche originale, qui faisait passer le nombre d'octets de 108 à 82.
Un gros merci à Kobi qui a trouvé une solution beaucoup plus élégante, ce qui m'a permis d'économiser 19 octets supplémentaires.
Où
<space>
représente un caractère d'espacement unique (qui serait sinon supprimé par SE). À des fins de comptage, chaque ligne est placée dans un fichier séparé et\n
doit être remplacée par un caractère de saut de ligne réel. Pour plus de commodité, vous pouvez exécuter le code tel quel à partir d'un seul fichier avec l'-s
indicateur.Essayez-le en ligne.
Explication
Eh bien ... comme d'habitude, je ne peux pas vous donner une introduction complète aux groupes d'équilibrage ici. Pour un aperçu, voir ma réponse Stack Overflow .
La première étape est une
S
étape de pli, qui divise l’entrée en lignes de plus en plus longues. Le_
signe que les morceaux vides doivent être omis de la scission (ce qui n’affecte que la fin, car il y aura une correspondance dans la dernière position). La regex elle-même est entièrement contenue dans une apparence, elle ne correspond donc à aucun caractère, mais uniquement à des positions.Cette partie est basée sur la solution de Kobi avec une golfitude supplémentaire que je me suis trouvée. Notez que les recherches en arrière-plan sont associées de droite à gauche dans .NET. Il est donc préférable de lire l'explication suivante de bas en haut. J'ai également inséré une autre
\G
explication pour plus de clarté, bien que cela ne soit pas nécessaire pour que le motif fonctionne.J'admire toujours le travail de Kobi ici. C'est encore plus élégant que la regex de test principal. :)
Passons à l'étape suivante:
Simple: insérez un espace après chaque caractère sans saut de ligne.
Cette dernière étape indente correctement toutes les lignes pour former le triangle. Le
m
n'est que le mode multiligne habituel pour faire^
correspondre le début d'une ligne. Le+
dit à Retina de répéter cette étape jusqu'à ce que la chaîne cesse de changer (ce qui, dans ce cas, signifie que l'expression régulière ne correspond plus).Cela correspond donc au début de toute ligne qui n'a pas d'indentation plus grande que la suivante. Dans une telle position, nous insérons un espace. Ce processus se termine, une fois que les lignes sont disposées dans un triangle ordonné, car il s’agit de la disposition minimale dans laquelle chaque ligne a un retrait plus important que le suivant.
la source
Candy ,
675957 octets&iZ1-=yZ1+Z*2/>{0g}0=z@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&1-8*1+r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&8*7-r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
ou:
forme longue:
la source
CJam,
2726 octetsMerci à Sp3000 d’avoir économisé 1 octet.
Étonnamment proche de Pyth, voyons si cela peut être joué au golf ...Testez-le ici.
Explication
la source
'
pourS
???S
s'agit d'une chaîne, pas d'un caractère, laf
carte sera mappée sur cette chaîne au lieu de la liste de lignes.Ruby,
847773 octets77 octets
Réduction de quelques octets supplémentaires en supprimant la variable
r
comme suggéré par steveverrill.84 octets
Ungolfed:
Premier calcul du nombre triangulaire à partir de la chaîne de saisie
Par exemple, la taille de la chaîne d'entrée est de 120 et notre nombre triangulaire n sera de 15.
Dans la ligne ci-dessus, il affiche les espaces suivis d'une série de chaînes extraites de la chaîne d'entrée à l'aide du modèle suivant
[[0,0],[1,2],[3,5],[6,9]]
Usage:
la source
upto
argument entier (times
certainement). J'ai incorporé une partie de votre syntaxe dans une révision de ma réponse. Le plus gros conseil que je puisse vous donner est que vous n’avez pas besoin de cette variabler
. Utilisez simplement a,
au lieu de..
et le nombre après la virgule est le nombre total d'éléments à renvoyer, plutôt que la fin de la plage.Pyth, 27 octets
Suite de tests
Une approche intéressante - impératif, et utilise
.I
. Probablement golfable.la source
C,
138136134 octetsPrend une chaîne en tant qu'entrée:
la source
printf(" ")
etprintf("\n")
avecputs(" ")
etputs("\n")
. Chaque substitution vous fera économiser 2 octets. :)Approche Ruby 2 rev 1, 76 octets
Optimisé à l'aide des idées de syntaxe de la réponse de Vasu Adari, ainsi que de quelques modifications personnelles.
Approche Ruby 2 rev 0, 93 octets
Approche complètement différente. Tout d'abord, nous ajoutons des espaces entre les caractères de l'entrée. Ensuite, nous imprimons les lignes ligne par ligne.
Approche Ruby 1, 94 octets
cela s'est avéré bien plus long que prévu.
w
contient le nombre de caractères imprimables dans la rangée du bas ou, de manière équivalente, le nombre de lignes.Chaque ligne contient des
w
caractères d'espacement (la dernière étant la nouvelle ligne). L'idée est donc d'imprimer ces caractères et d'insérer les caractères imprimables si nécessaire.la source
Minkolang 0,14 , 42 octets
Essayez ici.
Explication
la source
Python 2,
88 à85 octetsMerci xnor d'avoir économisé 3 octets.
la source
s
le calcul du nombre d'espaces en raccourcissant ?S=s=raw_input()
?CJam, 50 octets
Essayez ici.
Explication
la source
JavaScript (ES6), 135 octets
De-golf + démo:
la source
for (s = j = 0; j < w.length; j += s++);
? En outre, à l'intérieur d'un<pre>
, vous pouvez utiliser\n
au lieu de<br>
. En outre, vous avez oublié de mentionner qu'il s'agit d'ES6.Java,
258194Golfé:
Ungolfed:
Sortie du programme:
la source
import static System.out;
est 25 octets etSystem.
7 octets. Il est utilisé trois fois et 21 <25, ce qui augmenterait la taille de 4 octets. Bonne avance, cependant, les importations statiques peuvent économiser de l'espace et tout le monde ne les connaît pas.JavaScript (ES6), 106 octets
Utilise la récursivité au lieu d’une boucle for pour construire la chaîne.
Pour trouver la longueur de la plus longue ligne, utilisez la formule du nième nombre triangulaire
T_n
estT_n = (n^2 + n)/2
. Étant donnén
et résolus d’T_n
utiliser la formule quadratique, nous avons:Il s'avère que, après le revêtement de sol, l'ajout de 1/4 à la racine carrée ne modifie pas le résultat. La formule de la rangée la plus longue l'est donc
Math.sqrt(2*a.length)|0
.la source
TeaScript , 44 octets
Ceci utilise la même méthode que ma réponse JavaScript , mais est beaucoup plus court.
Ungolfed
la source
Powershell, 69 octets
Script de test moins joué:
Sortie:
la source
C #, 202
Je ne sais pas si c'est légal en code-golf mais, est-ce que passer une liste dans la fonction compte? Je ne peux pas trouver un moyen de récidiver ceci sans une liste <string> déclarée en dehors de la fonction, donc je la mets en paramètre.
Usage:
la source
C, 102 octets
la source
Bash + sed, 87
la source
R, 142 octets
Je suis assez sûr de pouvoir en parler davantage. Je travaille toujours là-dessus. J'ai l'impression de rater une récursion facile - mais je n'ai pas réussi à la raccourcir correctement.
non-golfé
la source
05AB1E , 11 octets
Essayez-le en ligne!
la source