Étant donné une chaîne ASCII, sortez les suffixes éclatés de celle-ci. Par exemple, si la chaîne était abcde
, il y a 5 suffixes, classés du plus long au plus court:
abcde
bcde
cde
de
e
Chaque suffixe est ensuite éclaté , ce qui signifie que chaque caractère est copié autant de fois que son emplacement à un index dans ce suffixe. Par exemple, exploser les suffixes de abcde
,
abcde
12345
abbcccddddeeeee
bcde
1234
bccdddeeee
cde
123
cddeee
de
12
dee
e
1
e
Au total, les suffixes éclatés de abcde
sont
abbcccddddeeeee
bccdddeeee
cddeee
dee
e
Règles
- C'est le code-golf donc le code le plus court l'emporte.
- L'entrée sera constituée des caractères ASCII imprimables. (Cela exclut les nouvelles lignes mais inclut les espaces.)
- La sortie aura chaque chaîne sur une ligne distincte.
- Les espaces de fin sont autorisés sur chaque ligne et il peut y avoir une nouvelle ligne supplémentaire à la fin.
Cas de test
''
'a'
a
'bc'
bcc
c
'xyz'
xyyzzz
yzz
z
'code-golf'
coodddeeee-----ggggggooooooollllllllfffffffff
oddeee----gggggoooooolllllllffffffff
dee---ggggooooollllllfffffff
e--gggoooolllllffffff
-ggooollllfffff
goolllffff
ollfff
lff
f
's p a c e'
s ppp aaaaa ccccccc eeeeeeeee
pp aaaa cccccc eeeeeeee
p aaa ccccc eeeeeee
aa cccc eeeeee
a ccc eeeee
cc eeee
c eee
ee
e
Réponses:
Gelée , 5 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça fonctionne
la source
J,
22128 octetsMerci aux miles pour avoir économisé 14 octets!
Maintenant, c'est une très bonne solution. Assez succinct aussi.
Il s'agit du hook
#~#\
appliqué aux suffixes (\.
) de l'entrée. Le crochet, lorsqu'il est appelé en entréey
, se décompose ainsi:Voici quelques résultats intermédiaires:
Cas de test
la source
Python, 61 octets
Variante 63:
la source
Python 3,
916865 octetsSe termine avec une erreur après l'impression de la sortie souhaitée. Testez-le sur Ideone .
Comment ça fonctionne
Avant que f puisse s'appeler récursivement, les indices de
s[1:...]
doivent être calculés.La première
enumerate(s[0]+s)
donne toutes les paires (i, c) de caractères c de s - avec son premier caractère dupliqué - et les indices correspondants i . La prépensions[0]
sert ici à deux fins.Le premier caractère de s doit être répété une fois, mais le premier index est 0 .
Une fois que tous les caractères ont été traités, déclenche
s[0]
une IndexError , provoquant la fin de f avec une erreur plutôt que l'impression de nouvelles lignes jusqu'à ce que la limite de récursivité soit atteinte.''.join(i*c for i,c in ...)
construit une chaîne plate de chaque c répété i fois, quiprint
fait écho à STDOUT.Enfin, puisque
print
renvoie None ets[1:None]
est simplements[1:]
, l'appel récursiff(s[1:...])
répète le processus ci-dessus pour s sans son premier caractère.la source
Perl 6 , 38 octets
37 octets + 1 pour le
-n
commutateur de ligne de commandeExemple:
Étendu:
la source
Brachylog , 17 octets
Essayez-le en ligne!
Explication
la source
05AB1E , 13 octets
Essayez-le en ligne!
Explication
la source
CJam , 14 octets
Essayez-le en ligne!
Explication
la source
C #, 101 octets
Fonction anonyme récursive, qui imprime également une nouvelle ligne de tête. Si la nouvelle ligne de tête n'est pas autorisée, 3 octets supplémentaires la transforment en une nouvelle ligne de fin:
Programme complet avec méthode non golfée et cas de test:
la source
Haskell, 48 octets
est interfacé par l'un des
la source
putStr.
, nous acceptons comme sortie de fonction. Vous devezimport Data.List
cependant utilisertails
.uncurry ... zip
parzipWith
:unlines.map(concat.zipWith replicate[1..]).tails
.zipWith replicate
raccourcissement m'est également venu à mon réveil. Dommage quetails
n'est pasPrelude
je pourrais cherchertails
de manièreData.List
implicite sans pleinimport
et toujours sans outgrowing l'foldr
équivalent. En ce qui concerne la pureté sansIO
plaque chauffante, je laisserais également l'mapM_ putStrLn
assaisonnement aux goûts des lecteurs et je n'effectuerais pas nonunlines
plus. La définition d'un bloce=
coûterait le nombre d'octets.imports
n'est pas Haskell standard, mais une caractéristique de laghci
repl. Dépendre de telles choses compte comme une langue distincte, donc je suggère de changer le titre de votre réponse en quelque chose commeHaskell (ghci)
. ( Voir aussi cette méta discussion ).Perl, 36 + 1 (
-n
) = 37 octetsBesoins
-n
et-E
(ou-M5.010
) pour fonctionner:Notez qu'il ne fonctionne que sur une seule instance chaque fois que vous l'exécutez (car il utilise la variable
$.
qui est incrémentée chaque fois qu'une ligne est lue, donc il1
ne tient que la première fois qu'une ligne est lue). (Mais pas de problème ici, juste^D
et relancez-le!)la source
Rétine , 31 octets
Le nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne!
la source
Java,
150127 octetsÉditer:
Snipet:
Non golfé:
la source
f->{String s[]=f.split(""),o="";int i=-1,j,l=s.length;for(;++i<l;)for(j=-2;++j<i;o+=s[i]);return l<1?o:o+"\n"+f.substring(1);}
Raquette 184 octets
Non golfé:
Production:
la source
JavaScript (ES6), 65 octets
Tentatives précédentes:
la source
PHP, 103 octets (99 avec des balises courtes)
Je suis assez certain que ce n'est pas la réponse la plus courte possible.
la source
MATL , 12 octets
J'adore quand les guillemets se rejoignent!
Essayez-le en ligne!
Explication
Cela fonctionne en construisant une matrice dont les colonnes sont utilisées, une par une, pour décoder en entrée la longueur. Par exemple, pour la saisie,
'abcde'
la matrice estCode:
la source
Python 3, 95 octets
C'était étonnamment plus difficile que ce à quoi je m'attendais. J'ai refait toute ma fonction peut-être 4 fois.
la source
Java 7,140 octets
Non golfé
La ligne suivante me fait très mal, je ne sais pas comment je peux y jouer (car il y a deux boucles pour briser la condition à mettre
"\n"
en impression).System.out.println();
la source
Pyke, 12 octets
Essayez-le ici!
la source
Rubis, 51 octets
Utilise l'
-n
indicateur pour +1 octet.la source
R, 108 octets
Lire l'entrée depuis stdin et l'imprimer vers stdout
J'ai pensé que l'utilisation de
do.call
était appropriée ici. Il prend essentiellement deux entrées: 1. un nom de fonction sous la forme d'une chaîne (rep
ici) et une liste d'arguments et 2. applique de manière itérative les appels à la fonction en utilisant les arguments de la liste.Par exemple:
rep("c",3)
produit le vecteur"c" "c" "c"
do.call("rep",list(c("a","b","c"),1:3))
produit le vecteur"a" "b" "b" "c" "c" "c"
rep("a",1)
,rep("b",2)
etrep("c",3)
la source
Vim, 43 octets
qqYlpx@qq@qqr0<C-H><C-V>{$:s/\v%V(.)\1*/&\1/g<CR>@rq@r
La première macro sépare les suffixes, la deuxième macro les "explose". Probablement battable. Les espaces sont ennuyeux.
la source
C, 186 octets
Cela peut probablement être raccourci un peu, mais je voulais juste l'essayer. C'est mon deuxième essai au golf, alors donnez-moi tous les conseils (* lol) que vous pouvez. Il prend une chaîne comme paramètre et explose à partir de là. u est utilisé comme tampon qui stocke la chaîne éclatée.
Non golfé:
la source
Acc !! , 150 octets
Attend une entrée sur stdin, terminée par un caractère de tabulation.
Explication
C'est en fait une assez bonne tâche pour Acc !! , car il suffit de lire une chaîne et de l'itérer avec des boucles imbriquées. Nous lisons la chaîne dans l'accumulateur, la traitant comme une séquence de chiffres de base 128, avec le premier caractère à l'extrémité inférieure. Après la
Count c
boucle d' ouverture , la valeur de l'accumulateur peut être conceptualisée comme ceci (en utilisantxyz
comme exemple d'entrée):(La valeur réelle de l'accumulateur pour cet exemple est
9*128^3 + 122*128^2 + 121*128 + 120
=20888824
.)Nous pouvons ensuite parcourir la chaîne en itérant sur des puissances croissantes de 128. Et nous pouvons parcourir les suffixes en divisant l'accumulateur par 128 après chaque itération, en coupant un caractère.
Avec retrait et commentaires:
la source