Écrire un programme pour élastiquer les cordes

33

Beau verbe là-bas, dans le titre.

Ecrivez un programme qui donne une chaîne d'entrée, "élastiquera" cette chaîne et affichera le résultat. L'élasticisation d'une chaîne se fait comme suit:

Le premier caractère est montré une fois. Le deuxième caractère est montré deux fois. Le troisième caractère est montré trois fois, et ainsi de suite.

Comme vous pouvez le constater, le nombre de duplications d'un caractère donné est lié à l'index du caractère par opposition à ses occurrences précédentes dans la chaîne.

Vous pouvez vous attendre à recevoir uniquement des caractères ASCII imprimables. Basé sur le lien suivant , ces caractères ont des valeurs décimales 32-126.

Exemples:

Why: Whhyyy

SKype: SKKyyyppppeeeee

LobbY: LoobbbbbbbYYYYY (Notez comme il y a 7 b puisque le premier b est affiché 3 fois et le second b 4 fois, ce qui donne un total de 7 b).

A and B: A aaannnnddddd BBBBBBB

Les octets les plus courts gagnent :)

Mario Ishac
la source
2
Cela semble être en désaccord avec "aucun support pour les espaces blancs n'est nécessaire, autre que le caractère d'espace". La sortie devrait-elle être la même que l'entrée alors? (Deux mots d'une lettre?) Notez également que nous avons un bel endroit appelé le bac à sable où vous pouvez créer des défis pour que les gens puissent vous donner leur avis avant de les poster.
FryAmTheEggman
FryAmTheEggman votre hypothèse est valide. @TimmyD Je réalise que là où je n'étais pas clair, vous pourriez vous retrouver avec des chaînes séparées de mes multiples espaces, comme le montre l'exemple de FryAmTheEggman.
Mario Ishac
Je suppose que le code le plus court gagne? ;)
Adnan
@Adnan Oui, bien que je ne sois pas sûr de devoir marquer la réponse avec le programme raccourci comme étant acceptée, car certaines langues sont conçues pour le golf contrairement à d'autres.
Mario Ishac
2
Connexes: 1 , 2
Sp3000

Réponses:

34

Gelée , 3 octets

Code:

ĖP€

Explication:

Ė     # Enumerate.
 P€   # Product of each.
      # Implicit joining of everything.

Utilise le codage Jelly . Essayez-le en ligne! .

Adnan
la source
16
Bon abus du fait que Python *effectue la multiplication de chaînes. Ce n'est pas vraiment prévu, mais ça marche.
Dennis
1
@ Dennis: lequel *? Il n'y a pas une telle chose dans toute la réponse.
Thomas Weller
10
@Thomas: Jelly est écrit en Python et la Pcommande Jelly calcule le produit en coulisse à l'aide de l' *opérateur Python . Cet article abuse de l'abstraction perméable du code sous-jacent se trouvant réellement en Python. Une Pcommande (produit) sur une chaîne fonctionne comme prévu.
Mellamokb
16

J, 4 octets

#~#\

Usage

   f =: #~#\
   f 'Why'
Whhyyy
   f 'SKype'
SKKyyyppppeeeee
   f 'LobbY'
LoobbbbbbbYYYYY
   f 'A and B'
A  aaannnnddddd      BBBBBBB

Explication

#~#\  Input: s
  #\  Computes the length of each prefix of s
      This forms the range [1, 2, ..., len(s)]
#~    For each value in the range, copy the character at the
      corresponding index that many times
      Return the created string
milles
la source
12

Brainfuck, 15 octets

,[>+[->+<<.>],]

Une implémentation assez simple, en décalant l'espace mémoire de 1 pour chaque caractère en entrée. Requiert un interpréteur donnant 0 sur EOF et des cellules de précision 32 bits / arbitraires pour les entrées de plus de 255 caractères.

Essayez-le en ligne! (Remarque: TIO utilise des cellules de 8 bits)

Sp3000
la source
1
De plus, je pense que cela ne fonctionne pas pour les chaînes de plus de 255 caractères.
Ismael Miguel
@IsmaelMiguel Cela dépend de savoir si l'interpréteur en question a des entiers de précision arbitraire ou non (mais effectivement, pour la plupart des implémentations, la limite serait
fixée
La convention est d'utiliser 8 bits. Quel est 1 caractère. Mais certains peuvent en effet implémenter avec des nombres 32 bits. Puisque vous spécifiez que vous avez besoin que EOF soit égal à 0 (ce qui est un comportement spécifique du compilateur / interprète), il convient de noter que pour les chaînes de plus de 255 caractères, vous avez besoin d'un compilateur / interprète avec des cellules 32 bits. Je viens juste de penser que cela devrait être ajouté à la réponse, car c'est aussi un comportement spécifique au compilateur / interprète.
Ismael Miguel
1
@ IsmaelMiguel Bien sûr, a noté.
Sp3000
8

Java, 158 121 octets

J'ai sauvé 37 octets grâce à Kevin Cruijssen !

interface a{static void main(String[]A){int b=0,B;for(char c:A[0].toCharArray())for(B=b+++2;--B>0;)System.out.print(c);}}

En prime, ce programme peut gérer tous les caractères Unicode de l’existence, y compris les caractères de contrôle situés tout à la fin du plan multilingue de base .

Dorukayhan veut récupérer Monica
la source
3
Euh, c'est très court pour un code Java.
Ave
1
Vous pouvez le raccourcir d'un octet en le remplaçant for(int C=c+1;C>0;C--)parfor(int C=c+2;--C>0;)
Kevin Cruijssen le
2
Ou même plus court ( 121 octets ):interface a{static void main(String[]A){int x=0,i;for(char c:A[0].toCharArray())for(i=x+++2;--i>0;)System.out.print(c);}}
Kevin Cruijssen
Eh bien, juste en faire un lambda ou une méthode
Leaky Nun
2
Wow, en utilisant un interfacepour les publicméthodes par défaut . C'est intelligent.
Justin
7

Perl, 16 octets

s/./$&x$+[0]/ge

+1 octet pour le -pdrapeau.

s/./        /    find every character
             g   globally
              e  and replace with the eval'd result of
    $&           the matched string
      x          repeated
       $+[0]     by the index of the character after the match
Poignée de porte
la source
7

Haskell, 29 octets

concat.zipWith replicate[1..]

Exemple d'utilisation: concat.zipWith replicate[1..] $ "SKype"->"SKKyyyppppeeeee" .

replicate n ccrée n copies de c et concatcrée une liste unique de toutes les sous-listes.

nimi
la source
id=<<C'est une bonne idée. :)
vendredi
Je voulais juste essayer, mais assigner f = id=<<zipWith replicate[1..](dans un fichier) a entraîné une erreur laide, pouvez-vous dire ce que je fais mal?
Flawr
Ne devrait-il pas être possible d'affecter cette fonction (non nommée, non?) À un nom, de sorte que nous puissions l'utiliser comme une fonction? Je veux dire si c'est une fonction, alors (id=<<zipWith replicate[1..] ) "SKype"devrait toujours fonctionner? Sinon, je considérerais cela comme un extrait . Le programme complet que vous avez fourni n’a pas de code "SKype".
Flawr
Je dirais que si vous ne pouvez pas l'utiliser comme n'importe quelle autre fonction, ce n'est pas une fonction. Par exemple, :tne considère pas id=<<zipWith replicate[1..]comme une fonction (une erreur (id=<<).zipWith replicate[1..]est simplement générée) mais est considéré comme une fonction. Je dirais que le premier est juste un extrait, qui fonctionne si vous codez en dur l'entrée, mais le second que vous venez de postet est une fonction (et est d' :taccord), êtes-vous d'accord avec cela?
flawr
OK super! Si vous n'êtes pas d'accord avec ma "définition", je pense que nous devrions créer un méta-post pour éclaircir cela. Dans le même temps , je suis en train de trouver d'autres haskellians pour leur opinion à ce sujet , car cela est juste mon point de vue.
Flawr
7

CJam, 9 8 7 octets

Merci à jimmy23013 pour avoir économisé 1 octet.

Sl+eee~

Testez-le ici.

Explication

En utilisant l' LobbYexemple:

                                      Stack:
S    e# Push space.                   [" "]
l    e# Read input.                   [" " "LobbY"]
+    e# Append.                       [" LobbY"]
ee   e# Enumerate.                    [[[0 ' ] [1 'L] [2 'o] [3 'b] [4 'b] [5 'Y]]]
e~   e# Run-length decode.            ["LoobbbbbbbYYYYY"]
Martin Ender
la source
6

Python, 39 octets

f=lambda s:s and f(s[:-1])+s[-1]*len(s)

Testez-le sur Ideone .

Dennis
la source
5

Javascript ES6, 39 octets

x=>x.replace(/./g,(y,i)=>y+y.repeat(i))

Même longueur, mais plus amusant:

x=>x.replace(i=/./g,y=>y.repeat(i=-~i))

Snippet démo:

f= x=>x.replace(/./g,(y,i)=>y+y.repeat(i))
run.onclick=_=>output.textContent=f(input.value)
<input id="input" value="SKype">
<button id="run">Go</button>
<pre id="output"></pre>

Nderscore
la source
Petite erreur, le programme ne prend pas en charge les espaces, ce qui est requis en tant que soumission (vérifiez l'OP).
Mario Ishac
@MarDev J'ai changé l'extrait de code à utiliser à la <pre>place de <div>, cela devrait aider.
Neil
1
@Neil Ah, le résultat a donc été correctement calculé, mais le rendu n'a pas été correctement rendu par le code HTML. J'ai oublié que <div> le fasse.
Mario Ishac
... "et affiche le résultat"
expéditeur le
1
@spender return est une forme de sortie valide pour les fonctions
Cat
4

APL (8)

{⍵/⍨⍳⍴⍵}

C'est à dire:

      {⍵/⍨⍳⍴⍵} ¨  'Why' 'SKype' 'LobbY'
┌──────┬───────────────┬───────────────┐
│Whhyyy│SKKyyyppppeeeee│LoobbbbbbbYYYYY│
└──────┴───────────────┴───────────────┘

Explication:

  • ⍴⍵: longueur du vecteur donné
  • : numéros 1..N
  • ⍵/⍨: réplique chaque élément en N fois.
marinus
la source
4

MATLAB, 45 octets

g=@(m)sort(m(m>0));@(s)s(g(hankel(1:nnz(s))))

Explication: La clé est hankel, qui produit une matrice de Hankel d'un vecteur donné. De cette matrice, nous pouvons extraire un vecteur d’index, qui définit quel caractère de la chaîne se trouve à quelle position dans la sortie. Par exemple, hankel(1:4)produit la matrice suivante:

 1  2  3  4
 2  3  4  0
 3  4  0  0
 4  0  0  0

De cette matrice, nous pouvons extraire le vecteur 1,2,2,3,3,3,4,4,4,4,4. Ce vecteur nous permet de sortir le premier caractère de la chaîne une fois , le deuxième deux fois, etc.

flawr
la source
4

NARS2000 , 6 caractères = 12 octets

⍳∘⍴/⊙⊢

⍳∘⍴l'énumération de l'argument ... (indices de sa longueur)
/⊙reproduit les éléments de ...
l'argument non modifié

Adam
la source
lien vers interprète?
Chat
@cat Voir éditer (dans l'en-tête).
Adám
@cat Quelle a été votre édition?
Adám
Identique à la vôtre, parce que je l'ai googlé moi-même et que mon montage a pris 10 minutes à être soumis
cat
De plus, dans quelle page de codes se trouve ce 6 octets?
Chat
3

PowerShell v2 +, 36 octets

-join([char[]]$args[0]|%{"$_"*++$i})

Prend input $args[0], le convertit explicitement en chartableau, l’envoie dans une boucle |%{...}. À chaque itération, nous prenons la lettre / le caractère actuel "$_"et utilisons l' *opérateur surchargé pour concaténer les temps pré-incrémentés de chaîne $i. Le résultat de chaque itération de boucle est encapsulé dans des parenthèses pour former un tableau, puis -joinédité ensemble pour former une chaîne. Cette chaîne est laissée sur le pipeline et la sortie est implicite.

Exemples

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 Why
Whhyyy

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 SKype
SKKyyyppppeeeee

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 LobbY
LoobbbbbbbYYYYY

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 'a b'
a  bbb
AdmBorkBork
la source
3

Brachylog, 13 bytes

:ImC,0:Ie,Cw\

This prints the result to STDOUT.

Explanation

This is a good example of exploiting backtracking to loop.

:ImC            C is the Ith character of the Input
    ,
     0:Ie       Unify an implicit variable with an integer between 0 and I
         ,
          Cw    Write C to STDOUT
            \   False, trigger backtracking. It will go back to 0:Ie and unify the implicit
                variable with another integer, until all integers were used. After that, it
                will backtrack to :ImC and unify I and C with the next character.
Fatalize
la source
3

MATLAB, 23 bytes

@(x)repelem(x,1:nnz(x))

Creates an anonymous function ans that can be called using ans('stringtoelacticize')

Suever
la source
What version are you using? Cannot find repelem in my (relatively old) version =(
flawr
1
@flawr repelem was introduced in R2015a
Luis Mendo
3

K/Kona, 14 bytes

{,/(1+!#x)#'x}

Usage:

k){,/(1+!#x)#'x}"A and B"
"A  aaannnnddddd      BBBBBBB"
Simon Major
la source
3

Perl 6,  22 20  19 bytes

{S:g/(.)/{$0 x$/.to}/}
{S:g[(.)]=$0 x$/.to}
{[~] .comb Zx 1..*}

Explanation:

{          # implicit parameter $_
  [~]      # string concatenate the following list
    .comb  # the NFG characters from $_
    Z[x]   # zip combined using the string repetition operator
    1 .. * # 1 to infinity
}
Brad Gilbert b2gills
la source
3

VBA, 75 bytes

Function e(s):For a=1 To Len(s):e=e &String(a,Mid(s,a,1)):Next:End Function

Call as e.g. a user function in a spreadsheet.

=e(A1)

┌─────────┬───────────────┐
│   SKype │SKKyyyppppeeeee│
└─────────┴───────────────┘

It truncates if you feed it its own output a few times :-).

Joffan
la source
2
Welcome to the site! =)
DJMcMayhem
3

PHP, 68 bytes

<?php foreach(str_split($argv[1])as$i=>$a)echo str_repeat($a,$i+1);
Simon
la source
Hi, and welcome to PPCG! Nice first post!
Rɪᴋᴇʀ
You can get it down to 47 bytes: for(;$a=$argv[1][$i++];)echo str_repeat($a,$i);.
insertusernamehere
3

Javascript ES6, 42 41 bytes

s=>[,...s].map((e,i)=>e.repeat(i)).join``

Example runs:

f=s=>[,...s].map((e,i)=>e.repeat(i)).join``

f("Why")   => "Whhyyy"
f("SKype") => "SKKyyyppppeeeee"
f("LobbY") => "LoobbbbbbbYYYYY"
Dendrobium
la source
Same length: s=>[...s].reduce((a,b,i)=>a+b.repeat(i+1))
Bassdrop Cumberwubwubwub
2
-1 byte: s=>[,...s].map((e,i)=>e.repeat(i)).join``
nderscore
@nderscore Aha, thats clever, thanks!
Dendrobium
3

Retina, 22 bytes

Byte count assumes ISO 8859-1 encoding.

.
$&$.`$*·
+`(.)·
$1$1

Try it online!

Basically, we insert the right amount of · as placeholders between the characters (since these extended ASCII characters can't appear in the input), then fill them up with the adjacent character in the second stage.

Martin Ender
la source
3

R, 83 50 bytes

-23 Thanks to Giuseppe, though he used essentially an entire new method altogether

function(s)intToUtf8(rep(utf8ToInt(s),1:nchar(s)))

My original post:

function(s){r="";for(i in 1:nchar(s))r=paste0(r,strrep(el(strsplit(s,""))[i],i));r}

Try it online!

I feel like there's definitely a better way to do this, but with my new knowledge of a few functions in R, this is my approach.

Sumner18
la source
1
Not a golfing tip, but your code link output was messed up. Here
Robert S.
Ah, I see. I'm new to TIO, so I didn't quite understand the header/footer portions. Thank You!
Sumner18
1
Very nice! However, using rep and the argument collapse="" to paste is shorter, and utf8ToInt is shorter still! TIO
Giuseppe
2

Actually, 7 bytes

' +ñ♂πΣ

Try it online!

Explanation:

' +ñ♂πΣ
' +      prepend a space
   ñ     enumerate ("abc" -> [[0, 'a'], [1, 'b'], [2, 'c']])
    ♂π   map: for each character, repeat it n times
      Σ  concatenate
Mego
la source
2

Pyth - 5 bytes

1 byte saved thanks to @FryAmTheEggman.

s*VSl

Test Suite.

Maltysen
la source
@FryAmTheEggman ah, nice one.
Maltysen
2

Python 3, 48 47 bytes

Thanks to mego for saving a byte with the -~i trick.

lambda s:''.join(c*-~i for i,c in enumerate(s))

This is mostly self-explanatory. One thing for those not versed in Python: The * operator is overloaded to act like Perl's x operator, repeating its string argument the number of times specified by its numeric argument. E.g. 'foo' * 3 == 'foofoofoo'

bkul
la source
c*-~i is shorter than c*(i+1).
Mego
2

C#, 81 Bytes

void f(string s){for(int i=0;i<s.Length;i++)Console.Write(new String(s[i],i+1));}
ScifiDeath
la source
you can save 1 byte by changing to a foreach loop, e.g. foreach(var a in s)Console.Write(new C(a,1*i++));
Abbath
but if its a foreach we don't have the i variable so you'd need to declare it.
ScifiDeath
It seems you're missing a using System or a System. in front of the Console.
Martin Ender
@ScifiDeath That's true - but the end result is still one byte shorter. Sorry for omitting it and causing confusion int i=1;
Abbath
Also one byte shorter using Linq: void f(string s){s.Select((c,i)=>{Console.Write(new string(c,i+1));return c;});}. The need for a (unused) return value is ugly though. Edit: just found similar snippets in other answers further back.
linac
2

MATL, 5 bytes

tn:Y"

Try it Online

Explanation

    % Implictly grab input as a string
tn  % Duplicate and compute the length (N)
:   % Create an array from [1...N]
Y"  % Perform run-length decoding to elacticize the string
    % Implicitly display the result
Suever
la source
2

Python, 40 bytes

f=lambda s,i=1:s and s[0]*i+f(s[1:],i+1)
xnor
la source
2

Julia, 34 bytes

!s=s>""?!s[1:(e=end)-1]*s[e:e]^e:s

Try it online!

Dennis
la source
Your solution was good. But I managed to beat it.
Glen O
I saw. I had c%n="$c"^n;~s=join([s[r=1:end]...].%r), but that's actually longer. split was the missing piece of the puzzle.
Dennis
2

TSQL, 97 bytes

Golfed:

DECLARE @x varchar(max)='Lobby'
DECLARE @ int=LEN(@x)WHILE @>0SELECT
@x=STUFF(@x,@,1,REPLICATE(SUBSTRING(@x,@,1),@)),@-=1PRINT @x

Ungolfed:

DECLARE @x varchar(max)='Lobby'

DECLARE @ int=LEN(@x)
WHILE @>0
  SELECT 
    @x=STUFF(@x,@,1,REPLICATE(SUBSTRING(@x,@,1),@)),
    @-=1

PRINT @x

Try it online

t-clausen.dk
la source