Łańcuchowanie podciągów

27

Wprowadzenie

W tym przykładzie weźmy ciąg Hello, World!i tablicę [3, 2, 3]. Aby znaleźć łańcuch podciągów, przechodzimy przez następujący proces:

Pierwsza liczba tablicy to 3, więc otrzymujemy podłańcuch [0 - 3], który jest Hel. Następnie usuwamy pierwsze 3znaki z początkowego ciągu, który pozostawia nam lo, World!.

Druga liczba tablicy to 2, więc otrzymujemy podłańcuch [0 - 2]z naszego nowego ciągu, który daje nam lo. Pozostaje ciąg znaków , World!.

Ostatni numer to 3, co daje nam , W. Łańcuch podciąg to wszystkie podciągi połączono, co daje nam:

['Hel', 'lo', ', W']

Bardziej wizualny przykład:

[3, 2, 3], 'Hello, World!'
3 -> Hel
2 ->    lo
3 ->      , W

Zadanie

Biorąc pod uwagę, jest niepusty łańcuch i jest niepusty tablicę składających się tylko z dodatnich liczb całkowitych ( > 0), wyjście z łańcucha podciągu . Możesz założyć, że suma wszystkich liczb całkowitych w tablicy nie przekracza długości łańcucha.

Możesz również założyć, że ciągi nigdy nie będą zawierać żadnych znaków nowej linii.

Przypadki testowe

Input: abcdefghijk, [2, 1, 3]
Output: ['ab', 'c', 'def']

Input: Code Golf, [4, 1]
Output: ['Code', ' ']

Input: Ayyy, [3]
Output: ['Ayy']

Input: lexicographically, [2, 2, 2, 7, 4]
Output: ['le', 'xi', 'co', 'graphic', 'ally']

To jest , więc wygrywanie z najmniejszą liczbą bajtów wygrywa!

Adnan
źródło

Odpowiedzi:

33

05AB1E , 1 bajt

£

To jest polecenie substring (0, N).
Zastosowane na liście, działa to wielokrotnie na pozostałej części łańcucha.

Wypróbuj online!

Emigna
źródło
9
Nie mogę tego przebić.
Steven H.,
12

Python 2, 42 bajty

s,a=input()
for n in a:print s[:n];s=s[n:]

Czasami robisz to po prostu nudno.

xnor
źródło
Jak dotąd najkrótsza z zbyt wielu odpowiedzi na python
Cyoce,
Cóż, najwyraźniej myślałem o tym, haha ​​...
DJMcMayhem
8

Brachylog , 20 13 bajtów

h@[~c.:la~t?,

Wypróbuj online!

Jest to wyjątkowo nieefektywne i przekracza limit czasu dla TIO dla ostatniego przypadku testowego.

Wyjaśnienie

Input = [String, List of integers]

h@[            Take a prefix of the string
   ~c.         Take a possible list of strings which when concatenated results in that prefix
      :la      Take the lengths of each element of that list
         ~t?,  This list of lengths is equal to the list of integers of the Input

Nieco bardziej wydajna wersja, 15 bajtów

t: {~ l} a.,? h @ [~ c

Fatalizować
źródło
8

Python 3, 45 bajtów

f=lambda s,a:f(s[a[0]:print(s[:a.pop(0)])],a)

To jeden podciąg drukuje jedną linię i kończy się błędem, gdy jest wyczerpany.

Przetestować go na repl.it .

Dennis
źródło
2
Cóż za świetny sposób na zakrycie się w druku!
xnor
7

Python, 52 , 46 bajtów

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

Rekurencyjna funkcja lambda.

Dzięki Dennisowi za zgolenie 6 bajtów!

DJMcMayhem
źródło
7

Galaretka , 6 bajtów

Jx$ĠịY

Wypróbuj online!

        The implicit working value is the first argument.
Jx$     Given a list L, repeat (x) an element of [1..len(n)] (J)
        as many times as the corresponding value in L.
   Ġ    Group indices by values. This turns [1, 1, 1, 2, 2, 3, 3]
        into [[1, 2, 3], [4, 5], [6, 7]].
    ị   Index into the second argument.
     Y  Join by newlines.
Lynn
źródło
5

Haskell, 34 bajty

s#(a:b)=take a s:drop a s#b
_#_=[]

Przykład użycia: "lexicographically" # [2,2,2,7,4]->["le","xi","co","graphic","ally"]

Prosta rekurencja.

Lub nudne rozwiązanie 29 bajtów za pomocą wbudowanego:

import Data.Lists
splitPlaces
nimi
źródło
5

Rubinowy, 26 bajtów

->w,a{a.map{|n|w.shift n}}

Ciągi są reprezentowane jako tablice znaków.

m-chrzan
źródło
4

PowerShell v2 +, 46 bajtów

param($a,$b)$b|%{-join$a[$i..($i+=$_-1)];$i++}

Pobiera wejściowy ciąg znaków $ai tablicę $b, pętle $b. Każda iteracja wykonuje wycinek tablicy na $apodstawie $i(domyślnie $nulllub 0) i bieżącej liczby. Musi zrobić -1i $i++dlatego ciągi w PowerShell są zero-indeksowane.

Przykłady

(Dane wyjściowe są tutaj oddzielone spacjami, ponieważ jest to domyślna metoda stringowania dla tablic)

PS C:\Tools\Scripts\golfing> @('abcdefghijk',@(2,1,3)),@('Code Golf',@(4,1)),@('Ayyy',@(3)),@('lexicographically',@(2,2,2,7,4))|%{""+$_[0]+" -> "+(.\substring-chainification.ps1 $_[0] $_[1])}
abcdefghijk -> ab c def
Code Golf -> Code  
Ayyy -> Ayy
lexicographically -> le xi co graphic ally
AdmBorkBork
źródło
4

Perl, 28 bajtów

Obejmuje +1 dla -n

Uruchom z ciągiem wejściowym na STDIN, a następnie każdą liczbą w osobnym wierszu:

(echo "Hello, World!"; echo 3; echo 2; echo 3) | perl -nE 'say for/(??{"."x<>||"^"})/g'

Tylko kod:

say for/(??{"."x<>||"^"})/g

Wersja z 23 bajtami ||"^"również nie działa, ale drukuje fałszywe końcowe znaki nowego wiersza

"^"można zastąpić, $_jeśli ciąg nie zawiera wyrażeń regularnych meta

Ton Hospel
źródło
3

MATL , 8 bajtów

ys:)1bY{

Wypróbuj online!

Wyjaśnienie

y    % Implicitly take the two inputs: numerical array, string. Duplicate the array
s    % Sum of the array, say n
:    % Range from 1 to n
)    % Take first n characters of the string
1    % Push 1
b    % Bubble up the original copy of the string to the top
Y{   % Split into pieces of lengths given by the numerical array. The pieces are 
     % stored in a cell array, which is implicitly displayed, one cell per line
Luis Mendo
źródło
3

JavaScript (ES6), 39 38 35 bajtów

Zaoszczędzono 3 bajty dzięki produktom ETH:

s=>a=>a.map(v=>s.slice(t,t+=v),t=0)

Przykład:

//Definition
f=
s=>a=>a.map(v=>s.slice(t,t+=v),t=0)

//Call
f('lexicographically')([2, 2, 2, 7, 4]);

//Output
Array [ "le", "xi", "co", "graphic", "ally" ]


Poprzednie rozwiązanie:
38 bajtów dzięki Huntro:

s=>a=>a.map(v=>s.substr(t,v,t+=v),t=0)

39 bajtów:

(s,a)=>a.map(v=>s.substr(t,v,t+=v),t=0)
Hedi
źródło
1
Możesz zaoszczędzić jeden bajt,
curry
2
.sliceoszczędza kilka bajtów:s=>a=>a.map(v=>s.slice(t,t+=v),t=0)
ETHprodukcje
3

Partia, 74 bajty

@set/ps=
@for %%i in (%*)do @call echo %%s:~0,%%i%%&call set s=%%s:~%%i%%

Biję C? To nie może być prawda! Pobiera ciąg znaków STDIN i tablicę jako argumenty wiersza polecenia.

Neil
źródło
3

Java, 119 bajtów

String[] substringChainification(String s, int[] i) {
    String[] r = new String[i.length];
    int j = 0, f = 0;
    for (int t : i)
        r[j++] = s.substring(f, f += t);
    return r;
}

Gra w golfa:

String[]s(String s,int[]i){String[]r=new String[i.length];int j=0,f=0;for(int t:i)r[j++]=s.substring(f,f+=t);return r;}

Zmodyfikowałem odpowiedź Romana Gräfa ( /codegolf//a/93992/59935 ), ale nie mam wystarczającej liczby przedstawicieli, aby móc komentować.

Zmieniłem implementację pętli i zamiast ustawiania łańcucha źródłowego na inny podciąg w każdej iteracji, po prostu zmieniam indeksy, za pomocą których otrzymuję podłańcuch.

mrco
źródło
2
Witamy w PPCG! Świetny pierwszy post! To właśnie powinieneś zrobić z sugestią golfa, ale za mało powtórzeń.
Rɪᴋᴇʀ
1
Witamy w PPCG! I zgadzam się z _EasterlyIrk_ , świetny pierwszy post. Próbowałem znaleźć coś do gry w golfa, ale nie mogłem. Być może już to widziałeś, ale możesz przeczytać Porady dotyczące gry w golfa w Javie . Jeszcze raz witamy i życzymy miłego pobytu.
Kevin Cruijssen
2

sed (82 + 2 dla -rn) 84

s,^,\n,;:l;N;s,\n\n,\n,;:
s,^([^\n]*)\n(.)([^\n]*\n)1,\1\2\n\3,
t;P;s,^[^\n]*,,;tl

Pierwszy wiersz danych wejściowych to ciąg znaków. Potem każdy wiersz po to wielkość podciągu w jednoskładnikowa .

Przykład:

$ cat test.txt:
lexicographically
11
11
11
1111111
1111

$ cat hold | sed -rnf sed.txt
le
xi
co
graphic
ally
Riley
źródło
2

CJam , 11 bajtów

lq~{/(ns}/;

Wypróbuj online!

Wyjaśnienie

l    e# Read input string.
q~   e# Read array of lengths and eval.
{    e# For each length...
  /  e#   Split the string into chunks of the given size.
  (  e#   Pull off the first chunk.
  n  e#   Print with linefeed.
  s  e#   Flatten the remaining chunks into a single string again.
}/
;    e# Discard any remainder of the input string.
Martin Ender
źródło
2

C, 81 bajtów

i,j;f(s,l,k)char*s;int*l;{for(i=j=0;i<k;){write(1,s+j,l[i]);puts("");j+=l[i++];}}

Ponieważ write()dane wyjściowe nie są buforowane, żaden kompilator online nie będzie miał trudności z wyświetleniem tego.

test.c :

i,j;f(s,l,k)char*s;int*l;{for(i=j=0;i<k;){write(1,s+j,l[i]);puts("");j+=l[i++];}}
main(){
    int l[]={3,2,3};
    f("Hello, World!",l,3);
    int ll[]={2,1,3};
    f("abcdefghijk",ll,3);
    int lll[]={4,1};
    f("Code Golf",lll,2);
    int llll[]={3};
    f("Ayyy",llll,1);
    int lllll[]={2,2,2,7,4};
    f("lexicographically",lllll,5);
}

Wyjście bez orurowania:

Hel
lo
, W
ab
c
def
Code

Ayy
le
xi
co
graphic
ally
betseg
źródło
w kompilatorze ideone l 'wyjście powyższego programu c [kopiowanie pierwszej funkcji, tym bardziej wysokość na ekranie] brzmi: „Cześć, WabcdefCode Ayylexicographically” bez „\ n” ...
RosLuP
2

PHP, 98 bajtów

<?php
$b=$argv[1];foreach(explode(',',$argv[2])as$a){echo(substr($b,0,$a).' ');$b=substr($b,$a);}

Stosowanie:

php chainification.php lexicographically 2,2,2,7,4


Wydajność:

le xi co graphic ally


Prawdopodobnie jest lepsze rozwiązanie z PHP.

Jrenk
źródło
2

PHP, 82 bajty

<?php for($s=$argv[++$i],$j=-1;$n=$argv[++$i];){for(;$n--;)echo$s[++$j];echo"
";}

Pobiera dane wejściowe jako ciąg znaków, a następnie listę liczb, dane wyjściowe są oddzielone nowymi wierszami. na przykład

php chainify.php lexicographically 2 2 2 7 4

Jeśli jesteś jedną z osób, które potrafią używać $ argv z opcją -r, możesz zapisać 6 bajtów używanych dla tagu otwierającego.

użytkownik59178
źródło
Jestem zdezorientowany co do używania $argv[++$i]. Dlaczego nie $argv[1]i $argv[2]?
MonkeyZeus,
Korzystając z PHP 7.0.2 na sandbox.onlinephpfunctions.com osiągnąłem limit 3 sekund
MonkeyZeus
to nie $argv[2]dlatego, że musimy iterować dostarczone argumenty i $argv[++$i]po raz pierwszy unikamy potrzeby a, ,$i=1a tym samym oszczędzamy 2 bajty.
user59178,
2

PHP, 63 bajtów

<?foreach($_GET[a]as$p){echo" ".substr($_GET[s],$s,$p);$s+=$p;}

Dane wyjściowe jako tablica 85 bajtów

<?foreach($_GET["a"]as$p){$o[]=substr($_GET["s"],$s,$p);$s+=$p;}echo json_encode($o);
Jörg Hülsermann
źródło
1

Pyth, 7 bajtów

PcwsM._

Pobiera dane wejściowe oddzielone znakiem nowej linii, ciąg nie jest ukształtowany i występuje po tablicy. Wypróbuj online!

Wyjaśnienie:

     ._  Get all prefixes of Q
   sM    Map sum across each of these prefixes (to get the total indices)
 cw      Split the string at these locations
P        Remove the last "remainder" of the string
Steven H.
źródło
1

Octave / MATLAB, 31 bajtów

@(s,a)mat2cell(s(1:sum(a)),1,a)

Jest to anonimowa funkcja z danymi wejściowymi s: string; a: tablica numeryczna.

Wypróbuj w Ideone .

Wyjaśnienie

To jest port mojej odpowiedzi MATL.

s(1:sum(a))        % Take first n characters of string s, where n is the sum of array a
mat2cell(...,1,a)  % Split into pieces of lengths given by a and store in a cell array
Luis Mendo
źródło
1

Java 142 bajty

public static String[]substringChain(String s,int[]i){
  String[]r=new String[i.length];
  for(int j=-1;++j<i.length;){
    r[j]=s.substring(0,i[j]);
    s=s.substring(i[j]);
  }
  return b;
}

Gra w golfa:

String[]s(String s,int[]i){String[]r=new String[i.length];for(int j=-1;++j<i.length;){r[j]=s.substring(0,i[j]);s=s.substring(i[j]);}return b;}
Roman Gräf
źródło
1

Awk, 36 znaków

{FIELDWIDTHS=$0;OFS=RS;getline}$1=$1

Przykładowy przebieg:

bash-4.3$ awk '{FIELDWIDTHS=$0;OFS=RS;getline}$1=$1' <<< $'3 2 3\nHello, World!'
Hel
lo
, W

W prawdziwym życiu użyłbym tego w ten sposób, po prostu nie mam pojęcia, jak obliczyć jego wynik:

bash-4.3$ awk -vFIELDWIDTHS='3 2 3' -vOFS='\n' '$1=$1' <<< 'Hello, World!'
Hel
lo
, W
człowiek w pracy
źródło
1

GNU sed, 55 + 2 (flagi rn) = 57 bajtów

1H;1d;G;:;s=.(\n.*)\n(.)=\1\2\n=;t;s=.==;P;s=[^\n]*==;h

Wypróbuj online! (dzięki @Dennis za dodanie sed)

Objaśnienie: Łańcuch wejściowy powinien znajdować się w pierwszym wierszu, a cyfry, w formie jednoargumentowej , w osobnych wierszach po nim. Nowy wiersz jest odczytywany domyślnie na początku cyklu, za każdym razem uruchamiając skrypt.

1H;1d                       # once: append string to hold space and start new cycle
                            #Initially, the hold space contains an useful '\n'.
G                           # append hold space to pattern space. The pattern space
                            #format will be: 'UNARY\n\nSTRING'.
:;s=.(\n.*)\n(.)=\1\2\n=;t  # iteratively remove a char from the string, as many
                            #times as unary chars, and store it on 2nd pattern line
s=.==;P                     # remove '\n', then print the new top line
s=[^\n]*==;h                # delete up to '\n' and update hold space

Uruchomienie testowe: użycie dokumentu tutaj z EOF jako znacznikiem końcowym

sed -rnf program.sed << EOF
> abcdefghijk
> 00
> 0
> 000
> EOF

Wydajność:

ab
c
def
seshoumara
źródło
1

Vimscript, 79 78 bajtów

niezbyt ładne, jestem pewien, że można to poprawić ...

Pobiera bufor vima, a następnie wywołuje, echom string(A([2,3]))aby zobaczyć wynik

fu A(l)
let r=[]
for i in a:l
exe "norm d".i."l"
let r+=[@"]
endfo
retu r
endf

Właściwie myślałem o oszukiwaniu i wydawaniu struny ["abc", "def"] ... Ale opierałem się: P

Objaśnienie: Usuń (umieszcza w rejestrze domyślnym) każdą tablicę zlicza znaki i dodaje ją do tablicy r... Naprawdę nudna odpowiedź.

Christian Rondeau
źródło
1

Common Lisp, 78 76 bajtów

Zakładając, że funkcja anonimowa jest dozwolona:

(lambda(s l)(loop for x in l as y = x then(+ y x)collect(subseq s(- y x)y)))

Stosowanie

(funcall #'(lambda(s l)(loop for x in l as y = x then(+ y x)collect(subseq s(- y x)y)))"AbCdefGhijK"'(3 2 3))

Wydajność

("AbC" "de" "fGh")

-2 bajty, używając aszamiast andi zmieniając definicję y w celu dopasowania nawiasów między dwiema zmiennymi w(subseq ...)


źródło
1

Rebol, 38 bajtów

func[s b][map-each n b[take/part s n]]
draegtun
źródło