É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 :)


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! .


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

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)


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 .


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

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.


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"]

6

Python, 39 octets

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

Testez-le sur Ideone .


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>


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.

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.


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é


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

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.

3

MATLAB, 23 bytes

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

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


What version are you using? Cannot find repelem in my (relatively old) version =(
flawr

1
@flawr repelem was introduced in R2015a
Luis Mendo


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
}

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 :-).


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);

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"

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.


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.


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


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'


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));}

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

2

Python, 40 bytes

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

2

Julia, 34 bytes

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

Try it online!


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.