Schreiben Sie ein Programm, um Zeichenfolgen zu elastifizieren

33

Nettes Verb dort, im Titel.

Schreiben Sie ein Programm, das eine Eingabezeichenfolge angibt, diese Zeichenfolge "elastifiziert" und das Ergebnis ausgibt. Das Elastifizieren eines Strings geschieht wie folgt:

Das erste Zeichen wird einmal angezeigt. Das zweite Zeichen wird zweimal angezeigt. Das dritte Zeichen wird dreimal angezeigt und so weiter.

Wie Sie sehen, hängt die Anzahl der Duplikationen eines bestimmten Zeichens vom Index des Zeichens ab, im Gegensatz zu den vorherigen Vorkommen in der Zeichenfolge.

Sie können nur druckbare ASCII-Zeichen erwarten. Basierend auf dem folgenden Link haben diese Zeichen Dezimalwerte 32-126.

Beispiele:

Why: Whhyyy

SKype: SKKyyyppppeeeee

LobbY: LoobbbbbbbYYYYY (Beachten Sie, wie es 7 B gibt, da das erste B 3-mal und das zweite B 4-mal angezeigt wird, was insgesamt 7 B ergibt.)

A and B: A aaannnnddddd BBBBBBB

Kürzeste Bytes gewinnt :)

Mario Ishac
quelle
2
Dies scheint nicht zu stimmen mit "es wird keine Unterstützung für Leerzeichen benötigt, außer dem Leerzeichen". Sollte der Ausgang dann der gleiche sein wie der Eingang? (Zwei Ein-Buchstaben-Wörter?) Beachten Sie auch, dass wir einen schönen Ort namens Sandbox haben, an dem Sie die Leute herausfordern können, Ihnen Feedback zu geben, bevor Sie sie veröffentlichen.
FryAmTheEggman
FryAmTheEggman Ihre Annahme ist gültig. @TimmyD Mir ist klar, wo ich unklar war, dass Sie möglicherweise Zeichenfolgen haben, die meine mehreren Leerzeichen voneinander getrennt haben, wie in dem Beispiel gezeigt, das FryAmTheEggman gepostet hat.
Mario Ishac
Ich gehe davon aus, dass der kürzeste Code gewinnt? ;)
Adnan
@Adnan Yep, obwohl ich nicht sicher bin, ob ich die Antwort mit dem kurzgeschlossenen Programm als akzeptiert markieren soll, da bestimmte Sprachen im Gegensatz zu anderen für Golfzwecke gemacht werden.
Mario Ishac
2
Related: 1 , 2
Sp3000

Antworten:

34

Gelee , 3 Bytes

Code:

ĖP€

Erläuterung:

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

Verwendet die Jelly-Codierung . Probieren Sie es online! .

Adnan
quelle
16
Netter Missbrauch der Tatsache, dass Python *String-Multiplikation macht. Das ist nicht wirklich beabsichtigt, aber es funktioniert.
Dennis
1
@ Tennis: welche *? In der ganzen Antwort gibt es so etwas nicht.
Thomas Weller
10
@Thomas: Jelly ist in Python geschrieben und der PBefehl Jelly berechnet das Produkt im Hintergrund mithilfe des Python- *Operators. In diesem Beitrag wird die undichte Abstraktion des zugrunde liegenden Codes missbraucht, der sich tatsächlich in Python befindet. Daher Pfunktioniert das Ausführen eines (Produkt-) Befehls für einen String wie erwartet.
Mellamokb
16

J, 4 Bytes

#~#\

Verwendung

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

Erläuterung

#~#\  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
Meilen
quelle
12

Brainfuck, 15 Bytes

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

Ziemlich unkomplizierte Implementierung, bei der der Speicherplatz für jedes Eingabezeichen um 1 verschoben wird. Erfordert einen Interpreter, der bei EOF 0 und bei Eingaben mit mehr als 255 Zeichen Zellen mit 32 Bit / willkürlicher Genauigkeit liefert.

Probieren Sie es online! (Hinweis: TIO verwendet 8-Bit-Zellen.)

Sp3000
quelle
1
Ich denke auch, dass dies nicht für Zeichenfolgen funktioniert, die länger als 255 Zeichen sind.
Ismael Miguel
@IsmaelMiguel Das würde davon abhängen, ob der fragliche Interpreter Ganzzahlen mit willkürlicher Genauigkeit hat oder nicht (aber in der Tat würde es für die meisten Implementierungen eine
Obergrenze von
Die Konvention ist die Verwendung von 8-Bit. Welches ist 1 Zeichen. Aber einige können in der Tat mit 32-Bit-Nummern implementieren. Da Sie angeben, dass EOF 0 sein muss (dies ist ein compiler- / interpreterspezifisches Verhalten), sollte beachtet werden, dass Sie für Zeichenfolgen mit mehr als 255 Zeichen einen Compiler / Interpreter mit 32-Bit-Zellen benötigen. Ich denke nur, dass es der Antwort hinzugefügt werden sollte, da es sich auch um ein compiler- / interpreterspezifisches Verhalten handelt.
Ismael Miguel
1
@IsmaelMiguel Sicher, bemerkt.
Sp3000
8

Java, 158 121 Bytes

Dank Kevin Cruijssen konnten satte 37 Bytes gespart werden !

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

Als Bonus kann dieses Programm alle vorhandenen Unicode-Zeichen verarbeiten, einschließlich der Steuerzeichen ganz am Ende von Basic Multilingual Plane .

Dorukayhan will Monica zurück
quelle
3
Huh, das ist sehr kurz für einen Java-Code.
Ave
1
Sie können es durch 1 Byte verkürzen durch Ersetzen for(int C=c+1;C>0;C--)mitfor(int C=c+2;--C>0;)
Kevin Cruijssen
2
Oder noch kürzer ( 121 Bytes ):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
Nun, machen Sie es einfach ein Lambda oder eine Methode
Leaky Nun
2
Wow, mit einem interfacefür die Standardmethoden public. Das ist Schlau.
Justin
7

Perl, 16 Bytes

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

+1 Byte für das -pFlag.

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
Türknauf
quelle
7

Haskell, 29 Bytes

concat.zipWith replicate[1..]

Anwendungsbeispiel: concat.zipWith replicate[1..] $ "SKype"-> "SKKyyyppppeeeee".

replicate n cerstellt n Kopien von c und erstellt concataus allen Unterlisten eine einzige Liste.

nimi
quelle
id=<<ist eine nette Geste. :)
Sonntag,
Ich wollte es nur versuchen, aber das Zuweisen f = id=<<zipWith replicate[1..](in einer Datei) führte zu einem hässlichen Fehler. Können Sie sagen, was ich falsch mache?
Fehler
Sollte es nicht möglich sein, diese (unbenannte, oder?) Funktion einem Namen zuzuweisen, damit wir sie als Funktion verwenden können? Ich meine, wenn es eine Funktion ist, (id=<<zipWith replicate[1..] ) "SKype"sollte das dann noch funktionieren? Ansonsten würde ich es als Schnipsel betrachten . Das vollständige Programm, das Sie bereitgestellt haben, ist mit "SKype" fest codiert.
Fehler
Ich würde sagen, wenn Sie es nicht wie jede andere Funktion verwenden können, ist es keine Funktion. ZB :twird nicht id=<<zipWith replicate[1..]als Funktion betrachtet (es wirft nur einen Fehler aus), sondern (id=<<).zipWith replicate[1..]wird als Funktion betrachtet. Ich würde sagen, das erste ist nur ein Ausschnitt, das funktioniert nur, wenn Sie die Eingabe fest codieren, aber das zweite, das Sie gerade veröffentlichen, ist eine Funktion (und :tstimmt zu), würden Sie dem zustimmen?
Fehler
Ok, großartig! Wenn Sie mit meiner "Definition" nicht einverstanden sind, sollten wir einen Metapost erstellen, um dies zu klären. In der Zwischenzeit versuche ich, ein paar andere Haskeller zu finden, die ihre Meinung dazu vertreten, da dies nur meine Ansicht ist.
Fehler
7

CJam, 9 8 7 Bytes

Danke an jimmy23013 für das Speichern von 1 Byte.

Sl+eee~

Teste es hier.

Erläuterung

Mit dem LobbYBeispiel:

                                      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
quelle
6

Python, 39 Bytes

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

Teste es auf Ideone .

Dennis
quelle
5

Javascript ES6, 39 Bytes

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

Gleiche Länge, aber mehr Spaß:

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

Snippet-Demo:

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
quelle
Kleiner Fehler, das Programm unterstützt keine Leerzeichen, die als Vorlage benötigt werden (OP überprüfen).
Mario Ishac
@MarDev Ich änderte den Code - Schnipsel zu verwenden , <pre>anstatt <div>, das helfen soll.
Neil
1
@Neil Ah, also das Ergebnis wurde korrekt berechnet, aber die Ausgabe wurde vom HTML-Code falsch gerendert. Ich habe vergessen, dass <div> das tut.
Mario Ishac
... "und das Ergebnis ausgeben "
Spender
1
@spender returning ist eine gültige Ausgabeform für Funktionen
cat
4

APL (8)

{⍵/⍨⍳⍴⍵}

Dh:

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

Erläuterung:

  • ⍴⍵: Länge des angegebenen Vektors
  • : Zahlen 1..N
  • ⍵/⍨: repliziere jedes Element in N-mal.
Marinus
quelle
4

MATLAB, 45 Bytes

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

Erklärung: Der Schlüssel ist hankel, der eine Hankelmatrix eines gegebenen Vektors erzeugt. Aus dieser Matrix können wir einen Vektor von Indizes extrahieren, der definiert, welches Zeichen des Strings an welcher Position in der Ausgabe steht. ZB hankel(1:4)erzeugt folgende Matrix:

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

Aus dieser Matrix können wir den Vektor extrahieren 1,2,2,3,3,3,4,4,4,4,4. Mit diesem Vektor können wir das erste Zeichen der Zeichenkette einmal , das zweite zweimal usw. Ausgeben

fehlerhaft
quelle
4

NARS2000 , 6 Zeichen = 12 Byte

⍳∘⍴/⊙⊢

⍳∘⍴Die Aufzählung des Arguments ... (Indizes seiner Länge)
/⊙repliziert die Elemente des ...
unveränderten Arguments

Adam
quelle
Link zum Dolmetscher?
Katze
@cat Siehe edit (in der Kopfzeile).
Adám
@cat Was hast du bearbeitet?
Adám
Identisch mit deiner Figur, weil ich sie selbst gegoogelt habe und es 10 Minuten gedauert hat, bis ich sie eingereicht habe
cat
Auch in welcher Codepage sind das 6 Bytes?
Katze
3

PowerShell v2 +, 36 Byte

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

Nimmt Eingaben auf $args[0], wandelt sie explizit in ein charArray um und sendet sie in eine Schleife |%{...}. Bei jeder Iteration nehmen wir den aktuellen Buchstaben / das aktuelle Zeichen "$_"und verwenden den *überladenen Operator, um die vorab inkrementierten $iZeiten der Zeichenfolge zu verketten . Das Ergebnis jeder Schleifeniteration wird in Parens eingekapselt, um ein Array zu bilden, und dann -joinzu einem String zusammengefasst. Diese Zeichenfolge verbleibt in der Pipeline und die Ausgabe ist implizit.

Beispiele

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
quelle
3

Brachylog , 13 Bytes

:ImC,0:Ie,Cw\

Dies druckt das Ergebnis nach STDOUT.

Erläuterung

Dies ist ein gutes Beispiel für die Nutzung von 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.
Tödlich
quelle
3

MATLAB, 23 Bytes

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

Erstellt eine anonyme Funktion ans, die mit aufgerufen werden kannans('stringtoelacticize')

Suever
quelle
Welche Version benutzt du? Kann repelemin meiner (relativ alten) Version nicht finden = (
flawr
1
@flawr repelemwurde in R2015a
Luis Mendo am
3

K / Kona , 14 Bytes

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

Verwendung:

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

Perl 6 ,  22 20  19 Bytes

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

Erläuterung:

{          # 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
quelle
3

VBA, 75 Bytes

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

Rufen Sie zB eine Benutzerfunktion in einer Tabelle auf.

= e (A1)

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

Es schneidet ab, wenn Sie ein paar Mal seine eigene Ausgabe einspeisen :-).

Joffan
quelle
2
Willkommen auf der Seite! =)
DJMcMayhem
3

PHP, 68 Bytes

<?php foreach(str_split($argv[1])as$i=>$a)echo str_repeat($a,$i+1);
Simon
quelle
Hallo und willkommen bei PPCG! Schöner erster Beitrag!
21.
Sie können es unten gelangen 47 Byte : 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``

Beispiel läuft:

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

f("Why")   => "Whhyyy"
f("SKype") => "SKKyyyppppeeeee"
f("LobbY") => "LoobbbbbbbYYYYY"
Dendrobium
quelle
Gleiche Länge: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, das ist klug, danke!
Dendrobium
3

Netzhaut , 22 Bytes

Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.

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

Probieren Sie es online!

Grundsätzlich fügen wir die richtige Anzahl von ·Platzhaltern zwischen die Zeichen ein (da diese erweiterten ASCII-Zeichen nicht in der Eingabe erscheinen können) und füllen sie dann in der zweiten Stufe mit dem benachbarten Zeichen auf.

Martin Ender
quelle
3

R , 83 50 Bytes

-23 Dank an Giuseppe, obwohl er im Wesentlichen eine völlig neue Methode angewendet hat

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

Mein ursprünglicher Beitrag:

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

Probieren Sie es online!

Ich glaube, es gibt definitiv einen besseren Weg, dies zu tun, aber mit meinen neuen Kenntnissen einiger Funktionen in R ist dies mein Ansatz.

Sumner18
quelle
1
Kein Golftipp, aber Ihre Code-Link-Ausgabe wurde durcheinander gebracht. Hier
Robert S.
Ah ich sehe. Ich bin neu bei TIO, daher habe ich die Kopf- / Fußzeilen nicht ganz verstanden. Danke dir!
Sumner18
1
Sehr schön! Die Verwendung von repund des Arguments collapse=""to pasteist jedoch kürzer und utf8ToIntnoch kürzer! TIO
Giuseppe
2

Eigentlich 7 Bytes

' +ñ♂πΣ

Probieren Sie es online!

Erläuterung:

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

Pyth - 5 Bytes

1 Byte gespart dank @FryAmTheEggman.

s*VSl

Test Suite .

Maltysen
quelle
@FryAmTheEggman ah, nett.
Maltysen
2

Python 3, 48 47 Bytes

Danke an mego für das Speichern eines Bytes mit dem -~iTrick.

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

Dies ist weitgehend selbsterklärend. Eine Sache für diejenigen, die sich mit Python nicht auskennen: Der *Operator ist überladen, um sich wie Perls xOperator zu verhalten, und wiederholt sein Zeichenfolgenargument so oft, wie es durch sein numerisches Argument angegeben ist. Z.B'foo' * 3 == 'foofoofoo'

bkul
quelle
c*-~iist kürzer als c*(i+1).
Mego
2

81 Bytes

void f(string s){for(int i=0;i<s.Length;i++)Console.Write(new String(s[i],i+1));}
ScifiDeath
quelle
Sie können 1 Byte sparen, indem Sie in eine foreach-Schleife wechseln, z. B.foreach(var a in s)Console.Write(new C(a,1*i++));
Abbath,
aber wenn es ein foreach ist, haben wir nicht die i Variable, also müsst ihr sie deklarieren.
ScifiDeath
Es scheint, dass Sie ein using Systemoder ein System.vor dem vermissen Console.
Martin Ender
@ScifiDeath Das stimmt - aber das Endergebnis ist noch ein Byte kürzer. Entschuldigen Sie das Auslassen und die Verwirrungint i=1;
Abbath
Auch ein Byte kürzer mit Linq: void f(string s){s.Select((c,i)=>{Console.Write(new string(c,i+1));return c;});}. Die Notwendigkeit für einen (nicht verwendeten) Rückgabewert ist jedoch hässlich. Bearbeiten: habe gerade ähnliche Schnipsel in anderen Antworten weiter hinten gefunden.
Linac
2

MATL, 5 Bytes

tn:Y"

Probieren Sie es online

Erläuterung

    % 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
quelle
2

Python, 40 Bytes

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

Julia, 34 Bytes

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

Probieren Sie es online!

Dennis
quelle
Ihre Lösung war gut. Aber ich habe es geschafft, es zu schlagen.
Glen O
Ich sah. Ich hatte c%n="$c"^n;~s=join([s[r=1:end]...].%r), aber das ist eigentlich länger. splitwar das fehlende Puzzleteil.
Dennis
2

TSQL, 97 Bytes

Golf gespielt:

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

Probieren Sie es online aus

t-clausen.dk
quelle