Napisz program, aby uelastycznić łańcuchy


33

Niezły czasownik w tytule.

Napisz program, który poda łańcuch wejściowy, „uelastyczni” ten łańcuch i wyświetli wynik. Uelastycznienie sznurka odbywa się w następujący sposób:

Pierwszy znak jest wyświetlany raz. Drugi znak jest pokazywany dwukrotnie. Trzecia postać jest pokazana trzy razy i tak dalej.

Jak widać, ilość duplikatów określonego znaku jest powiązana z indeksem znaku, w przeciwieństwie do jego poprzednich wystąpień w ciągu.

Możesz oczekiwać, że otrzymasz tylko drukowalne znaki ASCII. Oparte na poniższym linku , znaki te mają wartości dziesiętne 32-126.

Przykłady:

Why: Whhyyy

SKype: SKKyyyppppeeeee

LobbY: LoobbbbbbbYYYYY (Zauważ, że jest 7 b, ponieważ pierwszy b jest pokazany 3 razy, a drugi b jest pokazany 4 razy, co daje w sumie 7 b).

A and B: A aaannnnddddd BBBBBBB

Najkrótsze bajty wygrywają :)


2
Wydaje się, że nie zgadza się to z tym, że „nie jest wymagana obsługa spacji innych niż znak spacji”. Czy wynik powinien być taki sam jak na wejściu? (Dwa jednoliterowe słowa?) Zwróć też uwagę, że mamy fajne miejsce o nazwie Sandbox, w którym możesz postawić wyzwania, aby ludzie mogli wyrazić opinię przed opublikowaniem.
— FryAmTheEggman

FryAmTheEggman twoje założenie jest prawidłowe. @ TimmyD Zdaję sobie sprawę, gdzie byłem niejasny, możesz skończyć z ciągami oddzielającymi moje wiele spacji, jak widać na przykładzie opublikowanym przez FryAmTheEggman.
— Mario Ishac,

Zakładam, że wygrywa najkrótszy kod? ;)
— Adnan

@Adnan Tak, chociaż nie jestem pewien, czy powinienem oznaczyć odpowiedź skróconym programem jako zaakceptowany, ponieważ niektóre języki są stworzone do gry w golfa w przeciwieństwie do innych.
— Mario Ishac,

2
Powiązane: 1 , 2
— Sp3000,

Odpowiedzi:


34

Galaretka , 3 bajty

Kod:

ĖP€

Wyjaśnienie:

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

Wykorzystuje kodowanie Jelly . Wypróbuj online! .


16
Fajne nadużycie tego, że Python *zwielokrotnia ciąg. To nie jest tak naprawdę zamierzone, ale działa.
— Dennis

1
@Dennis: która *? W całej odpowiedzi nie ma czegoś takiego.
— Thomas Weller,

10
@Thomas: Jelly jest napisany w Pythonie, a Ppolecenie Jelly oblicza produkt za kulisami za pomocą *operatora Python . Ten post nadużywa nieszczelnej abstrakcji kodu źródłowego faktycznie znajdującego się w Pythonie, więc wykonanie Ppolecenia (produktu) na łańcuchu działa zgodnie z oczekiwaniami.
— mellamokb

16

J, 4 bajty

#~#\

Stosowanie

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

Wyjaśnienie

#~#\  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 bajtów

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

Dość prosta implementacja, przesuwająca przestrzeń pamięci o 1 dla każdego znaku wejściowego. Wymaga interpretera, który podaje 0 na EOF i 32-bitowe / arbitralne komórki precyzji dla danych wejściowych dłuższych niż 255 znaków.

Wypróbuj online! (Uwaga: TIO używa 8-bitowych komórek)


1
Myślę też, że to nie działa na łańcuchy dłuższe niż 255 znaków.
— Ismael Miguel

@IsmaelMiguel To zależy od tego, czy dany interpreter ma liczby całkowite precyzji, czy nie (ale w rzeczywistości, w przypadku większości implementacji będzie to 255)
— Sp3000

Konwencja polega na użyciu 8 bitów. Który jest 1 postacią. Ale niektóre rzeczywiście mogą implementować liczby 32-bitowe. Ponieważ określasz, że EOF musi wynosić 0 (co jest specyficzne dla kompilatora / interpretera), należy zauważyć, że w przypadku ciągów dłuższych niż 255 znaków potrzebny jest kompilator / interpreter z komórkami 32-bitowymi. Pomyślałem, że należy go dodać do odpowiedzi, ponieważ jest to również zachowanie specyficzne dla kompilatora / interpretera.
— Ismael Miguel

1
@ IsselMiguel Sure, odnotowano.
— Sp3000,

8

Java, 158 121 bajtów

Zaoszczędził aż 37 bajtów dzięki 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);}}

Jako bonus, ten program może obsłużyć wszystkie istniejące znaki Unicode, w tym znaki kontrolne znajdujące się na samym końcu Basic Multilingual Plane .


3
Huh, jest to bardzo skrót od kodu Java.
— Ave

1
Można go skrócić o 1 bajt zastępując for(int C=c+1;C>0;C--)zfor(int C=c+2;--C>0;)
— Kevin Cruijssen

2
Lub jeszcze krótszy ( 121 bajtów ):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

Niech to będzie lambda lub metoda
— Leaky Nun

2
Wow, używając interfacedomyślnych publicmetod. To sprytne.
— Justin

7

Perl, 16 bajtów

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

+1 bajt dla -pflagi.

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 bajtów

concat.zipWith replicate[1..]

Przykład użycia: concat.zipWith replicate[1..] $ "SKype"-> "SKKyyyppppeeeee".

replicate n ctworzy n kopii c i concattworzy jedną listę ze wszystkich list podrzędnych.


id=<<to miły akcent. :)
— sudee

Chciałem tylko spróbować, ale przypisanie f = id=<<zipWith replicate[1..](w pliku) spowodowało brzydki błąd. Czy możesz powiedzieć, co robię źle?
— flawr

Czy nie powinno być możliwe przypisanie tej (nienazwanej, prawda?) Funkcji do nazwy, abyśmy mogli używać jej jako funkcji? Mam na myśli, że jeśli jest to funkcja, to (id=<<zipWith replicate[1..] ) "SKype"czy nadal powinna działać? W przeciwnym razie uznałbym to za fragment . Pełny program podałeś ma „skype” sztywno.
— flawr

Powiedziałbym, że jeśli nie możesz używać go jak jakiejkolwiek innej funkcji, to nie jest to funkcja. Np. :tNie uważa się id=<<zipWith replicate[1..]za funkcję (po prostu generuje błąd), ale (id=<<).zipWith replicate[1..]jest uważany za funkcję. Powiedziałbym, że pierwszy jest po prostu wycięty, który działa tylko wtedy, gdy wpisujesz kod na sztywno, ale drugi, który właśnie wpisujesz, jest funkcją (i :tzgadza się), zgadzasz się na to?
— flawr

Ok świetnie! Jeśli nie zgadzasz się z moją „definicją”, myślę, że powinniśmy założyć meta post, aby to wyjaśnić. W międzyczasie staram się znaleźć innych haskellianów do ich opinii na ten temat, ponieważ to tylko mój pogląd.
— flawr

7

CJam, 9 8 7 bajtów

Dzięki jimmy23013 za oszczędność 1 bajtu.

Sl+eee~

Sprawdź to tutaj.

Wyjaśnienie

Korzystając z LobbYprzykładu:

                                      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 bajtów

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

Ta sama długość, ale więcej zabawy:

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

Wersja demonstracyjna fragmentu:

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>


Mały błąd, program nie obsługuje spacji, które są wymagane jako przesłanie (sprawdź OP).
— Mario Ishac,

@MarDev Zmieniłem fragment kodu, aby go używać <pre>zamiast <div>, co powinno pomóc.
— Neil,

1
@ Nee Ah, więc wynik został poprawnie obliczony, ale wynik został nieprawidłowo wyrenderowany przez HTML. Zapomniałem, że <div> to robi.
— Mario Ishac

... ”i wypisz wynik”
— wydano

1
Zwracanie @spender jest poprawną formą danych wyjściowych dla funkcji
— cat

4

APL (8)

{⍵/⍨⍳⍴⍵}

To znaczy:

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

Wyjaśnienie:

  • ⍴⍵: długość danego wektora
  • ⍳: liczby 1..N
  • ⍵/⍨: replikuj każdy element ⍵N razy.

4

MATLAB, 45 bajtów

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

Objaśnienie: Kluczem jest hankelutworzenie macierzy Hankela danego wektora. Z tej macierzy możemy wyodrębnić wektor indeksów, który określa, który znak ciągu znajduje się w której pozycji na wyjściu. Np. hankel(1:4)Produkuje następującą macierz:

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

Z tej macierzy możemy wyciągnąć wektor 1,2,2,3,3,3,4,4,4,4,4. Ten wektor pozwala nam wypisać pierwszy znak ciągu raz , drugi dwa razy itd


4

NARS2000 , 6 znaków = 12 bajtów

⍳∘⍴/⊙⊢

⍳∘⍴wyliczenie argumentu ... (wskaźniki jego długości)
/⊙replikuje elementy ...
⊢niemodyfikowanego argumentu


link do tłumacza?
— kot

@cat Patrz edycja (w nagłówku).
— Adám

@cat Jaka była Twoja edycja?
— Adám

Identyczne jak twoje, do postaci, ponieważ sam go przejrzałem, a moja edycja zajęła 10 minut
— kot

Ponadto, na której stronie kodowej znajduje się 6 bajtów?
— kot

3

PowerShell v2 +, 36 bajtów

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

Pobiera dane wejściowe $args[0], jawnie rzutuje je jako chartablicę, wysyła je do pętli |%{...}. Przy każdej iteracji bierzemy bieżącą literę / znak "$_"i używamy *przeciążonego operatora, aby połączyć ciąg znaków z przyrostem $iczasu. Wynik każdej iteracji pętli jest hermetyzowany w parens w celu utworzenia tablicy, a następnie -joinedytowany razem w celu utworzenia łańcucha. Ten ciąg jest pozostawiony w potoku, a dane wyjściowe są niejawne.

Przykłady

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 bajtów

:ImC,0:Ie,Cw\

Spowoduje to wydrukowanie wyniku do STDOUT.

Wyjaśnienie

To dobry przykład wykorzystania backtracku do zapętlenia.

: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 bajty

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

Tworzy anonimową funkcję, ansktórą można wywołać za pomocąans('stringtoelacticize')


Jakiej wersji używasz? Nie mogę znaleźć repelemw mojej (stosunkowo starej) wersji = (
— flawr

1
@flawr repelemzostał wprowadzony w R2015a
— Luis Mendo


3

Perl 6 ,  22 20  19 bajtów

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

Wyjaśnienie:

{          # 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 bajtów

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

Wywołaj jako np. Funkcję użytkownika w arkuszu kalkulacyjnym.

= e (A1)

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

Obcina się, jeśli kilka razy podasz własny wynik :-).


2
Witamy na stronie! =)
— DJMcMayhem


3

JavaScript ES6, 42 41 bajtów

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

Przykładowe przebiegi:

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

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

Ta sama długość:s=>[...s].reduce((a,b,i)=>a+b.repeat(i+1))
— Bassdrop Cumberwubwubwub

2
-1 bajt:s=>[,...s].map((e,i)=>e.repeat(i)).join``
— nderscore

@nderscore Aha, to sprytne, dzięki!
— Dendrobium

3

Siatkówka , 22 bajty

Liczba bajtów zakłada kodowanie ISO 8859-1.

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

Wypróbuj online!

Zasadniczo wstawiamy odpowiednią liczbę ·znaków zastępczych między znakami (ponieważ te rozszerzone znaki ASCII nie mogą pojawić się na wejściu), a następnie wypełniamy je sąsiednim znakiem w drugim etapie.


3

R , 83 50 bajtów

-23 Dzięki Giuseppe, choć zastosował on zasadniczo zupełnie nową metodę

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

Mój oryginalny post:

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

Wypróbuj online!

Wydaje mi się, że jest zdecydowanie lepszy sposób, aby to zrobić, ale dzięki mojej nowej wiedzy o kilku funkcjach w języku R jest to moje podejście.


1
Nie jest to wskazówka do gry w golfa, ale dane wyjściowe linku do kodu zostały zawalone. Tutaj
— Robert S.

O, rozumiem. Jestem nowy w TIO, więc nie do końca rozumiałem części nagłówka / stopki. Dziękuję Ci!
— Sumner18,


1
Bardzo dobrze! Jednak użycie repi argument collapse=""to pastejest krótszy i utf8ToIntjeszcze krótszy! TIO
— Giuseppe

2

Właściwie 7 bajtów

' +ñ♂πΣ

Wypróbuj online!

Wyjaśnienie:

' +ñ♂πΣ
' +      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 bajtów

Dzięki mego za uratowanie bajtu z -~ilewą.

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

Jest to w większości oczywiste. Jedna rzecz dla tych, którzy nie są zaznajomieni z Pythonem: *operator jest przeciążony, aby zachowywać się jak xoperator Perla , powtarzając swój ciąg znaków liczbę razy określoną przez argument liczbowy. Na przykład'foo' * 3 == 'foofoofoo'


c*-~ijest krótszy niż c*(i+1).
— Mego

2

C #, 81 bajtów

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

możesz zaoszczędzić 1 bajt, przechodząc do pętli foreach, np.foreach(var a in s)Console.Write(new C(a,1*i++));
— Abbath,

ale jeśli jest to foreach, nie mamy zmiennej i, więc musisz ją zadeklarować.
— ScifiDeath,

Wydaje się, jesteś brakuje using Systemlub System.z przodu Console.
— Martin Ender

@ScifiDeath To prawda - ale wynik końcowy jest wciąż o jeden bajt krótszy. Przepraszamy za pominięcie go i spowodowanie zamieszaniaint i=1;
— Abbath,

Również jeden bajt krótszy przy użyciu LINQ: void f(string s){s.Select((c,i)=>{Console.Write(new string(c,i+1));return c;});}. Potrzeba (nieużywanej) wartości zwracanej jest brzydka. Edycja: właśnie znalazłem podobne fragmenty w innych odpowiedziach dalej.
— linac

2

MATL, 5 bajtów

tn:Y"

Wypróbuj online

Wyjaśnienie

    % 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 bajtów

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

2

Julia, 34 bajty

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

Wypróbuj online!


Twoje rozwiązanie było dobre. Ale udało mi się to pokonać.
— Glen O

Widziałem. Miałem c%n="$c"^n;~s=join([s[r=1:end]...].%r), ale tak naprawdę dłużej. splitbył brakującym elementem układanki.
— Dennis

2

TSQL, 97 bajtów

Gra w golfa:

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

Nie golfowany:

DECLARE @x varchar(max)='Lobby'

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

PRINT @x

Wypróbuj online

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.