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.