Scrivi un programma per elasticizzare le stringhe


33

Bel verbo lì, nel titolo.

Scrivi un programma che ha dato una stringa di input, "elasticizzerà" questa stringa e produrrà il risultato. L'elasticizzazione di una stringa viene eseguita come segue:

Il primo carattere viene mostrato una volta. Il secondo carattere viene mostrato due volte. Il terzo personaggio viene mostrato tre volte e così via.

Come puoi vedere, la quantità di duplicazioni di un certo personaggio è correlata all'indice del personaggio rispetto alle sue ricorrenze precedenti nella stringa.

Puoi aspettarti di ricevere solo caratteri ASCII stampabili. Sulla base del seguente link , questi caratteri hanno valori decimali 32-126.

Esempi:

Why: Whhyyy

SKype: SKKyyyppppeeeee

LobbY: LoobbbbbbbYYYYY (Nota come ci sono 7 b poiché la prima b viene mostrata 3 volte e la seconda b viene mostrata 4 volte, per un totale di 7 b).

A and B: A aaannnnddddd BBBBBBB

Vince il byte più corto :)


2
Ciò sembra essere in disaccordo con "non è necessario alcun supporto per gli spazi bianchi, a parte il carattere spaziale". L'output dovrebbe essere lo stesso dell'ingresso allora? (Due parole di una lettera?) Nota anche che abbiamo un bel posto chiamato Sandbox in cui puoi mettere sfide alle persone per darti un feedback prima di pubblicarle.
FryAmTheEggman,

FryAmTheEggman il tuo presupposto è valido. @TimmyD Mi rendo conto di dove non ero chiaro, potresti finire con stringhe separate dai miei spazi multipli, come mostrato nell'esempio pubblicato da FryAmTheEggman.
Mario Ishac,

Suppongo che vince il codice più corto? ;)
Adnan,

@Adnan Sì, anche se non sono sicuro che dovrei contrassegnare la risposta con il programma in corto come accettata, poiché alcune lingue sono create per scopi di golf a differenza di altre.
Mario Ishac,

2
Correlati: 1 , 2
Sp3000,

Risposte:


34

Gelatina , 3 byte

Codice:

ĖP€

Spiegazione:

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

Utilizza la codifica Jelly . Provalo online! .


16
Bello abuso del fatto che Python *esegue la moltiplicazione delle stringhe. Questo non è davvero previsto, ma funziona.
Dennis,

1
@Dennis: quale *? Non c'è nulla di simile in tutta la risposta.
Thomas Weller,

10
@Thomas: Jelly è scritta in Python e il Pcomando Jelly calcola il prodotto dietro le quinte usando l' *operatore Python . Questo post sta abusando dell'astrazione che perde il codice sottostante in realtà in Python, quindi eseguire un Pcomando (prodotto) su una stringa funziona come previsto.
mellamokb,

16

J, 4 byte

#~#\

uso

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

Spiegazione

#~#\  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 byte

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

Implementazione piuttosto semplice, spostando lo spazio di memoria di 1 per ogni carattere di input. Richiede un interprete che fornisce 0 su EOF e celle di precisione arbitraria a 32 bit per input superiori a 255 caratteri.

Provalo online! (Nota: TIO utilizza celle a 8 bit)


1
Inoltre, penso che questo non funzioni per stringhe più lunghe di 255 caratteri.
Ismael Miguel,

@IsmaelMiguel Dipenderebbe dal fatto che l'interprete in questione abbia o meno numeri interi di precisione arbitrari (ma in effetti, per la maggior parte delle implementazioni, avrebbe un limite di 255)
Sp3000

La convenzione prevede l'utilizzo di 8 bit. Che è 1 personaggio. Ma alcuni potrebbero effettivamente implementare con numeri a 32 bit. Poiché si specifica che è necessario che EOF sia 0 (che è un comportamento specifico del compilatore / interprete), è necessario notare che per stringhe più lunghe di 255 caratteri, è necessario un compilatore / interprete con celle a 32 bit. Ho solo pensato che dovrebbe essere aggiunto alla risposta, dal momento che è anche un comportamento specifico del compilatore / interprete.
Ismael Miguel,

1
@IsmaelMiguel Certo, notato.
Sp3000,

8

Java, 158 121 byte

Risparmiato ben 37 byte grazie a 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);}}

Come bonus, questo programma può gestire tutti i caratteri Unicode esistenti, inclusi i caratteri di controllo situati all'estremità del piano multilingue di base .


3
Eh, questo è molto breve per un codice Java.
Ave,

1
Puoi accorciarlo di 1 byte sostituendolo for(int C=c+1;C>0;C--)confor(int C=c+2;--C>0;)
Kevin Cruijssen il

2
O anche più breve ( 121 byte ):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,

Bene, basta renderlo un lambda o un metodo
Leaky Nun,

2
Caspita, usando un interfaceper i publicmetodi predefiniti . È intelligente.
Justin il

7

Perl, 16 byte

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

+1 byte per la -pbandiera.

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 byte

concat.zipWith replicate[1..]

Esempio di utilizzo: concat.zipWith replicate[1..] $ "SKype"-> "SKKyyyppppeeeee".

replicate n ccrea n copie di c e concatcrea un unico elenco da tutte le liste secondarie.


id=<<è un bel tocco. :)
sudee,

Volevo solo provarlo, ma l'assegnazione f = id=<<zipWith replicate[1..](in un file) ha provocato un brutto errore, puoi dire cosa sto facendo di sbagliato?
Flawr,

Non dovrebbe essere possibile assegnare questa funzione (senza nome, giusto?) A un nome, in modo che possiamo usarla come funzione? Voglio dire se è una funzione, allora (id=<<zipWith replicate[1..] ) "SKype"dovrebbe ancora funzionare? Altrimenti lo considererei come un frammento . Il programma completo che hai fornito ha "SKype" hardcoded.
Flawr,

Direi che se non puoi usarlo come qualsiasi altra funzione, non è una funzione. Ad esempio :t, non considera id=<<zipWith replicate[1..]una funzione (genera solo un errore) ma (id=<<).zipWith replicate[1..]viene considerata come una funzione. Direi che il primo è solo uno snipped, che funziona solo se decodifichi l'input, ma il secondo che hai appena postato è una funzione (e :tconcorda), saresti d'accordo su questo?
Flawr,

Ok fantastico! Se non sei d'accordo con la mia "definizione", penso che dovremmo iniziare un meta post per chiarire questo. Nel frattempo sto cercando di trovare altri haskelliani per la loro opinione su questo, dato che questo è solo il mio punto di vista.
Flawr,

7

CJam, 9 8 7 byte

Grazie a jimmy23013 per aver salvato 1 byte.

Sl+eee~

Provalo qui.

Spiegazione

Utilizzando l' LobbYesempio:

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


5

Javascript ES6, 39 byte

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

Stessa lunghezza, ma più divertente:

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

Demo dello snippet:

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>


Piccolo errore, il programma non supporta gli spazi, che è necessario come invio (controllare l'OP).
Mario Ishac,

@MarDev Ho cambiato lo snippet da usare <pre> posto di <div>, che dovrebbe aiutare.
Neil,

1
@Neil Ah, quindi il risultato è stato calcolato correttamente, ma l'output è stato reso in modo errato dall'HTML. Ho dimenticato che <div> lo fa.
Mario Ishac,

... "e genera il risultato"
spender il

1
Il ritorno di @spender è una forma valida di output per le funzioni
cat

4

APL (8)

{⍵/⍨⍳⍴⍵}

Vale a dire:

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

Spiegazione:

  • ⍴⍵: lunghezza del vettore dato
  • : numeri 1..N
  • ⍵/⍨: replica ogni elemento in N volte.

4

MATLAB, 45 byte

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

Spiegazione: La chiave è hankel, che produce una matrice di Hankel di un dato vettore. Da questa matrice, possiamo estrarre un vettore di indici, che definisce quale carattere della stringa si trova in quale posizione nell'output. Ad esempio hankel(1:4)produce la seguente matrice:

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

Da questa matrice possiamo estrarre il vettore 1,2,2,3,3,3,4,4,4,4,4. Questo vettore ci consente di emettere il primo carattere della stringa una volta , il secondo due volte ecc


4

NARS2000 , 6 caratteri = 12 byte

⍳∘⍴/⊙⊢

⍳∘⍴l'enumerazione dell'argomento ... (indici della sua lunghezza)
/⊙replica gli elementi
dell'argomento non modificato


link all'interprete?
gatto,

@cat Vedi modifica (nell'intestazione).
Adám,

@cat Qual è stata la tua modifica?
Adám,

Identico al tuo fino al personaggio, perché l'ho cercato su me stesso e la mia modifica ha richiesto 10 minuti per l'invio
cat

Inoltre, in quale tabella codici sono questi 6 byte?
cat

3

PowerShell v2 +, 36 byte

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

Prende input $args[0], lo lancia esplicitamente come un chararray, lo invia in un ciclo |%{...}. Ogni iterazione prendiamo la lettera / carattere corrente "$_"e usiamo l' *operatore sovraccaricato per concatenare i $itempi pre-incrementati della stringa . Il risultato di ogni iterazione del ciclo è incapsulato in parentesi per formare un array e quindi -joineditato insieme per formare una stringa. Quella stringa viene lasciata sulla pipeline e l'output è implicito.

Esempi

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 byte

:ImC,0:Ie,Cw\

Questo stampa il risultato su STDOUT.

Spiegazione

Questo è un buon esempio di sfruttamento del backtracking per eseguire il 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 byte

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

Crea una funzione anonima ansche può essere chiamata utilizzandoans('stringtoelacticize')


Quale versione stai usando? Non riesco a trovare repelemnella mia (relativamente vecchia) versione = (
flawr

1
@flawr è repelemstato introdotto in R2015a
Luis Mendo il


3

Perl 6 ,  22 20  19 byte

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

Spiegazione:

{          # 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 byte

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

Chiama ad esempio una funzione utente in un foglio di calcolo.

= E (A1)

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

Si tronca se lo si alimenta il proprio output alcune volte :-).


2
Benvenuti nel sito! =)
DJMcMayhem

3

PHP, 68 byte

<?php foreach(str_split($argv[1])as$i=>$a)echo str_repeat($a,$i+1);

Ciao e benvenuto in PPCG! Bel primo post!
Rɪᴋᴇʀ

È possibile ottenere fino a 47 byte : for(;$a=$argv[1][$i++];)echo str_repeat($a,$i);.
insertusernamehere

3

Javascript ES6, 42 41 byte

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

Esempi di esecuzione:

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

f("Why")   => "Whhyyy"
f("SKype") => "SKKyyyppppeeeee"
f("LobbY") => "LoobbbbbbbYYYYY"

Stessa lunghezza: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, è intelligente, grazie!
Dendrobium,

3

Retina , 22 byte

Il conteggio dei byte presuppone la codifica ISO 8859-1.

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

Provalo online!

Fondamentalmente, inseriamo la giusta quantità di ·segnaposto tra i caratteri (poiché questi caratteri ASCII estesi non possono apparire nell'input), quindi li riempiamo con il carattere adiacente nel secondo stadio.


3

R , 83 50 byte

-23 Grazie a Giuseppe, sebbene abbia usato sostanzialmente un metodo completamente nuovo

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

Il mio post originale:

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

Provalo online!

Sento che c'è sicuramente un modo migliore per farlo, ma con la mia nuova conoscenza di alcune funzioni in R, questo è il mio approccio.


1
Non è un suggerimento per il golf, ma l'output del link del codice è stato incasinato. Qui
Robert S.

Ah, capisco. Sono nuovo di TIO, quindi non ho capito bene le parti di intestazione / piè di pagina. Grazie!
Sumner18


1
Molto bella! Tuttavia, l'utilizzo repe l'argomento collapse=""su pasteè più breve ed utf8ToIntè ancora più breve! TIO
Giuseppe,

2

In realtà, 7 byte

' +ñ♂πΣ

Provalo online!

Spiegazione:

' +ñ♂πΣ
' +      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 byte

Grazie a mego per aver salvato un byte con il -~itrucco.

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

Questo è per lo più autoesplicativo. Una cosa per coloro che non sono esperti di Python: l' *operatore è sovraccarico di agire come l' xoperatore di Perl , ripetendo il suo argomento stringa il numero di volte specificato dal suo argomento numerico. Per esempio'foo' * 3 == 'foofoofoo'


c*-~iè più corto di c*(i+1).
Mego

2

C #, 81 byte

void f(string s){for(int i=0;i<s.Length;i++)Console.Write(new String(s[i],i+1));}

puoi salvare 1 byte passando a un ciclo foreach, ad esempioforeach(var a in s)Console.Write(new C(a,1*i++));
Abbath,

ma se è un foreach non abbiamo la variabile i quindi dovresti dichiararla.
ScifiDeath

Sembra che ti manchi un using Systemo un System.davanti al Console.
Martin Ender,

@ScifiDeath È vero, ma il risultato finale è ancora più corto di un byte. Ci scusiamo per averlo omesso e causato confusioneint i=1;
Abbath,

Anche un byte più breve utilizzando Linq: void f(string s){s.Select((c,i)=>{Console.Write(new string(c,i+1));return c;});}. La necessità di un valore di ritorno (non utilizzato) è però brutta. Modifica: appena trovato frammenti simili in altre risposte più indietro.
Linac,

2

MATL, 5 byte

tn:Y"

Provalo online

Spiegazione

    % 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 byte

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

2

Julia, 34 byte

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

Provalo online!


La tua soluzione è stata buona Ma sono riuscito a batterlo.
Glen O,

Vidi. Ho avuto c%n="$c"^n;~s=join([s[r=1:end]...].%r), ma in realtà è più lungo. splitera il pezzo mancante del puzzle.
Dennis,

2

TSQL, 97 byte

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

Provalo online

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.