Xâu chuỗi chuỗi con


27

Giới thiệu

Trong ví dụ này, hãy lấy chuỗi Hello, World!và mảng [3, 2, 3]. Để tìm chuỗi chuỗi con, chúng ta trải qua quy trình sau:

Số đầu tiên của mảng là 3, vì vậy chúng ta có được chuỗi con [0 - 3], đó là Hel. Sau đó, chúng tôi xóa các 3ký tự đầu tiên khỏi chuỗi ban đầu, để lại cho chúng tôi lo, World!.

Số thứ hai của mảng là 2, vì vậy chúng tôi nhận được chuỗi con [0 - 2]từ chuỗi mới, cung cấp cho chúng tôi lo. Chuỗi còn lại trở thành , World!.

Số cuối cùng là một 3, cung cấp cho chúng tôi , W. Các chuỗi substring là tất cả các chuỗi con kết hợp, mang đến cho chúng ta:

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

Để có một ví dụ trực quan hơn:

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

Nhiệm vụ

Cho một chuỗi không trốngmột mảng không trống chỉ bao gồm các số nguyên dương ( > 0), xuất ra chuỗi chuỗi con . Bạn có thể giả sử rằng tổng của tất cả các số nguyên trong mảng không vượt quá độ dài của chuỗi.

Bạn cũng có thể giả định rằng các chuỗi sẽ không bao giờ chứa bất kỳ dòng mới nào.

Các trường hợp thử nghiệm

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

Đây là , vì vậy bài nộp có số byte nhỏ nhất sẽ thắng!

Câu trả lời:



12

Python 2, 42 byte

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

Đôi khi bạn chỉ làm điều đó một cách nhàm chán.


Cho đến nay câu trả lời ngắn nhất trong số rất nhiều câu trả lời về con trăn
Cyoce

Rõ ràng là tôi đã
lật đổ

8

Brachylog , 20 13 byte

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

Hãy thử trực tuyến!

Điều này cực kỳ không hiệu quả và hết thời gian trên TIO cho trường hợp thử nghiệm cuối cùng.

Giải trình

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

Phiên bản hiệu quả hơn một chút, 15 byte

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


8

Python 3, 45 byte

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

Đây in một chuỗi con trên mỗi dòng và chấm dứt với một lỗi khi một là kiệt sức.

Thử nghiệm nó trên repl.it .


2
Thật là một cách tuyệt vời để lẻn vào một bản in!
xnor

7

Python, 52 , 46 byte

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

Một hàm lambda đệ quy.

Cảm ơn Dennis vì đã cạo sạch 6 byte!


7

Thạch , 6 byte

Jx$ĠịY

Hãy thử trực tuyến!

        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.

5

Haskell, 34 byte

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

Ví dụ sử dụng: "lexicographically" # [2,2,2,7,4]->["le","xi","co","graphic","ally"]

Đệ quy đơn giản.

Hoặc giải pháp 29 byte nhàm chán thông qua tích hợp:

import Data.Lists
splitPlaces

5

Ruby, 26 byte

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

Chuỗi được biểu diễn dưới dạng mảng các ký tự.


4

PowerShell v2 +, 46 byte

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

Đưa chuỗi đầu vào $avà mảng $b, vòng lặp $b. Mỗi lần lặp, thực hiện một lát mảng $adựa trên $i(mặc định là $nullhoặc 0) và số hiện tại. Cần phải thực hiện -1$i++bởi vì các chuỗi trong PowerShell không được lập chỉ mục.

Ví dụ

(Đầu ra ở đây được phân tách bằng dấu cách, bởi vì đó là phương thức xâu chuỗi mặc định cho mảng)

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

4

Perl, 28 byte

Bao gồm +1 cho -n

Chạy với chuỗi đầu vào trên STDIN, theo sau là mỗi số trên một dòng riêng biệt:

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

Chỉ cần mã:

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

Phiên bản 23 byte mà không ||"^"có loại công việc, nhưng in các dòng mới theo dõi giả

"^"có thể được thay thế bằng $_nếu chuỗi không chứa các ký tự meta regex


3

MATL , 8 byte

ys:)1bY{

Hãy thử trực tuyến!

Giải trình

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

3

JavaScript (ES6), 39 38 35 byte

Đã lưu 3 byte nhờ vào ETHproductions:

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

Thí dụ:

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


Giải pháp trước đó:
38 byte nhờ Huntro:

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

39 byte:

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

1
Bạn có thể lưu một byte bằng cách currying
Huntro

2
.slicelưu một vài byte:s=>a=>a.map(v=>s.slice(t,t+=v),t=0)
ETHproductions

3

Mẻ, 74 byte

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

Tôi đang đánh C? Điều này không thể đúng! Lấy chuỗi trên STDIN và mảng làm đối số dòng lệnh.


3

Java, 119 byte

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

Chơi gôn

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

Tôi đã sửa đổi câu trả lời của Roman Gräf ( https://codegolf.stackexchange.com/a/93992/59935 ), nhưng tôi không có đủ đại diện để bình luận.

Tôi đã thay đổi việc thực hiện vòng lặp và thay vì đặt chuỗi nguồn thành một chuỗi con khác trong mỗi lần lặp, tôi chỉ thay đổi các chỉ số mà tôi nhận được chuỗi con.


2
Chào mừng đến với PPCG! Bài đăng đầu tiên tuyệt vời! Đây chính xác là những gì bạn nên làm với một gợi ý chơi gôn, nhưng không đủ đại diện.
Rɪᴋᴇʀ

1
Chào mừng đến với PPCG! Và tôi đồng ý với _EasterlyIrk_ , bài đăng đầu tiên tuyệt vời. Tôi đã cố gắng tìm thứ gì đó để chơi gôn nhiều hơn, nhưng không thể. Có thể bạn đã từng xem nó, nhưng bạn có thể thấy Mẹo chơi golf trong Java thú vị để đọc. Một lần nữa chào đón, và tận hưởng kỳ nghỉ của bạn.
Kevin Cruijssen


2

sed (82 + 2 cho -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

Dòng đầu tiên là chuỗi. Sau đó, mỗi dòng sau đó là kích thước của một chuỗi con trong unary .

Thí dụ:

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

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

2

CJam , 11 byte

lq~{/(ns}/;

Hãy thử trực tuyến!

Giải trình

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.

2

C, 81 byte

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

Bởi vì write()đầu ra không được đệm nên bất kỳ trình biên dịch trực tuyến nào cũng sẽ gặp khó khăn khi xuất ra cái này.

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

Đầu ra không có đường ống:

Hel
lo
, W
ab
c
def
Code

Ayy
le
xi
co
graphic
ally

trong ideone đầu ra trình biên dịch l'của chương trình c trên [đối phó các chức năng đầu tiên trên Hight hơn trong màn hình] là "Xin chào, WabcdefCode Ayylexicographically" mà không "\ n" ...
RosLuP

2

PHP, 98 byte

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

Sử dụng:

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


Đầu ra:

le xi co graphic ally


Có lẽ có một giải pháp tốt hơn với PHP.


2

PHP, 82 byte

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

Lấy đầu vào dưới dạng một chuỗi và sau đó là danh sách các số, đầu ra được phân tách bằng các dòng mới. ví dụ

php chainify.php lexicographically 2 2 2 7 4

Nếu bạn là một trong những người có thể sử dụng $ argv với -r, bạn có thể lưu 6 byte được sử dụng cho thẻ mở.


Tôi bối rối về việc sử dụng $argv[++$i]. Tại sao không $argv[1]$argv[2]?
MonkeyZeus

Ngoài ra, sử dụng PHP 7.0.2 tại sandbox.onlinephpfifts.com Tôi đã đạt giới hạn thời gian 3 giây
MonkeyZeus

không phải $argv[2]vì chúng ta cần lặp đi lặp lại qua các đối số được đặt ra và đây là $argv[++$i]lần đầu tiên để tránh sự cần thiết ,$i=1và do đó tiết kiệm được 2 byte.
dùng59178

2

PHP, 63 byte

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

Đầu ra dưới dạng Mảng 85 byte

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

1

Bình thường, 7 byte

PcwsM._

Đưa đầu vào được phân tách bằng dòng mới, với chuỗi không được thoát và đến sau mảng. Hãy thử trực tuyến!

Giải trình:

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

1

Octave / MATLAB, 31 byte

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

Đây là một hàm ẩn danh với đầu vào s: chuỗi; a: mảng số.

Hãy thử nó tại Ideone .

Giải trình

Đây là một cổng của câu trả lời MATL của tôi.

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

1

Java 142 byte

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

Chơi gôn

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

1

Awk, 36 ký tự

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

Chạy mẫu:

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

Trong cuộc sống thực, tôi sẽ sử dụng nó như thế này, không biết làm thế nào để tính điểm của nó:

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


1

GNU sed, 55 + 2 (cờ rn) = 57 byte

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

Hãy thử trực tuyến! (cảm ơn @Dennis vì đã thêm sed)

Giải thích: Chuỗi đầu vào phải nằm trên dòng đầu tiên và các số, ở dạng đơn nhất , trên các dòng riêng biệt sau đó. Một dòng mới được đọc ngầm khi bắt đầu một chu kỳ, chạy tập lệnh mỗi lần.

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

Chạy thử: sử dụng tài liệu ở đây với EOF làm điểm đánh dấu kết thúc

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

Đầu ra:

ab
c
def

1

Phiên bản, 79 78 byte

không đẹp lắm, tôi chắc chắn nó có thể được cải thiện ...

Lấy bộ đệm vim, sau đó gọi echom string(A([2,3]))để xem đầu ra

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

Tôi thực sự nghĩ về gian lận và đầu ra chuỗi ["abc", "def"] ... Nhưng tôi đã chống lại: P

Giải thích: Xóa (đặt trong thanh ghi mặc định) mỗi mục mảng số lượng ký tự và thêm nó vào mảng r... Một câu trả lời nhàm chán thực sự.


1

Lisp thông thường, 78 76 byte

Giả sử chức năng ẩn danh được cho phép:

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

Sử dụng

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

Đầu ra

("AbC" "de" "fGh")

-2 byte bằng cách sử dụng asthay vì andvà thay đổi định nghĩa y để khớp với dấu ngoặc giữa hai biến trong(subseq ...)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.