Verkettung von Teilsträngen

27

Einführung

Nehmen wir für dieses Beispiel den String Hello, World!und das Array [3, 2, 3]. Um die Teilzeichenkette zu finden, gehen wir wie folgt vor:

Die erste Zahl des Arrays ist 3, also erhalten wir die Teilzeichenfolge [0 - 3], die ist Hel. Danach entfernen wir die ersten 3Zeichen aus der Anfangszeichenfolge, was uns belässt lo, World!.

Die zweite Nummer des Arrays ist 2, also erhalten wir die Teilzeichenfolge [0 - 2]aus unserer neuen Zeichenfolge, die uns gibt lo. Die übrig gebliebene Zeichenfolge wird , World!.

Die letzte Zahl ist eine 3, die uns gibt , W. Die Unterzeichenkette besteht aus allen Unterzeichenketten, was uns ergibt:

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

Für ein anschaulicheres Beispiel:

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

Die Aufgabe

Bei einer nicht leeren Zeichenfolge und einem nicht leeren Array, das nur aus positiven Ganzzahlen ( > 0) besteht, wird die Teilzeichenfolgekette ausgegeben . Sie können davon ausgehen, dass die Summe aller Ganzzahlen im Array die Länge der Zeichenfolge nicht überschreitet.

Sie können auch davon ausgehen, dass die Zeichenfolgen niemals Zeilenumbrüche enthalten.

Testfälle

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

Das ist , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!

Adnan
quelle

Antworten:

33

05AB1E , 1 Byte

£

Dies ist der Teilstring (0, N) Befehl.
Auf eine Liste angewendet funktioniert dies wiederholt auf dem Rest der Zeichenfolge.

Probieren Sie es online!

Emigna
quelle
9
Kann das nicht schlagen.
Steven H.
12

Python 2, 42 Bytes

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

Manchmal macht man es einfach langweilig.

xnor
quelle
Bisher die kürzeste der viel zu vielen Python-Antworten
Cyoce,
Nun, anscheinend habe ich darüber nachgedacht, haha ​​...
DJMcMayhem
8

Brachylog , 20 13 Bytes

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

Probieren Sie es online!

Dies ist äußerst ineffizient und läuft bei TIO für den letzten Testfall aus.

Erläuterung

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

Eine etwas effizientere Version, 15 Bytes

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

Tödlich
quelle
8

Python 3, 45 Bytes

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

Dies gibt einen Teilstring pro Zeile aus und endet mit einem Fehler, wenn a erschöpft ist.

Testen Sie es auf repl.it .

Dennis
quelle
2
Was für eine großartige Möglichkeit, sich in einen Druck zu schleichen!
xnor
7

Python, 52 , 46 Bytes

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

Eine rekursive Lambda-Funktion.

Vielen Dank an Dennis für das Abschneiden von 6 Bytes!

DJMcMayhem
quelle
7

Gelee , 6 Bytes

Jx$ĠịY

Probieren Sie es 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
quelle
5

Haskell, 34 Bytes

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

Anwendungsbeispiel: "lexicographically" # [2,2,2,7,4]->["le","xi","co","graphic","ally"]

Einfache Rekursion.

Oder die langweilige 29-Byte- Lösung per eingebautem:

import Data.Lists
splitPlaces
nimi
quelle
5

Ruby, 26 Bytes

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

Zeichenfolgen werden als Arrays von Zeichen dargestellt.

m-chrzan
quelle
4

PowerShell v2 +, 46 Byte

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

Übernimmt die Eingabezeichenfolge $aund das Array $bund führt eine Schleife durch $b. Bei jeder Iteration wird ein Array-Slice $abasierend auf $i(standardmäßig $nulloder 0) und der aktuellen Nummer erstellt. Bedürfnisse der zu tun , -1und $i++weil Strings in Powershell - Null-indiziert sind.

Beispiele

(Die Ausgabe hier ist durch Leerzeichen getrennt, da dies die Standard-Stringifizierungsmethode für Arrays ist.)

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

Perl, 28 Bytes

Beinhaltet +1 für -n

Führen Sie mit der Eingabezeichenfolge auf STDIN aus, gefolgt von jeder Zahl in einer separaten Zeile:

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

Nur der Code:

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

Die 23-Byte-Version ||"^"funktioniert auch ohne , druckt aber falsche Zeilenumbrüche

"^"kann durch ersetzt werden, $_wenn die Zeichenfolge keine regulären Metazeichen enthält

Tonne Hospel
quelle
3

MATL , 8 Bytes

ys:)1bY{

Probieren Sie es online!

Erläuterung

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

JavaScript (ES6), 39 38 35 Byte

Dank ETHproductions 3 Bytes gespart:

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

Beispiel:

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


Bisherige Lösung:
38 Bytes dank Huntro:

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

39 Bytes:

(s,a)=>a.map(v=>s.substr(t,v,t+=v),t=0)
Hedi
quelle
1
Sie können ein Byte speichern, indem Sie
Huntro
2
.slicespart ein paar Bytes:s=>a=>a.map(v=>s.slice(t,t+=v),t=0)
ETHproductions
3

Batch, 74 Bytes

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

Ich besiege C? Das kann nicht richtig sein! Übernimmt die Zeichenfolge für STDIN und das Array als Befehlszeilenargumente.

Neil
quelle
3

Java, 119 Bytes

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

Golf gespielt:

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

Ich habe die Antwort von Roman Gräf geändert ( https://codegolf.stackexchange.com/a/93992/59935 ), aber ich habe nicht genug Repräsentanten, um einen Kommentar abzugeben.

Ich habe die Implementierung der Schleife geändert und anstatt die Quellzeichenfolge in jeder Iteration auf eine andere Teilzeichenfolge zu setzen, habe ich nur die Indizes geändert, mit denen ich die Teilzeichenfolge erhalte.

mrco
quelle
2
Willkommen bei PPCG! Toller erster Beitrag! Dies ist genau das, was Sie mit einem Golfvorschlag tun sollten, aber nicht genug Repräsentanten.
21.
1
Willkommen bei PPCG! Und ich stimme mit _EasterlyIrk_ überein , großartiger erster Beitrag. Ich habe versucht, etwas zu finden, um mehr Golf zu spielen, konnte es aber nicht. Vielleicht haben Sie es schon gesehen, aber vielleicht finden Sie Tipps zum Golfen in Java interessant zu lesen. Nochmals herzlich willkommen und genießen Sie Ihren Aufenthalt.
Kevin Cruijssen
2

sed (82 + 2 für -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

Die erste Eingabezeile ist die Zeichenfolge. Dann hat jede Zeile danach die Größe eines Teilstrings in Unary .

Beispiel:

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

$ cat hold | sed -rnf sed.txt
le
xi
co
graphic
ally
Riley
quelle
2

CJam , 11 Bytes

lq~{/(ns}/;

Probieren Sie es online!

Erläuterung

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

C 81 Bytes

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++];}}

Da die write()Ausgabe nicht gepuffert ist, kann ein Online-Compiler dies nur schwer ausgeben.

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

Leistung ohne Verrohrung:

Hel
lo
, W
ab
c
def
Code

Ayy
le
xi
co
graphic
ally
betseg
quelle
in ideone compiler l'output des obigen Programms c [Bewältigung der ersten Funktion je höher der Bildschirm] ist "Hallo, WabcdefCode Ayylexicographically" ohne "\ n" ...
RosLuP
2

PHP, 98 Bytes

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

Verwendung:

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


Ausgabe:

le xi co graphic ally


Es gibt wahrscheinlich eine bessere Lösung mit PHP.

jrenk
quelle
2

PHP, 82 Bytes

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

Übernimmt die Eingabe als Zeichenfolge und dann eine Liste von Zahlen, die Ausgabe wird durch neue Zeilen getrennt. z.B

php chainify.php lexicographically 2 2 2 7 4

Wenn Sie eine der Personen sind, die $ argv mit -r verwenden können, können Sie die 6 Bytes speichern, die für das Eröffnungs-Tag verwendet werden.

user59178
quelle
Ich bin verwirrt über die Verwendung von $argv[++$i]. Warum nicht $argv[1]und $argv[2]?
MonkeyZeus
Außerdem habe ich mit PHP 7.0.2 unter sandbox.onlinephpfunctions.com das Zeitlimit von 3 Sekunden erreicht
MonkeyZeus,
Das liegt nicht $argv[2]daran, dass wir die übersetzten Argumente durchlaufen müssen, und es ist $argv[++$i]das erste Mal, dass wir die Notwendigkeit von a vermeiden ,$i=1und somit 2 Bytes einsparen.
user59178
2

PHP, 63 Bytes

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

Ausgabe als Array 85 Bytes

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

Pyth, 7 Bytes

PcwsM._

Nimmt die Eingabe durch Zeilenvorschub getrennt vor, wobei die Zeichenfolge nicht umbrochen wird und hinter dem Array steht. Probieren Sie es online!

Erläuterung:

     ._  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.
quelle
1

Oktave / MATLAB, 31 Bytes

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

Dies ist eine anonyme Funktion mit Eingaben s: string; a: numerisches Array.

Probieren Sie es bei Ideone .

Erläuterung

Dies ist ein Port meiner MATL-Antwort.

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

Java 142 Bytes

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

Golf gespielt:

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

Awk, 36 Zeichen

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

Probelauf:

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

Im wirklichen Leben würde ich es so benutzen, nur keine Ahnung, wie man seine Punktzahl berechnet:

bash-4.3$ awk -vFIELDWIDTHS='3 2 3' -vOFS='\n' '$1=$1' <<< 'Hello, World!'
Hel
lo
, W
Mann bei der Arbeit
quelle
1

Dyalog APL 16.0, 15 Zeichen (nicht konkurrierend); 15,0, 17 Bytes

16.0 Lösung

{⍵⊆⍨(⍴⍵)↑⍺/+\⍺}

Dyalog APL 16,0 fügt APL2 der Partition primitive, mit der Glyphe .

15.0 Lösung:

{(-⍺)↑¨(+\⍺)↑¨⊂⍵}

TryAPL online!

Adam
quelle
1

GNU sed, 55 + 2 (rn Flags) = 57 Bytes

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

Probieren Sie es online! (Danke an @Dennis für das Hinzufügen von sed)

Erläuterung: Die Eingabezeichenfolge sollte sich in der ersten Zeile befinden, und die Zahlen müssen danach in getrennten Zeilen stehen. Zu Beginn eines Zyklus wird implizit eine neue Zeile gelesen, wobei das Skript jedes Mal ausgeführt wird.

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

Testlauf: Verwenden eines Here-Dokuments mit EOF als Endemarkierung

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

Ausgabe:

ab
c
def
Seshoumara
quelle
1

Vimscript, 79 78 Bytes

nicht sehr hübsch, ich bin sicher, es kann verbessert werden ...

Nimmt einen vim-Puffer und ruft dann echom string(A([2,3]))auf, um die Ausgabe zu sehen

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

Eigentlich habe ich darüber nachgedacht, die Saite zu betrügen und auszugeben ["abc", "def"]... Aber ich habe mich gewehrt: P

Erläuterung: Löschen (in das Standardregister eintragen) der einzelnen Arrayelemente und Hinzufügen von Zeichen zum Array r... Eine wirklich langweilige Antwort.

Christian Rondeau
quelle
1

Common Lisp, 78 76 Bytes

Angenommen, anonyme Funktionen sind zulässig:

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

Verwendung

(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))

Ausgabe

("AbC" "de" "fGh")

-2 - Bytes durch die Verwendung asanstelle von andund Ändern y Definition Klammern zwischen zwei Variablen zu passen(subseq ...)


quelle
1

Rebol, 38 Bytes

func[s b][map-each n b[take/part s n]]
draegtun
quelle